os-sdlc: objections ledger table shared by test-reviewer and reviewer; briefs carry open objections; convergence-aware bound #609

Closed
opened 2026-09-17 16:32:35 +00:00 by jared · 1 comment
Owner

Context

Implementation 27 on #606: three test-reviewer rounds each raised a disjoint set of objections, including new ones on unchanged files, and round 3's rejection was factually wrong. A fresh agent per dispatch has no memory of what was already accepted, so a bound of 2 cannot converge. Decided 2026-09-17 in session b224a5a7-84ca-4f47-a18e-abc50c9b5a77.

Design

Table objections: id, implementation_id FK, node (string, the map node such as test-reviewer), raised_by_dispatch_id FK, corrected_by_dispatch_id FK nullable, objection, expected_action, writer_note. Model OsSdlc::Model::Objection. An objection is open while corrected_by_dispatch_id is null. Ownership is the implementation plus node, never an agent.

Tasks

  • Schema bump adding the table and model with implementation.objections, implementation.open_objections(node), implementation.objections_for(node), dispatch.raised_objections, dispatch.corrected_objections.
  • A reviewer fail handoff inserts one row per objection item; a reviewer handoff corrected: [ids] sets corrected_by on those rows.
  • Brief enrichment objections for the writer (open rows, with ids) and the reviewer (all rows for the node; open in full, corrected as one line). One query, formatted as a numbered list.
  • A reviewer fail that leaves zero open rows is routed as pass.
  • Bound is spent only when a writer round leaves an open row untouched; a reviewer round that opens a row against unchanged lines is flagged in the report, not charged.
  • ADR recorded.

Origin

  • Trigger: implementation 27 post-mortem, session b224a5a7-84ca-4f47-a18e-abc50c9b5a77
  • Chain: fresh reviewer per round + no ledger → new objections each round → bound_exhausted DESIGN (map enrich for test-reviewer)
  • Where: plugins/os-sdlc/lib/os_sdlc/model/db.rb, pipeline/next_step.rb, maps/poodr-ticket-implementation.yaml
## Context Implementation 27 on #606: three test-reviewer rounds each raised a disjoint set of objections, including new ones on unchanged files, and round 3's rejection was factually wrong. A fresh agent per dispatch has no memory of what was already accepted, so a bound of 2 cannot converge. Decided 2026-09-17 in session b224a5a7-84ca-4f47-a18e-abc50c9b5a77. ## Design Table `objections`: id, implementation_id FK, node (string, the map node such as `test-reviewer`), raised_by_dispatch_id FK, corrected_by_dispatch_id FK nullable, objection, expected_action, writer_note. Model `OsSdlc::Model::Objection`. An objection is open while `corrected_by_dispatch_id` is null. Ownership is the implementation plus node, never an agent. ## Tasks - [ ] Schema bump adding the table and model with `implementation.objections`, `implementation.open_objections(node)`, `implementation.objections_for(node)`, `dispatch.raised_objections`, `dispatch.corrected_objections`. - [ ] A reviewer `fail` handoff inserts one row per objection item; a reviewer handoff `corrected: [ids]` sets corrected_by on those rows. - [ ] Brief enrichment `objections` for the writer (open rows, with ids) and the reviewer (all rows for the node; open in full, corrected as one line). One query, formatted as a numbered list. - [ ] A reviewer `fail` that leaves zero open rows is routed as `pass`. - [ ] Bound is spent only when a writer round leaves an open row untouched; a reviewer round that opens a row against unchanged lines is flagged in the report, not charged. - [ ] ADR recorded. ## Origin - Trigger: implementation 27 post-mortem, session b224a5a7-84ca-4f47-a18e-abc50c9b5a77 - Chain: fresh reviewer per round + no ledger → new objections each round → bound_exhausted DESIGN (map enrich for test-reviewer) - Where: plugins/os-sdlc/lib/os_sdlc/model/db.rb, pipeline/next_step.rb, maps/poodr-ticket-implementation.yaml
jared changed title from objections ledger table to os-sdlc: objections ledger table shared by test-reviewer and reviewer; briefs carry open objections; convergence-aware bound 2026-09-17 16:32:37 +00:00
Author
Owner

Resolution

Done: objections table (schema 24) and Model::Objection owned by implementation+node; ObjectionIntake records reviewer objections/corrected and writer notes; objections enrichment for test-writer and test-reviewer briefs; a reviewer fail with zero open rows routes as pass; bound spent only on a stale open objection; goalpost_moved flag on dispatches; test-reviewer and test-writer charters updated.

Evidence: main b1a10cdc, ADR-0200; tests ObjectionTest, ObjectionIntakeTest, ObjectionsDigestTest, ImplementationObjectionRoutingTest, GoalpostCheckTest; suite 1331 runs, only the two known-flaky OsSdlcEvidenceBinTest failures.

Follow-ups: implementation-report does not yet show goalpost_moved (P3, not filed: no pain until a run trips it); not live-verified, the #606 rerun in a fresh session is the live check

## Resolution **Done:** objections table (schema 24) and Model::Objection owned by implementation+node; ObjectionIntake records reviewer objections/corrected and writer notes; objections enrichment for test-writer and test-reviewer briefs; a reviewer fail with zero open rows routes as pass; bound spent only on a stale open objection; goalpost_moved flag on dispatches; test-reviewer and test-writer charters updated. **Evidence:** main b1a10cdc, ADR-0200; tests ObjectionTest, ObjectionIntakeTest, ObjectionsDigestTest, ImplementationObjectionRoutingTest, GoalpostCheckTest; suite 1331 runs, only the two known-flaky OsSdlcEvidenceBinTest failures. **Follow-ups:** implementation-report does not yet show goalpost_moved (P3, not filed: no pain until a run trips it); not live-verified, the #606 rerun in a fresh session is the live check
jared closed this issue 2026-09-17 17:16:00 +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#609
No description provided.