Skip to content

Commit 04fa47c

Browse files
authored
Merge pull request #1514 from Hellblazer/release/v7.35.0
release: conexus 7.35.0
2 parents 0e8dea9 + 23175b8 commit 04fa47c

31 files changed

Lines changed: 1108 additions & 17 deletions

.claude-plugin/marketplace.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,21 @@
1111
"source": "git-subdir",
1212
"url": "https://github.com/Hellblazer/nexus.git",
1313
"path": "conexus",
14-
"ref": "v7.34.1"
14+
"ref": "v7.35.0"
1515
},
1616
"description": "Self-hosted three-tier knowledge management with 13 specialized agents, plan-centric retrieval via nx_answer, semantic search, and RDR decision tracking for Claude Code.",
17-
"version": "7.34.1"
17+
"version": "7.35.0"
1818
},
1919
{
2020
"name": "sn",
2121
"source": {
2222
"source": "git-subdir",
2323
"url": "https://github.com/Hellblazer/nexus.git",
2424
"path": "sn",
25-
"ref": "v7.34.1"
25+
"ref": "v7.35.0"
2626
},
2727
"description": "Injects Serena and Context7 MCP tool usage guidance into subagents via SubagentStart hook.",
28-
"version": "7.34.1"
28+
"version": "7.35.0"
2929
}
3030
]
3131
}

CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,29 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
88

9+
## [7.35.0] - 2026-09-07
10+
11+
Paired with engine-service-v0.1.107 (`REQUIRED_ENGINE_VERSION` 0.1.107,
12+
one changeset over a v0.1.106 store).
13+
14+
### Added
15+
16+
- Anonymous daily install ping (nexus-h5olw). Once every 24 hours the MCP
17+
server sends six fields to the managed service so active installs can be
18+
counted across local and cloud mode: a random install id kept in
19+
`~/.config/nexus/install_id`, the conexus version, the install mode, OS,
20+
CPU architecture, and Python major.minor. Nothing else. Daemon thread,
21+
2 s timeout, every failure swallowed. Opt-out, default on:
22+
`nx telemetry off` (writes `telemetry.enabled: false`) or
23+
`NX_NO_TELEMETRY=1`; `nx telemetry status` shows the setting, the
24+
install id, and the last ping. README § Telemetry states exactly what is
25+
sent.
26+
- Engine: `POST /v1/install-ping`, unauthenticated, outside the `/v1/*`
27+
auth block; `nexus.install_pings` (telemetry-014, global, no RLS); rate
28+
limiting keyed by a trusted-proxy count (`NX_INSTALL_PING_TRUSTED_PROXIES`,
29+
default 0 = socket peer; the managed edge runs 1). The active-install
30+
read is an operator query on the conexus side; there is no `nx` verb.
31+
932
## [7.34.1] - 2026-09-07
1033

