FE-1311: Remove dead code and clarify repository contracts - #402
Draft
lunelson wants to merge 28 commits into
Draft
FE-1311: Remove dead code and clarify repository contracts#402lunelson wants to merge 28 commits into
lunelson wants to merge 28 commits into
Conversation
SPEC gains the "No deadness oracle in the gate" Acknowledged Blind Spot (episodic sweeps only, false positives on out-of-graph consumers per FE-1241 ripgrep evidence; knip.jsonc/konsistent unwired). PLAN's shared-session-host-convergence arc records the independent architecture-review confirmation and folds the coordinator decomposition into the arc. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coverage-shaped earned sweep over the verified 2026-08-03 induction findings: reduction-review deletion batch (with corrections), copy-not- import predicate consolidation, roster-drift repairs, and the knip wire-vs-delete decision. Sequenced Parallel / Low-conflict. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Closed 21-row inventory from the two 2026-08-03 induction reports: deletions & packaging (15 rows, 2 deferred), predicate consolidation & roster integrity (5 rows, 1 deferred), and the knip wire-vs-delete guardrail decision. Every deletion row carries the out-of-graph-consumer checks and same-row TOPOLOGY/treedocs reconciliation. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019fc869-d922-75a1-8239-48180094ce9d Co-authored-by: Amp <amp@ampcode.com>
…-constraint assertions The five pre-FE-1163 snapshot fixtures plus their normalizer froze a migration reference point that has since gone stale: the exchanges suite already carved out `ask` and `present_review_set`, and FE-1208 deleted the dev-mode baseline. Each family suite now asserts the constraint the snapshots were standing in for, through the production predicates in `shared/tool-schema.ts`: every registered schema carries adapter provenance (`hasToolParametersProvenance`) and passes `assertProviderLegalToolSchema`, with the family tool inventory pinned explicitly where the baseline keys had supplied it. The current-shape assertions the snapshots did not own — the review-set settlement fields and the ask questionnaire fields — are preserved verbatim. Reconciles SPEC I60-L, whose coverage cell cited the retired baselines. -2,339 LOC. No TOPOLOGY.md or treedocs.yaml reference existed (treedocs.yaml excludes __tests__). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The sweep row proposed deleting src/dev/consequential-fact-* as a parked campaign. The out-of-graph-consumer checks falsify that premise: the row conflated the retired campaign *frontier identity* with the code it left behind, which is live on four counts — dev-cli.ts ships the evaluate-consequential-fact subcommand over the evaluator, src/dev TOPOLOGY.md and README.md both declare the evaluator/report/runner seam functional dev/eval primitives, the live capture-ledger-tracer frontier reuses all three files, and a hidden-path lexicon test pins the runner. Record the evidence in the row and route back to ln-plan; PLAN's "Deletes / retires" list carries the same conflation. No code deleted. Also generalize the lesson as a cross-cutting obligation for the remaining deletion rows: read the owning TOPOLOGY/README prose and grep active scope cards for successor frontiers before trusting a deadness verdict. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sweep ledger row A3. `@types/oxlint_configuration_schema.json` and
`@types/oxfmt_configuration_schema.json` were snapshots of upstream Oxc
config schemas that nothing ever read: `.oxlintrc.json` and `.oxfmtrc.json`
point their `$schema` at `./node_modules/{oxlint,oxfmt}/configuration_schema.json`,
and `git log -S` over the filenames across all refs returns only the commit
that scoped this ledger. They were also stale — 18.2K against 701K upstream
for oxlint — so keeping them taught the wrong schema.
Deleting both empties `@types/`, so the `"@types/**"` ignorePatterns entry
(added afterwards, in b0abf26, only because these files tripped the
formatter) is removed from both configs in the same row.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ed-live Sweep row A4. All five named targets confirmed test-only under `rg --hidden` at both path and symbol level; three are overridden by canonical or active-card liveness declarations. Deleted (canonical reconciliation in the same commit): - `src/executor/run-auto-replan-policy.ts` + test. Every sibling in the HITL replanning family is wired through `src/rpc/methods/execute.ts` and the three `.pi/extensions/executor/execute-replan-*` tools; only this automatic delegation layer never gained a caller. Its `src/executor/TOPOLOGY.md` layout line and prose paragraph are removed, and the `run-replan-recommendation.ts` paragraph now states that acting on a recommendation stays human-selected through the `execute-replan-*` surface and that the family owns no automatic delegation layer. - `src/web/components/drawer-card.tsx` + test. A primitive ported from the prior trunk that the current web shell never imported, unlike its live sibling `node-card.tsx`. Its `src/web/TOPOLOGY.md` layout line and `src/treedocs.yaml` entry are removed. Kept, with the reason recorded in the ledger row: - `packet-redaction.ts` — the active `execution-comparison-tracer` oracle-smoke card names its test as the guard for a preserved invariant, `src/dev/TOPOLOGY.md` declares controller-owned comparison packets, and the `comparison-reporting` skill names the file a canonical FE-1230 schema surface. - `accessibility-contract.ts` — SPEC declares the minimal public accessibility contract part of the FE-1230 oracle boundary. - `plan-output.ts` — the SPEC lexicon declares it the owner of the domain term "Plan output" under D83-L. `memory/PLAN.md` still lists the three kept modules under "Deletes / retires"; that correction is owed to `ln-sync`, as row A2 also found.
…union PRODUCTION_EXECUTE_TOOL_MUTATIONS accepted any string key, so a tool added to or dropped from the roster diverged from its run-mutation classification until a runtime static test caught it. Project the 31 execute-tool constants into a BrunchExecuteToolName union in their owning vocabulary leaf and key the map by it, making both drift directions type errors. The sibling RPC map keeps string keys: its method names live downstream in src/rpc, which already imports this module, so deriving a union there would invert the dependency direction. A ceiling: comment names that trigger.
…riters Row A5 of the integrity-cleanup sweep, split per user decision: the two artifact tools go, `present_alternatives` stays. Neither `execute_plan_outline_artifact` nor `execute_plan_draft_artifact` was ever admitted by `EXECUTOR_ALLOWED_TOOL_NAMES`, and `pi.setActiveTools` only exposes allowlisted names, so no model could call either one. Their `src/executor/` artifact writers had no other consumer, and nothing reads `.brunch/execution-reports/*.json`, so both writers went with the tools rather than becoming test-only production modules. The roster union added in the previous commit did its job: shrinking `BrunchExecuteToolName` without touching the authority map failed type-check (TS2561 at run-execution-authority.ts:105). Executor roster, union, authority map, and allowlist now all agree at 29 names, and the registry test pins that there are no inert extras. `present_alternatives` is kept and recorded: `alternatives.ts` holds the product's only `pi.registerMessageRenderer` call, so the preview harness lane documented in src/dev/TOPOLOGY.md has no other subject, and D104-L still reserves the family. Whether to fold or retire it is parked for ln-spec. The `transcript-context.ts` literal is kept too — it filters persisted transcript tool results and was never a tool-names roster entry. Reconciled counts from live code (47 inventory, 29 executor, 36 shared-default) across SPEC I60-L/I61-L, both TOPOLOGY files, and the extensions README; the I58-L side-effect clause drops its execution-reports writers, which no longer exist. Prior three-way count drift (SPEC 52 / TOPOLOGY 50 / test 49) is recorded in the ledger row. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…targets Row A6 of the integrity-cleanup sweep. The row named six files as unused barrels/wrappers/CLI helpers; the out-of-graph battery falsified five of them, so the actual reduction is -110 LOC rather than the estimated -457. `src/.pi/extensions/shared/query-projection.ts` is genuinely dead. Its two consumers were the `introspect-query/` and `session-query/` extension directories from the FE-825/FE-847 DX introspection tiers, both removed wholesale by 1885130 (FE-1208), which left the shared helper behind. No path or symbol reference survives under `rg --hidden`, nothing copied its select-path predicate, no TOPOLOGY prose named it, and the consumer family appears only in docs/archive. Its `src/treedocs.yaml` entry goes with it. The five keeps each have a live or canonically declared consumer: - `src/dev/index.ts` is not unused — `brunch-data-context.test.ts` imports `createBrunchFauxHarness` through it via a hidden path, and `faux-launcher.test.ts` imports `runBrunchFauxTurn`. Removing it is an import-retarget refactor of live callers, not a deletion. - `src/dev/end-to-end-comparison.ts` is named as the owned seam by src/dev/TOPOLOGY.md and matches the fractal sub-tree convention of three live siblings in the same directory. It has never had an importer because it mirrors only 9 of 11 subtree modules, so `historical-replay-target.ts` bypasses it for `public-packet.ts`. Completing the barrel or dropping the convention for this family is a topology decision for ln-review. - `src/dev/faux-launcher.ts` is declared a Tier-1 exact-payload loop by src/dev/TOPOLOGY.md; `src/dev/` is build-excluded dev tooling, so test-and-probe-only consumption is its intended shape. - `src/graph/validate-fixture.ts` is a CLI-guarded entry point with no import-graph consumers by construction, invoked by name in docs/praxis/manual-testing.md, seven seed READMEs, and src/graph/TOPOLOGY.md. The ln-review contract lens had already recorded it as a falsified target of the induction that produced this row. - `src/web/queries/session.ts` holds an implemented-but-not-yet-rendered query option declared as such by src/rpc/TOPOLOGY.md and src/web/TOPOLOGY.md, over a live tested RPC method; deleting it would orphan its dedicated query-key factory. Recorded the CLI-entry-point hazard as a ledger obligation for the remaining deletion rows, plus the PLAN correction owed for its "unused dev barrels/wrappers" clause. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…letion premise Sweep row A7 proposed deleting src/db/row-schemas.ts plus drizzle-typebox and @sinclair/typebox. The deadness half of the verdict holds — the module has zero consumers under `rg --hidden`, at path and symbol level, with no barrel in src/db/ — but two canonical TOPOLOGY.md files declare it live in prose: src/db/TOPOLOGY.md carries it as a `## Owns` bullet with an anti-regrowth rule and names both deps in `## Stack`, and src/graph/TOPOLOGY.md:310 directs consumption at persistence-facing validation seams. Live D41-L/D16-L and I26-L's verification-debt row (SPEC.md:847, "Drizzle row-schema derivation boundaries") concur. Same keep class as A4's packet redaction and A6's web/queries/session.ts: a deferred consumer, not a retired module. Nothing deleted; no dependency change, so no changeset is owed. src/db/TOPOLOGY.md now records the current state rather than leaving it to be re-derived: the module is built ahead of its consumers, adoption is directed by the graph topology file, and reference-count zero is not evidence of deadness here. `## Stack` distinguishes @sinclair/typebox — drizzle-typebox's load-time peer — from typebox@1.x, Brunch's actual schema vocabulary, which validates these derived schemas directly, so consuming them needs no second runtime. Routed rather than fixed: @sinclair/typebox sits in devDependencies while its dependent drizzle-typebox sits in dependencies, which breaks on consumer install once a production path imports row-schemas.ts. That is a published-surface decision owned by row A12 and its `npm pack` oracle. The ledger gains a fifth hazard obligation: row-schemas.test.ts never imports row-schemas.ts — it is db/schema.ts coverage under a misleading name — so filename adjacency must not be read as test ownership. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… row A8 Sweep row A8 proposed deleting src/agents/shared/toon.ts plus @toon-format/toon. The deadness half of the verdict holds, and more cleanly than A7's: the two exports are imported by nothing but the module's own test under `rg --hidden`, nothing else in the repo imports the dependency, no golden or fixture emits a fenced toon block, and `codeBlock(..., 'toon')` has one call site inside the wrapper itself. Deleting it would orphan nothing. But D83-L is active, and its live text asserts in the present tense that the context-render house style *is* a markdown frame with TOON for uniform data, with src/agents/contexts/ owning "the <section> scope-clustering plus TOON data blocks". The live SPEC lexicon entry Context-render house style repeats it and names the package; the archived full text names this file by path; and this directory's own TOPOLOGY prose lists TOON record blocks among what it owns. Under the ledger's third cross-cutting obligation, a canonical doc declaring a module live overrides an induction deadness verdict. Symbol-level provenance explains the contradiction and is a disposition class the sweep had not yet seen. `git log -S renderToonBlock` shows the symbol added by FE-870 and later deleted: the sole consumer was spec-context.ts's ranked elicitation-gap render — the very example D83-L cites for TOON — which FE-1116 (5846c21) removed when D101-L moved gaps to the session-local scratchpad and D45-L retired the readiness estimate. So this module is not built ahead of its consumers (A4/A6/A7) and not abandoned scaffolding (A6's query-projection): a later active decision retired its subject and nobody propagated that back into the earlier active decision. D83-L's other TOON subjects are gone too — session lists render as markdown tables, mentions as bullet lines — and the one forward-looking statement, a future compact variant for very large graph overviews, is archived, hedged, and matched by no active card or PLAN item. That leaves a stale clause inside an active decision, which a deletion row cannot close. Striking TOON from D83-L and its lexicon definition is a product call on the render dialect, not a deletion, and it sits outside this row's SPEC write bound. Parked for ln-spec on the same precedent that parked D104-L in row A5: if the clause is struck, the wrapper, the dependency, and the lexicon text fall together in one coherent change; if it is kept, it should name its intended remaining subject so the wrapper stops reading as dead. Nothing deleted; the dependency set is unchanged, so no changeset is owed. The test is kept and is real coverage — unlike A7's namesake trap, toon.test.ts does import the module it is named for. src/agents/shared/TOPOLOGY.md now records the no-consumer state, the removal provenance, the keep reason, and an anti-regrowth line. treedocs.yaml keeps its entry for a kept file. memory/PLAN.md:203 still lists "TOON wrappers plus dep" under Deletes/retires; both are kept, so ln-sync owes that correction, as for rows A2 and A4 to A7. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Row A9 of the integrity-cleanup sweep. `renderTree` output is byte-identical; `package.json` loses one direct dependency and the lock loses four packages. Only `stringify-tree` was ever a direct dependency — `lodash.flatten` (and `@types/lodash.flatten` -> `@types/lodash`) came in transitively through it, so removing the single entry evicted all four. Nothing in the repo imported `lodash.flatten` directly. The committed golden pinned one 5-line tree whose only branch child was last, so it never exercised the `|` vertical-continuation prefix for a non-final branch — the hardest case in the algorithm — and no downstream suite or fixture pins tree output, making this test the only witness. So the goldens were captured from the live library, proven green with `stringify-tree` still installed, and only then run against the native formatter unchanged. The formatter transcribes stringify-tree@1.1.1: branch `T label`, leaf `- label`, the child's own line taking the elbow and its descendants the continuation or padding by last-ness, with `lodash.flatten` becoming `flatMap` (one level is exactly the depth lodash.flatten provided). The `createRequire` seam is gone along with the CommonJS-only dependency that forced it. Reconciles the *Context-render house style* lexicon entry, which named stringify-tree as the ASCII-tree implementation. D83-L is left unedited — its TOON clause stays parked for `ln-spec` per row A8, and this is an implementation mention, not a house-style change. SPEC_HISTORY keeps naming stringify-tree as the earlier choice; that archive records the trade this row reverses. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…quencing helper Sweep ledger row A10. The four minting members of src/probes/deterministic-exchange-script.ts — mintDeterministicExchangeIntoSessionFile, mintDeterministicExchange, presentExchangeMessages, and the private presentProjection — had zero references under `rg --hidden` at path and symbol level. Symbol provenance found the removal event: c3ee4eb "Retire legacy question read paths" (FE-1187) removed both consumers in one commit, and public-rpc-parity-proof.ts now mints its own pair in the active present_candidates grammar rather than the legacy present_question pair this chain built. Genuine deadness by supersession, not a stale clause in an active decision: live D78-L is thinned to event + pointer and names neither the module nor R24, so no SPEC text needed editing. The deletion is corrective rather than merely safe. present_question is retired vocabulary under active D116-L and is no longer registered, so this chain was a write path fabricating a retired tool name into durable session files — the fault the graduated contract lens "silent fallback that mints retired vocabulary into durable artifacts" names. The present-question projection modules stay: read-side tolerance of legacy transcripts is a fencing decision, and they have live consumers. The sequencing helper nextDeterministicStructuredExchange stays — its consumer src/session/__tests__/structured-exchange-loop.test.ts is green before and after (15/15). No cascade: every collaborator of the deleted imports retains other consumers, and the module's imports drop from six to one type import. Reconciled src/session/TOPOLOGY.md, the one canonical prose naming this file, which would otherwise have kept teaching a fabricator that no longer exists; rewrote the module header, whose claim to be the R24 proof's generator FE-1187 had falsified. Both carry an anti-regrowth line. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The row's premise ("non-test importers all in already-excluded src/dev")
holds at the import-graph level but is the wrong test: build-exclusion is
an invocation-surface question. Three probes are consumed through their
compiled dist/probes/*.js path — run-ship-gate-composition.sh, the
sweep-debt-tripwire usage text (pinned by its own test), and the env-gated
built-vs-source differential in provider-conduct-report.test.ts.
Applied the exclusion, measured, and reverted: build exit 0, dist probes
68 → 0, check exit 0, probe suites 20/20 green — every available oracle leg
passes while all three consumers break. check:release-pack fails
identically at the unmodified commit (better-sqlite3 binding in the temp
global install), so it does not discriminate.
No code changed; tsconfig.build.json is byte-identical to e4bd073. The
mechanism fork (tsconfig exclude plus consumer retarget, versus a
package.json files negation owned by row A12) is routed, not guessed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…probes Row A12 of the integrity-cleanup sweep, with row A11's goal folded in by coordinator rescope. Seven packages leave `dependencies`: the six Vite-bundled web packages (`react`, `react-dom`, `@tanstack/react-query`, `@tanstack/react-router`, `@fontsource-variable/inter`, `@fontsource-variable/geist-mono`) plus `drizzle-typebox`, which joins its already-dev load-time peer `@sinclair/typebox` instead of dragging it up. Decided from the published surface, not the repo import graph: an import closure from both published entry points (`bin/brunch.js` and `dist/app/brunch.js`) reaches 358 files and 13 third-party specifiers, none of them the moved seven. React and TanStack are inlined into `dist-web/assets/brunch-web.js`, which carries zero bare import specifiers; the fontsource packages are consumed only by two `@import` lines in `src/web/styles.css` and ship as materialized `.woff2`. The unbundled `dist/web/**` copy does import them, but it is unreachable and structurally non-executable under Node. `files` gains `!dist/probes`, so probes stay buildable and locally runnable from `dist/` while leaving the tarball (68 -> 0 entries). This is row A11's fork (b): `tsconfig.build.json` is untouched, and every built-path probe consumer A11 was blocked on still works. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coordinator disposition: A11's packaging goal was discharged by A12's files negation with all three built-path consumers verified intact. Residue (PLAN:206 correction, missing src/probes topology home) stays on the tie-off routing queue rather than holding the row open. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…g site Close sweep row A13. FE-1241 (f2a8bab) provisioned ripgrep so "the Linux full gate can exercise bounded grep reads"; the consumer is the Grep tool in the spawned-agent isolation policy (solution-isolation.ts:50 via claude-adapter.ts:75), which shells out from inside the spawned process and so is invisible to any reference scan of src/. A step-level comment now names the consumer, the issue id, and the permanent scan blind spot. expect and zsh on the same install line are deliberately excluded: both are grep-visible in src/dev/tui-driver, so ripgrep is uniquely blind. This is the only apt-get provisioning site across all four workflows. No functional change — the shell block is byte-identical. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sweep row B1. Lift the copy-not-import predicates that the writer, reader authority, replay, and lifecycle seams must agree on into src/executor/petri-state-predicates.ts: ordered id-list equality, marking equality, and the terminal-summary family. Census enumerated rather than inherited from the row. stringArraysEqual had four production definitions in two shapes -- undefined-tolerant in observer-read/petri-replay, non-nullable in orchestrate/petri-events. Not a semantic fork: the tolerant body is the strict body plus a leading guard, so it is a total extension. The tolerant form survives and its tolerance is now pinned by direct tests. petriMarkingsEqual was duplicated twice; the three terminal-summary predicates were each defined once but scattered across three files, so the row's count oracle alone could not have proven them -- it gained an ownership leg. Every import the new module makes is type-only, so it is a runtime leaf and its back edge to petri-events.ts for PetriTerminalEvent/-Payload forms no runtime cycle. Those types stay where six other modules already import them. Behavior-preserving: executor tree 42 files/584 tests green before, 43/589 after (+5 new), zero regressions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sweep row B2. The ledger's "copies byte-identical today (verified)" premise holds for four of the five copies, not all five: git-host-land-port.ts carries an ancestor-walking fallback that resolves symlinks in the deepest existing ancestor, where the other four fall back to a lexical resolve. That difference is load-bearing. materialize() normalizes args.targetDir before mkdir-ing it, then compares the result against an existing (therefore realpath-resolved) run worktree to decide target_aliases_run and target_inside_run. Under a symlinked temp root -- the macOS default -- the lexical form would leave the ancestor unresolved and both refusals would stop firing. So the four identical copies consolidate into one owner and the fifth stays put, renamed canonicalPathAllowingMissing for its difference, body moved verbatim rather than rewritten. Homed in src/executor/ because the shared module must be importable from both trees without inverting direction: src/app imports src/executor in 13 places, never the reverse, and executor/ x> app/ is enforced by src/executor/__tests__/boundaries.test.ts. durable-file.ts is the live precedent for an fs primitive owned here and consumed from an app-layer port. src/utils/ was rejected as a vestigial tree (its only file has no consumers). Reconciles both owning topology files. src/app/TOPOLOGY.md's dependency direction omitted executor/ while app already imported it 13 times; that clause is repaired here alongside the new edge. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
24 byte-identical private copies of the `access`-based existence predicate become one owner at `src/executor/path-exists.ts`: the 22 named `pathExists` (16 executor suites, 5 executor production files, 1 app git port) plus two `fileExists` aliases in `launch.ts` and `run-freshness.ts` that were the same function under a synonym. Homed in executor because `app/` imports `executor/` and never the reverse. A sibling of `canonical-path.ts` rather than a member of it: that module answers whether two spellings denote the same location, so folding a general fs-predicate bucket into it would make its name stop describing it. `source-policy.ts` keeps its divergent private check, which reads the path as UTF-8 and so answers false for a directory. Collapsing it would widen what counts as a present populated plan, and provenance shows the difference is unadjudicated rather than contractual, so it is documented and fenced instead. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Row C of the integrity-cleanup sweep asked whether a deadness oracle should join `npm run check`. Measured rather than assumed: knip against HEAD reports 796 findings, and reaching a clean pass requires switching off the export/type/duplicate categories holding 674 of them, because they land on the public-entry-point barrels AGENTS.md mandates and on the Pi-extension `registerX` + default convention. Of the 8 survivors, 7 contradict canonical TOPOLOGY.md decisions and the 1 true positive was already found by hand in row B4. The allowlist needed to get there is a transcription of this sweep's own ten falsified verdicts, so the oracle cannot generate them -- it can only be taught to forget what a human already adjudicated, while its residual false positives would train agents to delete live seams. So `knip.jsonc` is deleted; it was never an installed dependency, so the published dependency set is untouched. konsistent is disposed on its own evidence instead of riding that outcome, because it is not a deadness oracle: it asserts structure positively, and a positive assertion cannot be falsified by a hidden consumer. It already carries a real four-convention config, runs in 26ms, and is clean on HEAD, so it is now wired into `check` -- which CI already runs. It catches what lint and type-checking are structurally incapable of seeing: a Pi extension without its `index.ts` barrel, a skill directory without `SKILL.md`. The SPEC blind spot is re-affirmed for deadness with the rejection evidence recorded, and notes konsistent's structural half as wired.
Discharges the sweep's cross-cutting tie-off obligation plus the three reconciliations row builders flagged as outside their own manifests. The changeset owes both published halves, not one: row A9 removed `stringify-tree` and row A12 moved seven packages to `devDependencies` (23 -> 15 production deps), while A12 also changed the published *file* set by negating `dist/probes` out of the tarball (-68 entries). Written by hand -- `npm run changeset` is an interactive prompt. AGENTS.md described `npm run check` in two places and both predated row C wiring `konsistent` into it; they now match package.json exactly. Row B3 predicted its coupling witness would fire as TS2353. The live witness in row A5 fired TS2561 instead: TypeScript emits the spelling-suggestion variant of the excess-property error whenever a near roster name exists, and the deleted `execute_plan_draft_artifact` was one suffix from the surviving `execute_plan_draft`. Both codes re-verified against HEAD and each demonstration reverted, so the ledger now records what fired and warns off pinning an oracle to a single TS code. `verify:full` cannot run as one command on this host: `test:full` is `test && test:slow`, so the 18 pre-existing environmental failures in the default lane abort the chain before any slow test or the build. Lanes run individually instead -- fix, test:slow:core, test:comparison, build and check all exit 0, and the default lane's 18 failures are exactly the briefed set in three files (17 real-boot 60s timeouts plus one `git tag` failure caused by this host's `tag.gpgsign=true`). Zero new failures; skipped-test delta 0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Why
Repository cleanup had drifted from current runtime and ownership truth: dead artifacts remained in source or the published package, duplicated predicates could diverge, and reference-count scans mislabeled intentional seams as disposable.
What
How to test
npm run checkand confirm structural, formatting, skill, and promoted-run checks pass.npm run buildand confirm the product, local probes, and bundled web artifact build.npm run test:slow:coreandnpm run test:comparisonand confirm both retained slow lanes pass.npm pack --dry-run --ignore-scripts --json; confirmdist-webis present anddist/probesis absent.Practical testing is still pending and will be recorded before this draft is marked ready to merge.