os-sdlc: survivors gate step and slow-step warning (#1638 part C) #1641

Closed
opened 2026-11-08 16:01:00 +00:00 by jared · 4 comments
Owner

Problem

The os-sdlc-survivors command exists, but no map runs it, so a survivor does not stop a ticket. A Mutineer run that takes much longer than expected gives no signal.

Approach

Design: docs/system-design-format/proof/2026-11-08-os-sdlc-mutation-survivors.md, sections 3 to 5, build slice 6 (slice 7 is orchestrator work below). Parent: #1638.

Required work:

  1. Add survivors to Gate::Name::ALL and map it in Gate::Commands#to_h to os-sdlc-survivors <implementation-id> — check: present os-sdlc-survivors in plugins/os-sdlc/lib/os_sdlc/gate/**/*.rb
  2. StepOutcome#gate_type maps survivors to survivor (not mutation, which is the seeded-patch gate's name); Gate::ViolationRecord::PARSERS["survivor"] records one Violation per survivor through MutationTest::Outcome.parse(output).survivors.violations — check: present MutationTest::Outcome.parse in plugins/os-sdlc/lib/os_sdlc/gate/**/*.rb
  3. A survivors step that exits 3 gives the verdict error, not fail, so a tool failure never routes to a test-writing node — check: present "survivor" in plugins/os-sdlc/lib/os_sdlc/**/*.rb
  4. Add Gate::SlowStep with LIMITS = { "survivors" => 500 } seconds and warning(outcome); Gate::Reply#to_h adds warnings on every verdict when a limit gives a line — check: present warnings in plugins/os-sdlc/lib/os_sdlc/gate/**/*.rb

Orchestrator work: after this ticket merges, edit plugins/os-sdlc/maps/poodr-ticket-implementation.yaml (design section 3 and slice 7): node survivor-check (agent suite-check, gates: [survivors], instructions to run os-sdlc-gate with a Bash timeout of 600000 ms, pass: contract-auditor, fail: survivor-tests); node survivor-tests (agent test-writer, gates: [survivors, test-lint], instructions to write tests that kill the listed survivors and pass on the current code, pass: suite-check, fail: { to: survivor-tests, bound: 2 }); suite-check pass: goes to survivor-check. A run on this map that edits the map file fails its own map-digest check, so this edit is not in the pipeline run. Verify with the map document test and Map::Check.

Acceptance criteria

  1. Given a node with gates: [survivors] and a survivors command that exits 0, when the gate runs, then the verdict is pass.
  2. Given a survivors command that exits 1 with two survivor rows, when the gate runs, then the verdict is fail and one correction round with gate type survivor holds two violations with the survivors' files and lines.
  3. Given a survivors command that exits 3, when the gate runs, then the verdict is error and the step output holds the error line.
  4. Given a survivors step that took more than 500 seconds, when the gate reply is built, then it has a warnings line naming the step and its time, and the verdict is the same as without the warning.
  5. Given a survivors step under 500 seconds, when the gate reply is built, then it has no warnings key.
  6. Given a later green survivors run in the same implementation, when the gate records it, then the open survivor violations are resolved and lint and test violations are not touched.

Owner sketch

class Gate::SlowStep
  LIMITS = { "survivors" => 500 }.freeze
  def warning(outcome)
end

class Gate::Reply
  def to_h
end

Blocking edges

Blocked by #1640.

Origin

  • Trigger: domain-object design docs/system-design-format/proof/2026-11-08-os-sdlc-mutation-survivors.md (commit f0e172b7) for parent #1638
  • Improvised this session: none
  • Chain: survivor gate needs one owner per fact ← design section 3 ← DESIGN (docs/system-design-format/proof/2026-11-08-os-sdlc-mutation-survivors.md)
  • Root candidate: none found; searched mutation, mutineer, mutant, survivor, merge_base, changes since
  • Where: lib/os_sdlc/gate/, maps/poodr-ticket-implementation.yaml
  • Session: ff703e34-8046-4b24-af68-6ef76d8aa338
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os-plugins-os-sdlc/ff703e34-8046-4b24-af68-6ef76d8aa338.jsonl

VERDICT: CREATE

## Problem The `os-sdlc-survivors` command exists, but no map runs it, so a survivor does not stop a ticket. A Mutineer run that takes much longer than expected gives no signal. ## Approach Design: `docs/system-design-format/proof/2026-11-08-os-sdlc-mutation-survivors.md`, sections 3 to 5, build slice 6 (slice 7 is orchestrator work below). Parent: #1638. Required work: 1. Add `survivors` to `Gate::Name::ALL` and map it in `Gate::Commands#to_h` to `os-sdlc-survivors <implementation-id>` — check: present `os-sdlc-survivors` in `plugins/os-sdlc/lib/os_sdlc/gate/**/*.rb` 2. `StepOutcome#gate_type` maps `survivors` to `survivor` (not `mutation`, which is the seeded-patch gate's name); `Gate::ViolationRecord::PARSERS["survivor"]` records one `Violation` per survivor through `MutationTest::Outcome.parse(output).survivors.violations` — check: present `MutationTest::Outcome.parse` in `plugins/os-sdlc/lib/os_sdlc/gate/**/*.rb` 3. A `survivors` step that exits 3 gives the verdict `error`, not `fail`, so a tool failure never routes to a test-writing node — check: present `"survivor"` in `plugins/os-sdlc/lib/os_sdlc/**/*.rb` 4. Add `Gate::SlowStep` with `LIMITS = { "survivors" => 500 }` seconds and `warning(outcome)`; `Gate::Reply#to_h` adds `warnings` on every verdict when a limit gives a line — check: present `warnings` in `plugins/os-sdlc/lib/os_sdlc/gate/**/*.rb` Orchestrator work: after this ticket merges, edit `plugins/os-sdlc/maps/poodr-ticket-implementation.yaml` (design section 3 and slice 7): node `survivor-check` (agent `suite-check`, `gates: [survivors]`, instructions to run `os-sdlc-gate` with a Bash timeout of 600000 ms, `pass: contract-auditor`, `fail: survivor-tests`); node `survivor-tests` (agent `test-writer`, `gates: [survivors, test-lint]`, instructions to write tests that kill the listed survivors and pass on the current code, `pass: suite-check`, `fail: { to: survivor-tests, bound: 2 }`); `suite-check` `pass:` goes to `survivor-check`. A run on this map that edits the map file fails its own map-digest check, so this edit is not in the pipeline run. Verify with the map document test and `Map::Check`. ## Acceptance criteria 1. Given a node with `gates: [survivors]` and a survivors command that exits 0, when the gate runs, then the verdict is pass. 2. Given a survivors command that exits 1 with two survivor rows, when the gate runs, then the verdict is fail and one correction round with gate type `survivor` holds two violations with the survivors' files and lines. 3. Given a survivors command that exits 3, when the gate runs, then the verdict is error and the step output holds the error line. 4. Given a survivors step that took more than 500 seconds, when the gate reply is built, then it has a `warnings` line naming the step and its time, and the verdict is the same as without the warning. 5. Given a survivors step under 500 seconds, when the gate reply is built, then it has no `warnings` key. 6. Given a later green survivors run in the same implementation, when the gate records it, then the open `survivor` violations are resolved and `lint` and `test` violations are not touched. ## Owner sketch ```ruby class Gate::SlowStep LIMITS = { "survivors" => 500 }.freeze def warning(outcome) end class Gate::Reply def to_h end ``` ## Blocking edges Blocked by #1640. ## Origin - Trigger: domain-object design `docs/system-design-format/proof/2026-11-08-os-sdlc-mutation-survivors.md` (commit f0e172b7) for parent #1638 - Improvised this session: none - Chain: survivor gate needs one owner per fact ← design section 3 ← DESIGN (`docs/system-design-format/proof/2026-11-08-os-sdlc-mutation-survivors.md`) - Root candidate: none found; searched mutation, mutineer, mutant, survivor, merge_base, changes since - Where: lib/os_sdlc/gate/, maps/poodr-ticket-implementation.yaml - Session: ff703e34-8046-4b24-af68-6ef76d8aa338 - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os-plugins-os-sdlc/ff703e34-8046-4b24-af68-6ef76d8aa338.jsonl VERDICT: CREATE
Author
Owner

Blocked on #1640 (MutationTest::Outcome and os-sdlc-survivors).

Blocked on #1640 (MutationTest::Outcome and os-sdlc-survivors).
Author
Owner

Unblocked: #1640 is closed (MutationTest::Outcome and os-sdlc-survivors are built). The waiting label stays until the CLI can remove labels.

Unblocked: #1640 is closed (MutationTest::Outcome and os-sdlc-survivors are built). The waiting label stays until the CLI can remove labels.
Author
Owner

Work started on branch ticket-1641 (os-sdlc pipeline, map poodr-ticket-implementation).

Work started on branch ticket-1641 (os-sdlc pipeline, map poodr-ticket-implementation).
Author
Owner

Resolution

Done: Gate type survivor wired through Gate::Name, Gate::Commands, StepOutcome and ViolationRecord; MutationTest::Survivors#violations folds survivors into gate violations; Gate::SlowStep owns the non-blocking 500 s limit and adds a warning to the gate reply.

Evidence: Implementation 265 implementation_complete: 10 dispatches, 0 retries, 14 min 0 s; Runner commit on branch ticket-1641 (11 paths, none overlapping or dirty). Suite gate passed in 54.6 s. Contract-auditor passed with no LENS lines.

Follow-ups: Map edit (survivor-check and survivor-tests nodes, suite-check pass edge) is orchestrator work after this merge, per the design doc slice 7; done in this session under #1638.

## Resolution **Done:** Gate type survivor wired through Gate::Name, Gate::Commands, StepOutcome and ViolationRecord; MutationTest::Survivors#violations folds survivors into gate violations; Gate::SlowStep owns the non-blocking 500 s limit and adds a warning to the gate reply. **Evidence:** Implementation 265 implementation_complete: 10 dispatches, 0 retries, 14 min 0 s; Runner commit on branch ticket-1641 (11 paths, none overlapping or dirty). Suite gate passed in 54.6 s. Contract-auditor passed with no LENS lines. **Follow-ups:** Map edit (survivor-check and survivor-tests nodes, suite-check pass edge) is orchestrator work after this merge, per the design doc slice 7; done in this session under #1638. <!-- os-backlog kind: resolution -->
jared closed this issue 2026-11-08 17:01:09 +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#1641
No description provided.