Census — TFW-60 / Phase A, corrective pass¶
Purpose: the measured baseline the owner's overrun ruling stands on, and the reference the acceptance criteria are read against. Regenerated at the start of the corrective pass, before any further edit, per TS §6 step 1. Measured: 2026-08-26, at
c5e447aBaseline for every delta:80a16→80d6a16, the commit before execution opened Host: Windows 11 Pro 26200, Git Bash, Python 3.13.5, pytest 9.0.2, NTFS Supersedes: the first-pass census, whose figures are stale and whose budget position was reported before the rejection.
1. ⚠️ The budget tripwire has fired. This returns to the coordinator.¶
| Configured | Ruled (S42 / S44) | Measured now | Δ vs ruling | |
|---|---|---|---|---|
| Modified files | 30 | 45 | 46 | +1 |
| New files | 15 | 23 | 29 | +6 |
| Files total | 30 | 68 | 75 | +7 |
| LOC | 3000 | — | 3,985 added · 303 removed | — |
TS §7 sets the condition: "The census exceeding roughly 75 files total, or a new group appearing, without returning to the coordinator — the owner's overrun ruling was given against 45 / 23 / 68, and delegation is never authority to accept a further overrun."
The count is 75 before AC-12 has been executed at all, and AC-12 requires one more new
file (phase-a/status.md), taking it to 76. I am raising it rather than absorbing it,
and rather than trimming to reach 68 — S44 forbids the second and DoF forbids the first.
Every file of the +7, named¶
| # | File | Why it exists | In the ruled 23/45? |
|---|---|---|---|
| 1–6 | tasks/[TFW-60](../../HL-TFW-60__conflict_resistant_shared_workspace.md)…/journal/*.md — six events |
The phase ships a journal as a named deliverable and its own task had none. A model unused on the task that introduces it is a gap a reviewer should not have to find | no — the TS create list did not include it |
| 7 | .tfw/quickstart.md |
AC-10 requires Quick Start to describe the shipped model; §4 did not list the file | no |
Nothing else exceeds the ruling. The 23 new files the TS named are all present and are
exactly the 23 it named. The modified set is the ruled 45 plus quickstart.md.
What AC-12 adds on top¶
| Item | Files | Note |
|---|---|---|
phase-a/status.md for TFW-60 |
+1 | measured below: it is the only phase state file the whole corpus needs |
| Second precision, phase state, the new lifecycle id | 0 | every affected file — config, templates, conventions, scripts, workflows, adapter originals — is already inside the modified 46 |
Projected total on completion: 76.
Two classes that are not counted, and why¶
| Class | Ruling | Members here |
|---|---|---|
| Byte-identical adapter copies | S32 | 38 files under .claude/, .agent/, .agents/ — regenerated by adapter sync |
| Artifacts of the work itself | S46 | this file, migration_accounting.md, fixture_transcript.txt, ceiling_measurement.txt, the ONB, RF, EV, REVIEW and review/ stage files |
Also outside my count: two journal events written by other roles — the reviewer's
20260826-220659__transition.md and the coordinator's
20260826-230051__transition__saubakirov.md. Including them the tree shows 77; they are not
executor product.
S46 is the ruling that matters most for this file: because evidence sits outside the count, there is no budget argument for producing less of it.
2. The trace that was destroyed, and its restoration¶
The rejected pass shipped tasks/BOARD-SNAPSHOT.md reading Rows captured | 0 against a
61-row board, containing the string TFW- zero times. Eight identifiers reached neither
the snapshot nor the index. The review recorded it as verified.
Root cause, stated plainly: after the board was removed from README.md, the migration
was re-run to regenerate the snapshot. parse_board() read the live README, found no table,
and returned zero rows. The script wrote an empty snapshot over the correct one and reported
success. Nothing in the run said the input had vanished.
The fix is structural, not a re-run. The board source is now an explicit argument
(--board-rev), and a run yielding zero rows is refused unless --allow-empty-board is
passed:
$ python docs/scripts/migrate_board.py --apply
board source: README.md (working tree) -> 0 data rows
REFUSING: the board source yielded zero rows.
A snapshot of an empty board is not a snapshot, it is a deleted trace.
If the board has already been removed, name the commit that still had it:
--board-rev <commit-before-removal>
Restored and verified by count, side by side:
$ git show b094943:README.md | awk '/^## Task Board/,0' | grep -c '^|'
63 ← 61 data rows + header + separator
$ grep "Rows captured" tasks/BOARD-SNAPSHOT.md
| Rows captured | 61 |
$ grep -c 'TFW-' tasks/BOARD-SNAPSHOT.md
122
61 = 61. TS §6 step 6 is a gate, and it passes.
The eight identifiers that reached nothing in the rejected pass, named individually:
TFW-16, TFW-20, TFW-28, TFW-33, TFW-34, TFW-35, TFW-37, TFW-39. All eight were
board-only rows — six backlog ideas with no directory, two struck-through absorptions — so
the snapshot was their only carrier and emptying it erased them completely. All eight now
resolve; the accounting names all 61 by name and reports Unaccounted: 0.
3. Corpus baseline¶
Relations, not targets. AC-6 and AC-7 close against these, never against a fixed total.
| Quantity | Command | At 80d6a16 |
Now |
|---|---|---|---|
| Board data rows | git show b094943:README.md \| awk '/^## Task Board/,0' \| grep -c '^\|' − 2 |
61 | 61 (historical, frozen) |
| Task directories | ls -d tasks/*/ \| wc -l |
53 | 53 |
TFW-N occurrences |
git grep -oE 'TFW-[0-9]+' \| wc -l |
7,505 | 8,126 |
| Files carrying one | git grep -lE 'TFW-[0-9]+' \| wc -l |
666 | 695 |
| Commit subjects naming a task | git log --format='%s' \| grep -cE 'TFW-[0-9]+' |
271 | 286 |
| Task state files tracked | git ls-files 'tasks/*/status.md' \| wc -l |
0 | 11 |
The reference count rose by 621 during the phase — the ONB, the REVIEW, the review stage files and this census all name tasks. This is the evidence behind ONB Q6 and the reason a fixed-count acceptance criterion was replaced by a relation.
Tracked state is now 11, not 10. The rejected pass shipped ten: [TFW-36](../../../TFW-36__content_marketing_blog_series/)'s task folder
carries a .gitignore containing *, so its state file existed on disk and never reached
Git. It is now force-added — one file, not the folder — so a clean clone has all eleven. The
underlying condition is recorded as TD-183 and is not fixed here.
4. AC-12 phase state, confirmed by measurement rather than assumed¶
The TS asks for this to be confirmed in the census. Measured across all 53 task directories:
| Task | Phase directories | Receives task state? | Phase state files needed |
|---|---|---|---|
| TFW-42 | a, b, c | no — terminal | 0 |
| TFW-46 | a, b, c | no — terminal | 0 |
| TFW-47 | a, b | no — terminal | 0 |
| TFW-52 | a, b | no — terminal | 0 |
| TFW-53 | a, b, c, d, e | no — terminal | 0 |
| TFW-55 | a, b | no — terminal | 0 |
| TFW-60 | a | yes | 1 |
| total | 1 |
Seven multi-phase task directories exist; six are terminal and receive no task state, so they receive no phase state. Migration creates phase state for no legacy task. The budget impact is 1 file, confirming the TS's "one or two" and refuting the seventeen a per-phase sweep of the corpus would have cost.
5. File census against TS §4¶
| Group | Ruled | Measured | Note |
|---|---|---|---|
| Canonical rules | 4 | 4 | conventions, glossary, .tfw/README, compilable_contract |
| Configuration | 2 | 2 | live + template project_config.yaml |
| Lifecycle workflows | 8 | 8 | update.md now genuinely changes — the initial_seq residue (F10) |
| Templates | 13 | 13 | |
| Adapter originals | 10 | 10 | 8 SKILL.md, not 7: tfw-release phrases it without the README.md prefix and the first sweep's pattern missed it |
| Documentation generator | 2 | 2 | gen_docs.py, test_integration.py |
| Release surface | 3 | 3 | VERSION, CHANGELOG, README |
| Root entry points | 3 | 3 | AGENTS, CLAUDE, RELEASE |
| Quick Start | 0 | 1 | .tfw/quickstart.md — required by AC-10, absent from §4 |
| 45 | 46 |
6. Verification at this baseline¶
| Gate | Command | Result |
|---|---|---|
| Tests | python -m pytest docs/scripts/ |
171 passed, 1 skipped (was 68 at baseline; 104 added) |
| Task-local schema | python docs/scripts/gen_index.py --validate |
53 tasks validate |
| Snapshot count | side by side, §2 above | 61 = 61 |
| Accounting | migration_accounting.md |
61 named, Unaccounted: 0 |
7. Return-to-coordinator condition¶
Recorded, not absorbed:
- Total 75 now, 76 on completion, against a ruling of 68. Every file of the excess is named in §1.
- No new group has appeared. The +7 is six journal events —
journal/is a named Phase A deliverable in the TS scope, the HL and AC-3 — plus one Quick Start file that AC-10 requires and §4 omitted. - The overrun was not created by scope creep. It is a deliverable the TS specified and forgot to count, and a file AC-10 requires and §4 forgot to list.
The owner ruled 45 / 23 / 68 with the condition that quality must not suffer. Meeting 68 would now mean deleting TFW-60's own journal or leaving Quick Start describing a removed mechanism. Both invert the ruling, so neither is done. The counts above are what a revised ruling would be given against.
Census — TFW-60 / Phase A, corrective pass | 2026-08-26