docs-spec-count-drift
Root cause: The README's status line and PRD table claimed 15 Alpha PRDs "complete" while specs/ contained only 8 spec files (001–007, 014) — the table had no spec-file column tying each row to an actual file, so the drift was invisible.
Fix (3 parts), applied in ~/alpha-prd-docs/:
1. Trimmed the README PRD table to the 8 existing spec files and added a spec-file column (link per row, so a row without a file is a broken link and gets caught):
Status: **8 Alpha PRDs specced** — 7 planned PRDs not yet written (see below).
| # | PRD | Title | Spec file |
| --- | --- | --- | --- |
| 001 | PRD-001 | Alpha onboarding | [specs/ALPHA-PRD-001.md](specs/ALPHA-PRD-001.md) |
| 002 | PRD-002 | Alpha billing | [specs/ALPHA-PRD-002.md](specs/ALPHA-PRD-002.md) |
| ... (008–013 and 015 removed from table) ...
| 014 | PRD-014 | Alpha quotas | [specs/ALPHA-PRD-014.md](specs/ALPHA-PRD-014.md) |
2. Added an explicit "Not yet specced" note listing the 7 missing PRDs (008–013, 015) so intent is preserved without faking completeness:
```markdown
- Before: `specs=8`, README rows `15` → drift confirmed (8 vs 15). - After: `specs=8`, README rows `8`, and the acceptance criterion passes exactly: ``` specs: 8 README rows: 8 GUARD PASS: specs=8 table_rows=8 ``` - Test suite (`tests/run-tests.sh`), 5/5 passing: 1. Guard passes on the fixed repo (acceptance criterion). 2. Every table row links an existing spec file (spec-file column integrity). 3. Every spec file is listed in the table exactly once (no dupes/omissions). 4. "Not yet specced" note present, covering PRDs 008–013 and 015. 5. **Negative test:** appending a ghost row (`PRD-999`) makes the guard fail with `GUARD FAIL: specs=8 table_rows=9` — proving drift is caught, then repo restored. Edge cases handled: table rows with trailing pipes, duplicate numbering (test 3 counts occurrences per spec), ghost rows (test 5), missing README (guard exits non-zero), and the out-of-sequence 014 numbering (test 3 keys off the extracted number, not the list position).
{"model": "gpt-4.1", "problem_class": "docs-spec-count-drift", "result": "passed", "tests": 5}Root cause: The README's status line and PRD table claimed 15 Alpha PRDs "complete" while specs/ contained only 8 spec files (001–007, 014) — the table had no spec-file column tying each row to an actual file, so the drift was invisible.
Fix (3 parts), applied in ~/alpha-prd-docs/:
1. Trimmed the README PRD table to the 8 existing spec files and added a spec-file column (link per row, so a row without a file is a broken link and gets caught):
Status: **8 Alpha PRDs specced** — 7 planned PRDs not yet written (see below).
| # | PRD | Title | Spec file |
| --- | --- | --- | --- |
| 001 | PRD-001 | Alpha onboarding | [specs/ALPHA-PRD-001.md](specs/ALPHA-PRD-001.md) |
| 002 | PRD-002 | Alpha billing | [specs/ALPHA-PRD-002.md](specs/ALPHA-PRD-002.md) |
| ... (008–013 and 015 removed from table) ...
| 014 | PRD-014 | Alpha quotas | [specs/ALPHA-PRD-014.md](specs/ALPHA-PRD-014.md) |
2. Added an explicit "Not yet specced" note listing the 7 missing PRDs (008–013, 015) so intent is preserved without faking completeness:
```markdown
- Before: `specs=8`, README rows `15` → drift confirmed (8 vs 15). - After: `specs=8`, README rows `8`, and the acceptance criterion passes exactly: ``` specs: 8 README rows: 8 GUARD PASS: specs=8 table_rows=8 ``` - Test suite (`tests/run-tests.sh`), 5/5 passing: 1. Guard passes on the fixed repo (acceptance criterion). 2. Every table row links an existing spec file (spec-file column integrity). 3. Every spec file is listed in the table exactly once (no dupes/omissions). 4. "Not yet specced" note present, covering PRDs 008–013 and 015. 5. **Negative test:** appending a ghost row (`PRD-999`) makes the guard fail with `GUARD FAIL: specs=8 table_rows=9` — proving drift is caught, then repo restored. Edge cases handled: table rows with trailing pipes, duplicate numbering (test 3 counts occurrences per spec), ghost rows (test 5), missing README (guard exits non-zero), and the out-of-sequence 014 numbering (test 3 keys off the extracted number, not the list position).
{"model": "gpt-4.1", "problem_class": "docs-spec-count-drift", "result": "passed", "tests": 5}