Skip to content

Releases: abm9111/chamber

v0.1.5 — a moved passage stops reading as a broken one

Choose a tag to compare

@abm9111 abm9111 released this 19 Aug 11:20

A moved passage stops reading as a broken one

If you run chamber verify in CI, 0.1.4 fires on every passage below an insertion. The pin formula contains the passage's position (path#pN), so adding a section at the top of a note re-slots everything under it and each pin reports hash_mismatch against text that did not change.

That is not a rare shape. A backtest over a real 44,000-passage vault measured nine false alarms from a single edit — half of all passage-level alarms inside edited files. A drift gate that cries wolf on an ordinary edit is one its reader learns to skip, which costs more than the feature is worth.

0.1.5 reports those as relocations: support intact, both positions named, kept out of the exit code. A genuinely edited passage still fails the run.

9 pinned passage(s) found at a new position in the same file:
  moved: 10 - Infrastructure/Skills Index.md#p0 → #p1
  (the pinned text was found intact at these positions; a duplicate
   passage in the same file is indistinguishable from a move)

The rescue is scoped to one file under one ingest root and requires byte-identical content through the same hash formula the pin was minted with, so it cannot weaken into a similarity match. verify --json gains relocatedPins and per-belief relocations; the composite Action passes them through untouched.

Measured, not asserted

scripts/backtest_drift.ts is the harness that found the defect, shipped so the claim can be re-tested against any git corpus instead of taken on trust:

npm run backtest:drift -- --repo ~/notes --from <rev> --exclude 'Private/**'

It stratifies on the interval's own diff (a uniform sample over 44k passages where 34 changed reports "recall n/a" — a clean-looking result that measured nothing), and it self-tests its ground-truth classifier against the starting state before reporting anything, because the first version of that classifier was wrong and confidently so.

On the vault it was built from: recall 100%, precision 84.6%, zero alarms across 366 untouched pins. The two remaining false positives are chunk-boundary re-cuts, and they stay alarms deliberately.

What is still true

A pinned passage that is edited while a byte-identical copy of its old text survives elsewhere in the same file reads as a move. Content-addressing cannot separate "the same paragraph, moved" from "a different paragraph that reads identically" — docs/KNOWN_LIMITATIONS.md entry 6 carries the full account and the fix it needs. Surfaces no longer claim "support intact" without saying so.

Also

  • 0.1.0 deprecated: same broken install as 0.1.1/0.1.2 (no dist/), missed when those were deprecated.
  • Eight probes now gate CI, up from six.

Full changelog: v0.1.4...v0.1.5

v0.1.4 — the stub says so, and the action stopped pasting input into a shell

Choose a tag to compare

@abm9111 abm9111 released this 17 Aug 18:00

0.1.3 answered from the canned stub, unlabelled, whenever a config omitted model.mode — canned prose above a per-claim citation verdict block, which reads exactly like a real model declining for lack of sources. This release exists mainly to stop that.

Fixed

  • ask and chamber_ask now render a stub disclosure above the answer, from one shared function, on stdout and inside the MCP tool result (KNOWN_LIMITATIONS 19). AskResult is a discriminated union, so an answer with no recorded author is unrepresentable rather than merely discouraged.
  • The composite GitHub Action no longer interpolates caller-supplied inputs into run: shell text, and neither does its own selftest. An adversarial CI job now hands the action a payload and fails the build on a canary.
  • The Docker image runs as node rather than root; ten uses: lines are pinned by commit digest; both workflows declare permissions: contents: read.

Removed

  • vendor/xenova-transformers/ — 11k lines of Apache-2.0 code nothing imported, with an unidentified upstream revision, invisible to npm audit, Dependabot and SBOM tooling.

Gates

Two new ones: probes/harness_declaration_guards.ts, plus subprocess tests driving the real CLI and MCP surfaces rather than the function behind them. The harness had been silently dropping async tests declared after its drain loop while still printing N/N passed, exit 0.

374 tests · 6 probes · typecheck · lint · demos. Verified from the packed tarball at a neutral cwd, not from the repo.

