Runner commit omits production files that no handoff lists #955
Labels
No labels
P0
P1
P2
P3
bug
category/code-change
category/cross-repo
category/eval-run
category/investigation
category/no-test-target
category/owner-ruling
category/prose-artifact
category/recurring-chore
category/structure
category/umbrella
crc-refactor
create
delete
enhancement
filed-by/agent
filed-by/user
frozen
lint-rule
needs-info
needs-triage
next
plugin/cc-architect
plugin/os
plugin/os-adr
plugin/os-aidd-lint
plugin/os-backlog
plugin/os-context
plugin/os-doc-hygiene
plugin/os-sdlc
plugin/os-vault
project/cc-os
ready-for-agent
ready-for-human
recurring
review
rule-proposal
update
waiting
wayfinder:grilling
wayfinder:map
wayfinder:map
wayfinder:research
wayfinder:task
wayfinder:task
wontfix
worklist/deviations
worklist/lint-rule
worklist/new-implement-build
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jared/cc-os#955
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
The Runner commit at implementation complete stages only the paths that the implementation's handoffs list.
A green increment can therefore pass every gate while the production files that make the tests pass stay uncommitted.
The commit then holds only the test file, and the files that make it pass stay in the working tree.
Observed
During #949 on branch crc-os-adr-2026-10-04, the Runner commit for implementation 34 held only the test file.
The ConceptCycles lint and bin/lint-concept-cycles stayed uncommitted, and the session committed them by hand in
530c98f6.The
530c98f6message says abandoned implementation 32 wrote those files, and they passed all gates of implementation 34.The files were untracked, so they were in
changed_paths, but no handoff of implementation 34 listed them.Reproduce
n/a: needs a Runner run where an earlier abandoned implementation wrote production files that no handoff of the final implementation lists. Unit level: a repo with an untracked production file absent from every handoff item, then
OsSdlc::Implementation::Commit.new(implementation:, root:).callreturns a record whosedirty_pathsincludes that file.Approach
Cause is in
plugins/os-sdlc/lib/os_sdlc/command/implementation/commit.rb:34:staged_pathsreturnsListedPaths.new(@implementation).call & changed_paths.ListedPaths(plugins/os-sdlc/lib/os_sdlc/query/implementation/commit/listed_paths.rb:12) reads only handoff items.Line 27 then reports every unlisted changed file as
dirty_paths.The first guess, that
dirty_pathsdrives the path list, is wrong:dirty_pathsonly reports what the commit left out. ADR-0171 and ADR-0249 chose "staging only handoff-listed paths" on purpose, to protect unrelated user work, so a fix needs a new ADR.Decide how a file counts as part of the increment when no handoff lists it, for example a file that an abandoned implementation of the same ticket wrote, or a file the gates ran against.
Required work: none beyond the acceptance criteria.
Acceptance criteria
dirty_paths.Owner sketch
Origin
/os-sdlc:implementfor #949 on branch crc-os-adr-2026-10-04, implementation 34.530c98f6.Commit#staged_pathsintersects handoff-listed paths with changed paths ← DESIGN (ADR-0171, ADR-0249).Not CRC work. No CRC action (ruling (b), 2026-10-16). This ticket stays open for its own owner ruling.
Resolution
Done: Mechanism: Implementation::Commit builds the commit from handoff items and the last handoff summary, not from the diff or the ticket. Occurrence: #1116 "Runner commit leaves ticket files uncommitted when the programmer handoff items omit them".
Evidence: #1116 adds a second case: implementation 67 of #1107 left structure-changer.md and implement/SKILL.md uncommitted (reported as dirty_paths) though Required work checks R2/R3/R7 named them; fix option: stage every path a passing check named.
Follow-ups: Repeat of the earlier note on this issue (its text 'x'/'y' was a test of the command; ignore it)
Occurrence: Refuse implementation_complete while required generated files are uncommitted
Seen: plugins/os-sdlc/lib/os_sdlc (Runner implementation_complete gate); implementation 230 for #1514 left plugins/os-backlog/design/generated/ uncommitted; files reached main only through merge
949375afRun: cbb127b2-9430-4c75-9b92-185bedb457c1; implementation 230
Adds: a second case where Commit#staged_paths stages only handoff-listed paths; commit
043dd10balso used the auditor summary as its message (covered by #987)Occurrence: Commit the reviewed test file with the Runner commit at implementation_complete
Seen: plugins/os-sdlc/lib/os_sdlc/implementation/commit.rb
Run: implementations 284 (#1709) and 285 (#1710), session 01fe836c-833b-4fd9-a7f2-6982cee53d73, 2026-11-12
Adds: the unlisted file can be the test-writer's reviewed test, not only a production file. 284 left a modified test file and 285 a new untracked test file in dirty_paths; both runs passed every gate with the file in the tree, so a merge without a hand commit (
c9691f64a,a238876ed) ships the fix with no test.