os-sdlc: wire code-probe evidence brief into downstream dispatch + gate its output #403

Closed
opened 2026-08-15 12:34:31 +00:00 by jared · 3 comments
Owner

Follow-up from #359/ADR-0118. (1) No runner consumer reads .sdlc/tickets//evidence-brief.md back into the next dispatch packet (needs an EvidenceBrief annotation analogous to SeamDecisionBrief). (2) The code-probe map-row gate (test -s {{brief_path}}) checks the incoming brief, not the agent's output — consider gating on evidence-brief.md like seam/verdict gates.

Follow-up from #359/ADR-0118. (1) No runner consumer reads .sdlc/tickets/<id>/evidence-brief.md back into the next dispatch packet (needs an EvidenceBrief annotation analogous to SeamDecisionBrief). (2) The code-probe map-row gate (`test -s {{brief_path}}`) checks the incoming brief, not the agent's output — consider gating on evidence-brief.md like seam/verdict gates.
Author
Owner

Decomposition

Decision: mirror the seam-decision pattern exactly. New named gate "evidence" in GateEvaluator (like "seam"/"verdict"); EvidenceBrief parser + brief annotation sibling to SeamDecision/SeamDecisionBrief; code-probe map row swaps its no-op shell gate for "evidence". No new ADR — extends ADR-0113/0116 patterns.

Tasks (via os-sdlc pipeline agents: test-writer → programmer → lint → reviewer)

  • EvidenceBrief parser class (lib/os_sdlc/runner/) mirroring SeamDecision: path_for.sdlc/tickets/<id>/evidence-brief.md; valid? iff file exists and contains the six labeled lines of skills/code-probe/references/brief-template.md.
  • GateEvaluator: named gate "evidence" (like SEAM_GATE/VERDICT_GATE) — pass iff EvidenceBrief valid, fail with a naming message otherwise.
  • TicketFlow#brief_body: seam-designer dispatch packet inlines evidence-brief content under ## Evidence brief (mirror SeamDecisionBrief's test-writer branch; sibling class, not nested).
  • maps/default.yaml code-probe row: gate: "evidence" replacing test -s {{brief_path}}. (Blocked by the gate task.)
  • Tests mirroring seam_decision_test.rb (parser), ticket_flow_seam_decision_brief_test.rb (injection), seam_gate_wiring_test.rb + seam_designer_map_row_test.rb (gate/map wiring).

Acceptance criteria

  • "evidence" gate fails when evidence-brief.md is missing, empty, or missing any of the six labeled lines; passes on a template-shaped file.
  • The assembled seam-designer brief file content includes the evidence brief's text.
  • code-probe map row no longer references {{brief_path}}.
  • Full suite green; rubocop clean; ticket closed via os-backlog close with done/evidence/follow-ups.

In scope

Parser, named gate, seam-designer packet injection, map row, tests.

Out of scope

Feeding the evidence brief to test-writer/review stages, changing the brief template's shape, retrofitting other stages' gates, agent/skill prose changes.

## Decomposition Decision: mirror the seam-decision pattern exactly. New named gate `"evidence"` in GateEvaluator (like `"seam"`/`"verdict"`); EvidenceBrief parser + brief annotation sibling to SeamDecision/SeamDecisionBrief; code-probe map row swaps its no-op shell gate for `"evidence"`. No new ADR — extends ADR-0113/0116 patterns. ### Tasks (via os-sdlc pipeline agents: test-writer → programmer → lint → reviewer) - [ ] EvidenceBrief parser class (lib/os_sdlc/runner/) mirroring SeamDecision: `path_for` → `.sdlc/tickets/<id>/evidence-brief.md`; `valid?` iff file exists and contains the six labeled lines of skills/code-probe/references/brief-template.md. - [ ] GateEvaluator: named gate `"evidence"` (like SEAM_GATE/VERDICT_GATE) — pass iff EvidenceBrief valid, fail with a naming message otherwise. - [ ] TicketFlow#brief_body: seam-designer dispatch packet inlines evidence-brief content under `## Evidence brief` (mirror SeamDecisionBrief's test-writer branch; sibling class, not nested). - [ ] maps/default.yaml code-probe row: `gate: "evidence"` replacing `test -s {{brief_path}}`. (Blocked by the gate task.) - [ ] Tests mirroring seam_decision_test.rb (parser), ticket_flow_seam_decision_brief_test.rb (injection), seam_gate_wiring_test.rb + seam_designer_map_row_test.rb (gate/map wiring). ### Acceptance criteria - [ ] `"evidence"` gate fails when evidence-brief.md is missing, empty, or missing any of the six labeled lines; passes on a template-shaped file. - [ ] The assembled seam-designer brief file content includes the evidence brief's text. - [ ] code-probe map row no longer references `{{brief_path}}`. - [ ] Full suite green; rubocop clean; ticket closed via `os-backlog close` with done/evidence/follow-ups. ### In scope Parser, named gate, seam-designer packet injection, map row, tests. ### Out of scope Feeding the evidence brief to test-writer/review stages, changing the brief template's shape, retrofitting other stages' gates, agent/skill prose changes.
Author
Owner

Work starting via /os-sdlc:implement on main.

Work starting via /os-sdlc:implement on main.
Author
Owner

Resolution

Done: EvidenceBrief reader class + named evidence-brief gate in GateEvaluator (fails closed on missing/empty output) + seam-designer dispatch brief now inlines evidence-brief content; code-probe map row gate swapped from tautological test -s {{brief_path}}; SeamDecisionBrief renamed StageBriefAnnotations per review transform. Full os-sdlc pipeline run end to end (code-probe -> seam-designer -> test-writer -> programmer -> lint -> review APPROVE).

Evidence: Commits 3f0a5a7 + merge to main; suite on main 915 runs / 2252 assertions / 0 failures; rubocop clean on changed files; reviewer verdict APPROVE in .sdlc/tickets/403/verdict.md; bin/refresh-plugins clean.

Follow-ups: Captured as issue #404 (resume retry crash on agentless states + reviewer packet evidence gap). Deliberately dropped: structural six-line validation of evidence-brief.md — gate is presence/non-empty like sibling artifact gates; tighten later only if probe briefs drift.

## Resolution **Done:** EvidenceBrief reader class + named evidence-brief gate in GateEvaluator (fails closed on missing/empty output) + seam-designer dispatch brief now inlines evidence-brief content; code-probe map row gate swapped from tautological test -s {{brief_path}}; SeamDecisionBrief renamed StageBriefAnnotations per review transform. Full os-sdlc pipeline run end to end (code-probe -> seam-designer -> test-writer -> programmer -> lint -> review APPROVE). **Evidence:** Commits 3f0a5a7 + merge to main; suite on main 915 runs / 2252 assertions / 0 failures; rubocop clean on changed files; reviewer verdict APPROVE in .sdlc/tickets/403/verdict.md; bin/refresh-plugins clean. **Follow-ups:** Captured as issue #404 (resume retry crash on agentless states + reviewer packet evidence gap). Deliberately dropped: structural six-line validation of evidence-brief.md — gate is presence/non-empty like sibling artifact gates; tighten later only if probe briefs drift.
jared closed this issue 2026-08-15 13:17:17 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#403
No description provided.