Skip to content

docs(ledger): reconcile the task ledger and the docs that drifted from it - #358

Open
stellarfeline wants to merge 3 commits into
mainfrom
docs/ledger-reconciliation
Open

docs(ledger): reconcile the task ledger and the docs that drifted from it#358
stellarfeline wants to merge 3 commits into
mainfrom
docs/ledger-reconciliation

Conversation

@stellarfeline

@stellarfeline stellarfeline commented Aug 11, 2026

Copy link
Copy Markdown
Owner

All 34 pending / in_progress ledger items audited against origin/main at
0a40db8. Every verdict below is a measurement, not a grep hit: the
workspace was built first (cargo build --workspaceFinished) and
cargo test --workspace exits 0, so no test count here was read off a tree
that did not compile.

Verdicts

# Subject Verdict Evidence (measured)
6 Owner-confirm batch (9 items) OPEN — 6 of 9 answered (3) mark merged #286; (6) island released v1.1.0; (7) required checks merged #304check-required-contexts.py reports 12 jobs / 12 contexts; (8) #298+#299 merged; (9) worktree rule is CLAUDE.md:279; (1) withdrawn by #36's re-scope. Still unanswered: (2) spec-0027 AC6, (4) layout staleness — fixed in this PR, (5) souls slate: bossbar/boss_phase/fog_gate/cooldown appear 0 times in crates/dsl/src/stages.rs and in no spec; only currency+vendor were approved (spec-0032)
7 Bell remake → artifact gate OPEN (blockers real, one premise STALE) bell/mod.rs zone table: Z3 and Z7 both not programmed; causeway still a terminus, no tower_stair. STALE: "REMAKE.md does not exist on disk anywhere (verified)" — it does; see below
8 Cherry valley #176/#177 OPEN + STALE PREMISE PR #260 is CONFLICTING / DIRTY, 19 commits behind origin/main, not "MERGEABLE/CLEAN"; "10/10 green" is now 12 contexts. #259's base is worker/spec-0026-foundation (CLEAN there), not main. Chain unmoved: engine #260/#259 open, content #21/#22/#26 open
10 spec-0027 phase 2/3 OPEN (phase 2/2b landed) Obligation A: crates/grammar/tests/staging.rs:1316 still carries the §4 palette-role test-local mirror; no §4 diagnostic exists. Obligation B: reachable_with_fall still test-local in grammar/tests/support; crates/grammar/Cargo.toml still has no dependency on the compiler — and PR #316 added compiler::traversal, a third model of "can this body get there"
12 DW0461 branch-aware replay STALE PREMISE continuity::NpcWhere::Indeterminate excludes any NPC whose lifecycle is branch-driven (flag-gated effect, dialogue option, env trigger, reaction bundle); check_placement_position only matches At/Offstage, so a branch NPC never reaches DW0461 — DW0462/DW0483 own it. The "#186 open gap" half is closed too: emit::branch_paths emits branch-path-<slug>.json through the same critical_path_json as the exported path (PR #276)
18 DW0310 trigger-fired wave — bind or forbid OPEN plan.rs:1029 wave_area step 2 is unchanged: still campaign.world.content.areas.len() == 1. No anchor→area resolution, no strike-npc refusal code. Half landed: DW0497 makes a residual dangle a hard build error
23 cast::station concurrency edge OPEN Read cast.rs:240-269: still iterates quest_dag_order, breaks at upto_quest, and consumes the whole-path begun set — both divergences (a) and (b) stand. No diagnostic forbids two concurrently-activatable quests casting one NPC; no red fixture exists
26 Cast-arrival timing proof OPEN (blocked on planner design, as filed) SPRINT_TICKS_PER_BLOCK = 4 exists in nav.rs, but no proof compares a walk driver's tick cost against a player route; grep for an arrival-race diagnostic returns nothing
28 move-actor ma_tick per-leg latch DONE PR #303 merged as 319b4a9. cargo test -p delvec --test move_supersede7 passed, 0 failed, including later_move_actor_supersedes_the_running_leg. (The ledger entry's tail is a corrupted task-update payload — worth cleaning when you close it)
33 min_y into critical-path.json OPEN harness/src/teardown.ts:35 still reads "The harness has no wired source for a delve's min_y today", and scriptedTeardownThreshold still falls back to -100. No min_y in the compiler's critical-path export
34 hollow-vigil does not build OPEN + STALE PREMISE Reproduced: delvec validateexit 1, exactly 2× DW0331 (no DW0205 — it is masked, as filed). STALE: the "residual gap (own task)" — a pipeline-repo job compiling the pinned content's campaigns — is closed: PR #322's campaign builds job is a required context, and .github/campaign-build-exclusions.toml INVERTS the assertion for hollow-vigil. tools/build-every-campaign.py run here: discovered 2, built green 1, known-red 1 as recorded. Still open: the content-repo campaign-build.yml is not on content main (only prefab-audit, release, workflow-lint)
36 #192 re-scope: /trigger out-of-order OPEN — both findings live Finding 1 confirmed by reading emit.rs:3160: the completion line is execute if score #party dw.qa_<q> matches 1 unless score #party dw.o_<obj> matches 1 … — quest-active + not-already-complete only; the objective's own after[] is never consulted. (Option-level requires_flags/forbids_flags/requires_state do get return fail guards, so the hole is an ungated option completing a prerequisite-bearing objective.) Finding 2 confirmed: emit.rs:3148 emits weather {token} with no duration; WorldWeather::token() is clear/rain/thunder
42 Local playtest ≠ shipped pack auto-install OPEN tools/playtest-server.sh:137-145 prints only the pack path / copy note; nothing says the shipped path is unexercised. resource-pack + resource-pack-sha1 in server.properties are written only by the content repo's release.yml. tools.md's row does not say so either. Its blocking dependency (the build-performance work) landed at #313
46 traversal override — "spider sheep" STALE PREMISE The task is filed as an OWNER CALL awaiting a ruling. CLAUDE.md:236-239 records that it was already ruled in an earlier session, and names re-asking it as a rebuke cause. What is open is the spec + implementation, not the decision — and the ruling's content is written down nowhere in either repo (only its existence is), which is itself a finding against "docs are the only persistent memory"
47 resample step-up levitation OPEN nav.rs:1727 documents the L geometrically ("rise in place, then cross") and why. The player-visible cost framing is absent, and the skill's shot-review step (SKILL.md:969) says nothing about step-ups. Its entire remaining deliverable is a doc change
48 crates.io + release binaries DONE (part 2 half-executed) PR #318 merged 922cfb6: both crates carry description/license/repository, delvec is the package name, no publish = false on either, engine-release.yml is the only publisher behind an approval environment. gh release view v1.1.05 target archives + SHA256SUMS. But gh release view v1.0.0 → ZERO assets, although the tag was force-moved onto 922cfb6 exactly as ADR-0017 §5 says — so the ADR's stated reason for the retag ("an empty shelf forever") is still unfulfilled. workflow_dispatch with the tag input re-fills it
50 shortcuts[] wrong-side hint DONE — in a better shape than filed PR #324 (95091d3). No bespoke hint field was added: compiler::wrongside derives the sealed side from the gate slab's thin axis, ws_arm_fns summons one 1.02f interaction per doorway cell on the sealed side only, and an author's ordinary strike/use trigger on the gate rides them — the general EnvTrigger mechanism reaching an object it previously could not. DW0425 withholds rather than guesses; tests/shortcut_wrong_side.rs:332 asserts the code
51 Widened inventory bypasses the fence OPEN — doc half landed PR #339 recorded the measurement on l10n::inventory and explicitly left the tier decision to the owner. Neither deliverable is done: l10n.rs:511 still says the walk "consults the campaign document and never its dsl_version", and grep -n widen CLAUDE.md returns nothing
52 delvec fmt OPEN delvec --help lists validate analyze build l10n-inventory schema snapshot blocking-chart edit calibrate — no fmt
53 Byte baseline for released campaigns OPEN The recorded baseline hash cf882e2e… appears nowhere in the tree; tools/build-every-campaign.py contains no hashlib/sha256/baseline. The campaign builds gate proves "still builds", exactly as the task says
54 Unbound-fact sweep (3 audits) OPEN — final obligation not done Instance + general fixes landed (content #39; engine #342, #345, #344, #320). But the closing obligation — "record the fourth vacuity shape in CLAUDE.md alongside unbound/unfenced/unemitted" — is not done: CLAUDE.md:207-215 still lists exactly three. audit-content.md / audit-engine.md / audit-gates.md are not in the scratchpad
61 Lift authored entirely in campaign JSON DONE PR #356 merged 0a40db8. Not one file under any crate's src/ is touched; tests/v10_lift.rs reads the owner's timing table back off the emission, and a schema-derived test asserts no DSL surface is named after a lift. spec-0031 AC9 closes
64 compose drops four harness env vars OPEN (name detail corrected) Set difference measured: harness reads 15 names, compose.yaml forwards 11. Missing: DELVEWRIGHT_ACTOR_FLOOR, DELVEWRIGHT_CUTSCENE_GRACE_MS, DELVEWRIGHT_ENTITY_SETTLE_TIMEOUT_MS, DELVEWRIGHT_RETRY_ON_DEATH — all four carry the DELVEWRIGHT_ prefix the ledger entry omits. No env-forwarding gate exists
65 Untiered set-piece fight compiles green OPEN — doc half landed stages.rs:2101 and :3163 are both tier: Option<EncounterTier>; nothing requires one. playtest-methodology.md:104 now states this correctly ("no diagnostic demands a tier"), so the doc is fixed and the engine gap is not
66 DW codes outside compiler.md bound by nothing OPEN (count stale) + half STALE Re-measured: 37 distinct codes across the other six reference docs (grammar 1, i18n 9, playtest 16, skill-workflow 1, tools 15), not 42. check-dw-codes.py still binds DOC_PATH = docs/reference/compiler.md alone. Exactly one code needs the PENDING concept: DW0364, absent from source and from compiler.md. STALE half: the motivating instance is fixed — mecha_crosscheck.py is in tools.md (line 274). No check-tool-inventory.py exists
68 Bot-tier debt: on_death + lethal-volume death OPEN harness/src/ lethal is staged.some(g => g.crush) — timed gates only. No lethal-volume and no on_death assertion anywhere in the harness. The crush-gate precedent it should copy is in executor.ts:232-609
69 Self-certifying byte-identity baseline OPEN worktree-bootstrap.md:112 names the invariant ("a baseline hash manifest records the git SHA and delvec --version… and the comparison asserts them") under a heading that literally reads "The stronger fix, which is not this convention". Nothing in tools/ or validation/ builds it
70 1.21.11 rejects legacy camelCase gamerules OPEN — both sites still live crates/admit/src/gallery.rs:171-174 still emits doDaylightCycle/doWeatherCycle/doMobSpawning/doImmediateRespawn; tools/spike-jump-arc/measure.mjs:186 still emits gamerule fallDamage false. The compiler is fine — tests/emit.rs:774 asserts the new names
71 Respawn invulnerability window DONE Recorded in spec-0031:432, spec-0032:166, compiler.md:3543, docs/notes/death-and-teleport-spike.md:210, raw at observations.json:331. And it reached emission: emit.rs:7377 explains that execute store success … run damage is inert and the lethal-volume guard reads the outcome (#leth_hp); tests/v10_lethal_volume.rs:198-210 asserts both the outcome guard and the absence of store success
72 Share threshold declassifies open findings OPEN check-capability-ownership.py:240 is still MODIFIER_MIN_SHARE = 1/3 with no absolute-count term and no "once ledgered, stays ledgered". Ran it: check D examines 112 pairs, 6 matched — while capability-ownership-audit.md:243 says 7. The 7th (TimedGateDisarm.TrapDisarm) is a MODIFIER_HOLES key the checker did not count as matched, so the audit table and the tool disagree today
73 Two affordance authorities OPEN eclipse.rs:311 states the defect in its own doc comment ("there are TWO affordance authorities in the compiler"). No import crosses between affordance.rs and eclipse.rs; no test compares their membership. v10_economy.rs:454 pins the shop instance, not the general form
74 Teleport moves a stake out from under its ledger OPEN teleport.rs has no stake handling; check_bound_affordances reads eclipse::affordances, and v10_economy.rs:450 asserts a stake is deliberately not in it. Neither candidate fix is taken
75 A local PackTest run can be a strict subset OPEN validation/packtest-run.sh asserts no test count at all and never compares against what the compiler emitted — grep for count/template in it returns only prose
76 A spec's Status is bound to nothing OPEN — instance in flight, general form open PR #357 owns spec-0029. Swept all 30 specs: spec-0027 Proposed, spec-0031 Draft, spec-0032 Draft, spec-0028 Proposed all read as unbuilt over shipped work. Fixed in this PR by adding a measured Implemented line beside (never replacing) Status. No check binds either

The seven REMAKE §7 prerequisites, measured

campaigns/the-drowned-bell/REMAKE.md §7 names them by pre-renumbering task ids.
Measured by capability, not by number:

REMAKE §7 Capability State
1 · #180 Undefeated rest/death re-seat at full HP EXISTS. waves[].respawns_on_rest (stages.rs:2069); and per the 2026-08-05 owner ruling a billed elite/boss still standing is deleted and re-seated at full count/health by a rest (stages.rs:2094-2099). DW0499 forbids boss + respawns_on_rest
2 · #179 Declared-subset drops EXISTS. MobDrop = Slot{slot} | Item{item,name} (DSL v0.9, stages.rs:2333); undeclared slots keep drop chance 0.0; DW0490 refuses a slot the entity's own equipment does not fill. Note the shape is a declared subset, not a raw per-slot drop_chance knob as §5 words it — same guarantee
3 · #116 Kit potion contents EXISTS. KitItem.contents: Option<PotionContents> (DSL v0.8, stages.rs:892); DW0486 restricts it to potion-bearing items, DW0487 catches a potion with no contents
4 · G1 Observability: standable cell outside the hazard span with line of sight EXISTS, already at the tier §7 asks for. DW0388 (nav.rs:97), HAZARD_STANDOFF derived as one second of sprint. §7 asks it be "error tier for the remake" — nav.rs:3647 hazard_tier(souls, …) already converts every finding to a build error (exit 3) for a souls campaign, and nav.rs:3637 defines that as "a campaign that places a bonfire". The remake declares six. Nothing to promote
5 · G2 Timed-gate disarm EXISTS. TimedGate.disarm: Option<TimedGateDisarm> (stages.rs:1793), PR #275
6 · #163 Grammar back end EXISTS, with two named gaps. crates/grammar with 6 of 8 zone programs. Z3 and Z7 are the open engine blockers: causeway is a terminus with no exit lane past its guard post (wants a berm_gate parameter), and nothing in the vocabulary ascendsdrop_shaft/dumbwaiter are one-way down by gate, boulder_stair is flat, so a bell tower cannot be climbed (wants tower_stair). Plus counterweight_lift, which today's IR cannot express
7 · #181 Narrate/skin/prompt/wave-guidance batch CONTENT, unstarted. campaigns/the-drowned-bell/ on content main holds only REMAKE.md, media/, out/, out-zh/no campaign source at all, which is why the campaign builds gate discovers 2 campaigns and not 4

So the remake's open ENGINE blockers are exactly two shapes, both in the grammar
vocabulary: an exit past a terminus (Z3) and any ascending route (Z7).
Everything
else §7 lists is built.

Document corrections (each with the measurement behind it)

Document Was Measured
CLAUDE.md layout crates/ … dsl / compiler / orchestrator / admit / schem / render ls crates/ → 7 members; grammar was missing
CLAUDE.md layout docs/reference/ listing six files ls docs/reference/7; worktree-bootstrap.md was missing
CLAUDE.md layout prefabs/ # .nbt library + metadata (git-lfs) find prefabs -name '*.nbt' | wc -l0; *.json0. 36 .nbt are in the content repo. prefabs/README.md already said so; the constitution did not
docs/reference/grammar.md §5c REMAKE §n cited with no path The file is at campaigns/the-drowned-bell/REMAKE.md, content main 795ef92. §3 = zones, §4 = lettered catalogue, §7 = prerequisites — all three resolve
spec-0027 Status: Proposed AC1/2/4/5 shipped (#266/#277/#286); AC3 not built — the §4 mirror at staging.rs:1316 still stands in
spec-0028 Status: Proposed refimg.py shipped (#334/#338); AC3 nowheresimilarity occurs only in the spec itself; no test of any kind for the tool
spec-0031 Status: Draft All five primitives + AC9 merged; runtime death proof absent (task #68)
spec-0032 Status: Draft Compile-time shipped (#355); AC9's bot-tier loop absent
docs/notes/capability-ownership-audit.md "Binds today": A 11, D 7, E 10 Ran tools/check-capability-ownership.py on main: A 13, D 6, E 11. D's "7" counts a STRUCTURAL_TWINS tuple as a MODIFIER_HOLES key — the dict has six. A hand-copied binding count in the table whose whole purpose is stating binding counts, so the note now tells the reader to re-run the tool rather than quote the row

Status lines are not touched — they record approval. Each spec gains a
separate Implemented line that names its evidence and, deliberately, what is
still missing. spec-0029 is untouched: PR #357 owns that file.

Findings, reported rather than edited (code is wrong, not the doc)

  1. DW0425's message names a field that does not exist. emit.rs:6165 tells
    the author "shortcut X declares an on_wrong_side answer" — on_wrong_side
    appears in no DSL schema (grep -rn on_wrong_side crates/dsl/src/ is
    empty). It is the vestige of an abandoned design; wrongside.rs:2's module doc
    repeats it. Worse, check_shortcut_sides raises DW0425 for every
    shortcut with an underivable side, whether or not any answer is authored — so
    the message is false for the common case.
  2. v1.0.0's shelf is still empty although ADR-0017 §5's retag was performed.
    workflow_dispatch on engine-release.yml with tag: v1.0.0 fills it.
  3. Three of the capability ledger's five binding counts had drifted below the
    build (A, D, E) — corrected in this PR, since the numbers are the document's
    only content.
  4. The traversal ruling exists but its content is unrecorded — CLAUDE.md
    asserts it was ruled and nothing anywhere says what was ruled.

What CI proves

Doc-only; no file under any crate's src/ is touched. check-doc-dupes,
check-dw-codes, check-reference-versions, check-required-contexts,
check-capability-ownership, check-skill-version and check-storybook-version
all pass locally, on a tree that built first.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL

stellarfeline and others added 3 commits August 10, 2026 22:13
…m it

An audit of all 34 pending/in-progress ledger items against `origin/main`,
measured rather than read. The verdict table is the PR body; this commit is the
document half — every claim below was corrected against a command that was run,
never a grep hit.

CLAUDE.md's repository layout was false in three places, in the file every
session reads first:
  * `crates/` omitted `grammar`, which has existed since PR #266;
  * `docs/reference/` listed six of its seven files (`worktree-bootstrap.md`
    was missing);
  * `prefabs/` claimed ".nbt library + metadata (git-lfs)" while
    `find prefabs -name '*.nbt' | wc -l` is **0** and so is the metadata count.
    The library is 36 `.nbt` in the CONTENT repo, which `prefabs/README.md` has
    said since spec-0007 Step 0 and which the compiler's own `--prefabs`
    default (`campaigns/prefabs`) agrees with.

`docs/reference/grammar.md` §5c now names where `REMAKE` is. Every `REMAKE §n`
citation in that file and in `crates/grammar/src/library/bell/` was pointing at
a document multiple sessions recorded as "does not exist on disk anywhere
(verified)". It exists — it was on an unmerged content branch for six days and
is now on content `main` (`795ef92`, content PR #31). The general form is worth
more than the instance: an existence check that never looks at unmerged
branches confidently reports a merged-in-spirit artifact as nonexistent.

Four specs carried a `Status` that reads as unbuilt over work that has shipped —
the drift direction task #76 names as the one that costs, and the one that
already produced a wrong answer to the owner. `Status` is left alone (it records
APPROVAL); each spec gains an `Implemented` line that is a MEASUREMENT, naming
the merge that discharged each criterion and, explicitly, the criteria that are
still not built:
  * spec-0031 — all five v0.10 primitives and AC9 (the lift in pure campaign
    JSON, PR #356) are on `main`; the runtime death proof is not (task #68);
  * spec-0032 — compile-time yes, AC9's bot-tier loop no;
  * spec-0027 — AC1/2/4/5 yes, AC3 no (the §4 diagnostic does not exist and a
    test-local mirror still stands in for it);
  * spec-0028 — `refimg.py` yes, AC3's similarity ordering nowhere in the tree,
    and the tool has no test at all.

spec-0029 is deliberately untouched: PR #357 already owns that file.

No engine source is modified. Where a document was wrong because the code is
wrong, it is reported as a finding instead — notably `DW0425`'s message, which
tells an author their shortcut "declares an `on_wrong_side` answer" for a field
that exists in no schema.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
… the build

Three of the five rows in `capability-ownership-audit.md`'s "Binds today" table
disagreed with what `tools/check-capability-ownership.py` prints when it is run:
A said 11 and the tool measures 13, D said 7 and the tool measures 6 (the
`MODIFIER_HOLES` dict has six keys — the seventh tuple a reader counts belongs
to `STRUCTURAL_TWINS`), E said 10 and the tool measures 11.

None of them is a defect in the check; they are hand-copied numbers in a table
whose entire purpose is that a gate states what it binds to. So the fix is the
numbers plus a note telling the next reader to re-run the tool rather than quote
the row — a hand-copied binding count is the unbound fact this document exists
to prevent.

Measured by running the tool on `main`, not by re-reading the table.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
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