Skip to content

Commit 85ec61b

Browse files
committed
feat(intel): publish E13/E14/E15 intelligence seams to OSS core
Publish the generic, tier-neutral OSS intelligence base so downstream consumers resolve it on public main (publish-before-consume): - pkg/scheduler: E13 recurring-evaluation seam (OSS registers no jobs → no-op) - pkg/signalsources: prometheus/tempo queriers, registry, metric/trace shapes - pkg/storage: ModelStore lifecycle (E14) over the base Provider - pkg/core: typed signal seam (SignalLearner/Detector/Observation/TypedVerdict) - pkg/agent: brain seam (E15 per-type) + analyze metric/trace query tools - cmd, config, services wiring; fake-metrics script, helm + docs All exported funcs covered by *_test.go; go vet + go build clean.
1 parent 1223461 commit 85ec61b

81 files changed

Lines changed: 7562 additions & 173 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

GOVERNANCE.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,16 @@ In practice:
157157
> enterprise-gated. That is the boundary in action: the seam is open, the
158158
> org-scaling wrapper is paid.
159159
160+
> **"All signal sources" means the log-based sources shipped under MIT**
161+
> (Elasticsearch, Graylog, Splunk, Loki, CloudWatch Logs, file, …) — these are
162+
> OSS forever under §1. A **standing metric/trace ingestion source** (a source
163+
> that polls a PromQL/TraceQL rule each tick to *start* incidents) has **not**
164+
> shipped under MIT and is a **new** Enterprise capability; only the on-demand
165+
> `query_metrics`/`query_traces` correlation tools, the shared queriers, and the
166+
> generic `core.SignalSource` seam + registration hook are OSS. This is the
167+
> seam-in-OSS / wrapper-in-Enterprise pattern, not a narrowing of the OSS surface
168+
> (nothing MIT-released moves out).
169+
160170
#### Documentation is part of the open core
161171

162172
The product **documentation content** (the Markdown under `versus-incident/src`)
@@ -172,6 +182,13 @@ build tool that **pulls the public `versus-incident/src` Markdown at build time*
172182
site deployed to the public docs domain. The renderer may be private; the
173183
**content it renders must remain in the public MIT repo.**
174184

185+
**Enterprise features are documented (not licensed) in the open.** Enterprise-tier
186+
capabilities are documented openly on the public docs site — including how to run
187+
them — for transparency and to show tier value; documenting an Enterprise feature
188+
publicly does **not** make it OSS, and such pages must clearly label the feature
189+
as Enterprise and state that running it requires a licensed Enterprise
190+
distribution.
191+
175192
### 3. Same binary, license-gated — no open-source bait-and-switch fork
176193

177194
- There is **no fork** of OSS product logic. Community and Enterprise are the

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@
1515
</p>
1616

1717
<p align="center">
18-
Free with MIT license · priced on monitored services, never per seat ·
19-
<a href="https://docs.versusincident.com/#/pricing">Pricing</a>
18+
Free with MIT license · <a href="https://docs.versusincident.com/#/pricing">Enterprise Pricing</a>
2019
</p>
2120

2221
![Versus](src/docs/images/versus-dashboard-01.png)

SPONSORS.md

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ the two ladders read coherently and never compete:
3535
| **Backer** | $25 | Individual self-hoster | Name listed in `SPONSORS.md` |
3636
| **Bronze** | $100 | Small team self-hosting the core | Logo in `README.md` (small) + `SPONSORS.md` |
3737
| **Silver** | $500 | Mid team self-hosting the core | Logo in `README.md` (medium) + priority issue triage + private Discord channel |
38-
| **Gold** | $2,000 | Org running the core at scale (≈ Enterprise Starter interest) | Logo in `README.md` (large) + monthly roadmap call (1h) + priority feature review |
38+
| **Gold** | $2,000 | Org running the core at scale (≈ Versus Enterprise interest) | Logo in `README.md` (large) + monthly roadmap call (1h) + priority feature review |
3939
| **Platinum** | Custom | Strategic backer / pre-commercial enterprise | Everything above + named integration ("Datadog support sponsored by …") + co-marketing |
4040

4141
Sponsor amounts deliberately sit **alongside, not on top of**, the commercial
@@ -88,36 +88,31 @@ core, **Versus Enterprise** is the commercial tier. It is priced on **monitored
8888
services, never per-seat**, and billed **monthly**:
8989

9090
- **Versus Enterprise** — self-hosted commercial license for multi-tenant org
91-
isolation, SSO/SCIM, RBAC + audit, per-org model gateway, and air-gapped
92-
supply-chain packaging. **Enterprise Starter** list **$1,500/mo**
93-
Enterprise ($3,500/mo) → Plus ($7,000/mo+).
91+
isolation, SSO/SCIM, RBAC + audit, per-org model gateway, the
92+
standing-intelligence metric/trace data source, and air-gapped supply-chain
93+
packaging. There is **one tier today — Founding, $199/mo** — the full feature
94+
set on the same binary, self-hosted.
9495

95-
### Founding-Customer Beta — Enterprise Starter at $199/mo
96+
### Founding — Versus Enterprise at $199/mo
9697

97-
**Get in before we're well-known.** We're opening the **Enterprise Starter**
98-
tier to the **first 10 founding customers** at an introductory self-hosted beta
99-
price. Low-risk first price, full features, locked in — and a transparent path
100-
to list price later.
98+
**Get in before we're well-known.** Versus Enterprise has exactly **one paid
99+
tier** today: **Founding, $199/mo**, an introductory founding-cohort price for
100+
the complete self-hosted feature set.
101101

102-
> **Enterprise Starter:** ~~$1,500/mo list~~**$199/mo founding-customer
103-
> beta** — first **10 customers only**, price **locked at $199/mo for 12
104-
> months**.
102+
> **Founding:** **$199/mo** — the full Versus Enterprise feature set, self-hosted,
103+
> your data never leaves your infrastructure. Nothing held back.
105104
106105
- **Full feature set, no asterisks.** Founding customers run the **complete
107-
Enterprise Starter feature set — same binary, same features**. The discount is
108-
on **price, not capability**; nothing is feature-clipped to reach $199/mo.
109-
- **Price-locked for 12 months** from signup, then a **published, honest
110-
conversion path** — no surprise re-rate:
111-
- **Year 2** — $750/mo (founding-loyalty rate)
112-
- **Year 3+** — $1,500/mo (Enterprise Starter list)
113-
- We send a **60-day pre-renewal notice** before any step-up.
114-
- **Why act now.** The cohort is capped at **10 customers** and the **12-month
115-
lock** is only available to founding signups. Once the 10 seats are filled,
116-
Starter is list price for everyone else.
117-
118-
This is the **self-hosted Versus Enterprise beta**. It is **not** the deferred,
119-
managed **Versus Cloud** tier — the Cloud "Team" price point is a separate
120-
future offering that is not sold today.
106+
Enterprise feature set — same binary, same features**, including the
107+
standing-intelligence metric/trace data source. The introductory price is on
108+
**price, not capability**; nothing is feature-clipped to reach $199/mo.
109+
- **One price today.** $199/mo is the only Versus Enterprise price right now.
110+
We are **not** quoting a multi-tier list ladder or a hosted Cloud plan — higher
111+
self-hosted tiers and Cloud pricing are TBD and not offered yet.
112+
113+
This is the **self-hosted Versus Enterprise** offer. It is **not** the deferred,
114+
managed **Versus Cloud** product — Cloud pricing is a separate future offering
115+
that is not sold today.
121116

122117
> A hosted **Versus Cloud** (managed, usage-based SaaS) is a **future** offering
123118
> built on the same binary. It is **not sold today** — we are shipping and selling

cmd/main.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,13 @@ func handlerRedisOptions(rc c.RedisConfig) *redis.Options {
352352
DB: rc.DB,
353353
}
354354

355+
if !rc.TLSEnabled() {
356+
// Plaintext Redis (e.g. a local/dev redis:7-alpine): dial without
357+
// TLS by leaving TLSConfig nil. Make the downgrade auditable.
358+
log.Println("WARNING: Redis TLS disabled (plaintext connection) — intended for dev/local only")
359+
return redisOptions
360+
}
361+
355362
if rc.InsecureSkipVerify {
356363
// Configure TLS
357364
redisOptions.TLSConfig = &tls.Config{

cmd/main_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
6+
c "github.com/VersusControl/versus-incident/pkg/config"
7+
)
8+
9+
// TestHandlerRedisOptionsTLS covers QA-002: with TLS disabled the Redis
10+
// client must not set TLSConfig (so a plaintext Redis can connect), while
11+
// the existing default-on / insecure_skip_verify TLS behaviour is preserved.
12+
func TestHandlerRedisOptionsTLS(t *testing.T) {
13+
tru := true
14+
fls := false
15+
16+
t.Run("tls disabled produces no TLSConfig", func(t *testing.T) {
17+
opts := handlerRedisOptions(c.RedisConfig{Host: "localhost", Port: 6379, TLS: &fls})
18+
if opts.TLSConfig != nil {
19+
t.Fatalf("expected nil TLSConfig when redis.tls=false, got %#v", opts.TLSConfig)
20+
}
21+
})
22+
23+
t.Run("tls omitted defaults to TLS", func(t *testing.T) {
24+
opts := handlerRedisOptions(c.RedisConfig{Host: "localhost", Port: 6379})
25+
if opts.TLSConfig == nil {
26+
t.Fatal("expected TLSConfig when redis.tls is omitted (default-on)")
27+
}
28+
})
29+
30+
t.Run("tls enabled keeps TLS", func(t *testing.T) {
31+
opts := handlerRedisOptions(c.RedisConfig{Host: "localhost", Port: 6379, TLS: &tru})
32+
if opts.TLSConfig == nil {
33+
t.Fatal("expected TLSConfig when redis.tls=true")
34+
}
35+
})
36+
37+
t.Run("tls enabled with insecure_skip_verify", func(t *testing.T) {
38+
opts := handlerRedisOptions(c.RedisConfig{Host: "localhost", Port: 6379, TLS: &tru, InsecureSkipVerify: true})
39+
if opts.TLSConfig == nil || !opts.TLSConfig.InsecureSkipVerify {
40+
t.Fatal("expected InsecureSkipVerify TLSConfig when redis.tls=true and insecure_skip_verify=true")
41+
}
42+
})
43+
}

examples/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ runs only the services required for that source.
1212
|---|---|
1313
| [docker-compose/file/](./docker-compose/file/) | (none — local file) |
1414
| [docker-compose/loki/](./docker-compose/loki/) | Loki + Grafana |
15+
| [docker-compose/metrics/](./docker-compose/metrics/) | Prometheus + loadgen (Tempo optional) |
1516
| [docker-compose/elasticsearch/](./docker-compose/elasticsearch/) | Elasticsearch + Kibana |
1617
| [docker-compose/cloudwatch/](./docker-compose/cloudwatch/) | (your AWS account) |
1718

examples/docker-compose/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ spun up alongside Versus + Redis.
99
|---|---|---|
1010
| [file/](./file/) | versus + redis | Quickest start; tail a local log file |
1111
| [loki/](./loki/) | versus + redis + **loki** + **grafana** | Test the `loki` source against a real Loki |
12+
| [metrics/](./metrics/) | versus + redis + **prometheus** + **pushgateway** | OSS metric/trace **correlation**: `query_metrics`/`query_traces` analyze tools pull host-pushed series during an AI investigation (incident triggered via a `file` log source). All fake data comes from the `scripts/` generators. The standing `prometheus`/`traces` *source* is Enterprise. |
1213
| [elasticsearch/](./elasticsearch/) | versus + redis + **elasticsearch** + **kibana** | Test the `elasticsearch` source against a real ES |
1314
| [cloudwatch/](./cloudwatch/) | versus + redis | Test the `cloudwatchlogs` source against your AWS account |
1415
| [graylog/](./graylog/) | versus + redis + **graylog** + mongodb + opensearch | Test the `graylog` source against a real Graylog |

0 commit comments

Comments
 (0)