BOHICA-LABS / BOHICA-LABS/vsdd-factory
POL-003 candidate: rulings' Downstream Dispatch Tables must enumerate all cross-artifact sync obligations
- Dominant language
- Rust
- Stars
- 2
- Forks
- 1
- Avg merge
- 6h 43m
- Merged PRs (30d)
- 29
Description
### Root-cause context for #401 and #404 recurrences
Every RULING-*.md file authored under the Wave-6 Tranche B convergence carries a "Downstream Dispatch Table" section listing which artifacts the ruling requires updating. This table is the single point where the propagation-completeness contract for a ruling is codified.
**Observed defect:** across three consecutive Tranche B rulings (RULING-W6TB-D, -J, -K), the Downstream Dispatch Table listed only the story markdown file(s) and omitted:
1. `.factory/sprint-state.yaml` (canonical) — must sync `vp_traces`, `bc_traces`, `spec_version` when a story bumps.
2. `.factory/stories/sprint-state.yaml` (duplicate) — same fields, dual-path per #404.
3. `.factory/stories/STORY-INDEX.md` — status cell version parenthetical per POL-002.
4. `inputDocuments` frontmatter of the target story — per #401 policy.
5. VP catalog rows in `VP-INDEX.md` when a ruling changes VP-story anchors.
Result: three consecutive rulings, three sets of downstream artifacts missed, all three caught only by Pass-5 lens-3 fresh-context adversarial review. This is not a spec-authoring diligence failure — it is a template gap.
### Proposed policy
**POL-003 (candidate) — Ruling Dispatch Completeness Invariant:**
> Every RULING-*.md file MUST include a Downstream Dispatch Table that enumerates, at minimum, one row per authoritative sync surface potentially affected by the ruling's changes:
> - Story files (`.factory/stories/*.md`) — inputDocuments, changed_by_rulings, body ACs, changelog
> - Sprint-state canonical (`.factory/sprint-state.yaml`) — vp_traces, bc_traces, spec_version
> - Sprint-state duplicate (`.factory/stories/sprint-state.yaml`) — same fields
> - STORY-INDEX (`.factory/stories/STORY-INDEX.md`) — status cell version, BC/VP columns
> - VP catalog (`VP-INDEX.md`) — if VP-story anchors change
> - BC catalog (`BC-INDEX.md`) — if BC-story anchors change
>
> A ruling that determines a given surface is NOT affected MUST still list it with an explicit "N/A — reason: …" cell. Silent omission is a POL-003 violation.
### Enforcement options (any/all)
1. **Ruling template** — ship a canonical `RULING-TEMPLATE.md` with the mandatory table columns pre-populated; agents fill in Yes/No/N/A per row.
2. **Pre-commit lint** — parse ruling Downstream Dispatch Table; assert row-count ≥ N (matching the canonical sync surface set); assert every row has either an artifact path or "N/A — reason".
3. **Ruling-adjudicator agent prompt** — add a post-condition requiring dispatch-table completeness before the ruling is committed.
### Blast radius / evidence
Three switchboard-blue Wave-6 Tranche B recurrences (see #401 recurrence comments, #404 recurrence comments) all trace to this template gap. Fixing at the ruling-template level closes both #401 and #404 upstream — the propagation checklist becomes mandatory rather than best-effort at the story-write step.
### Related
- #401 (inputDocuments ⊇ changed_by_rulings)
- #404 (sprint-state x2 sync)
- POL-002 (STORY-INDEX row-sync)
Contributor guide
Assessment
This issue has not been assessed yet.