Add the unchanged gate for structure-only changes #1106
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#1106
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
A structure-only change (rename, move, split) needs proof that behavior did not change.
No os-sdlc gate compares the merge-base with HEAD, so none can give that proof.
The existing suite is the proof only if the run count and the lint offense count stay equal.
Reproduce
n/a: new gate; nothing exists to reproduce.
Approach
Add
Gate::Name::UNCHANGEDandbin/os-sdlc-unchanged-check IMPL_ID.The check runs the target suite command and
rubocop --format jsononce at the merge-base, in a detached temporary worktree, and once at HEAD.It parses the suite line with
Suite::Output::Summary.It passes when HEAD has 0 failures and 0 errors, HEAD
runsequals baserunsminus the runs of tests listed under## Retired tests, and the whole-target offense count equals the base count.The offense count covers the whole target, not only the diffed files, so it catches broken path globs.
The gate name is parsed vocabulary (maps parse it). Run
/os-adr:findfirst, and run/os-adr:createif it reports a one-way door.Required work:
UNCHANGEDinplugins/os-sdlc/lib/os_sdlc/gate/name.rbunchangedinplugins/os-sdlc/bin/os-sdlc-unchanged-checkOrchestrator work: run
/os-adr:findfor the gate name, then/os-adr:createif it reports a one-way door.Acceptance criteria
os-sdlc-unchanged-check IMPL_IDruns, then it passes.## Retired tests, when the check runs, then it fails and reports the base and HEAD run counts.## Retired tests, when the check runs, then HEAD runs equal base runs minus the runs of that test and the run count check passes..rubocop.ymlExclude glob so the whole-target offense count rises, when the check runs, then it fails and reports both counts.Owner sketch
Origin
VERDICT: CREATE
Work started on branch ticket-1106 via /os-sdlc:implement.
Resolution
Done: Gate::Name::UNCHANGED plus bin/os-sdlc-unchanged-check IMPL_ID: measures the target suite and rubocop offense count at the merge-base (detached temporary checkout) and at HEAD; passes when HEAD has 0 failures and 0 errors, HEAD runs equal base runs minus retired tests, and the whole-target offense count equals base. Gate name registered in Gate::Commands and Boot::Commands.
Evidence: ticket-1106 branch
59a939c7(Runner commit), 12 files, 371 insertions; pipeline run 66: 10 dispatches, 0 retries, 13 min 38 s; suite gate pass; contract-auditor pass; adr-find returned no candidates for the gate name (additive vocabulary, no ADR).Follow-ups: #1107 consumes this gate in the structure-change map. Runner commit subject was built from the contract-auditor summary rather than the change; captured as a separate ticket this session.