docs(ledger): reconcile the task ledger and the docs that drifted from it - #358
Open
stellarfeline wants to merge 3 commits into
Open
docs(ledger): reconcile the task ledger and the docs that drifted from it#358stellarfeline wants to merge 3 commits into
stellarfeline wants to merge 3 commits into
Conversation
…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
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.
All 34
pending/in_progressledger items audited againstorigin/mainat0a40db8. Every verdict below is a measurement, not a grep hit: theworkspace was built first (
cargo build --workspace→Finished) andcargo test --workspaceexits 0, so no test count here was read off a treethat did not compile.
Verdicts
markmerged #286; (6) island releasedv1.1.0; (7) required checks merged #304 —check-required-contexts.pyreports 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/cooldownappear 0 times incrates/dsl/src/stages.rsand in no spec; only currency+vendor were approved (spec-0032)bell/mod.rszone table: Z3 and Z7 both not programmed;causewaystill a terminus, notower_stair. STALE: "REMAKE.md does not exist on disk anywhere (verified)" — it does; see beloworigin/main, not "MERGEABLE/CLEAN"; "10/10 green" is now 12 contexts. #259's base isworker/spec-0026-foundation(CLEAN there), notmain. Chain unmoved: engine #260/#259 open, content #21/#22/#26 opencrates/grammar/tests/staging.rs:1316still carries the §4 palette-role test-local mirror; no §4 diagnostic exists. Obligation B:reachable_with_fallstill test-local ingrammar/tests/support;crates/grammar/Cargo.tomlstill has no dependency on the compiler — and PR #316 addedcompiler::traversal, a third model of "can this body get there"continuity::NpcWhere::Indeterminateexcludes any NPC whose lifecycle is branch-driven (flag-gated effect, dialogue option, env trigger, reaction bundle);check_placement_positiononly matchesAt/Offstage, so a branch NPC never reaches DW0461 — DW0462/DW0483 own it. The "#186 open gap" half is closed too:emit::branch_pathsemitsbranch-path-<slug>.jsonthrough the samecritical_path_jsonas the exported path (PR #276)plan.rs:1029wave_areastep 2 is unchanged: stillcampaign.world.content.areas.len() == 1. No anchor→area resolution, nostrike-npcrefusal code. Half landed: DW0497 makes a residual dangle a hard build errorcast::stationconcurrency edgecast.rs:240-269: still iteratesquest_dag_order,breaks atupto_quest, and consumes the whole-pathbegunset — both divergences (a) and (b) stand. No diagnostic forbids two concurrently-activatable quests casting one NPC; no red fixture existsSPRINT_TICKS_PER_BLOCK = 4exists innav.rs, but no proof compares a walk driver's tick cost against a player route; grep for an arrival-race diagnostic returns nothingma_tickper-leg latch319b4a9.cargo test -p delvec --test move_supersede→ 7 passed, 0 failed, includinglater_move_actor_supersedes_the_running_leg. (The ledger entry's tail is a corrupted task-update payload — worth cleaning when you close it)min_yintocritical-path.jsonharness/src/teardown.ts:35still reads "The harness has no wired source for a delve'smin_ytoday", andscriptedTeardownThresholdstill falls back to-100. Nomin_yin the compiler's critical-path exportdelvec validate→ exit 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'scampaign buildsjob is a required context, and.github/campaign-build-exclusions.tomlINVERTS the assertion for hollow-vigil.tools/build-every-campaign.pyrun here: discovered 2, built green 1, known-red 1 as recorded. Still open: the content-repocampaign-build.ymlis not on contentmain(onlyprefab-audit,release,workflow-lint)/triggerout-of-orderemit.rs:3160: the completion line isexecute 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 ownafter[]is never consulted. (Option-levelrequires_flags/forbids_flags/requires_statedo getreturn failguards, so the hole is an ungated option completing a prerequisite-bearing objective.) Finding 2 confirmed:emit.rs:3148emitsweather {token}with no duration;WorldWeather::token()isclear/rain/thundertools/playtest-server.sh:137-145prints only the pack path / copy note; nothing says the shipped path is unexercised.resource-pack+resource-pack-sha1inserver.propertiesare written only by the content repo'srelease.yml.tools.md's row does not say so either. Its blocking dependency (the build-performance work) landed at #313traversaloverride — "spider sheep"resamplestep-up levitationnav.rs:1727documents 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 change922cfb6: both crates carry description/license/repository,delvecis the package name, nopublish = falseon either,engine-release.ymlis the only publisher behind an approval environment.gh release view v1.1.0→ 5 target archives + SHA256SUMS. Butgh release view v1.0.0→ ZERO assets, although the tag was force-moved onto922cfb6exactly as ADR-0017 §5 says — so the ADR's stated reason for the retag ("an empty shelf forever") is still unfulfilled.workflow_dispatchwith the tag input re-fills itshortcuts[]wrong-side hint95091d3). No bespokehintfield was added:compiler::wrongsidederives the sealed side from the gate slab's thin axis,ws_arm_fnssummons one1.02finteraction per doorway cell on the sealed side only, and an author's ordinarystrike/usetrigger on the gate rides them — the generalEnvTriggermechanism reaching an object it previously could not.DW0425withholds rather than guesses;tests/shortcut_wrong_side.rs:332asserts the codel10n::inventoryand explicitly left the tier decision to the owner. Neither deliverable is done:l10n.rs:511still says the walk "consults the campaign document and never itsdsl_version", andgrep -n widen CLAUDE.mdreturns nothingdelvec fmtdelvec --helplistsvalidate analyze build l10n-inventory schema snapshot blocking-chart edit calibrate— nofmtcf882e2e…appears nowhere in the tree;tools/build-every-campaign.pycontains nohashlib/sha256/baseline. Thecampaign buildsgate proves "still builds", exactly as the task saysaudit-content.md/audit-engine.md/audit-gates.mdare not in the scratchpad0a40db8. Not one file under any crate'ssrc/is touched;tests/v10_lift.rsreads 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 closescompose.yamlforwards 11. Missing:DELVEWRIGHT_ACTOR_FLOOR,DELVEWRIGHT_CUTSCENE_GRACE_MS,DELVEWRIGHT_ENTITY_SETTLE_TIMEOUT_MS,DELVEWRIGHT_RETRY_ON_DEATH— all four carry theDELVEWRIGHT_prefix the ledger entry omits. No env-forwarding gate existsstages.rs:2101and:3163are bothtier: Option<EncounterTier>; nothing requires one.playtest-methodology.md:104now states this correctly ("no diagnostic demands a tier"), so the doc is fixed and the engine gap is notcheck-dw-codes.pystill bindsDOC_PATH = docs/reference/compiler.mdalone. Exactly one code needs the PENDING concept: DW0364, absent from source and from compiler.md. STALE half: the motivating instance is fixed —mecha_crosscheck.pyis intools.md(line 274). Nocheck-tool-inventory.pyexistsharness/src/lethalisstaged.some(g => g.crush)— timed gates only. No lethal-volume and noon_deathassertion anywhere in the harness. The crush-gate precedent it should copy is inexecutor.ts:232-609worktree-bootstrap.md:112names the invariant ("a baseline hash manifest records the git SHA anddelvec --version… and the comparison asserts them") under a heading that literally reads "The stronger fix, which is not this convention". Nothing intools/orvalidation/builds itcrates/admit/src/gallery.rs:171-174still emitsdoDaylightCycle/doWeatherCycle/doMobSpawning/doImmediateRespawn;tools/spike-jump-arc/measure.mjs:186still emitsgamerule fallDamage false. The compiler is fine —tests/emit.rs:774asserts the new namesspec-0031:432,spec-0032:166,compiler.md:3543,docs/notes/death-and-teleport-spike.md:210, raw atobservations.json:331. And it reached emission:emit.rs:7377explains thatexecute store success … run damageis inert and the lethal-volume guard reads the outcome (#leth_hp);tests/v10_lethal_volume.rs:198-210asserts both the outcome guard and the absence ofstore successcheck-capability-ownership.py:240is stillMODIFIER_MIN_SHARE = 1/3with no absolute-count term and no "once ledgered, stays ledgered". Ran it: check D examines 112 pairs, 6 matched — whilecapability-ownership-audit.md:243says 7. The 7th (TimedGateDisarm.TrapDisarm) is aMODIFIER_HOLESkey the checker did not count as matched, so the audit table and the tool disagree todayeclipse.rs:311states the defect in its own doc comment ("there are TWO affordance authorities in the compiler"). No import crosses betweenaffordance.rsandeclipse.rs; no test compares their membership.v10_economy.rs:454pins the shop instance, not the general formteleport.rshas no stake handling;check_bound_affordancesreadseclipse::affordances, andv10_economy.rs:450asserts a stake is deliberately not in it. Neither candidate fix is takenvalidation/packtest-run.shasserts no test count at all and never compares against what the compiler emitted — grep forcount/templatein it returns only proseProposed, spec-0031Draft, spec-0032Draft, spec-0028Proposedall read as unbuilt over shipped work. Fixed in this PR by adding a measuredImplementedline beside (never replacing)Status. No check binds eitherThe 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:
waves[].respawns_on_rest(stages.rs:2069); and per the 2026-08-05 owner ruling a billedelite/bossstill standing is deleted and re-seated at full count/health by a rest (stages.rs:2094-2099).DW0499forbidsboss+respawns_on_restMobDrop=Slot{slot}|Item{item,name}(DSL v0.9,stages.rs:2333); undeclared slots keep drop chance0.0;DW0490refuses a slot the entity's ownequipmentdoes not fill. Note the shape is a declared subset, not a raw per-slotdrop_chanceknob as §5 words it — same guaranteecontentsKitItem.contents: Option<PotionContents>(DSL v0.8,stages.rs:892);DW0486restricts it to potion-bearing items,DW0487catches a potion with no contentsDW0388(nav.rs:97),HAZARD_STANDOFFderived as one second of sprint. §7 asks it be "error tier for the remake" —nav.rs:3647hazard_tier(souls, …)already converts every finding to a build error (exit 3) for a souls campaign, andnav.rs:3637defines that as "a campaign that places abonfire". The remake declares six. Nothing to promoteTimedGate.disarm: Option<TimedGateDisarm>(stages.rs:1793), PR #275crates/grammarwith 6 of 8 zone programs. Z3 and Z7 are the open engine blockers:causewayis a terminus with no exit lane past its guard post (wants aberm_gateparameter), and nothing in the vocabulary ascends —drop_shaft/dumbwaiterare one-way down by gate,boulder_stairis flat, so a bell tower cannot be climbed (wantstower_stair). Pluscounterweight_lift, which today's IR cannot expresscampaigns/the-drowned-bell/on contentmainholds onlyREMAKE.md,media/,out/,out-zh/— no campaign source at all, which is why thecampaign buildsgate discovers 2 campaigns and not 4So 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)
CLAUDE.mdlayoutcrates/ … dsl / compiler / orchestrator / admit / schem / renderls crates/→ 7 members;grammarwas missingCLAUDE.mdlayoutdocs/reference/listing six filesls docs/reference/→ 7;worktree-bootstrap.mdwas missingCLAUDE.mdlayoutprefabs/ # .nbt library + metadata (git-lfs)find prefabs -name '*.nbt' | wc -l→ 0;*.json→ 0. 36.nbtare in the content repo.prefabs/README.mdalready said so; the constitution did notdocs/reference/grammar.md§5cREMAKE §ncited with no pathcampaigns/the-drowned-bell/REMAKE.md, contentmain795ef92. §3 = zones, §4 = lettered catalogue, §7 = prerequisites — all three resolvespec-0027Status: Proposedstaging.rs:1316still stands inspec-0028Status: Proposedrefimg.pyshipped (#334/#338); AC3 nowhere —similarityoccurs only in the spec itself; no test of any kind for the toolspec-0031Status: Draftspec-0032Status: Draftdocs/notes/capability-ownership-audit.mdtools/check-capability-ownership.pyonmain: A 13, D 6, E 11. D's "7" counts aSTRUCTURAL_TWINStuple as aMODIFIER_HOLESkey — 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 rowStatuslines are not touched — they record approval. Each spec gains aseparate
Implementedline that names its evidence and, deliberately, what isstill missing.
spec-0029is untouched: PR #357 owns that file.Findings, reported rather than edited (code is wrong, not the doc)
DW0425's message names a field that does not exist.emit.rs:6165tellsthe author "shortcut
Xdeclares anon_wrong_sideanswer" —on_wrong_sideappears in no DSL schema (
grep -rn on_wrong_side crates/dsl/src/isempty). It is the vestige of an abandoned design;
wrongside.rs:2's module docrepeats it. Worse,
check_shortcut_sidesraisesDW0425for everyshortcut with an underivable side, whether or not any answer is authored — so
the message is false for the common case.
workflow_dispatchonengine-release.ymlwithtag: v1.0.0fills it.build (A, D, E) — corrected in this PR, since the numbers are the document's
only content.
traversalruling exists but its content is unrecorded — CLAUDE.mdasserts 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-versionandcheck-storybook-versionall pass locally, on a tree that built first.
🤖 Generated with Claude Code
https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL