Splits the old S3d charter: S3d = ops centre ONLY (operations.md becomes a read tributary; strategy-advisor honours the dated frozen-past-self anchor that deprecates older inferences — advisory/reader-side). The hygiene + triple-post reconciliation half (dead content-history.md retirement + post-tracking↔published↔analytics) moves to a new SB-S3e (the last S3 slice). Light-Voyage hardening: scope-guardian ALIGNED (0 creep/gap); brief-reviewer REVISE (5 FIX folded); plan-critic 3 major + 3 minor folded. Baselines verified live: gate 95→97, brain 113→114, ASSERT floor 80→82. The RED-bearing brain-test literal is pinned to the dated-anchor convention (_As of YYYY-MM-DD:_, verified absent) — NOT 'deprecates older inferences', which already ships in the seed comment and would make the RED gate vacuous. Go-before-code gate pending (forks: Option B enrich seed · advisory deprecation · one reader · doc home). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RigJBiRFNtFZKCz21qNbQ4
16 KiB
Brief — SB-S3d: the operations centre (operations.md becomes a READ tributary)
Slice: SB-S3d (the ops-centre sub-slice of SB-S3). Splits the old "S3d hygiene+ops" charter: S3d = ops centre only; the hygiene + triple-post reconciliation (dead
content-history.mdretirement + post-tracking↔published↔analytics) moves to a new SB-S3e (the genuine LAST S3 slice). Status: DRAFT (brief + plan written; light-Voyage hardening + go-before-code gate pending). Predecessors: SB-S0 (scaffold seeds the bareoperations.md) · SB-S3a (the profile.md reader pattern this mirrors) · SB-S3b/c (supersede + cross-silo graph — independent of this).
1. Operator decision (2026-06-23)
The S3d charter bundled three deliverables — (a) flesh out operations.md, (b) retire the dead content-history.md, (c) triple-post reconciliation. Grounding showed a clean fault line: (a) is additive / new / self-contained (touches only scripts/brain/ + one reader agent, never the post silos), while (b)+(c) are coupled (the content-history back-fill question is the reconciliation question) and both touch the loose regex-mutated state silo S3c deliberately avoided. The operator chose Split — ops centre first: S3d ships (a) only; (b)+(c) become SB-S3e, the focused finale. This keeps S3d low-risk and isolates the silo surgery.
2. Why the ops centre, and why now
architecture.md:9 frames the second brain as "memory AND an operations centre." S0→S3c delivered the memory half (profile, ingest, consolidation loop, cross-silo graph). The operations centre is the genuinely-new half (architecture.md:44: "the operations/plans centre is genuinely new"), and today it is scaffold-only: operationsSeed() (scaffold.ts:52-64) writes three bare headers — ## Who I am now (anchor), ## Plans, ## Ideas — that no agent or command reads. Verified: 0 references to operations.md in consolidate.ts/assemble.ts/ingest.ts/cli.ts and 0 in agents/.
The architecture's load-bearing spec is the frozen-past-self guard (architecture.md:59): "operations.md holds a periodic user-authored 'where I'm headed now' anchor that deprecates older inferences." This is the human override on the machine's anti-drift mechanisms (evidence-threshold / decay-flag / anti-sycophancy): where those keep the machine honest, the dated anchor lets the user declare current direction that outranks stale inferences. S3d makes that real — a reader honours the anchor.
It is the right next slice because it is additive / non-breaking, read-only into generation (no engine or silo write), and the natural successor to S3a (same "wire the first reader" shape), now extended with the genuinely-new deprecation semantics.
3. Scope — what is IN (S3d)
-
Enrich the
operations.mdseed so the frozen-past-self guard is operational.operationsSeed()(scaffold.ts:52-64) currently ships bare headers. The genuinely-new seed content is the dated-anchor convention_As of YYYY-MM-DD:_under the anchor (verified ABSENT from the current seed —grep "As of" scaffold.ts= 0) plus light item-format guidance for Plans/Ideas. Rationale: the guard "deprecates older inferences" — that is inherently temporal, so the anchor must carry a date the reader can compare against a profile fact'slast_seen. NB: the phrasedeprecates older inferencesis NOT new to the seed — it already ships in the seed's guard comment (scaffold.ts:58) — so the seed's new-coverage test must key on the date convention, not that phrase (else it passes pre-enrichment; see SC3). Idempotency is existence-skip:initBrainwrites a seed file only when it is absent (scaffold.ts:105-113), so an existingoperations.mdis never re-touched and a user edit is structurally safe regardless of seed content.- Fork (open question for the go-gate): the lighter alternative is reader-only, no seed change (Option A) — wire the reader against the existing bare seed. Recommended: Option B (enrich), because an undated anchor makes the guard vague. See §8.
-
Wire
strategy-advisorto readbrain/operations.md. Add the file to the agent's existing Step 0 Load-Context block (strategy-advisor.md:41-48) and a short consumption subsection immediately after the profile subsection (:63). The agent reads the markdown in-context (no parser — Claude is the retrieval engine,architecture.md:14; consistent with S3a). -
Consumption contract — the frozen-past-self guard (advisory / reader-side).
- The anchor (
## Who I am now) is the user's own dated declaration of current direction — it is authoritative, and it deprecates older inferences: when abrain/profile.mdDynamic fact predates the anchor's date or contradicts its stated direction, prefer the anchor and flag the older fact as possibly-stale — do not parrot it. - Anti-sycophancy INVERSION (the genuinely-new nuance): profile facts are evidence to TEST (S3a — challenge them); the anchor is the opposite — it is user-declared direction, not an inference to challenge, so it is honoured rather than counter-pressured. (It is direction, not praise — honouring it never licenses flattery.)
- Plans = active commitments (current intent). Ideas = parking lot (suggestions, not commitments). Weigh accordingly.
- Durable sentinel literal for the lint:
deprecates older inferences(verbatimarchitecture.md:59).
- The anchor (
-
Graceful absence.
brain/operations.md(or an empty anchor) → the agent degrades silently — no error, no "missing ops centre" noise; it proceeds on its other context sources. (Fresh installs have no brain untilbrain init.) -
Deterministic wiring test — a new Section 16e in the
test-runner.shgate, modelled byte-for-byte on Section 16d (SB-S3a): two UNCONDITIONAL checks — (a) a non-vacuity self-test (full-wiring probe detected; 3 under-wired probes — incl. a sibling-filebrain/profile.mddecoy — rejected); (b) a real-file grep assertingstrategy-advisor.mdcarries BOTH literalsbrain/operations.mdanddeprecates older inferences.ASSERT_BASELINE_FLOOR80→82 (+2, lockstep). If Option B: a newscaffold.test.tscase asserts the dated-anchor seed convention →BRAIN_TESTS_FLOOR113→114. -
Doc/count reconciliation. Update
architecture.md:80(the SB-S3 build-row) to reflect the split: S3d ✅ ops centre · S3e remains (content-history retirement / triple-post reconciliation). Update STATE telling (gate 95→97, ASSERT floor 80→82, brain 113→114). No CLAUDE.md count change (no new agent/command/reference doc;strategy-advisormodel/frontmatter unchanged).
4. Non-goals — what is OUT (deferred)
- The hygiene + reconciliation half (b+c) — dead
content-history.mdretirement and post-tracking↔published↔analytics reconciliation. This is SB-S3e (the new last slice). S3d touches no post silo, nostate-updater.mjs, nocontent-historysurface. - Code-enforced deprecation. S3d's guard is advisory (reader-side): the agent prefers the dated anchor. It does NOT add a seam that makes
consolidate.tsread the anchor and down-weight/flag older profile facts during--propose. That engine change is heavier (touches the sole writer ofprofile.md) and is an explicit follow-up, not S3d. - A second reader.
content-planneris the obvious next consumer (plans/ideas feed planning); S3d wires exactly one agent (strategy-advisor, which already readsprofile.md) — the smallest valuable proof. Follow-on. - A parser / new
.mjsfor operations.md. It is user-authored prose consumed in-context; it needs no TS grammar and no twin.mjsparser. (The only TS touched is the seed string inscaffold.ts+ its test.) - Any WRITE path to
operations.mdfrom the motor. It stays user-authored; the scaffold's existence-skip is the only code that touches the file, and only to create it once (never re-touched once present). - A "Maskinrommet cockpit" surface.
architecture.md:4reserves the day-to-day cockpit for a future thin layer that reads/writes through the store. S3d ships the store substrate (a read tributary), not an end-user cockpit.
5. Boundaries / invariants (must hold)
- READ-only into generation — S3d adds no write path to any brain file;
brain consolidate --apply --confirmstays the sole writer ofprofile.md, andoperations.mdstays user-authored. - No post-silo contact — zero edits to
state-updater.mjs,## Recent Posts,content-history, analytics, or any tributary JSON. (That is S3e.) - No tributary schema change — operations.md is a hub file, not a tributary schema; no
ingest.ts/assemble.ts/consolidate.tschange. - Idempotent + no-clobber — the enriched seed must preserve
initBrain's existence-skip (a seed is written only if the file is absent,scaffold.ts:105-113); a user-editedoperations.mdis never overwritten (scaffold.test.ts:70-77must stay green). - Fresh-clone safe — missing brain → the reader degrades silently; the seed change cannot crash a fresh init.
- Anti-sycophancy preserved — the profile reader's
evidence to TESTstance (S3a / Section 16d) is untouched; the anchor's authoritative stance is an addition for a different file, never a weakening of the profile stance. - TDD iron law — the failing Section-16e check (and, Option B, the failing scaffold seed assert) lands BEFORE the agent/seed edit.
6. Success criteria (testable)
- SC1 — wired:
strategy-advisor.mdStep 0 context-load includesbrain/operations.md. (lint, deterministic — Section 16e Check B) - SC2 — guard framed: the operations-consumption subsection carries the exact durable literal
deprecates older inferences, asserted by an exact-literal grep + a non-vacuity self-test with a sibling-file decoy (repo idiom, Sections 13/16c/16d). (lint) - SC3 — seed operational (Option B):
operationsSeed()ships the dated-anchor convention_As of YYYY-MM-DD:_; a NEWscaffold.test.tscase asserts that exact convention (the RED-bearing literal — verified absent from the current seed, so it fails first; thedeprecates older inferencesphrase already ships and is a non-RED companion only).BRAIN_TESTS_FLOOR113→114 (verified current reportedtests 113, so new floor = recorded + 1). RED proof recorded: run(cd scripts/brain && npm test)against the un-enriched seed and confirm the new case fails BEFORE the seed edit. (brain suite) - SC4 — gate green:
scripts/test-runner.shstays green with Section 16e; TOTAL 95→97 (verified current 95; +2 unconditional checks; recount live at land rather than assume). The hook suite (separate runner) untouched (no hook path changes). - SC5 — assertion floor honoured:
ASSERT_BASELINE_FLOORbumped by exactly the new unconditional checks (+2 → 82); the self-count check passes. - SC6 — graceful absence (manual/behavioural):
strategy-advisorwith nobrain/operations.mdproduces normal output, no missing-file noise. - SC7 — guard works (manual/behavioural):
strategy-advisorwith a populated dated anchor that contradicts an older profile fact prefers the anchor and flags the older fact as deprecated/stale, not parroted — the frozen-past-self override observably fires. Honesty hedge (verifiseringsplikt): if a per-call data-root cannot be exercised, this is recorded as wiring-inspected-only, NOT a behavioural pass — never record a guard-fires pass that was not actually run.
7. Verification
- Deterministic (gate): SC1/SC2/SC4/SC5 via Section 16e in
test-runner.sh; SC3 via the brain suite (cd scripts/brain && npm installbefore the gate, else it warn-skips — STATE rule). No hook path changes → hook suite untouched. - Behavioural (manual, documented — the honest limit): SC6 + SC7 — agent-prompt behaviour is not unit-testable (command-testing workstream still open). The plan includes a documented manual run: (a) empty-brain → clean output; (b) seed a temp
operations.mdwith a dated anchor that contradicts a hand-written profile fact → confirm the anchor wins and the older fact is flagged. Record the result in STATE/changelog at land; never overclaim a behavioural pass not run (verifiseringsplikt).
8. Open questions for brief-review / the go-gate
- Seed enrichment (Option B) vs reader-only (Option A). Recommended B — a dated-anchor convention makes the temporal guard operational; A leaves the anchor undated and the guard vague. B costs one seed function + one brain test (
BRAIN_TESTS_FLOOR+1). Confirm at the gate. - Advisory vs code-enforced deprecation. Recommended advisory (reader-side) for S3d — keeps it additive, no engine change. Code-enforcement (consolidate.ts reads the anchor date to flag older profile facts) is a flagged follow-up. Confirm the deferral.
- One reader (
strategy-advisor) for S3d. Confirm;content-planneras second reader is follow-on. - Doc home for the contract. Recommended: update
architecture.md:80(the build-row, now partly false post-split) + let the brief/plan be the contract record. Confirm we do NOT touchconsolidation-loop.md(that doc is the profile motor contract; operations.md is not in that loop).
9. Light-Voyage review — folded
Three reviewers ran on the brief + plan (2026-06-23):
voyage:scope-guardian: ALIGNED — 0 creep, 0 gaps, 0 dependency issues. Every IN item maps to a plan step; no OUT-list file is touched (the only mentions of post silos /consolidate.ts/content-historyin the plan are the scope-fence list + thearchitecture.md:80doc string that assigns them to S3e). Doc reconciliation stays minimal. Proportional.voyage:brief-reviewer: REVISE → 5 [FIX]es folded:- FIX-1 (load-bearing): the sentinel
deprecates older inferencesalready ships in the seed (scaffold.ts:58) and atarchitecture.md:59— so a seed test keyed on that phrase passes GREEN pre-enrichment, collapsing the TDD RED gate. Folded: SC3 + §3.1 now pin the new seed assertion to the dated-anchor convention_As of YYYY-MM-DD:_(verified absent:grep "As of" scaffold.ts= 0). The agent-file Check B still greps the phrase (correct there — the agent file does NOT yet carry it). ✅ - FIX-2: SC3 now requires a recorded RED proof (run the brain suite against the un-enriched seed, confirm the new case fails first). ✅
- FIX-3: "compare-then-skip" was a mischaracterization —
scaffold.ts:105-113is existence-skip (writes only if absent; no content compare). Corrected in §3.1/§4/§5. ✅ - FIX-4: SC7 now carries the honesty hedge (wiring-inspected-only unless a per-call data-root is exercised). ✅
- FIX-5: gate TOTAL treated as "expected +2, recount live"; verified live: 95 → 97. ✅
- Floor arithmetic confirmed correct by the reviewer:
ASSERT80→82,BRAIN113→114.
- FIX-1 (load-bearing): the sentinel
voyage:plan-critic: 3 major + 3 minor (folded into the plan, seeplan-sb-s3d.md§"Plan-critic — folded"): the brain-test RED literal (= FIX-1), the recorded brain floor (verifiedtests 113→ 114),grep -qFfixed-string pinning, header-enumeration range:33-37,operationsSeed()cite incl. braces, and the load-bearing retained##anchors forscaffold.test.ts:48-58.
Net: scope unchanged; the folds harden the TDD RED guarantee (the one real hole) + correct two prose mischaracterizations. Brief-reviewer's residual verdict after folds: structurally sound, well-scoped, honest.