Extract Project::Code, Project::Test, Project::Lint value objects; Codebase replaces Layout as the code-to-test pairing #595
Labels
No labels
P0
P1
P2
P3
bug
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
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#595
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?
VERDICT: CREATE (ticket-skeptic: user-requested design decision, explicitly stated and approved this session — hard floor overrides the gauntlet)## Context
plugins/os-sdlc/lib/os_sdlc/project.rbis aData.definewith 13 keyword attributes after commit5e867e6. Rubocop'sSdlc/Structural/ParameterListSignalsMissingObjectcop fires on itsinitialize. Attributes that change together sit scattered across the flat list.test_path,test_command,test_framework, andred_assert_commandmove together when the test framework changes.lint_configandlint_pathsmove together too.Project::Layout, atplugins/os-sdlc/lib/os_sdlc/project/layout.rb, is a lookup, not a validation. Given a code file, it builds candidate test paths, mirrored and unnamespaced, and picks the first that exists. It falls back to scenario-split siblings, then raises. It needs both the code prefix and the test prefix, so it belongs to an object that holds both. The name "Layout" misnames this behavior. The YAML format stays flat;.sdlc/project.yamlkeys do not change.Project::Yaml::Document#attrs,Project::Yaml::Document#shared_attrs, andProject::Config#projectbuild the nested values at load time. The user decided this design on 2026-09-15. A separate session implements it through/os-sdlc:implementusing the ticket map.Observed
Reproduce
n/a: this is a feature/design ticket, not a bug.
Expected
Given a project loaded from a flat
project.yaml, when the reader accessesproject.code.path,project.test.path,project.test.command,project.test.framework,project.lint.config, andproject.lint.paths, then each nested value matches today's flat-attribute value, andproject.tests_for(code_file)returns the same test paths thatProject::Layoutreturns today.Owner sketch
Cases
Structural follow-through
plugins/os-sdlc/lib/os_sdlc/project/layout.rbandProject::LintConfigonce their callers move.project.code_path,test_path,test_command,test_framework,red_assert_command,lint_config, andlint_pathsacrossplugins/os-sdlc/libto the nested readers. Grep first; the count is not yet known.Project::Yaml::Document#attrs,Project::Yaml::Document#shared_attrs, andProject::Config#projectbuild the nested values. The compact-at-edge rule from5e867e6stays./os-adr:findonproject.rbbefore editing. ADR-0167 (Data.define for value objects) is satisfied. ADR-0187 through ADR-0189 (batch-4 owners) must not be reversed. Record the extraction as a new ADR amending ADR-0189.Origin
dd6a445).Project#initializefails the cop ← attributes that change together are split across a flat list ←DESIGN: batch-4 responsibility-refactor leftproject.rbflat (ADR-0187-ADR-0189).plugins/os-sdlc/lib/os_sdlc/project.rb,plugins/os-sdlc/lib/os_sdlc/project/layout.rbBody edited 2026-09-15: cop trigger was a false positive (fixed
dd6a445); reserved_paths and red_assert_command dropped from the sketch as dead code (zero lib readers); case 10 and follow-through 5 added for the removal and old-blob tolerance.Body edited 2026-09-15: cop trigger was a false positive (fixed
dd6a445); reserved_paths and red_assert_command dropped from the sketch as dead code (zero lib readers); case 10 and follow-through 5 added for the removal and old-blob tolerance.Work started 2026-09-15 on branch ticket-595 via /os-sdlc:implement.
implementation 21 (session 3affeb44) ended implementation_failed: bound_exhausted:test-reviewer/fail after 12 dispatches. Failed step: test-reviewer dispatches 271, 273, 275 rejected the second red round because the working tree held production changes relative to HEAD. Those changes were the programmer's green increment (dispatch 268), not test-writer edits. Test-writer dispatch 274 obeyed the objection and checked out project.rb and config.rb from HEAD, discarding the programmer's work. Worktree ticket-595 now holds only the two new test files. Harness defect filed separately. Waiting on a decision: rerun after the harness fix, or hand-finish.
Resolution
Done: Project members are name, root, tracker, code, test, lint, map, commit_on_complete. Project::Code, Project::Test, Project::Lint own defaults and path predicates. Project::Codebase replaces Layout. LintConfig deleted. FlatAttrs nests the flat yaml and JSON keys at load. reserved_paths and red_assert_command removed with their three yaml lines. ADR-0191 amends ADR-0187 and ADR-0189.
Evidence: Branch ticket-595 commits
9443674,433552c,fd78119. Suite 1211 runs, 0 failures, 0 errors. Rubocop clean on 21 changed files; ParameterListSignalsMissingObject silent on project.rb. Cases 1-10 covered by project_nested_code_test_lint_test.rb and project_nested_structural_followthrough_test.rb. Pipeline impl 21 failed bound_exhausted (test-reviewer); increment restored from the programmer transcript and hand-finished.Follow-ups: #597 test-reviewer per-dispatch diff base (filed, P1). Document::FLAT_KEYS and FlatAttrs key maps list the flat keys in two places; dropped, revisit only if a third reader appears.
Correction: the ADR is ADR-0192, not ADR-0191 (main took 0191 for #594 while this branch was open). Merged to main 2026-09-15 via worktree finish; suite 1216 runs, 0 failures.