Building internal models of objects, concepts, relationships and state.
Latest74v1
Baseline47.5Oct 8
Live use—last 7 days
Shared copy: the operator's name is replaced with "the operator", machines other than Firefly are named by their role, and one security detail is held back. Nothing else is changed.
Piper — what it is
Objects and relationships live in the entity graph; concepts live in a capability and concept registry that code is supposed to consult before new algorithms are written; state lives in the work ledger, the belief ledger and the document store. Code itself is represented structurally rather than textually — a parse of callers, callees and imports across six languages.
What needs improving: Self-registry now kept current (74% right, all critical versions); her self-description is still stale
Her split into objects, concepts, state and code is good. What representation really comes down to is whether the internal model is accurate and consulted, and there the record is mixed. The code graph is large and fresh: 26k nodes and 196k edges, rebuilt today. The parser supports six languages, but the index holds four. The claim that the concept registry is "consulted before new algorithms are written" is false in practice. The concept tool isn't in her toolset, workers never call it, and capability was used once, on 09-18. Her component registry, the model of herself, is badly stale: it still lists the router at 1.9.4 and the bridge at 1.6.1.
Update 2026-10-09 — first upgrades: the self-registry now keeps itself current (47.5 → 74.0, critical 14/14), the code graph drops deleted files, and her state cards stop presenting registry ghosts as versions
A correction to the baseline first. On 10-08 the registry looked unread: "read for a decision 0 times". That counted only her direct reads. The perception card added in #1 reads the registry for any module it cannot find on disk. In her last ten sessions, 1,387 version lines on her cards came from that fallback, against 2,854 read from disk. Examples: "foundation: version 1.3.0", "games: version 1.0.0", for things with no source file. So the stale registry was reaching her decisions.
1. Self-registry reconciliation (the paper's Intervention 1). A new nightly job, registry_reconcile.py, compares every registry row with the code on disk:
out-of-date rows take the disk version through her own record_version(), so the changelog stays truthful;
rows for files that exist nowhere move to a component_versions_retired table: 20 of them, kept rather than deleted;
the three missing critical components are registered.
Two dry runs, before anything was written, caught rules that would have retired real systems:
the baseline's "backup" exclusion also matched the file recovery_backup.py;
components that live outside the main code folders (freeroam, canvas, games) were read as phantoms.
Those components are now left alone and listed.
same metric as the baseline
10-08
10-09
registry exact-field accuracy
47.5%
74.0%
version accuracy
67.2%
100%
critical components present
11 of 14
14 of 14
critical versions right
3 of 10
all
What is left. The remaining errors are mostly the 84 rows for components outside the main code folders, which the baseline counts as phantoms. Coverage is unchanged at 48%: every registry name becomes a word her card watches for, so registering the other ~285 modules waits until its effect on card noise has been measured. Her self-description (resume_full) is still 1 of 10 versions right; nothing here touched it.
2. Code graph cleanup (codegraph 1.3.0). The index now removes entries for files that have been deleted. The deletion check had failed in all six languages; the battery is now 7 of 7 in each. On her live index the first cleanup removes 31 deleted files (266 nodes, 2,427 edges). A read-only dry run beforehand confirmed every one of them is really gone.
3. Card wording (premise_card 1.3.1, also part of #1). A module known only from the registry is now shown as "registry entry only (records 1.0.0, date); no live source file found…", not as a version fact. Lines read from disk are unchanged.
Readout 10-16. The nightly runs should keep every critical component's registry entry within a day of its file.
Parts that do it
- Firefly: memory/registry_reconcile.py 1.0.0 (cron registry_reconcile.py-5a17, 04:47), memory/codegraph.py 1.3.0, foundation/core/premise_card.py 1.3.1; backups *.bak-claude-*-20261009, registry tables memory/registry-tables.bak-claude-regfix-20261009.json
- Bench: ~/cognition-bench/05-representation/regfix/ (PREREG-R1, dry runs, check A), cgfix/ (PREREG-C2), post/ (score)
Update 2026-10-08 — baseline: her self-registry is 47.5% right (critical components: 3 of 10 versions correct), and nothing she decides reads it; the code graph is 98.7% fresh but never forgets a deleted file
Claude ran the plan's first and third experiments. Both were preregistered (PREREG-A, PREREG-C, hashes in the bench). Everything on her machine was read-only; the snapshot is sealed on the bench machine.
Experiment 1: her model of herself against reality. Each row of her component registry was checked against the live code: does the component exist, is the version right, is the path right.
registry rows
383
exactly right
182 (47.5%)
stale (exists, a field is wrong)
89
phantom (does not exist in any live folder)
106 (27.7%); 86 of them exist only in archive or backup copies
version accuracy
67.2%
coverage of live versioned components
262 of 539 (48.6%)
The registry was last written on 09-29, 9 days ago. Stale rows were last touched a median of 27.9 days ago.
The components that matter most are the most wrong. 11 of 14 critical components are present (missing: the work ledger, harness acceptance, spheres rites). Only 3 of 10 have the right version: router 1.9.4 vs live 1.9.105, bridge 1.6.1 vs 1.106.0, memstore 1.0.2 vs 1.21.1, codegraph 1.0.0 vs 1.2.0; hive, foundationd and the registry's own entry are stale too.
4 rows use a file path or extension as the component name.
Her written self-description (resume) is worse. 62 version mentions, 10 checkable: 1 right, 9 stale. Its header says "Last updated 2026-09-22", although a 10-07 addendum exists.
Does any decision rely on it? This is the question that decides whether the staleness is damage.
- The registry has been read for a decision 0 times by the agent. Its only reader in code is staged_promote, and the one entry it reads (the work-ledger schema version) is correct.
- The resume was read 16 times, every time while she was editing it, last on 09-03. No code preloads it.
- So this is drift that no decision has relied on yet, not cognitive damage. The danger is the day something starts trusting it.
Running old code. foundationd has been up 17.6 days and its file changed 1.8 days ago, so it runs the older version. piper-cli and brainstorm likewise. Her self-model cannot see this at all.
Experiment 3: the code graph. A battery of seven checks per language on small fixture repositories, plus a freshness audit of the live index.
- All six languages parse correctly. "Four indexed" only means there is no Go or Rust code in the folders it indexes; the only such files are in folders it skips.
- The live index is fresh: 2,691 of 2,726 files current (98.7%). 5 were edited after this morning's ingest.
- One real defect, in every language: deleting a file never removes its nodes. 30 deleted files still contribute 263 nodes. Each language passes 6 of 7 checks and fails this one.
- Not preregistered, observed: JavaScript/TypeScript arrow functions are not captured as functions.
Expectations against results. Registry version accuracy above 50% was expected to fail; overall it passed (67%), but critical components failed badly (30%). Router and bridge stale: confirmed. The resume was expected to be better than the registry; it is worse. Drift without decision exposure: confirmed. The code graph was expected to show stale nodes from deletions (confirmed) and over 5% stale files (refuted: 1.1%).
Two corrections in my own collector, both recorded. It counted archive and backup copies as live; the scorer (score05 1.1) now applies the preregistered exclusion, with the change logged. It also marked the work-ledger schema entry unverifiable because it only scanned 400 lines; a direct read shows the entry is correct.
Score. 47.5 is registry exact-field accuracy only (subsuite D). It is not a total out of 100 for representation.
Next.
1. The plan's second experiment: does making her check the concept registry before writing new code actually help? (A/B on consultation.)
2. For the operator: regenerate the registry from the live tree instead of hand-editing it; make code-graph ingest delete nodes of removed files; restart foundationd.
Bench: ~/cognition-bench/05-representation (PREREG-A, PREREG-C, PROGRESS.md, collect05/score05/battery); snapshot sealed root-only on the bench machine.
Test suite baseline 10-08 (preregistered): self-registry 47.5% right, critical 3/10 · upgrades 10-09: registry_reconcile nightly (PREREG-R1 check A pass) → 74.0%, version accuracy 100%, critical 14/14 · codegraph 1.3.0 drops deleted files (battery 7/7 ×6) · premise card shows registry-only modules as such · correction: the card exposed the stale registry (1,387 lines) · readout 10-16 · open: coverage 48%, resume 1/10
Model-versus-reality checks. Questions about entities and relationships ("who/what is X connected to", "are these two entities the same thing"), about code structure ("what calls f", "what breaks if I change g"), and about her own current state. Every answer is checked against ground truth pulled directly from the database, the AST or the live process. Scoring: accuracy, plus entity-resolution precision and recall on a seeded set of duplicates and near-duplicates. The live-use part measures how fresh her self-model tables are against the files on disk.
Dashed line: the suite's baseline. Shaded band: the ± interval. Hollow dots are anchor items carried over from an earlier suite. Scores from different suite versions are not comparable, so each version gets its own panel.
Date
Suite
Type
Score
±
Live use
Cost
Notes
2026-10-09
v1
sealed
74
—
—
—
Live configuration after the 10-09 upgrades, same metric as the 47.5 baseline (subsuite D component-registry exact-field accuracy, score05 1.1 on a fresh collect05 snapshot, 03:27). 366 rows: 271 correct, 89 phantom by the baseline's definition (84 of them exist outside the live roots and were deliberately left), 2 ambiguous, 4 unverifiable. Version accuracy 100%; critical presence 14/14, critical version accuracy 100%. Coverage unchanged 47.8% (non-critical modules not registered yet). Resume still 1/10 versions right.
2026-10-08
v1
sealed
47.5
—
—
—
Self-model accuracy ONLY (subsuite D: component-registry exact-field accuracy), not a /100 total. 383 rows: 182 correct, 89 stale, 106 phantom (86 only in archive/backup copies). Version accuracy 67.2%; critical 3/10 (router 1.9.4 vs 1.9.105, bridge 1.6.1 vs 1.106.0). Coverage 262/539. Registry read for a decision 0 times: drift without exposure. Resume: 1 of 10 checkable versions right. Code graph (PREREG-C): 6/6 languages parse, 98.7% fresh, deleted files never removed (263 orphan nodes). [Correction 2026-10-09: 'read for a decision 0 times' counted only her direct reads. The #1 premise card reads the registry for any module it cannot find on disk: 1,387 version lines on her cards in e80-e89 came from it. So the drift WAS exposed to her decisions.]
Experimental record
One entry per intervention: hypothesis, prediction, before and after, cost, side effects, and the keep-or-revert decision.
2026-10-09 · v1✓ kept47.5 → 74 (+26.5) ± 0
Hypothesis. Self-model staleness is an update-path problem: nothing updates the registry except hand calls, so it drifts (paper Intervention 1).
Research sources
operator's 'representation' paper §30 Intervention 1, §37 thresholds; baseline PREREG-A/C.
Implementation / version
memory/registry_reconcile.py 1.0.0, nightly 04:47 through fcron: stale rows take the disk version via component_registry.record_version (changelog kept); rows with no source file anywhere move to component_versions_retired (20); 3 missing critical components registered. codegraph 1.3.0: ingest prunes files that no longer exist (battery 6/7 -> 7/7 in all six languages; live dry run 31 orphan paths). premise_card 1.3.1: a registry-only module is shown as a registry entry, not a version.
Predicted improvement
critical version accuracy to 100%; exact-field accuracy up sharply; drift within a day.
Regressions
none seen: work_ledger_schema row identical; staged_promote/control checks read only that row.
Lessons learned
Two dry runs caught rules that would have retired real systems (a file named recovery_backup.py read as a backup; components outside the live roots read as phantoms). Registering all ~285 missing modules waits for a card-noise check.