> PROJECT index (all agents here load it). Keep under ~17KB — past the read limit the TAIL IS
> SILENTLY DROPPED. Compacted 2026-08-03: 37.5KB->25.6KB->19.7KB->here, NO topic file deleted;
> 41 entries lost their index LINE, then 11 were RESTORED (doyle's mechanism-not-event test: a
> write-up whose MECHANISM can recur is a hazard wearing a date and keeps its pointer). 30 stay
> dropped, all closed events. 194 files in this dir have no index line — 153 orphaned by EARLIER
> passes and never mechanism-tested. Grep this dir; do not assume the index is the population.
> 2026-08-04: gate/test craft SPLIT OUT VERBATIM to GATE-TEST-INDEX.md (23.3KB -> 14.2KB, 29
> entries MOVED, zero dropped, diff-verified byte-identical). Growth is handled by SPLITTING a
> whole section out to a 🔎 sub-index, never by dropping entries — the ~17KB nag is refused.
> 2026-08-19: judgement rules SPLIT OUT VERBATIM to JUDGEMENT-INDEX.md by the same method
> (21.9KB -> 13.6KB, 24 entries MOVED, zero dropped, byte-identity asserted in the move script,
> not eyeballed). The nag fired again mid-split and was refused again: it asks for compaction,
> and compaction is what cost this index 30 pointers in 2026-08-03.
> 2026-08-22: change-shape traps SPLIT OUT VERBATIM to CHANGE-SHAPE-INDEX.md, same method (25,938
> -> 20,331 bytes, 12 entries MOVED, zero dropped, byte-identity asserted per line in the move
> script). ⚠ MEASURED, not assumed: the index was ALREADY OVER its 24,436-byte read limit BEFORE
> that session's one-line addition — the tail was being silently dropped at the time, so "my edit
> caused it" was the flattering read and it was wrong. SIDE EFFECT DECLARED: the rewrite also
> normalized this file CRLF -> LF (84 CRLF -> 0); entry CONTENT is byte-identical, the line
> TERMINATORS are not. There is no single house form here — GATE-TEST-INDEX is CRLF, JUDGEMENT-
> and HAZARD-INDEX are already LF — so it was left LF rather than restored.

- 🔎 [HAZARD-INDEX.md](HAZARD-INDEX.md) — defect/mechanism sub-index, read when HUNTING a symptom: attach wedges, apply/adapter defects, Windows traps, rig traps, + a RETIRED list you must NOT act on. This file = RULES you obey; that = MECHANISMS you consult. Neither is the population.

