Skip to content

FE-1311: Remove dead code and clarify repository contracts - #402

Draft
lunelson wants to merge 28 commits into
nextfrom
ln/fe-1311-integrity-cleanup
Draft

FE-1311: Remove dead code and clarify repository contracts#402
lunelson wants to merge 28 commits into
nextfrom
ln/fe-1311-integrity-cleanup

Conversation

@lunelson

@lunelson lunelson commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

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

  • Removes artifacts proven dead and trims the published dependency/file surface.
  • Consolidates executor state, filesystem, and tool-roster contracts under canonical owners.
  • Records intentional keeps, repairs canonical paths, and wires positive structural checks without introducing a noisy deadness oracle.
  • Keeps the final closure walkthrough explicitly scoped rather than treating this draft as finished.

How to test

  1. Run npm run check and confirm structural, formatting, skill, and promoted-run checks pass.
  2. Run npm run build and confirm the product, local probes, and bundled web artifact build.
  3. Run npm run test:slow:core and npm run test:comparison and confirm both retained slow lanes pass.
  4. Run npm pack --dry-run --ignore-scripts --json; confirm dist-web is present and dist/probes is absent.

Practical testing is still pending and will be recorded before this draft is marked ready to merge.

lunelson and others added 28 commits August 3, 2026 18:00
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>
…-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>

lunelson commented Aug 4, 2026

Copy link
Copy Markdown
Contributor Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@lunelson lunelson changed the title major ln-sync pass FE-1311: Remove dead code and clarify repository contracts Aug 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant