Add os-sdlc:test-lint-fixer agent and the early test-lint gate to /os-sdlc:implement #317

Closed
opened 2026-08-07 13:16:49 +00:00 by jared · 3 comments
Owner

Design: ADR-0107 (docs/adr/0107-dedicated-test-lint-fixer-agent-with-early-test-lint-gate-and-path-routed-late-gate.md); decisions charted on wayfinder map #310 (tickets #311, #312).

Acceptance criteria

  • A new agent file plugins/os-sdlc/agents/test-lint-fixer.md exists, mirroring lint-fixer.md's structure: per-file assignment (path + verbatim offense list, no ticket context), tools Read/Write/Edit/Glob/Grep/Bash, model sonnet, rubocop-scoped self-verification, disclosure list return format, never deletes its assignment file, never asks questions. Scope inversion: it edits ONLY files under the project's test_path and never any other file. Assertion-set invariant stated: may extract helpers, split test methods, rename locals, restructure non-assertion code; must never add, remove, weaken, or merge an assertion. lint-fixer.md is unchanged.
  • New transition-table rows in plugins/os-sdlc/lib/os_sdlc/transition_table/ insert an early test-lint gate between the first red-assert and shard-plan: (1) safe autocorrect (rubocop -a) scoped to only the test files the test-writer dispatch created/edited this run, (2) rubocop check scoped to the same files, (3) if residuals, per-file fanout dispatch of os-sdlc:test-lint-fixer via the existing worklist/assignment machinery, (4) red-assert re-runs if and only if a fixer edited a file. Clean rubocop → no dispatch, no re-run, gate adds no steps.
  • All gate/sequencing logic is in tested Ruby in the transition table, none in skills/implement/SKILL.md prose (ADR-0097).
  • Transition-table unit tests cover: clean path (no dispatch, no re-assert), dirty path (fanout + conditional red-assert re-run), and scoping (files outside the test-writer's set are not linted at this gate).
  • Full suite green; rubocop clean.
Design: ADR-0107 (docs/adr/0107-dedicated-test-lint-fixer-agent-with-early-test-lint-gate-and-path-routed-late-gate.md); decisions charted on wayfinder map #310 (tickets #311, #312). ## Acceptance criteria - A new agent file plugins/os-sdlc/agents/test-lint-fixer.md exists, mirroring lint-fixer.md's structure: per-file assignment (path + verbatim offense list, no ticket context), tools Read/Write/Edit/Glob/Grep/Bash, model sonnet, rubocop-scoped self-verification, disclosure list return format, never deletes its assignment file, never asks questions. Scope inversion: it edits ONLY files under the project's test_path and never any other file. Assertion-set invariant stated: may extract helpers, split test methods, rename locals, restructure non-assertion code; must never add, remove, weaken, or merge an assertion. lint-fixer.md is unchanged. - New transition-table rows in plugins/os-sdlc/lib/os_sdlc/transition_table/ insert an early test-lint gate between the first red-assert and shard-plan: (1) safe autocorrect (rubocop -a) scoped to only the test files the test-writer dispatch created/edited this run, (2) rubocop check scoped to the same files, (3) if residuals, per-file fanout dispatch of os-sdlc:test-lint-fixer via the existing worklist/assignment machinery, (4) red-assert re-runs if and only if a fixer edited a file. Clean rubocop → no dispatch, no re-run, gate adds no steps. - All gate/sequencing logic is in tested Ruby in the transition table, none in skills/implement/SKILL.md prose (ADR-0097). - Transition-table unit tests cover: clean path (no dispatch, no re-assert), dirty path (fanout + conditional red-assert re-run), and scoping (files outside the test-writer's set are not linted at this gate). - Full suite green; rubocop clean.
Author
Owner

Implemented on branch sdlc/317 (worktree .sdlc/worktrees/sdlc-317) via /os-sdlc:implement. Suite green (777 runs), rubocop clean, reviewer APPROVE after 3 change rounds. Awaiting merge decision.

Implemented on branch sdlc/317 (worktree .sdlc/worktrees/sdlc-317) via /os-sdlc:implement. Suite green (777 runs), rubocop clean, reviewer APPROVE after 3 change rounds. Awaiting merge decision.
Author
Owner

Branch sdlc/317 never merged; predates the #341/#342 map-driven engine rewrite (large diff vs current lib/os_sdlc/runner). ADR-0107 still Accepted and not superseded, so the design stands, but implementation needs re-scoping onto current architecture rather than merging the stale branch. Leaving open.

Branch sdlc/317 never merged; predates the #341/#342 map-driven engine rewrite (large diff vs current lib/os_sdlc/runner). ADR-0107 still Accepted and not superseded, so the design stands, but implementation needs re-scoping onto current architecture rather than merging the stale branch. Leaving open.
Author
Owner

Closing as superseded: branch sdlc/317 predates the map-driven runner rewrite (ADR-0097, #341/#342 waves) — 247-file stale diff, never merged. The test-lint gate concept from ADR-0107 needs re-scoping against the current stepper if revived.

Closing as superseded: branch sdlc/317 predates the map-driven runner rewrite (ADR-0097, #341/#342 waves) — 247-file stale diff, never merged. The test-lint gate concept from ADR-0107 needs re-scoping against the current stepper if revived.
jared closed this issue 2026-08-13 18:33:42 +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#317
No description provided.