1134
Client-only patch. Engine unchanged at engine-service-v0.1.106

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,23 @@ After `/plugin update`, run both steps so the CLI matches the plugin.
9191
Installs that never left ChromaDB (5.x, or 6.x never migrated) take a
9292
different path: [Getting Started § Upgrading from a pre-PG install](docs/getting-started.md#upgrading-from-a-pre-pg-install).
9393

94+
### Telemetry
95+
96+
Once a day the MCP server sends one anonymous ping to the managed service so
97+
the project can count active installs. It carries exactly six fields: a random
98+
install id (a UUID minted on first use, stored in `~/.config/nexus/install_id`),
99+
the conexus version, the install mode (`local` or `cloud`), OS, CPU
100+
architecture, and Python major.minor. No hostname, no paths, no collection
101+
names, no content. It runs on a background thread with a two second timeout
102+
and never blocks or retries. Turn it off with either:
103+
104+
```bash
105+
nx telemetry off # writes telemetry.enabled: false to config.yml
106+
export NX_NO_TELEMETRY=1 # or per environment
107+
```
108+
109+
`nx telemetry status` shows the current setting and the last ping time.
110+
94111
### Something broken?
95112

96113
[nexus-recovery-runbook](https://gist.github.com/Hellblazer/08f0a615e3d73e47d8062bce4829b611) is a

conexus/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "conexus",
3-
"version": "7.34.1",
3+
"version": "7.35.0",
44
"description": "Self-hosted three-tier knowledge management with plan-centric retrieval (nx_answer), specialized agents, semantic search, and RDR decision tracking for Claude Code.",
55
"author": {
66
"name": "Hal Hildebrand",

conexus/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to the conexus plugin are documented here.
44
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
55
Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [7.35.0] - 2026-09-07
8+
9+
Plugin version aligned with conexus 7.35.0. No plugin-side changes.
10+
711
## [7.34.1] - 2026-09-07
812

913
- `rdr-gate` command and skill: a Layer 0 re-gate survivor sweep driven by

conexus/PENDING_RELEASE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ mechanize, it matters enough to ship.
2929
---
3030

3131

32-
## Awaiting the next release or plugin cut (pinned: v7.34.1)
32+
## Awaiting the next release or plugin cut (pinned: v7.35.0)
3333

3434
(none)

docs/cli-reference.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ Every `nx index repo` run also writes a per-repo log file at `~/.config/nexus/lo
108108
- **`nx store import`'s `[embed]` heartbeat** (nexus-s71lr) — the import is one call with no per-record progress at all (worse than the per-file loops: not even a start/end line per record). Same mechanism, armed for the whole call: ` [embed] importing <file> still running (Xs elapsed)` every 5 s, always on.
109109
- **`nx store put`'s `[embed]` heartbeat** (nexus-s71lr pass 3) — a single document is still ONE embed call, and a large document's embed can run a minute+ with zero progress signal. Same mechanism, armed for the whole `db.put()` call: ` [embed] storing <title> still running (Xs elapsed)` every 5 s, always on.
110110
- **`GET /v1/status`** (nexus-s71lr, engine-side) — additive endpoint serving live embed-activity counters (`embedding_mode`, `local_embed_activity` for the local bge path, and — pass 3 — `embedder_activity`, a map keyed by model token covering the cloud-mode Voyage/CCE embedders too, so a cloud install is no longer always `null`). `nx doctor` (also `--check-engine-activity` standalone) polls it and renders one "Engine activity: …" line, falling back to the busiest tracked embedder when `local_embed_activity` is null.
111+
- **`POST /v1/install-ping`** (nexus-h5olw, engine-side) — additive unauthenticated route recording the client's anonymous daily install ping into the global, RLS-free `nexus.install_pings` table (telemetry-014). 202 on accept; 400 on any malformed or over-long field; 429 with `Retry-After` past the mint-route rate limits (per remote address, then per install id). Active installs = distinct `install_id` in the trailing 28 days. See `nx telemetry status`.
111112
112113
**Voyage per-project rate limit (nexus-cy9u7):** the engine embeds server-side on write, so a bulk `nx index` run's real "embed pressure" is its T3 vector-write and catalog manifest-write request rate. Voyage's RPM budget (4000 RPM for `voyage-context-3`) is per PROJECT, not per process or per worker — every concurrent worker thread AND every concurrent `nx index` session sharing that Voyage project draws from the SAME budget. Every write path now routes through a shared process-wide "rate brake" — `HttpVectorClient.upsert_chunks` (the one choke point every T3 write call site funnels through: the ChunkBatcher's combined-write flush, the per-file prose/code fallback, and PDF indexing, which never uses the batcher), the catalog manifest write, and the migration-ETL leg. The first worker to see ANY retryable transient failure — a 429, 502, 503, or 504, or a retryable transport error (connect refused, read timeout, ...), not only a narrow 429/503-with-`Retry-After` signal — pauses EVERY writer in this process until the same shared deadline, instead of each worker backing off independently and re-firing the limit the moment its own backoff elapses (the 2026-08-15 incident, conexus-ddh0/nexus-99r7y: the engine was retrying Voyage internally and the edge's own timeout surfaced to the client as a 502/504 with no `Retry-After` at all — a signal the narrower pre-fix scope would have missed entirely). The pause is floored at the server's `Retry-After` when one is supplied, otherwise an escalating default (2s, doubling per consecutive process-wide trip, capped at 60s); it resumes at the base delay once a write succeeds. `nexus-99r7y` (engine fail-fast with an explicit 429 + `Retry-After` instead of a bare edge timeout) sharpens this signal but is **not required** for the brake to engage — the escalating-default path covers every retryable failure shape either way.
113114
@@ -3792,6 +3793,29 @@ a loud `model_family_drift` warning).
37923793
37933794
---
37943795
3796+
## nx telemetry status / off / on
3797+
3798+
```
3799+
nx telemetry status
3800+
nx telemetry off
3801+
nx telemetry on
3802+
```
3803+
3804+
The anonymous daily install ping (nexus-h5olw): once every 24 hours the
3805+
MCP server POSTs six fields to the managed service's unauthenticated
3806+
`POST /v1/install-ping` route so active installs can be counted across
3807+
local and cloud mode. Fields: `install_id` (random UUID in
3808+
`~/.config/nexus/install_id`), `client_version`, `mode` (`local`/`cloud`,
3809+
the same dispatch `nx init` uses), `os`, `arch`, `python`. Nothing else.
3810+
Daemon thread, 2 s timeout, every failure swallowed at debug level; the
3811+
last successful send is recorded in `~/.config/nexus/install_ping.last`.
3812+
3813+
Opt-out, default on. `off` writes `telemetry.enabled: false` to
3814+
`config.yml`; `NX_NO_TELEMETRY=1` (any value but `0`) wins over config.
3815+
`NX_INSTALL_PING_URL` overrides the target (tests, private deployments).
3816+
`status` prints the decision, its source, the install id, and the last
3817+
ping time.
3818+
37953819
## nx telemetry baseline
37963820
37973821
```

mcpb/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"manifest_version": "0.4",
44
"name": "conexus",
55
"display_name": "Conexus",
6-
"version": "7.34.1",
6+
"version": "7.35.0",
77
"description": "Three-tier semantic memory + knowledge management for Claude Desktop chat. Persistent code/docs/RDR indexing, plan-centric retrieval via nx_answer, and a Postgres-backed storage substrate that interoperates with the Claude Code plugin and the nx CLI on the same host.",
88
"long_description": "Conexus is the Claude Desktop Extension form of Nexus. Same MCP tools and storage tiers as the Claude Code plugin and the nx CLI, packaged as a .mcpb bundle that uv resolves on first install. Persistent state is served by the storage service (Postgres), which `nx init` provisions \u2014 there is no separate daemon to install or talk to. State is shared with any other consumer on the same host (Claude Code plugin, nx CLI, Cowork via SDK bridge).",
99
"author": {

mcpb/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "conexus-mcpb"
3-
version = "7.34.1"
3+
version = "7.35.0"
44
description = "Conexus packaged as Claude Desktop .mcpb (Desktop Extension)"
55
requires-python = ">=3.12"
66
dependencies = [
@@ -10,7 +10,7 @@ dependencies = [
1010
# while collections are indexed at 768/1024-dim, so every T3 search hits a
1111
# dimension mismatch and returns zero results. The .mcpb cannot run the
1212
# interactive `nx init` embedder choice, so it must pin [local] explicitly.
13-
"conexus[local]>=7.34.1",
13+
"conexus[local]>=7.35.0",
1414
]
1515

1616
[tool.uv]

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ build-backend = "hatchling.build"
1212

1313
[project]
1414
name = "conexus"
15-
version = "7.34.1"
15+
version = "7.35.0"
1616
description = "Self-hosted semantic search and knowledge management for LLM-driven development"
1717
readme = { file = "README.md", content-type = "text/markdown" }
1818
requires-python = ">=3.12,<3.14"

0 commit comments

Comments
 (0)