BOHICA-LABS / BOHICA-LABS/vsdd-factory

POL-003 candidate: rulings' Downstream Dispatch Tables must enumerate all cross-artifact sync obligations

Open
#406 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.