Dissolve Gate::Violations into StepOutcome#gate_type and the ViolationRecorder parser table so the Violations ledger keeps its name #788
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#788
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
Two unrelated constants in plugins/os-sdlc share the name Violations.
model/violations.rb is the Sequel-backed mining ledger.
parser/gate/violations.rb is Gate::Violations, moved there in #787.
Inside command/gate/run.rb and command/gate/violation_recorder.rb the bare name resolves to the parser, so both files write OsSdlc::Violations to reach the ledger.
Gate::Violations parses nothing.
It decides lint or test from the step name, then hands the output to Gate::LintViolations or Gate::TestViolations.
Two of its three callers only ask whether the step was a lint step.
Every caller takes a Gate::StepOutcome apart to call it.
Reproduce
n/a: naming defect visible in the two qualified references.
Approach
Dissolve Gate::Violations.
The step-kind decision moves onto Gate::StepOutcome, the model that already holds step and output (lens A11).
The parser table moves into Gate::ViolationRecorder, the only consumer of parsed rows.
The ledger keeps its name.
Required work:
ruby -e 'require "./lib/os_sdlc"; p OsSdlc::Gate::StepOutcome.new(step: "lint", exit_status: 1, output: "", duration_ms: 0).lint?'prints truegrep -rn "Gate::Violations\b" lib testsreturns nothinggrep -rn "OsSdlc::Violations" libreturns nothingcd plugins/os-sdlc && ruby tests/all.rbRejected: renaming the ledger to ViolationLedger (the model is the persisted object and keeps the object's name); renaming the parser (it is not a parser).
Acceptance criteria
Owner sketch
Non-goals
Removing the dead nil guard in ViolationRecorder#resolve_open. Changing what ViolationRecorder records.
Origin
Rename the mining ledger model OsSdlc::Violations so it does not shadow Gate::Violationsto Dissolve Gate::Violations into StepOutcome#gate_type and the ViolationRecorder parser table so the Violations ledger keeps its nameRewritten 2026-09-28 after review: the ledger keeps the name Violations; Gate::Violations is dissolved into StepOutcome#gate_type and the recorder's parser table. Implementation in progress on branch crc-pass-os-sdlc.
Commit:
1ff8bb70refactor(os-sdlc): StepOutcome owns the step kind; ViolationRecorder owns the parser table (#788)Final suite: 1306 runs, 2862 assertions, 0 failures, 0 errors, 10 skips
Final inward-lint: exit 0 (61 pre-existing baseline entries, unrelated to this ticket)
Resolution
Done: Gate::Violations dissolved: StepOutcome#gate_type and #lint? own the step kind; ViolationRecorder::PARSERS owns the parser table; the Violations ledger keeps its name and the OsSdlc:: qualifications are gone.
Evidence: commit
1ff8bb70on crc-pass-os-sdlc; suite 1306 runs, 0 failures; Zeitwerk eager load clean; lint-inward-dependencies exit 0; grep for Gate::Violations and OsSdlc::Violations in lib and tests returns nothingFollow-ups: none