01
Changelog
Rendered at build time from the repository's canonical CHANGELOG.md: the parser copies it out and a parity gate byte-compares the result on every CI run, so what you read here is exactly what is committed there (version truth pinned against package.json). For tagged releases with patch notes, the GitHub releases page is one click away.
Unreleasedpass 357 (the /showcase page: the fleet's portfolio, the self entry, and the submit door)
Added: route ten, the portfolio of real Vant installs
- /showcase SHIPS (the site route table is now ten): case-study
- THE FIRST CARD IS OURS, AS DIRECTED: "Axolotl at Creadev.org"
- THE SUBMIT DOOR: a static prefilled GitHub issue-composer link
- NAV + FOOTER, ONE LIST: WALK gains "Showcase" after Security
- Pins moved with the contracts: config.test.mjs nine -> ten routes;
- Verified: build:home 10/10 (zero warnings), vitest 40/40 (config 6,
Unreleasedpass 356 (docs quality sweep: SEO descriptions everywhere, bottom crosslinks everywhere, and issue #239's HTML residue out)
Fixed: the docs layout's dead script tag and dead CSS (issue #239)
- THE DEAD CLASSIC PAGEFIND TAG (docs/_layouts/default.html):
- THE DEAD LINE-NUMBERS CSS (same file): the
- Issue dhaupin/vant#239 closed on trunk.
Added: page-specific SEO descriptions and bottom crosslinks on every docs page
- DESCRIPTION FRONTMATTER IS NOW ON EVERY PAGE: 71 pages were
- BOTTOM CROSSLINKS ARE NOW ON EVERY SURFACE: the 9 section-index
- THE /status STATIC COPY CAUGHT UP TO THE MONITOR (web/home
- Verified: lint:docs five gates, check-language (`PASS, 209 prose
Unreleasedpass 355 (the /status monitor goes server-side: D1 history, edge sweeps, and the deploy half fully documented)
Added: the D1-backed status monitor (web/home Pages Functions + island)
- THE MODEL: Pages Functions sweep each public asset (six
- THE FILES:
web/home/functions/_lib/status-math.js(pure core, - THE DATABASE IS
vant-pub(named for the site's public-surface - BINDINGS LIVE IN PAGES SETTINGS, NEVER CODE (owner law, no
- DEPLOY.md ROMAN SWEEP: new section 13 (the docs site is
- Verified: lint:home, pilot:pages (GREEN incl. the no-wrangler law),
Unreleasedpass 354 (the whole-page read: every surface read end to end, four drifts caught)
Fixed: what survived the gates was a raw DOM property, a wrong API-limits claim, a missing space, and a leaked lock
- **THE WHOLE-PAGE READ (owner ask: read all of web/home for sense,
- THE PRE-ISLAND PLACEHOLDERS USED RAW
class=PROPS (Status.jsx - THE /terms API-LIMITS CLAIM pointed at the wrong machinery:
- A MISSING SPACE in docs/integrations/index.md (
index.jsbut) - A LEAKED LOCKFILE (models/private/vant/.locks/
- Verified: the full gate train - build:home 9/9 (zero DOM-property
Unreleasedpass 353 (one green for the whole brand; the docs palette rides web/home)
Changed: owner picked web/home's green (#0b8a5c); docs now wear the home palette
- THE CANONICAL GREEN IS WEB/HOME'S (#0b8a5c) (owner direction:
- DOCS TAKE THE HOME PALETTE, NAME FOR NAME (docs/_layouts/
- CODE BLOCKS JOIN THE TERM TILE: the VitePress-era #1e1e1e hard-
- THE VITEPRESS RESIDUE (the freestruct cleanup sweep): bin/
- Verified: build:home 9/9 (favicon baked into dist, changelog json
Unreleasedpass 352 (the fiction sweep, round two: the pages that shipped dead APIs)
Fixed: copy pointing at code that does not exist, now pointing at code that does
- THE EMBEDCONFIG FICTION (docs/essential/boot.md): the "Embedded
- THE WRONGLY-NAMED DOOR (docs/runtime/mcp.md): Remote Access told
- THE BOOT THAT WASN'T (docs/essential/islands.md + cli.md): the
- THE UNROUTED PROGRAMMATIC SURFACE (index.js):
require('vant') - THE AGENTS.md SUCCESSION PATH LIE: the guide said trust levels
- Verified: exports smoke PASS, docs gates PASS (style/links/frontmatter/
Unreleasedpass 351 (the fiction sweep: every live-page error found, fixed)
Fixed: copy that lied about the install path, the clocks, and the page count
- **THE NPM LINK HOLE (homepage hero, the first-win card, and the
- THE DOCS HUB PROMISED 60 SECONDS TWICE (docs/index.md):
- THE HOME SECTION NUMBERS SKIPPED 09/10: after 01-08 the walk
- AGENTS.md TIMED THE QUICK START AT 2 MINUTES: the repo guidance
- NOTED NOT FICTION (verified, left alone): docs pages served with
Unreleasedpass 350 (docs credit, generated stats, walk pins, and the small sweep)
Added + Changed: the /docs footer carries the credit; the stats strip is generated truth; the walk contracts get pins
- DOCS FOOTER CREDIT (docs/_layouts/default.html): the docs hub now
- THE STATS STRIP IS BUILD-TIME TRUTH (the #2 fix): hand-pinned
- THE WALK CONTRACTS GET PINS (the #3 fix):
src/walk.mjsis now - THE #4 SWEEP: nav brand and drawer brand are Links now (no full
- Verified: build:home 9/9 (stats baked: cli 130, mcp 347, lib 182,
Unreleasedpass 349 (the footer says © 2026)
Added: the copyright year joins the meta row
- © 2026 AT THE FRONT of the footer's final sentence (owner
- Verified: build:home 9/9, lint:home PASS (truth + style), changelog
Unreleasedpass 348 (the walk finds /brain/, and the white pages get their observers)
Fixed: two navigation bugs in one shell file
- THE WALK LOOKED UP RAW PATHNAMES: the prerendered site serves
- THE WHITE-PAGE CAUSE (the fx observer lifecycle): the reveal/counter
- Verified: build:home 9/9, lint:home PASS (truth + style), changelog
Unreleasedpass 347 (the external-link affordance: one rule, every door marked)
Added: off-site links wear the arrow-up-right glyph
- THE SYSTEM (owner direction: "an icon for external links"): every
- HOW IT MARKS WITHOUT TOUCHING MARKUP: the glyph is a masked
- Verified: build:home 9/9, lint:home PASS (truth + style gates),
Unreleasedpass 346 (the final footer sentence: one credit line, dofollow door)
Changed: the meta row speaks the closing credit
- THE FINAL FOOTER SENTENCE (owner direction, verbatim): the bottom
- NO DUPLICATE CREDIT: the closer statement's trailing "Free and
- Verified: build:home 9/9, lint:home PASS (truth + style gates),
Unreleasedpass 345 (the footer is two columns: Vant and Learn; the engine mentions leave)
Changed + Fixed: the footer reorganizes around the menu; /status stops listing sister engines
- PRESTRUCT AND FREESTRUCT ARE OFF THE SITE (owner direction): the
- THE FOOTER IS TWO COLUMNS AT EVERY WIDTH: the phone-stacking bug
- Verified: build:home 9/9 (the two-up footer baked on every route: two
Unreleasedpass 344 (quick start folded into /install, and the site went hyphen-voiced)
Changed + Added: the five-minute setup lives at /install; the voice rules ship as a gate
- QUICK START LEFT THE MENU (owner direction): the docs quick-start
- EVERY START/INSTALL BUTTON POINTS AT /install NOW: the home hero
- THE LANGUAGE AUDIT, DONE AS A GATE: scripts/check-web-home-style.js
- Verified: build:home 9/9, lint:home PASS (13 files + the style gate),
Unreleasedpass 343 (the Brain stop gets a page, the menu gets a bolete sidebar)
Added — the /brain marketing page + the walk stop went internal; the drawer went structural
- A REAL BRAIN PAGE (
/brain, the walk's fourth stop is internal - THE MENU ITEM: "Brain (dashboard)" → "Brain" →
/brain— the - THE BOLETE SIDEBAR (.menu-drawer, mirrors web/dashboard's SideNav
- Verified: build:home 9/9 (the /brain route prerenders with the walk
Unreleasedpass 342 (the site tour: the menu order IS the walk, prev/next on every stop)
Added — the page-walk widget (owner direction: "users can walk through the site")
- ONE ORDER, TWO SURFACES: the owner-directed tour (Home → Quick
- THE WALK WIDGET (
AppLayout.jsx PageWalk, one<nav class="page-walk"> - THE CHEESY ROW RETIRED: Security's "Related pages: privacy (what
- CONTACT-FORM OVERFLOW GUARD: the SS overflow was the previous
- Verified: build:home 8/8 (walk widget + new nav order baked into every
Unreleasedpass 341 (the footer closer: an every-page statement, no site tourism)
Changed — the footer blurb is rewritten (owner direction via mobile SS)
- THE CROSSLINK SENTENCE IS GONE — "One of four crosslinked sites:
- THE CLOSER IS A REAL VANT SUMMARY (owner direction: "applicable to
- Verified: build:home 8/8 (the new closer baked into every route),
Unreleasedpass 340 (the counters round: numbers that count, an MCP neighbor, a shorter door)
Fixed — counters stuck at 0 + the CTA copy/wrap
- COUNTERS NEVER OBSERVED (the "190 zeroing bug", found on mobile):
- STAT ROW GAINS "MCP COMMANDS" next to CLI commands:
data-count={347} - CTA COPY: "START IN 5 MINUTES" — owner direction via mobile SS; the
- Verified: build:home 8/8 (counters + 347 + copy baked into dist),
Unreleasedpass 339 (the live-site round: footer in three columns, the route set in the main menu)
Changed — nav + footer after the Pages deploy went live
- THE MAIN MENU CARRIES THE ROUTES:
/changelogjoins the top nav - FOOTER IN THREE COLUMNS (
.footer-grid): the full-width link soup - Verified: build:home 8/8, lint:home PASS (12 files), home suite 6/6
Unreleasedpass 338 (the dependency sweep: everything in range moves up)
Changed — the schema/OG pimp (the owner face now reads like the software it is)
- BIGGER GRAPH (three nodes → four): the every-page JSON-LD gains the
- OG CARD STATICS (web/home/index.html): og:image:width 1200,
- freestruct ADOPTION, SETTLED: npm [email protected] is now live on
Changed - the registry-checked bump pass (2026-10-22)
- In-range/patch round: root
yaml ^2.9.0 → ^2.9.1; docs pipeline - gh-actions refresh: docs.yml/test.yml gain
actions/checkout@v5 - Owner-face JSON-LD (ssr.config.js gains
buildJsonLd()): every page - Registry truth, resolved and UNCHANGED where it stayed: jsqr 1.4.0,
Removed - the two elimination fixes (no majors, no ESM cliff)
chalkOUT (dependency eliminated, API preserved): chalk 5/6 arejs-yamlOUT (never imported anywhere): the ^4.1.1 range sat in
Fixed - web/home can run its tests again (and finally has them)
- THE PRE-EXISTING GAP closed: web/home's
test/test:runscripts - SECOND PASS (same Unreleased block): the pin suite now rides CI —
- THE HOME PAGES SETUP, ON PAPER (DEPLOY.md §12.0): the section the
- THE GATE-WALKER LAW (one blind spot, five walkers): the docs gates
- THE CF PAGES BUILD FIX (first home deploy failed at install): the
- **THE SECOND CRASH REPRODUCED (vant-brain, the dashboard's Pages
Unreleasedpass 337 (/changelog with a hard parity law + npm-compat pins - and the hidden client-bundle fix)
Added - the changelog that cannot lie
- /changelog renders ONLY from CHANGELOG.md:
web/home/scripts/parse-changelog.mjs - The parity gate (
npm run lint:changelog, stepped into test.yml): - THE REAL CATCH this pass: the site has been shipping with NO client
- Verified: 8/8 routes prerendered,
npm run lint:changelogPASS, `npm run
Unreleasedpass 336 (the site gains /install and /security)
Added - the two OSS routes the project was missing
- /install — the money page for clone-shipped OSS, previously buried in
- /security — private-disclosure route (GitHub private security
- Wired everywhere: ssr.config.js (7 routes), client-nav META map, nav
- Verified:
prestruct buildrenders 7/7 routes + artifacts; `npm run
Unreleasedpass 335 (the home site becomes a real React/prestruct multi-route site)
Changed - web/home grows its Vite pipeline (the prd-web §2.5 predicted shape)
- The hand-written lander retires into
web/home/index.bak.html(design /is the lander ported section-for-section — hero with the static- Islands where they earn their keep:
status-board(live surfacing /terms+/privacysummarize the canon (LEGAL.md, docs securityscripts/check-home.jslearned dist: walksweb/home/dist/**.html- Verified:
prestruct buildrenders 5/5 routes + sitemap + robots +
Unreleasedpass 334 (the docs post-render layer converts to npm freestruct)
Changed - the prototype meets its child
- docs/ now consumes npm
freestruct1.0.0 as the post-render SEO layer: - Retired the hand-rolled
docs/sitemap.xml(a stale 2-entry file against - Verified against the 0.9.0 engine source with a synthetic
/vant-nested
Unreleasedpass 286 (② CLOSED on main: the live corridor over brain.creadev.org + the Pages deploy-log warns swept)
Added - the live solve + the build hygiene
- THE MERGED DEPLOY TESTED (PR #221 accepted, main = 8feb448):
- THE NODE PIN, TRUTH-UP (.nvmrc 20 → 22): the Pages builder took
- THE ENTRY CHUNK, REALLY SPLIT (web/dashboard/vite.config.ts): the
- Suite: dashboard build clean (tsc + vite, exit 0, no chunk warn);
Unreleasedpass 284 (the Cairn pitstop: issue #219's `--brains` filter finally reaches the `vant transform` face)
Fixed - the gather-all-brains gap (pin by Cairn on dhaupin/prestruct)
--brains <a,b>ONvant transform(bin/transform.js): the issue #219- THE INVENTORY HONORS THE SAME LAW (lib/transform.js
gatherMode): - THE SILENTLY-SKIPPED PINS (test/transform.test.js): the suite's
- Docs truth-up: cli.md's transform rows were stale verbs
- Suite: transform 16/16, brain-storage-strict 14/14, cli-smoke 2/2
Unreleasedpass 273 (§2.2: the sovereign-profile transport — one sealed file, the pairing loop closes)
Added - the profile rides one encrypted file
- **THE SOVEREIGN PROFILE TRANSPORT (
web/dashboard/src/lib/profile.ts, - THE SETTINGS FACES: a "Sovereign profile (export / import)" card —
- THE PAIRING LOOP CLOSES (modules/pairing): the redeem result now
- Suite: dashboard tsc clean, vitest 77/77 (10 profile pins: canon
Unreleasedpass 272 (§5 rung 2: the context-nonce binding — the key card, and the ride rides LIVE)
Added - rung 2 + the honest key manager + the live corridor
- §5 RUNG 2 — CONTEXT-NONCE BINDING (pod + client, one law): the ride
- THE E2E KEY CARD (Settings): the sovereign profile's honest key
npm run pilot:pairing-ride(scripts/pilot-pairing-ride.js): THE- Fixtures truth-up: the two-relays pilot and the relay suite ride the
- Suite: dashboard tsc clean, vitest 67/67 (3 key-card render pins:
Unreleasedpass 271 (P6b: the pairing-time e2e channel rides — key binding + the live chain)
Added - the binding moment, the sealed ride, and the chain editor
- THE KEY BINDING AT PAIRING (pod, §5 rung 1):
pairing_voucher_redeem - **
relay_rideDOOR VERB (lib/mcp.js) + THE SHARED RIDE CORE - THE CLIENT CRYPTO (
web/dashboard/src/lib/seal.ts): WebCrypto - THE LIVE ROUTE (src/api.ts
exec): usage ON + a bound key ⇒ door - THE SOVEREIGN PROFILE STATE (src/state.ts): chain hops
- THE CHAIN EDITOR (Settings, prd-relay.md 3.3): add = a live read of
- Suite: dashboard tsc clean, web/relay tsc clean, vitest 59/59 (10
Unreleasedlint gate for the web trees (the TS/TSX parse gap is closed)
Added - the web trees lint for real (`npm run lint:web`)
- THE PARSER GAP (
/.eslintrc.jsonoverride +package.jsonlint:web): - **THE CONTROL-CHAR SCAN, REPATTERNED (3 relay webhooks paths guards,
- The unknown-rule disable:
react-hooks/exhaustive-depsdirectives - Suite: lint:web 0 problems / exit 0 (was: 4 errors + 10 warnings
UnreleasedP5b chain (the relay chain READ over the real caps routes)
Added - `/chain` (module #20, prd-carrier-share.md 3.2 P5b, from prd-relay.md 3.3/6.1)
- **THE CHAIN MODULE (
web/dashboard/src/modules/chain,route /chain, - HONEST CAPS RECORDS (
relayCapsin src/api.ts, typed zod): 404 - THE CORE-RUNG BADGE (§5 pin): every hop states the core-rung line
- THE PROBE RIDES THE DOOR (§3.3 probe seam): a
relay.lostbeacon - Suite: dashboard tsc clean; vitest 49/49 (10 new chain pins: caps
Unreleasedissues #212/#213 (the memory-learn prose lane: agent voice is writeable again)
Fixed - the two false-positive walls on the learn lane (from rook on main)
- THE FIELD-SPLIT SCAN (
lib/pipeline.jsrunChain): the brain-write - THE PROSE LANE (
lib/vaf.js,proseContent+PROSE_PATTERNS): - PATH CHECK ANCHORING (
checkPathTraversal): the home-expansion - ACTIONABLE REFUSALS:
Path blockednow names the rule and the - Regression pins (test/memory.test.js): the literal repro bodies
Unreleasedpass 270 (the origins posture is law - intranet LAN-scope relay + the ops CLI faces)
Added - the posture (relay) and the faces (CLI)
- **THE ORIGIN POLICY (
lib/api.js_relayOriginPolicy, one resolver, - THE LAN CARVE-OUT IN THE WALL (
lib/network.js): new - THE KIT DOUBLES THE POSTURE KEYS (`web/kit/contracts
- THE PILOT SWITCHES POSTURE:
scripts/pilot-two-relays.jsnow arms vant travelerIS ROUTED (bin/vant.jsCOMMANDS): cli.md hasvant carrierCLI (bin/carrier.js, the ops face):list(the- Docs truth-up: docs/operations/relay.md gains THE ORIGIN POLICY
- Suite: relay 38/38 (new block 16 pins all postures incl.
Unreleasedpass 269 (P3: the r/2 webhook relay lane rides REAL pods — pilot:relay, the sealed corridor)
Added - the lane the mesh speaks (relays on real pods, no new lib laws)
scripts/pilot-two-relays.js(npm run pilot:relay): the r/2- THE RIDE CORRIDOR (relay.ride, a pod as the sealed ENDPOINT): a
- THE HOP CORRIDOR (relay.hop, a pod as the FORWARDER): a signed hop
- **THE LANE RED TEAM (5 attacks, every one REFUSED or typed, 16/16
- Suite: pilot:relay 16/16 (L/F/R/H blocks), relay suite untouched
Unreleasedpass 268 (P2.5: the artifact rides the wire too — traveler_stamp, both qr halves cross real HTTP)
Added - the raster crosses the wire (the in-memory dock is gone)
traveler_stampdoor verb (lib/mcp.js): the OTHER half of the qr- THE SERVING WALL, ONE LAW (refactor):
traveler_fetchand scripts/pilot-two-pods.jsAct III rewired: pod B's station no- **THE IN-TRANSIT RED TEAM (4 attacks, every one REFUSED, 18/18 pins
- Suite: pilot:pods 18/18 (14 door/boundary + 4 red-team), mcp
Unreleasedpass 267 (P2 two-pod: the raster alone crosses the boundary — traveler_fetch + the wire hook)
Added - the cross-node packet leg (the door, the seam, the demo)
traveler_fetchdoor verb (read-class, lib/mcp.js): a node serves- THE WIRE HOOK (lib/carriers.js):
carriers.setPointerFetch(hook) scripts/pilot-two-pods.js(npm run pilot:pods): the P2 demo —- THE REQUIREKEY POSTURE (demo doors): keyless POSTs answer 401 on
- **THE BOUNDARY RED TEAM (3 attacks, every one REFUSED, 17/17 pins
- Read-class canon grows by one (+2 honest re-pins):
fetchjoins - The one change that stays simulation: the pods are real child
- Suite: pilot:pods 17/17 (14 door/boundary + 3 red-team), carriers
Unreleasedpass 266 (the pilot rides BOTH halves of the qr lane: pointer bridge leg added to P1)
Added - the second bridge leg (scan → resolve → walk certifies, one run)
npm run pilot:mfggrows a leg (B5–B10): after the PLC plate ships- Idempotent re-run law: a second pilot run hits persist()'s
- Suite: pilot 19/19 (13 prior + 6 pointer-leg pins), carriers
Unreleasedpass 265 (pointer-QR: the extended vant frame — lattice-scale identity rides the mark)
Added - the pointer half of the qr lane (one lane, two grammars, auto-detect)
- THE POINTER QR (owner rulings, 2026-10-18): encode(t, 'qr',
- ONE QR LANE, AUTO-DETECT (scan ruling): decode reads any mark and
- RESOLVE-TO-PACKET (scan ruling), fail-closed by law: a pointer
- THE PURE-POINTER OPTION (scan ruling): decode(png, { pointerOnly:
- Suite: carriers 103/103 (the P-block pins: frame grammar, honest
Corrected - the address-space honesty (the 10-billion claim, already fixed in-docs)
- The routeable NSC-9 barcode doorway is 9,000,000,000 addresses
Unreleasedpass 264 (the QR lane is real; the blank becomes the plate)
Added - the symbology lane (a real reader, not a self-confirmation loop)
qrcarrier is REAL (lib/carriers.js): the declared-absent lane- THE QR/PLATE MIX, DECIDED (owner's answers, 2026-10-18): full QR
- Suite: carriers 95/95 (the three 1b/8a/8a-qr pins rotated: png
Changed - naming (pass 262 era renamed in-package)
- THE PLATE RENAME:
blankDefine/blankList/_hydrateBlanksare now
Unreleasedpass 263 (P1 fleet pilot: the line runs, the record refuses — std passive MIS)
Added - the simulated manufacturing line pilot (no new lib laws; the OS held the whole red team)
scripts/pilot-mfg-line.js(npm scriptpilot:mfg): the P1 pilot- THE PLC-DIALECT PLATE, DISCOVERED THROUGH A PILOT (not a demo):
- **THE RED TEAM (7 attacks, every one REFUSED or EXPOSED, 13/13 pins
- Suite: the pilot is a script, not a unit test — exit 1 on any wall
Unreleasedpasses 257-262 (entries reconstituted from code after an in-workspace file loss)
Unreleasedpass 256 (the Traveler joins the OS: pipeline-wired, evented, audited, crew-attributed)
Added - OS integration (the backend-lane completion, before any frontend)
- Pipeline wiring (
lib/traveler.js): reads/writes through the - Agent/team attribution: steps carry
by(explicit >VANT_AGENT - Determinism law:
mintacceptsnow— same payload + ledger + - Suite:
test/traveler-lib.test.js31/31 — the new H-block pins
Unreleasedpass 255 (the Traveler works: backend lib + CLI + MCP door — the auditable pin rides live, ISO 9001 8.5.2 adopted)
Added
- Backend lib (
lib/traveler.js): the clarified object — a holder of - CLI face (
bin/traveler.js): `open / hop / status / audit / - MCP door verbs: `traveler_open / traveler_hop / traveler_status /
- PRD mirror: prd-web §11 gains the owner's clarified framing
- Suites:
test/traveler-lib.test.js25/25 (mint/advance/verify,
Unreleasedpass 254 (the Traveler: the enterprise router object — the schema-rizer is real, kit + pod face in code)
Added
- Traveler kit (tr/1) in
web/kit/contracts/traveler-contract.js: the - Vendor uplift: the relay kit now carries two sources (r/2
- Pod face:
relay.travelbridge family inlib/api.js(plain-copy - Suite:
test/traveler.test.js26/26 — laws, rizer, runtime- - PRD frontlined:
labs/prd-web.md§11 — definition, rizer,
Unreleasedpass 253 (the config-door fix: #205 closed — masked gets, immutable secret sets)
Fixed - security (closes #205)
- config door (#205):
vant_config_getmasks secret keys at the - duplicate-registration bug: a second
vant_config_set - test hygiene: guest roster cap is env-tunable for test harnesses
- Regression pins: 3 new in mcp.test.js (mask, typed refusal +
Unreleasedpass 252 (red team round 5: the config lane — raw-secret read by read-only guests, #205 filed)
Security
- P1 (#205, transparency):
vant_config_getis guest-gated as - Guest issue/verify/gate chain inspected: solid (claim-once hex
- Carried to round 6: agent_spawn quota window, escrow concurrency,
Unreleasedpass 251 (the door fix batch: #203 + #204 fixed at cause, closed on the security PR)
Fixed - security (closes #203, #204)
- door (#203): the CORS class now emits
Access-Control-Allow-Origin - escrow (#204): the approval lane is wired and hardened — exact/
- Disclosure: docs/reference/escrow.md rewritten to the truthful
Unreleasedpass 250 (red team round 4: storage/escrow lanes — approval gate unwired, #204 filed)
Security
- P3 (#204, transparency): the escrow APPROVAL layer (docs: "gate
- Holds: WAL replay containment + blob allowlist + DENIED-not-empty
- Carried to round 5: agent_spawn check-then-act window, escrow
Unreleasedpass 249 (red team round 3: the door lanes — #203 filed, QoS holds)
Security
- P2 (#203, transparency):
lib/server.jsCORS class reflects any - Holds: QoS global cap beats client-id rotation (60/40 burst
- Lanes carried to round 4: WAL torn-write/replay, escrow race,
Unreleasedpass 248 (docs: the industrial router object — the horcrux is the router; prd-automation seeded)
Added - automation arc (docs-only; nothing built per the owner's build order)
- labs/prd-automation.md (v0.1 draft): the automation/industrial
- docs/advanced/nsc9-spec.md: router-object seed section added to
Unreleasedpass 247 (red team round 2: nation-state-lane re-attack — defenses held)
Unreleasedpass 246 (security fix batch: #199 #200 #201 fixed at cause and closed with evidence)
Fixed - security (closes #199, #200, #201)
- search (#199): BM25 TF scoring no longer compiles guest query
- CLI (#200): every git execution in bin/ is argv-routed
- horcrux (#201): the
p_<password>filename is no longer a - Verification: 19-suite sweep green; each issue closed with an
Unreleasedpass 245 (red team: nuclear-scale self-adversarial security sweep)
Security - 3 live findings PoC'd on our own surfaces, filed upstream as #199/#200/#201
- P1 (#199) search: BM25 builds
new RegExpfrom raw guest - P1 (#200) CLI:
execSyncinterpolates the UNVALIDATED current - P2 (#201) horcrux: brain password exposed via argv (
ps), - Frontend/relay verdict from the sweep: clean sandwich — zero
Unreleasedpass 244 (the OSS face: post-merge brain refresh, the stone re-carved, the NSC-9 industrial playbook seed)
Brains + the boot horcrux
- The axolotl brain files updated for the merge state (identity gains
- The boot horcrux refreshed IN PLACE (same
p_password) so the stone
Spec'd - the NSC-9 industrial playbook seed (owner sidebank)
docs/advanced/nsc9-spec.mdgains the industrial/MFG playbook seed:
Unreleasedpass 243d (the CI stabilization trail: green on Actions, four latent classes fixed at cause)
Fixed - the four classes
- Detached-HEAD wording, twice: Actions checks out a PR at a merge
- Raw throw reintroduced into lib/: the RAG projection guard
vant qc --helpside-ran the full battery:bin/qc.jshad no help- Same-port server restart flake: the messages CS door block rebound
Fixed - the two exact-count/one-time assumptions
test/e2e-grand-tour.test.jsgate B demanded/tools === 328— staletest/init-wizard.test.jsraninit --yesONCE then demanded rerun
Pins
- Door pins 28/28 locally + detached-wording probes against a throwaway
Unreleasedpass 243 (the security-pipeline scan: the pod verb, the scanner, the status card, and the objects container spec'd)
Added - `security_pipeline_report` (the pod-side scan)
lib/security-pipeline.js(NEW): walks the pod'slib/tree- The door verb (
lib/mcp.js): admin-only (theguest_list - Live truth at HEAD: 180 modules scanned, 65 with gate wiring,
- Dashboard (status #3): a
PipelineScanCardrenders the report - Spec'd (labs/prd-web.md 4.4 + rows 29-34): the same contract
Pins
test/security-pipeline.test.js(NEW, 8/8): report shape,- MCP docs coverage 332 = 332 (the
security_pipeline_reportrow +
Unreleasedpass 239 (the canonical stone: boot-folder cleanup, the carrier abstraction recorded, horcrux refreshed)
Housekeeping - the boot folder is CANONICAL-ONLY
models/public/vant/boot/now carries exactly: the axolotl stone- Era stones (
buffy-p_buffy2026.svg,nova-p_nova2026.svg) remain in
Spec'd - the covert-carrier abstraction (prd-web.md 4.2)
- QR is promoted from a pairing feature to ONE interface module in a
- Recorded as a REQUIREMENT, not a build-now: lands when a real
The stone, refreshed for onboarding
models/private/axolotl/identity.mdrewritten for the canonical- Horcrux refreshed IN PLACE with the SAME password (
axolotl2026, the
Unreleasedpass 238 (the P2 spawn leg closed: the canSpawn pod-side decision, documented)
Documented - the spawn-leg chain, verified live
- The door's guest gate classifies spawn-class verbs
agents.spawn(lib/agents/core.js) then runs- The host knobs that answer TRUE, by name:
vant org grant
Docs truth upgraded
docs/security/multi-guest-auth.md: the spawn-leg closure statedlabs/prd-web.md: the P3 phase section states landed-vs-remaining
Unreleasedpass 215 (#185 closed: per-guest read-verb enumeration throttle + the docs freshness sweep)
Added - the per-guest read budget (`lib/guests.js` + the door)
guests.checkReadBudget(guestId): fixed-window budget on the door- Defaults: 120 reads per 60s window (a dashboard cadence, not a
- Refusal shape: typed
429withreasonCode: E_GUEST_THROTTLEDand - Hosts and write/exec verbs untouched (the EW4 per-client IP limiter
Docs freshness sweep (owner ask)
- Greps for claims made stale by passes 211-215: none found beyond the
- Full lint stack green: style, links, frontmatter, language, fiction
- New env knobs documented at [Multi-Guest
Pins
test/mcp.test.js(+3, 17/17 x2): the budget trips typed (reads 1-3
Unreleasedpass 214 (#185 channel scope: the owner concept for msg channels + two live bugs found by its own survey)
Fixed - two live bugs the survey caught
msg_sendwrote garbage: the MCP handler passed the STRING contentmsg_listignored its own arguments: the handler called
Added - channel owner (`lib/msg.js` + the MCP door)
msg.send(chan, msg, { scopeOwner }): stamp-on-create binds a NEWmsg.setChannelOwner(chan, ref): claims an unowned channelmsg.channelOwner(chan)accessor;clear()drops the owner WITH the- Door tenant posture (same rule as
agent_list, pass 213): foreign
Pins
test/msg.test.js(+4, 29/29 ×2): stamp-on-create + loud invalid ref,test/guests.test.js(+8, 25/25 ×2): the door truth — public readable,
Unreleasedpass 213 (#185 H5: per-tenant list filtering — the pass-211 boundary closed)
Added - per-tenant roster filtering (`lib/guests.js` + the MCP door)
guests.tenantAgentVisible(agentId, guestOwnerRef): the crew-rosterguests.tenantVisible(recordOwnerRef, guestOwnerRef): the general- Door wiring (
lib/mcp.js):agent_listbehind the exec door filters
Boundary statement (docs/security/multi-guest-auth.md)
- The pass-211 "org-wide lists are operator-trust surfaces" caveat is
Pins
test/guests.test.js(+4, 17/17 × 2 runs): matcher rules (public row /
Unreleasedpass 212 (#185 H2/H3/H4: the event tap, era-context chat, and the composed work order)
Added - work_assign: the composed verb (`lib/mcp.js`)
work_assign: one call = the full work handoff — task text +- Refusal law: every failed leg returns a typed honest refusal
- Explicit
agentIdis honored exactly — never silently replaced with
Added - era-context chat tagging (`lib/msg.js`)
msg.create({ era, task })tags a chat thread with the era (and- era/task ride the arch-A snapshot (
state/msg-conversations.json),
Added - the MCP event tap (`lib/mcp.js`)
- Guests with the spawn role subscribe to a live event family
Pins
test/mcp.test.js(+5): schema gate, absent-agent refusal (rostertest/msg.test.js(+9): tagging, hostile-tag rejection, honesttest/tap.test.js: the fix to the emit→dispatch path plus honest
Unreleasedpass 211 (#185 H1: per-identity multi-guest auth)
Added - guests: the per-identity layer (`lib/guests.js`, NEW)
guests.issue/verify/revoke/list/pair: tokensvguest_<id>_<secret>- Roles ride the capability vocabulary (never a fourth permission
- The door gate (lib/mcp.js): guest tokens verify BEFORE execute and
- Pairing voucher:
vant headlesspersists its pairing code as a - The auth.js seam is REAL for guests:
revokeToken('vguest_...') - Doors: CLI
vant guest issue|list|revoke|pair(routed; cli.md row - Spec + pins: docs/security/multi-guest-auth.md (the full contract
Unreleasedpass 210 (#187 headless: the serving pod + the honest REST retire)
Added - `vant headless` (the headless serving pod)
- One boot = MCP door (3457-class, every registered tool — the door IS the
--helpis honest (dispatcher branch answers it), per the truth-in-help- Pins:
test/headless-retire.test.js(14) — detectMode claims no mode on
Fixed - the honest retire + stale-path sweep
- REST sidecar is health-only everywhere: GET
/tools→ 410 (the MCP door lib/api.js detectMode(): a plain import no longer claims an ambient- Docs truth:
docs/reference/rest-api.md, the DEPLOY.md port-map row,
Owner ruling carried through (no code, verified)
- Leisure/tempo containment: no legacy
models/{leisure,tempo}/migration
Unreleasedpass 209 (#196 ruling: contained ledgers + kernel-driven leisure.autoPursue, ONE pass)
Added - containment: the keepers move into the brain tree
lib/leisure.js: ledger relocatedmodels/leisure/<brain>.json→lib/tempo.js: ledger relocatedmodels/tempo/ledger.json→- Both ledgers ride the gitignored private tree (zero sync traffic);
Added - `leisure.autoPursue`: kernel-driven autonomy, default OFF
- Kill switch:
leisure.autoPursue(config or env - Caps:
leisure.autoPursueMaxWindowMs(default 15 min) + - QoS breaker: circuit OPEN → no play.
- Work precedence: an open era (work owns the attention) or a live
- Executable provider: the kernel executes NO prose - the agent runtime
- Escrow for token-cost steps: a provider declaring
tokenCost: true - Events:
leisure:auto_pursued{ want, windowMs, dailyUsed, dailyCap,
Pins + docs
test/leisure.test.js15 → 21: containment path pin and the FULL gate- Docs:
docs/memory/leisure.md+docs/memory/tempo.mdcontract paths
Unreleasedpass 208 (#196 leisure: the free-time keeper + the zen/dream/tempo loop)
Added - #196 free-time methodology: `lib/leisure.js` + the cohesive loop
lib/leisure.js(NEW) — the want-list keeper: play now persists- The cohesive loop (owner direction this pass):
- Door: `vant leisure
- Psy tree (the methodology):
models/public/vant/leisure.md(the - Skill:
vant-skill-restteaches the drag-free spend: check the - Catalogue:
leisure:wanted/leisure:pursued/ - Docs:
docs/memory/leisure.md+ memory-index row. - Pins:
test/leisure.test.js- want dedupe + file-scoped
Unreleasedpass 207c (pass-190/206 close-out + #195 art packs + #197 tempo)
Fixed - #189 close-out: the last two unexecuted battery items landed
- **Wave 3 gate (R4, #189):
lib/nature.jsaccumulateCosmic()now rides - **Wave 2 / R5 truth-in-help:
bin/encrypt.jsencrypt/decrypt now encrypt - **Battery item 3:
vant healthexit 0; brain re-anchored with descriptive
Added - #197 tempo: the time-dilation keeper (loop first, formula later)
lib/tempo.js(NEW) — an owner-stated wall-clock budget becomes N- Door:
vant tempo begin|status|stop|end|receipts|pace(wired in - Persistence + resumability: ledger at
models/tempo/ledger.json - Isolation rule: a failing slice callback is recorded as its own
- Consciousness idle consult (#196 integration):
- Catalogue:
tempo:budget-start/tempo:slice/tempo:budget-end - Pins:
test/tempo.test.js(14) - duration matrix, sampled-window
Added - #195 art packs: horcrux stones upgrade from 3 circles to generative math-art
lib/art-packs.js(NEW) — deterministic generative art engine for the- Wiring:
canvas.generateHorcruxTemplatedelegates the four reserved - Legacy is byte-exact:
minimal/spiral/default styles keep their - End-to-end receipt:
vant horcrux create --art backup→ 9.5 MB stone, - Pins:
test/art-packs.test.js(14) — determinism (same style+seed → - Future (documented in the note, not this pass): durable seed = brain
Added - Battery item 4 (door sweep): honest auth posture at every key door
- New
config.authPosture()inlib/config.js: ONE resolver-derived - The HTTP server door (
lib/server.js) prints the posture line on listen; - Pinned by
test/auth.test.js(authPosture: OPEN names all consulted
Unreleasedpass 206 (Language gate - contributor prose is English-only, #184)
Added - Language gate (issue #184)
- Detection is a Unicode script-block LONGEST-RUN analyzer (Han,
- Allowlist by construction: fenced blocks and inline-code spans are
- Failure contract: exit 1,
path:line <Script> (N chars): <line>; - Wired in:
npm run lint:docsfinal step and a standalone CI row in
Fixed
- #186/#188 fix-first (crash + honesty bugs, independent of the R1-R5
- #119:
vant org grantpersisted the operator grant, but the write - #120:
teams.createDept/teams.createTeamsilently stored the - The gate's first live run caught its own first real finding: a
- docs/reference/era.md (the Wave-Era page written in pass 205) now
Added - Era (`vant era`): intent → folded record → signed rollup (issues #177/#178; appendix #179 tracked)
- The contract (
lib/era.js): arch-A state store persistence - Event catalogue (
FIELD_FOR_EVENT): 16 families → 5 fields, - CLI (
bin/era.js, dispatcher-routed):era start <intent>/ - MCP +5:
era_start/era_log/era_close/era_current/era_list - Pins:
test/era.test.js7/0 — typed refusals, subscriber no-op - Docs:
docs/reference/era.md(storage, record shape, routing - Appendix (#179) tracked separately: scope-aware eras, agora
Unreleasedpass 204 (QC live-fire — five adversarial holes closed)
Fixed - QC sweep of the U-wave surface (marketplace skills + escrow)
- Score-settlement exploit (
settleSkill): settlement moved REAL - Scarcity bypass (
buySkill): the supply-1 oversell — a skill - Self-dealing (
buySkill): a seller could buy their own listing — - Stealth-refute TTL (
_skillsTtlMs): the brain-config TTL path was - Escrow max-holds starvation (
lib/escrow.js): expired holds were - Supply semantics (decided, not just fixed): skills are labor — a
- Pins:
test/market-skills.test.js19 → 23 (sold-out oversell, - Docs: playbook §8 failure-mode rows + §10 supply semantics
Unreleasedpass 203 (U6.6 — the last three follow-ups resolved)
Added - Wave U6.6: timeout evidence sweep + shill-resistant reputation + the launch decision
- Timeout automation with evidence rules:
skillSweep()releases - Shill-resistant reputation aggregation:
- 'launch'-payload decision — RESOLVED, not deferred: the whole
- Pins:
test/market-skills.test.js14 → 19 (sweep evidence - Docs: playbook §6/6b (sweep economics + reputation teeth) and §7
Unreleasedpass 202 (U6.5 PRODUCTIZED — the skills marketplace is a product)
Added - Wave U6.5: credentialed marketplace gets its product surface (gate ON is an explicit act)
- Real escrow settlement (the honest gap closed this pass):
- Config mounting:
VANT_MARKET_SKILLS_ENABLEDenv alias registered - CLI verb family on
bin/market.js:skill-list(title, --price, - MCP +6:
market_skill_list/_buy/_deliver/_settle/_status/_gate - Skill fields persist:
payloadKind,capabilityTag, - Docs:
docs/operations/skills-marketplace.md(productized - Pins:
test/market-skills.test.js8 → 14 (SINGLE-DEBIT invariant - Still additive follow-ups (unchanged): timeout automation with
Unreleasedpass 201 (Wave U6 prototype — credentialed marketplace)
Added - Wave U6 PROTOTYPE: skills as paid digital labor, gated OFF by default
- The contract (
labs/prototype-marketplace.md): buyers pay - Prototype surface (
lib/market.js/ U6.2):listSkill, - Trust feed (U6.3): settle outcomes write real cooperation
- Adversarial pins (U6.4):
test/market-skills.test.js8/8 — - Regression: market/crossprocess/debit/trust suites green.
Unreleasedpass 200 (Wave U5 — provenance/compliance bundle)
Added - Wave U5: a self-verifying export bundle (tamper-EVIDENCE, fail-closed)
- The L-hash is a RUNNING hash list (
lib/export-bundle.js): - The bundle:
manifest.json(registry export, point-in-time), - Fail-closed verify (U5.2): extra or missing files are TAMPER, not
- Honest scope note (pinned in-suite): a FULL re-forge of every
- CLI +1 bin (
bin/export.js, dispatcher-routed) +2 verbs; pins:
Unreleasedpass 199 (Wave U4 — deliberation→decision records)
Added - Wave U4: a forum decision now knows its THREAD (and the trail survives restart)
- Durable thread→vote linkage (U4.1): `forum.vote(proposal,
- Decision trail reader (U4.2):
forum.threadDecisionTrail(barcode) - Pins (U4.3):
test/forum-decisions-persistence.test.js
Unreleasedpass 198 (post-merge audit — the pool now REALLY debits)
Fixed - scenario escrow debit was bookkeeping-only: the shared pool never drained
Unreleasedpass 197 (Wave U3 — governance scenario playbook + resume materialization)
Added - Wave U3: Governance Scenario Playbook
lib/scenario.js+bin/scenario.js(U3.1): `vant scenario- **U3 carry-over — resume's byte-restoring materialization (closes
- MCP +3:
vant_scenario_crew/_task/_status(309 registered - Docs:
docs/operations/scenario-playbook.md(task flow - Verified:
test/scenario-crew.test.js8/0 (typed gates,
Unreleasedpass 197 (Wave U2 — prd-universe.md)
Added - Wave U2: Stored, Content-Addressed Scenario Manifests
lib/state/genesis-snapshot.jsU2 surface:recordSnapshot()- Rules fix (the U2 opener, from U1's honest limitation):
- MCP +3:
vant_universe_record/_diff/_resume(306 registered tools, - CLI +3 verbs on
bin/universe.js:record(--fork, --state-root), - Verified:
test/scenario-manifest.test.js18/0 (U2.1–U2.5 +
Unreleasedpass 196
Fixed - `vant config get` now reports LIVE values for the domain-tuning keys
Unreleasedpass 195
Added - Wave G: GitProvider stack adopts RemoteTransport (prd-canonicalization §7 adoption wave 3)
lib/remote.js—GitProvider extends RemoteTransport. Every Git- The auth() door is THE credential resolution.
this.tokeninstance - Transport tuning registered:
VANT_SYNC_OP_TIMEOUT_MS, - Read-path compatibility: shared headers/URLs/_requestJson/_gitExec
- Verified: CI 453/0; probe pins — providers are instanceof
Unreleasedpass 194
Fixed - trust.quarantine() async gap
Added - RAG tuning keys go live (spec → implementation)
lib/config.jsgains RAG getters —ragRehydrateMaxSize(defaultlib/search.jsenforces them:hydrate()appliesbin/search.jsusesrag.limitMaxas its default limit ceiling
Unreleasedpass 193
Fixed - Wave A stage 2: the bus is the ONLY emitter (prd-canonicalization §2)
Changed - Registry decision: WIRED WIDER (agent-registry persistence + trust feed)
- Persistent — the agent book hydrates from
- Trust feed — a successful registration now writes ONE positive
registerBrainAgentwired — the pass-old_brainRegistriesdead- Pin suite:
test/agent-registry.test.js(11 pins — persist, trust
Fixed - Config-doc honesty: settings.ini/mood.ini fiction retired (item-1 closeout)
settings.example.ini/mood.example.ini: zero runtime readers.- Docs reconciled to the truth:
docs/reference/config.mdnow labels - The config-precedence contract stands unchanged as landed in pass 188:
0.8.62026-08-29Axolotl "Nuclear Breaking" Refactor
Refactor - Multi-Brain (T1–T4)
pipeline.runnow caches module resolution and supportsasync- "Secured" variants of the brain surface are exported for callers that
- A second private brain ("axolotl") is loaded alongside the public
Refactor - Dead-Code Bloat Removal (T10b–T14b-r1, 5 commits)
Test - Stale Test Fixes (T15, 1 commit)
Migration
Known Issues
test/embed.test.js(9 fails): asserts an embedding abstractiontest/test-escrow.js(4 fails): canSpend/recordSpend/agent
UnreleasedFuture
Added - Durable Docs-Coverage Gates: MCP 300/300 + CLI 122 (pass 192)
scripts/check-mcp-coverage.js— every tool registered inscripts/check-cli-coverage.js— everybin/*.jsmust be- Why "mentioned" (word match) is the right contract: the shape of a
- Verified:
npm run lint:coveragePASS; all four doc gates re-run
Added - Docs Pass: Full MCP Catalog + CLI Coverage Closeout (docs pass 191)
- MCP docs brought up to the CLI doc's standard. Two MCP docs existed;
- CLI doc closeout (
docs/reference/cli.md): the 15 bins without a - Executable verification: doc examples spot-fired through
mcp.execute
Fixed - MCP Fiction Audit: canned tools routed to their real libs (pass 190)
- The walk. All 299 hand-registered MCP tools swept for handlers that
- Handler-shape scan: the remaining 134 auto-flagged handlers were
- docs/reference/mcp-tools.md updated: resolution_track's real params
- Verified: mcp.test 6/6, mcp-schema 13/13, resolution 12/12, test-mcp
Fixed - CLI Walk: bin/nodes, registry, network, connector, cache + backup/brain stubs (pass 189)
- The walk. All 122
bin/CLIs swept for verbs that print canned strings - Julia live-fire verdict (the tracked "skipped" test): the test is
- Sweep confirmed clean: no "not wired yet", "placeholder", "coming soon",
Fixed + Added - Placeholder CLI Verbs Wired + Config-Precedence Docs (pass 188)
- Placeholder CLI verbs wired to their real libs. Four verbs printed
- WHY they were placeholders: each CLI was authored against a lib
- Config-precedence docs landed at the top of
getStorage('repos')ReferenceError fixed (CI-caught). The Wave-D- Verified:
node test/ci.js453 passed, 0 failed (was 452/1);
Added - State-Spine Documentation + Last steveframe Typo (docs pass 187)
- New page: [docs/memory/state-spine.md](docs/memory/state-spine.md). The
- Crosslinked into existing docs: memory index (specialist-formats table),
- Last live
steveframetypo fixed: ROADMAP.md's horcrux-sharing todo - Doc gates re-run green: frontmatter (now 119 pages) + fiction-signature scan.
Fixed - Config Rogue Cleanup + Registry Completion (pass 186)
- Duplicate
msg:object key retired.config.load()definedmsg: steveframe→stegoframetypo fixed. The_configkey was- Stale getters wired through
load().getGithub()and cfR2Bucket()zombie removed. Zero consumers (grep-proved + the- ENV_REGISTRY Wave-B completion: 24 → 43 entries. The 19 vars that
- Pinned by
test/config-registry.test.js(31 pins now, 8 new).
Added - Geometry Precision Wiring + Shim Retirement (pass 185)
- Legacy
Math.imullattice shim retired.lib/geometry/lattice-keys.js lib/geometry/precision.js(#157) is WIRED. Quasicrystal store now- Real engine-parity leg.
quasicrystal.engineParity()runs the SAME - Pinned by
test/geometry-parity.test.js(8 pins); suites green: lib/geometry/fold.js(#154) stays a tested primitive — the facet
Added - Wiring Candidates Landed (pass 184 — hotset, universeSeed, transport verify)
- HotSet (#153) backs the state spine's tree-read hot path.
stateStore.treeFor() universeSeedgot its first WRITER (#158). Genesis's_writeTopology- Transport verify adoption (Wave F §7, wave 2).
lib/sync.jsgains - Pinned by
test/wiring-184.test.js(10 pins): hot cache hit + identical
Added - RemoteTransport Seam (pass 183, prd-canonicalization Wave F)
- The five "send state elsewhere" stacks (sync, org-sync, agora-sync,
- First adopter:
lib/connectors/s3.jsgainsS3Transport— SigV4 - Pinned by
test/remote-transport.test.js(23 pins): validators
Added - Messaging Trio Charters + Shared Envelope (pass 182, prd-canonicalization Wave E)
- The charter is law (labs/prd-canonicalization.md §6): **msg.js owns
- New
lib/messaging.js: the ONE shared envelope — crew-bus's wire - Pinned by
test/messaging-envelope.test.js(32 pins): shape - Consumer suites re-run green: crew-bus 20, stream, agents, forum,
Refactored - storage.js Split (pass 181, prd-canonicalization Wave D)
- The 2,391-line, 8-class monolith
lib/storage.jsis split into lib/storage.jsREMAINS THE IMPORT SURFACE as the factory facade- Ownership matrix landed in
labs/prd-canonicalization.mdappendix - Structural gate updated for the split: the atomic-writes structural
- Suites green: storage 40, brain-strict 14, remote 13,
Refactored - One Hashing Module (pass 180, prd-canonicalization Wave C)
- New canonical surface
lib/hash.js:sha256(input)(one-shot hex), - Every direct
crypto.createHash('sha256')call site inlib/now - Pinned by
test/hash-canon.test.js(29 pins): byte-identity vectors - Migrated suites re-run green: audit, wal, state-wiring,
Added - Event Bus Observability + Wiring (pass 179, prd-canonicalization Wave A)
- The shared bus emitted 266 distinct event names with only 8 heard
lib/event-wiring.js(wired at boot): security denials- FIXED (pre-existing):
lib/health.js runChecks()crashed on every
Added - Config Env Registry (pass 179, Wave B)
lib/config.jsnow owns a 24-entryENV_REGISTRYof everyVANT_*- Straggler modules migrated off direct
process.envreads:
Fixed - Cross-Brain Privilege Leak via Boot Hydrate (axolotl pass 123)
- Boot's persisted operator-capability hydrate resolved the brain via
- Bare
vant orgdefaulted to thegrantsubcommand — any side-effect-free
Added - Brain Layout Migration (merge-safety, axolotl)
vant migrate(lib/migrations.js, layout v3): imports pre-multibrain--brain-name <name>names BOTH imported scopes (defaultvant);- Detection is content-based and conservative; idempotent; failed imports
- Alert surfaces: start banner (real imports only),
vant health,
Fixed - Security & Robustness (axolotl QC waves)
- Git CLI injection closed across
lib/branch.jsand all four git lib/branch.jscrashed withaudit is not definedon every CLI-path- Commit messages are arbitrary text again: strict content patterns no
- Migration import is existing-wins (never clobbers live multibrain
- Brain circuit breaker (BRAIN_CIRCUIT_OPEN) on repeated load failures.
Evolution - Temporal Learning System
- Session tracking: changes, insights per session
- Auto-start/end sessions
- Brain load tracking → attention boosting
- Memory integration: sessions persist for semantic search
- Islands integration: lazy-load evolution data
- MCP tools: brain_evolution_start, brain_evolution_end, brain_evolution_insight, brain_evolution_history, brain_evolution_status
- Dream integration: evolution insights consolidate to learnings
Multi-Brain Architecture v0.9.0
- Stack-based multi-brain loading (pushBrain, popBrain, getStack)
- Brain switching (currentBrain, switchBrain)
- Brain modes: silo, shared, governance
- Brain types: public, private
- State persistence: stack saves to models/state.json
Architecture - Areas to Address
- Current state: Fragmented config across multiple files
- Issue: No single source of truth for configuration
- Task: Unify into layered config system
- Benefit: Easier to understand, configure, migrate
- Current state: lib/boot.js loads layers sequentially
- Issue: Rigid order, hard to customize, hard to add new layers
- Task: Make boot more modular
- Benefit: More flexible, easier to extend, better debugging
- Current state: No formal plugin system
- Vision: Runtime-extensible Vant
- Tasks:
- Benefit: Ecosystem of shareable extensions
0.8.62026-06-30
Feature - Headless Mode (v0.8.6 SCOPE)
- API System (2026-06-30)
- Auth & Pipeline Fixes (2026-06-30)
- Architecture (2026-06-30)
- Agent System (2026-06-30)
- Messaging (2026-06-30)
- Cloudflare Integration (2026-06-30)
- Admin UI (2026-06-30)
- Index Engine (Roadmap)
- Config System Consolidation (Roadmap)
0.8.62026-05-30
Feature - AI-First Runtime Interoperability (v0.8.6)
- Event Wiring (2026-05-30)
- Auto-Islands (2026-05-30)
- Security Chain (2026-05-30)
- Discovery Registry (2026-05-30)
- System Dashboard (2026-05-30)
- User Extensibility (2026-05-30)
- Batch 2: Memory Trio Interoperability (2026-05-30)
- Batch 3: Config Centralization (2026-05-30)
- Batch 4: Boot System Visibility (2026-05-30)
- Batch 5: Duality Bridge (2026-05-30)
- Batch 6: Heartbeat Systems (2026-05-30)
- Batch 7: Coordination Systems (2026-05-30)
- Batch 8: API & Integration (2026-05-30)
- Batch 9: Compute & Embed (2026-05-30)
- Batch 10: Infrastructure (2026-05-30)
- Batch 11: Core Systems (2026-05-30)
- Batch 12: Utilities (2026-05-30)
- Batch 13: Security + Infrastructure (2026-05-30)
Feature - Multi-Agent Orchestration (v0.8.6)
- MCP Agent Tools (2026-05-13)
- Agent Quota (2026-05-13)
- Orchestrator (2026-05-13)
- Agent-Brain Wiring (2026-05-13)
Feature - Git Provider Parity (v0.8.6)
- Multi-Provider Support (2026-05-10)
- Sandbox Refactor - Execution Keeper (2026-05-10)
- Sandbox Keeper Features (2026-05-10)
- Runtime Gate Integration (2026-05-10)
Breaking Changes (v0.8.6)
- Consolidated Cache Module (2026-05-09)
- Deleted Unused Search/Query Modules (2026-05-09)
- Unified Event Module (2026-05-09)
- Deleted Unused HTTP Modules (2026-05-09)
- Unified QoS + Throttler + Debouncer (2026-05-09)
- JobWorker in Cron (2026-05-09)
- Delete Deprecated Wrappers (2026-05-09)
- Sanitize + IPFilter in VAF (2026-05-09)
- Hybrid-Sync in Sync (2026-05-09)
- ErrorHandler in Errors (2026-05-09)
Added
- Vant Class + Agent Runtime (2026-05-09)
Changed
- Runtime renamed to Vant (2026-05-09)
Added
- Core Modules for Vant Class (2026-05-09)
0.8.62026-05-08
Changed
- Search Consolidation (2026-05-08)
- Config+Env Merge (2026-05-08)
- Pool Consolidation (2026-05-08)
- Audit Unification (2026-05-08)
Deleted
- lib/env.js
- lib/buffer.js
- lib/storage.js
- lib/audit-log.js
- lib/metrics.js
Fixed
- framework.js: _configFlag not defined
- test/coverage.js: horcrux require → stego
0.8.52026-05-07
Added
- Encrypt Class
Changed
- Search Consolidation (2026-05-08)
- HTTP Server Consolidation