## Judgement rules (binding)
- [measure the diagnosis, incl. YOUR OWN](dont-take-a-diagnosis-as-measured.md) ⭐⭐ an issue body, a panic text, and your own first reading all wear a measurement's clothes. #171: the ticket named the wrong line and the fix would have been a NEW bug. #170, ONE SESSION LATER: I classified five reds as "environment" in a report to the gater without varying anything — measuring agreed with me, which is exactly why a right guess is not evidence. #187 3rd face: two verifiers each spot-checked the ORDERING cites and neither read the arm that DECIDES — check the deciding arm, and date the RCA against later fix-lane traffic. 4th face: a COMPACTION SUMMARY of my own session flagged my ledger as carrying a claim doyle never made — measuring found his correction on the record 12min before I wrote it, so the fix would have made a true sentence false and retracted a real ruling back at its author. A carried-forward to-do is a hypothesis; re-measure before you WRITE a correction.
- [`EXIT=$?` after a truncation pipe measures the TRUNCATOR](exit-status-after-a-truncation-pipe-measures-the-truncator.md) ⭐⭐ filed a FALSE bugfix (#153): `spt update --restart | tail -20; echo EXIT=$?` read tail's unconditional 0 while the product returned 3 at four trees, already pinned. A lane was dispatched, briefed and re-scoped before anyone questioned the meter. Fails hardest on TRUNCATION pipes — they read as formatting, not pipeline elements — i.e. exactly when you are trimming output to QUOTE it in a ticket. Tell: a control and a treatment reporting the IDENTICAL number is evidence about the meter. ⚠ 2026-08-22 #159, TWO more faces: `| head` CLOSED the pipe so the producer took SIGPIPE and `${PIPESTATUS[0]}` read **101** — the pipe MANUFACTURED a status, so PIPESTATUS is not protection; and an hour later `clippy | tail` read tail's 0 while clippy really was clean, the version that never gets caught. **Tell is the REPORTING: "am I about to quote this?", not "is this a pipe?"** — all three instances happened while trimming output to quote it. ⚠ 4th face 2026-08-22, NO PIPE AT ALL: a wrapper `( … ); echo $? > leg.exit` ends with the CAPTURE, so it exits 0 over a leg's 100 — todlando nearly filed a runner misreport, minimal probe retracted it (IR-60). Read the LEG's exit FILE, never a wrapper's status.
- [a frontier names WHERE progress stopped, not the CAUSE](a-frontier-names-where-progress-stopped-not-the-cause.md) ⭐⭐ IR-55: streaming + `--test-threads=1` NAMED the wedger — it passes ALONE in 0.02s. Skipping it moved the frontier 183 → 335, then stalled on TWO. Real cause = an EARLIER test leaking `findstr .` children (no file arg ⇒ reads stdin forever under headless conhost). doyle retracted his own entry within the hour + killed his scrub hypothesis (isolation runs HAD the scrub and passed). Run the frontier alone first; then BISECT, never edit at the frontier.
- [measure the DESIGN's premise, not the ticket's claim](measure-first-tests-the-design-premise-not-the-ticket.md) ⭐⭐ W5/#211: mechanism TRUE, the CONCLUSION drawn from it FALSE at the head — #209 had landed, so the "dead" own-node spelling was already LIVE and the ruled effects looked DELIVERED with no lane code. "Collides with nothing" was a BEHAVIOUR claim while the collision sat in the RECORD: 6 landed sites incl. a ratified REQ TITLE prescribing a tier the operator deleted. Split every premise MECHANISM vs CONCLUSION; the ticket does not know what the design assumed. Delivered-but-unpinned ≡ undelivered from the tracker — only a cell separates them.
- 🔎 [JUDGEMENT-INDEX.md](JUDGEMENT-INDEX.md) — the FULL judgement-rules sub-index (measurement discipline, claim hygiene, falsifiability, absence/silence traps, figure provenance), split out 2026-08-19 against the read-limit cliff; 24 entries VERBATIM, zero dropped. Read it before reasoning from a measurement or reporting a figure.

- [same reading from opposite outcomes = the METER](identical-readings-across-opposite-outcomes-indict-the-meter.md) ⭐⭐ my #153 filed a refusal as exit 0 AND reported a SUCCESSFUL roll exiting 0 as corroboration — that was the refutation, filed as supporting evidence. Both ran cmd|tail then $?, so both measured tail; source returns 3 at 4 trees. Wrong issue, 17 days, ate a builder lane. A control agreeing with the treatment outranks the finding — vary the INSTRUMENT. ⚠ flynn same day, BOTH idioms on one tool minutes apart: a flattened exit AGREES with truth nearly always (his conclusion right, evidence invalid), so the idiom is never audited — my #153 is the rare disagreement, which is why it surfaced. Capture-first for anything that becomes evidence.
- [declining a credit SPECIFIES the requirement](declining-a-credit-specifies-the-requirement.md) ⭐ I could have offered my 08-04 composite roll against #212’s "no lane gates it" row; naming the condition it never presented (a REFUSED outcome — nothing was near a floor) showed the leg was TWO opposites, not one: #159 floor met by INCOMING core only (must ADMIT + register at new version), #213 met by NEITHER (must refuse, REFUSED not FAILED, exit 3 not 1). Report UNCOVERED conditions by name, never a coverage percentage.
- [brief fix-shape: grep hazard tags first](brief-fix-shape-check-hazard-tags-first.md) ⭐ #190 brief ordered re-breaking REQ-HAZARD-PUMP-IPC-DEADLINE (3 tagged sites); builder caught it pre-build. A brief's shape is authored from the ISSUE, not the seam — cite tagged invariants or leave shape to the measure-first report.

## Record hygiene
- [audit whole file](doc-audit-reads-whole-file.md) · [amendment falsifies more](amendment-falsifies-more-than-named.md) · [correct by replacement](correct-by-replacement-not-annotation.md) · [stale carried-forward](stale-carried-forward-sentence.md) · [retraction sweeps STRINGS](retraction-sweeps-diagnostic-strings.md) · [docs positive framing](docs-positive-framing.md) must-DO not must-NOT; upstream in experimplate.
- [resume: re-ground BEFORE acting](resumed-session-reground-before-acting.md) ⭐⭐ a commune's next-steps decay fastest; mine were ALL already done and origin was 20 ahead. Rulings durable, state/next-steps = hypothesis. 3rd face: ROUTE ORDER ≠ CONTENT RECENCY — my LATER-routed brief carried the STALER project-context (4 checkable facts off, incl. a closed issue listed as "next task"). ⚠ UNCORRELATED, NOT INVERTED — todlando's pair ranked RIGHT by the same counter, so you cannot flip the heuristic either; that is the harder failure, since it reads reliable until it re-opens a closed issue. Rank by content vs measurement, never by timestamp.
- [NEVER `cat >` a shared memory file blind](write-a-shared-memory-file-only-after-checking-it-exists.md) ⭐⭐ my clobber 2026-08-21: wrote a NEW file over a peer’s richer one, same slug — filenames derive from the LESSON, so two agents learning it from one incident collide, and the collision is likeliest when the topic is LIVE. No git/backup here; only MEMORY.md’s pointer survived to reconstruct from. Detector: index line richer than the file = you truncated. Append or merge; never blind-write. ⚠ CORRECTED: file was a THIRD agent’s, and the substance survived in IR-55 — but I measured that too: IR-55 was UNCOMMITTED (` M`, absent from HEAD, no -S history) in a dirty shared checkout, so both copies were one `git checkout --` from gone. **tracked ≠ committed ≠ pushed** — state the property you MEASURED, not the one you want true (same shape as counting pipefail for containment).
- [commune = testimony](commune-is-testimony-not-an-artifact.md) · [ingest dies silently](commune-ingest-dies-silently.md) can resume you STALE · [echo-commune clobbers fresh commune](echo-commune-overwrites-fresh-commune.md) ⭐ latest-write-wins drop-box; echo brief can be newer AND staler, writer untraced · [drops are box-wide](commune-drops-orphaned-box-wide.md) ⭐⭐ · [two roots diverged](two-memory-roots-diverged.md) ⭐⭐ session root picks which loads; ⛔ the compaction nag on THIS file is wrong — do not comply · [infra register ruling](infra-register-ruling.md) infra/CI debt → INFRA-REGISTER.md.

## Gate & test craft
- 🔎 [GATE-TEST-INDEX.md](GATE-TEST-INDEX.md) — full sub-index (rig construction, gate population, filters reading as absent, nextest/cargo traps, pipe-verdict traps, two-daemon rigs, gh/CI polling), split out 2026-08-04 against read-limit truncation; 29 entries VERBATIM, none dropped. Read it BEFORE authoring, changing, or running any gate/test/rig — the craft is not in this file.
- [OPEN the sub-index or the split was worthless](open-the-subindex-before-running-a-gate.md) ⭐⭐ ran a whole golden gate without opening GATE-TEST-INDEX, hit a trap it covers ⭐⭐ WITH the command, and thanked doyle for handing back craft I had filed myself 2026-08-04. A missing memory is not experienced as missing — it is experienced as the TOOL having a limitation, and I reported that false constraint to a gater. Trigger is the ACT: first touch of a gate/rig/test-filter/CI log, open it before the first command.

## Boxes / CI / infra
- 🔎 [CI-INFRA-INDEX.md](CI-INFRA-INDEX.md) — full sub-index (runners, pools, rigs, teardown, box traps), split out 2026-08-03 against read-limit truncation; entries VERBATIM, none dropped.
## Release
- 🔎 [RELEASE-INDEX.md](RELEASE-INDEX.md) — full sub-index (ledger + latest published version, tag-window holds, milestone/parity rulings, docs-surface traps), split out 2026-08-04 against read-limit truncation; entries VERBATIM, none dropped. Latest cut lives there, not here — read it before any release, tag, or milestone close.

## Roles, scope, comms
- [bag members ride, no judgment drops](bag-members-are-operator-selection-not-judgment-surface.md) ⭐ TURNKEY #211: bagged = operator selection; delegated judgment covers ADDITIONS only. Composition concerns become sequencing (design-pass wave), not exclusions; a blocked bag member = stop-and-ask BEFORE minting.
- [spt R&D stays on SPT_DEV nodes](spt-rnd-stays-on-spt-dev-nodes.md) ⭐⭐ operator-ruled: the R&D population is SPT_DEV's CURRENT membership, read LIVE at the act — the roster is dynamic (operator re-mints at will; 2026-08-05 re-mint dropped KITSUBITO, added ENLYZEAM) and was NEVER part of the rule. Reachable ≠ in the fleet; a remembered roster ≠ the fleet either. BIGNET nodes run other projects.
- [SPT_MANTLE = engine-room anchor](spt-mantle-is-engine-room-anchor.md) closed fleet-plumbing subnet (operator 2026-08-05), not an R&D surface or population.
- [roles](agent-roles.md) doyle=gate, todlando=exec, perri=adapter, deployah=release · [emphasys](emphasys-agent.md) owns `omp-spt` · [alchemy milestones](alchemy-formal-milestone-process.md) BINDING via `spt shell cmd alchemy-0`. ⭐ FILE THROUGH `alchemy create`, never bare `gh` — gh joins the board but skips the MINT, so no `type:` label + no Requester footer, carried silently by reconcile. My #153 sat typeless 17 days; measured population = exactly 1 of 209 issues, so it is the signature of hand-filing, not a board hole. `state:` was present the whole time — one facet of the taxonomy present is not evidence of the rest.
- [relay ≠ the gater's word](relay-is-not-the-gaters-word.md) ⭐⭐ a peer reporting a dispatch/lift is CONTEXT; ask the author a scope-naming question. Caught 2/2 (deployah, hertz); doyle ruled it the standard. ALSO 1 MISS, mine: relayed flynn stale on-box figures (core/adapter versions) to doyle as fact while STANDING ON that box — check was 2 commands. Relay-check reflex fires on testimony about DECISIONS, stays silent on testimony about STATE; a version number wears fact clothes better than a ruling does · [consumer verifies, core decides](consumer-verifies-core-decides.md) · [don't solo across roles](dont-solo-across-role-lines.md) · [blind consumer read](blind-consumer-read-beats-author-checklist.md) · [perri triage](perri-question-triage-protocol.md) · [perri needs reply](perri-needs-reply-to-continue.md) · [spt-claude-code NEXT](spt-claude-code-next.md) silence = stop-point.
- [credential = identity, ONE holder](credential-holder-boundary-one-actor-per-identity.md) ⭐ flynn's boundary 2026-08-21: hand the owner the QUESTION, never read their token — read-only is a property of the plan, not of the holding; locating a peer's credential file is the stop-and-route moment.
- [bare `access` = ROSTER not self](bare-access-is-roster-first-not-self.md) ⭐⭐ answered for another agent's endpoint and read as identity adoption; `--help` refuted it in one command. Confirm a bare verb's SCOPE before reporting an identity anomaly; never edit rules off a roster row.
- [verbatim recovery = authoring transcript](verbatim-recovery-lives-in-authoring-transcript.md) ⭐ digest truncates ~201ch; peer can "remember" a dispatch that never existed — search, then author fresh, never relay the reconstruction.
- [shell send = ARG not stdin](spt-shell-send-takes-arg-not-stdin.md) ⭐ piped payload silently dropped when --file stages; verb never fired · [send from FILE](send-body-from-file-not-inline.md) + [no inline backticks](spt-send-no-inline-backticks.md) · [SENT/QUEUED both success](owl-send-binary.md) · [confirmation is a CLAIM](delivery-confirmation-is-a-claim-too.md) ⭐⭐ NO PERCH but body LANDED; only the receiver can falsify · [empty inbound never material](empty-inbound-is-never-material.md) NEVER reconstruct · [psyche migration](legacy-psyche-migration-2026-07-06.md) · [ingest latency](commune-ingest-pulse-latency-gap.md).
- [wake offline local endpoints yourself](wake-offline-local-endpoints-yourself.md) operator 2026-08-21: offline LOCAL builder = wake it, don't wait · [ring destroys the perch](ring-destroys-callers-perch.md) lifted but PERCHLESS-ONLY; shipped ≠ installed · [proceed autonomously](dont-wait-proceed-autonomously.md) · [self-clear blocked](self-clear-skill-api-blocked.md) · [drop dir vs info.cwd](commune-drop-dir-info-cwd.md) · [sid→owner](session-id-owner-mapping.md) · [identity blast radius](no-diagnostics-in-identity-blast-radius.md) · [notify perri](adapter-dir-delivery-notify-perri.md) · [liam mint gate](liam-mint-path-gate.md) · [alarm port stays DEFERRED](alarm-port-deferred-arrangement.md) ⚠ operator 2026-06-15, unconfirmed since — no REQ, no port, no stopgap.

## Architecture / boundary
- [harness boundary](spt-core-harness-boundary-and-grounding.md) BINDING: never cater to a harness · [adapter glue-model](adapter-glue-model-boundary.md) manifest + binary only · [unbounded brain carrier](unbounded-brain-carrier-cannot-be-bounded.md) caller-side budget is a NO-OP.
- [mints ride build PRs](registry-mints-ride-build-prs.md) · [adapter impl triage](adapter-impl-question-triage.md) fix the PUBLIC contract · [adapter-agnostic resolution](harness-adapter-agnostic-resolution.md) · [plugin name](sptc-plugin-name-ruling.md) · [--release archive](adapter-add-release-archive.md) · [tips → published docs](adapter-tips-published-docs.md) · [cplugs publish](cplugs-publish-mechanics.md).
- [broker is state anchor](broker-is-daemon-state-anchor.md) · [QUIC deadline](v083-broker-quic-deadline.md) · [pump IPC deadline](pump-ipc-deadline-fix.md) · [boot-race self-heal](boot-race-self-heal.md) · [EVENT envelope](event-envelope-reply-to-removal.md) · [F-007 relay](f007-live-relay-acceptance.md).

## Change-shape traps
- 🔎 [CHANGE-SHAPE-INDEX.md](CHANGE-SHAPE-INDEX.md) — the FULL change-shape-trap sub-index (narrowing an unconditional call, censusing enforcers AND staters, per-line suppression, authored-but-unlanded text, reading source at the measured sha, bare `cd`, sequenced edits, placing a correction), split out 2026-08-22 against the read-limit cliff; 12 entries VERBATIM, zero dropped. Read it BEFORE shaping any change or correction.

## Runtime defects
- [rest_state=suspended ≠ a suspend](rest-state-suspended-is-not-a-suspend-proof.md) ⭐⭐ terminal_normalize stamps it on ANY session death; a killed harness reads identical to a rested one — make such a step ADDITIVE, never terminal.
- [main-thread TLS dtors NEVER run](main-thread-tls-destructors-never-run.md) ⭐⭐ `process::exit` skips them; moving work to a spawned thread makes Drop impls RUN that never once executed — predicts normal output THEN nonzero exit with no panic.
- [identity = content hash, not breadcrumb pid](identity-by-content-hash-beats-breadcrumb-pid.md) ⭐ `brain.ready` carries an `exe_hash`; hashing both candidate exes settled "whose home is this" that a last-writer-wins `daemon.pid` could not. Proves CURRENT resident only — historical touch stays unproven, and an empty TEMP sweep locates nothing.
- Windows liveness — [only the process table](derived-view-vs-on-disk-record.md) · [pid reuse](pid-reuse-across-reboot.md) ⭐⭐ MEASURED same-boot recycle in 30s, both user-owned; bare-pid probe unsound, needs `pid_started_at` · [stale-breadcrumb tree-kill](stale-breadcrumb-tree-kill-class.md) · [breadcrumb pid hazard](breadcrumb-pid-tree-kill-hazard.md) exit 101=assertion, 1=terminated.
- [UNBOUND unwedge](unbound-endpoint-unwedge-procedure.md) ⭐ 0.52.x bind-ABA lockout: NEVER purge (alchemy-0 nests under deployah's perch!), correct info.json + `endpoint run`; retire at fleet ≥0.53.0 · [gc spin #125](swarm-discovery-gc-spin.md) · [autostart inherits job-escape](autostart-inherits-job-escaped-daemon.md) · [agents lock spt.exe](live-agents-lock-target-debug-spt-exe.md) reap BY PATH · [spt home](spt-home-is-localappdata-spt-core.md) + [legacy vs live](owlery-home-legacy-vs-live.md) ⭐⭐ `\spt` is DEAD; wrong root = "never existed".
- Pump / wedge mechanisms — [dial does NOT fast-fail](subnet-peer-pump-stall-rca.md) offline-but-resolvable peer blocks past the 30s bound · [io_timeout ≠ connect bound](cold-start-pump-iotimeout-not-connect.md) misread 3× · [broker alive, brain gone](update-wedge-rca-v53.md) no rc countdown = frozen PTYs, not a crash · [resume steals the controller](update-wedge-2-resume-steal.md) · [poison churn is benign](v0306-poison-log-churn.md) else it reads as the wedge recurring · [inline deliver starves the viewer](v013-rc-attach-flood-wedge.md) drain thread throttled.
- [psyche failure is SELF-only](psyche-host-failure-is-self-only.md) ⭐⭐ file-ingest and summariser-spawn are SEPARATE · [fail log](psyche-fail-log-instrument.md) · [spend limit](psyche-ccs-bigscreen-spend-limit.md) · [visibility lease](subnet-visibility-lease-regression.md).

## Active work / project state
- 🔎 [ACTIVE-WORK-INDEX.md](ACTIVE-WORK-INDEX.md) — the FULL active-work sub-index, split out 2026-08-04 against the read-limit cliff (this section sat last and would drop first, reading as "no active work"; entries VERBATIM, zero pointers dropped). Includes #145 LANDED @`4b37512` + the four authored instrument lanes riding the next golden batch. State decays fastest — re-ground before acting.
