Takedown design phase must lint the design's tests and code before the design is final #1005
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#1005
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 takedown design becomes final without lint. The design phase proves the failing tests red at base (
red_check) and, since ADR-0291, that the target suites pass. It never runs rubocop on the design's Ruby files. Thetakedown-implementnodeplace-testsgates ontest-lint. ADR-0290 forbids model edits of placed content, so no node can repair a lint failure at that point. A design that is red for the intended reason can therefore fail at implement time. This blocks the D2 tracer and every #975 trial ticket.The previous design for this ticket (run
docs/takedown/1005-20261014-151342) only failed the run on offenses. It had no repair step. ADR-0293 supersedes it.Observed
On 2026-10-14, implementation 43 (#1004, design
docs/takedown/1004-20261014-124517/final-design.json) escalated atplace-tests(dispatch 376, escalation 22).diff-testclassified the runred, which is the expected result.test-lintfailed with 10 offenses inplugins/os-sdlc/eval/ticket-takedown/test/command/final_suite_test.rb:The previous #1005 design (run 1005-20261014-151342) had 2 offenses. The old
ProjectSuites#lint_targetalso had a defect: a target withpath: "."linted no files, so such a design always looked clean.Reproduce
n/a for the #1004 failure: it shows in the records of implementation 43, dispatch 376, escalation 22. For the
path: "."defect: give a design Ruby files with offenses and a target whosepathis "."; the lint step reports no files.Approach
Required work: none beyond the acceptance criteria. Behavior is fixed by ADR-0293 (Accepted 2026-10-15, Jared's ruling; amends ADR-0291). The design is open.
OsSdlc::Project::Targetalready owns the target andlint_configrules; the design may reuse it (open question indocs/research/lint-lessons/metrics-perceived-complexity.md).Pinning tests that change (all under
plugins/os-sdlc/eval/ticket-takedown/):test/command/final_suite_test.rb,test/controller/run_cli_test.rb(line 12 and line 114),test/command/pipeline_test.rb(line 442, the key set),test/model/harness_files_test.rb(line 16, the card set; line 156, the schema set: run1005-20261015-101625addspolisher.mdandpolish.json).Implementation route: use the
poodr-ticket-implementationmap, nottakedown-implement. The pipeline cannot polish its own fix (bootstrap, ADR-0293 consequences). The next ticket after this one becomes the D2 tracer.Slice
This ticket is slice 1 of 2 (split 2026-10-15 after blast radius: about 12 lib files and 5 test files in one run is too large). Slice 1 builds AC 1, 3, 4, 9 and 10, with one change: in this slice a lint-red
green-suite(AC 2) fails the run and names each offense; it does not go topolish. Slice 2 (polish, guard, limits,polish_rounds: AC 2, 5, 6, 7, 8) is #1009, which is blocked by this one. AC 2, 5, 6, 7 and 8 below stay as the target behavior; they are out of scope for this slice.Decision (agent, AFK, 2026-10-15): a test-red
green-suiteafter the critique limit is reached (no reviser profile is left;revision_rule.rb:14,step_profile.rb) fails the run, and the design is not final. No reviser rounds are added beyond the limit.Pinning tests for this slice:
test/command/final_suite_test.rb(rename),test/controller/run_cli_test.rb(line 12, line 114). Also checktest/command/pipeline_test.rb:258,test/run_support.rbandtest/report_support.rb.ProjectSuites::Targethas nopathorlint_config; reuseOsSdlc::Project::Target(lib/os_sdlc/model/project/target.rb:19,lint_pathalready handles ".").Acceptance criteria
green-suiteruns, then the run records the design as final. The step was calledfinal-suitebefore; old run records keep that name.lint_configthat is not present at base, whengreen-suiteruns, then the next step ispolish, andgreen-suiteruns again after it. Offenses that exist at base are not counted.pathis ".", whengreen-suitelints, then it lints the design's Ruby files at the repo root.green-suiteruns, then the run returns torevise; the new idea is graded again; the return counts toward the existing critique round limit (3).polishruns, then its input is the offenses and the lint lesson fromplugins/os-sdlc/lint-lessons/(read throughLesson::Relay) when one exists for the cop. It never receives the ruling or the grade. It changes form only.polishreturns files, when the guard runs, then the target suites pass and the design's failing tests are still red at base. If either check fails, the polish round does not count as a success.final-design.jsonholds the polished files,source_stepnames the graded design, and a newpolish_roundsfield holds the polish count.place-design, the implement body and thetakedown-implementmap keep readingfinal-design.json.green-suiteandpolishdo not run, and eval grades stay comparable with earlier runs.green-suiteruns on them, then it names each offense with its cop, path and line.Owner sketch
Origin
/os-sdlc:implement 1004 takedown-implement(implementation 43), escalation 22 atplace-testsplace-testsfailstest-lint← the design was never linted ← the design phase checks only red at base and green suites ←DESIGN: ADR-0283 decision 3, ADR-0290 (no model edits of placed content), ADR-0291 (final-suite without lint)docs/handoffs/2026-10-15-lint-lesson-analysis.mdVERDICT: CREATE — observed failure from an in-policy run (implementation 43, escalation 22); it blocks D2 and D3; chain ends in DESIGN.
Blocked by #1006 (relevance step returns needs_ruling when an Accepted amending ADR resolves the conflict). Jared ruled 2026-10-14: take #1006 first, then run the #1005 tracer. The Forgejo CLI has no dependency link, so this comment records the edge.
Re-scoped 2026-10-15 per ADR-0293 (Jared's ruling). Old body saved in session; previous design run 1005-20261014-151342 is superseded.
Work started 2026-10-15 (session fb136c57) on branch prism-architect. Route: /os-sdlc:implement 1005 poodr-ticket-implementation (Jared ruling, predicted then accepted). Blast-radius check first. Run 1005-20261015-101625 (failed at final-suite) is a non-final reference only. Polish limit is 5 rounds (Jared ruling 2026-10-15).
Skeptic DROP (A15 layout follow-up): depth-1 rule; same defect class as #946. Note posted on #946 to consider widening scope to the takedown eval lib after #1009.
Resolution
Done: Slice 1 of ADR-0293 built via poodr-ticket-implementation (implementation 45, 8 dispatches, 10 min): final-suite renamed green-suite; SuiteCheck runs rubocop with the target lint_config, counting only offenses new against base; target path '.' lints the repo root; lint-red fails the run naming cop, path and line; test-red returns to revise within critique limit 3, then fails the run; eval case mode skips green-suite. Pinning tests final_suite_test.rb and run_cli_test.rb updated.
Evidence: Commit
984d9f3con prism-architect (runner commit, suite-check gate green, behavior-verifier pass, contract-auditor pass). Records389171a4(README step table, os-sdlc leaf History row). Lens signalsa9853e9b(P2),9e135aef(A15) on main.Follow-ups: #1009 (slice 2: polish, guard, 5-round limit, polish_rounds; now also LintRun injection from the P2 lens challenge). A15 layout follow-up: skeptic DROP, noted on #946.