v0.1.3

Choose a tag to compare

@abm9111 abm9111 released this 14 Aug 11:35

The release that makes the npm package actually work — and the repo now ships its own GitHub Action.

The confession first (KNOWN_LIMITATIONS entry 18, dated correction included): 0.1.1 and 0.1.2 were never installable via npx. Current Node refuses to strip TypeScript types under node_modules on every release line tested, and the tarball didn't ship the try-demo fixtures. Local verification was green the whole time because npm resolves a matching local package before the registry — the checks never tested the real path. The action's own self-test caught it on a stock CI runner.

Fixes:

  • The tarball now ships compiled JavaScript (prepackdist/; the bin shim prefers it, clones still run TypeScript-direct on 23.6+). npx -y @bu7umaid/chamber try works from a clean machine — verified against the packed tarball from a neutral directory before this release.
  • fixtures/demo ships, so try runs everywhere.
  • New: the CI drift gate is one lineuses: abm9111/chamber@v0.1.3. The action runs its own checked-out source (no npx, no install, exact tag semantics) and fails the build when a pinned doc claim's ground moves. docs/CI_DRIFT_GATE.md is the recipe; the repo's own CI runs the action against its own docs.

Also since 0.1.2: MCP tool annotations, and the embedding-space mismatch names itself instead of reporting 'nothing matches'.

v0.1.2

Choose a tag to compare

@abm9111 abm9111 released this 14 Aug 09:25

The dogfood release: everything here came from using the tool on its own development and letting cold reviewers at the repo.

  • CI drift gate: chamber verify --json (machine-readable exit contract, names its database), a runnable demo (demos/06_ci_drift_gate.ts) and a one-page recipe (docs/CI_DRIFT_GATE.md) — doc claims pinned to code passages, the build fails when the code moves. No model involved in the check.
  • Fixed: stale code generations. Re-indexing edited code duplicated rows (content-derived ids), so pins verified forever and retrieval served old and new code as equally verified. Re-index now sweeps the file's unrewritten rows.
  • Retrieval-miss disclosure: when a rare term from your question exists in a passage the model was never shown, the answer says so, next to the answer.
  • verify names its blind spots: sourceless beliefs (outside scope) and pinned files no longer on disk (report-only until tombstones).
  • tool_drift fires: per-tool MCP pins are finally read — roster changes vs a rewritten tool are diagnosed separately, drifted tool named with facet.
  • Ingest batch-embeds per file — the 75-minutes-class corpus re-embed drops to minutes; loud fallback, never half-batched.
  • Seed retrieval golden set (npm run eval:retrieval, report-only) and dated corrections on three KNOWN_LIMITATIONS entries that overstated weaknesses.

v0.1.1

Choose a tag to compare

@abm9111 abm9111 released this 12 Aug 19:10

One addition: chamber mcp.

The npm package now serves the MCP tools in a single command — a client config is just:

npx -y @bu7umaid/chamber mcp

It answers initialize/tools/list before any config exists; tool calls resolve config on first use. Hosts that spawn with a minimal PATH should still name absolute interpreter paths (see README).

Also corrects the README paragraph about npm run probes, which passes today.

v0.1.0

Choose a tag to compare

@abm9111 abm9111 released this 12 Aug 11:26

First tagged release.

Chamber answers questions from your own notes with citations back to the exact passage, hashes those passages when it cites them, and tells you when a source changed underneath a conclusion you already drew.

  • Local-first: node:sqlite and files on your disk. No account. No cloud call unless you point it at one.
  • Zero runtime dependencies. Node 23.6+ (runs TypeScript directly, no build step).
  • The drift-detection half needs no model. The Q&A half takes any OpenAI-compatible endpoint, including localhost.
  • MCP server included (chamber_ask, chamber_verify, chamber_corpus).
  • docs/KNOWN_LIMITATIONS.md lists 17 known limitations, including the unflattering ones.

Try it on a throwaway folder — no config, no database, no network:

git clone https://github.com/abm9111/chamber && cd chamber
npm ci && node --experimental-strip-types src/cli.ts try