linkedin-studio/docs/second-brain
Kjell Tore Guttormsen 585f972a05 feat(linkedin-studio): SB-S3b — supersede arm in the consolidation engine [skip-docs]
The engine can now RETIRE a fact via an operator-gated, explicitly-signalled
temporal-update supersede — completing the consolidation motor's one S2 TODO
("no supersede in S2 — that's S3"). A `supersedes` signal on a candidate retires
the stale fact (re-minted to an archival id, status: superseded, REPLACED IN
PLACE, retained as audit) and installs the new winner under the canonical key-id,
so mintEntityId(key) always points at the live fact.

- consolidate.ts: Candidate.supersedes? + ProfileDiff.supersedes (SupersedeOp
  carries the full winner fact, so applyDiff stays a pure projector). proposeDiff
  value-guarded routing fork (routes only when the target holds a DIFFERENT value —
  else a re-sent signal would self-supersede every run) + intra-batch
  first-supersede-wins guard. applyDiff replace-in-place + value-matched state-check
  (oldId present, active, value===oldValue) → idempotent re-apply + stale-diff safe;
  superseded facts never bumped/promoted (supersede wins). Decay excludes superseded.
  archivalId seeded with the pre-archival id (collision-free).
- cli.ts: renderDiffMd `## Supersessions (old → new)` (rendered last, only when
  present → zero-supersession diffs stay byte-identical); validateCandidates optional
  single-line `supersedes`; `--gather` profileFacts filtered to active (superseded
  archival facts never re-presented as live context).
- Tests: +12 brain (consolidate 10 + consolidate-cli 2). TDD: RED (6 fail) → GREEN
  (94/94). BRAIN_TESTS_FLOOR 82->94; ASSERT_BASELINE_FLOOR unchanged at 80 (no new
  test-runner.sh section). Gate 95/0/0.
- Docs: consolidation-loop.md rule table + honest-limit reconciled (the operator
  gate is the only classification net); engine docstring updated.

All 13 success criteria deterministically tested (unlike S3a, no behavioural-only
SC). READ-only gate unchanged — brain consolidate --apply --confirm stays the sole
profile.md writer. Scope held: scripts/brain/ only; temporal-update only
(condition-dependent/distractor deferred).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RigJBiRFNtFZKCz21qNbQ4
2026-06-23 19:58:09 +02:00
..
research docs(linkedin-studio): second-brain architecture (approved) + 3 research reports 2026-06-23 12:55:17 +02:00
architecture.md chore(linkedin-studio): release v0.5.2 — SB-S2 evolution loop 2026-06-23 17:11:38 +02:00
brief-sb-s1.md docs(linkedin-studio): second-brain SB-S1 brief + plan (review-hardened) 2026-06-23 14:51:29 +02:00
brief-sb-s2.md docs(linkedin-studio): second-brain SB-S2 brief + plan (review-hardened) 2026-06-23 16:57:17 +02:00
brief-sb-s3a.md docs(linkedin-studio): SB-S3b brief + plan — supersede arm (light-Voyage hardened) 2026-06-23 18:51:25 +02:00
brief-sb-s3b.md docs(linkedin-studio): SB-S3b brief + plan — supersede arm (light-Voyage hardened) 2026-06-23 18:51:25 +02:00
brief.md docs(linkedin-studio): second-brain SB-S0 brief + plan (review-hardened) 2026-06-23 13:24:18 +02:00
consolidation-loop.md feat(linkedin-studio): SB-S3b — supersede arm in the consolidation engine [skip-docs] 2026-06-23 19:58:09 +02:00
ingest-manual-import.md feat(linkedin-studio): SB-S1 wire voice-trainer to published-only + gate-enforce it [skip-docs] 2026-06-23 15:02:32 +02:00
plan-sb-s0.md docs(linkedin-studio): second-brain SB-S0 brief + plan (review-hardened) 2026-06-23 13:24:18 +02:00
plan-sb-s1.md docs(linkedin-studio): second-brain SB-S1 brief + plan (review-hardened) 2026-06-23 14:51:29 +02:00
plan-sb-s2.md docs(linkedin-studio): second-brain SB-S2 brief + plan (review-hardened) 2026-06-23 16:57:17 +02:00
plan-sb-s3a.md docs(linkedin-studio): SB-S3a brief + plan — first profile.md reader (light-Voyage hardened) 2026-06-23 18:09:54 +02:00
plan-sb-s3b.md docs(linkedin-studio): SB-S3b brief + plan — supersede arm (light-Voyage hardened) 2026-06-23 18:51:25 +02:00