project.yaml test_path default is test/ while every cc-os plugin uses tests/; setup-project and implementation-open do not detect the mismatch #616
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#616
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?
project.yaml test_path default is test/ while every cc-os plugin uses tests/ [capture]
Context
This came up during the #612 pipeline run, on the new
plugins/os-backlog/.sdlc/project.yaml.It caused a gate to silently auto-pass with nothing checked.
Observed
Project::Test#initializedefaultspath:to"test".Every plugin in this repo keeps its tests under
tests/, includingplugins/os-sdlc/.sdlc/project.yaml, which has notest_pathline at all.In #612 implementation 1, the new
plugins/os-backlog/.sdlc/project.yamlalso had notest_pathline.Changes#test_pathswas empty because the defaulttest/directory does not exist in this repo.GateCommands#diff_test_commandreturned nil, soGateEvaluator#run_gateshort-circuited to a pass with nothing run.The Runner recorded
unexpected_pass:test-writer/diff-test.The tests were red when run directly outside the gate.
Reproduce
testdoes not exist;testsholds the suite the gate should have selected from.Expected
Origin
Decisions 2026-09-19
Project::Testdefault path fromtesttotests, and keep the refusal. Both fixes ship in this ticket.Project::Validation, called fromOpenImplementation#validate_target!, which runs before retired tests are deleted and before the implementations row is inserted. No orphan implementation rows.plugins/os-sdlc/.sdlc/project.yamlandplugins/os-backlog/.sdlc/project.yamlalready carrytest_path: tests. That criterion is done.Slice
A project.yaml whose paths do not exist on disk is refused at implementation-open with a message that names the path, the target, the candidate directories, and the fix. The default test path becomes
tests.Acceptance criteria
Model::Project::Validationchecks, relative to the project root:code_pathis a directory,test_pathis a directory, andlint_config(when set) is a file. It returns the list of problems.OpenImplementation#validate_target!raises when the list is not empty, beforeload_ticket_body!and before the implementations row is opened.The CLI rescues that error in
DispatchCommands.implementation_openand exits loudly with a message shaped like:implementation-open project_validation: test_path "test" does not exist for target os-backlog.
Candidates under plugins/os-backlog: tests/
Update test_path in plugins/os-backlog/.sdlc/project.yaml and rerun implementation-open.
Candidates are the root-level directories among
test,tests,specthat exist. For code_path, candidates arelib,app,src.Project::Test#initializedefaultspath:to"tests". The shared fixture default intests/support/project_attr_assertions.rband the tests that assert the default move totests. Tests that writetest_path: "test"explicitly into a fixture yaml keep working unchanged./os-sdlc:setup-projectSKILL.md tells the generator to writetest_pathfrom the directory it finds amongtests,test,spec, in that order, rather than omitting the key.Non-goals
This ticket does not touch the path-base mismatch in
Adapter::Git::Repo#changed_paths. It does not remove the "nil command means pass" branch inGateEvaluator#run_gate.Owner sketch
Cases
tests/directory, when the project loads, thenproject.test.pathistests.Skeptic verdict
VERDICT: CREATE
REASON: Diff-test gate silently auto-passed with zero tests run because test_path default ("test") doesn't match this repo's convention ("tests"); Origin chain traces to a design gap (no existence check on test_path), not an agent improvisation, and is validation-class (silent false-pass), so it clears the gauntlet.
## Retired testsand## Approach#612Body updated 2026-09-19 with the design decisions (see ## Decisions 2026-09-19). Implementation via /os-sdlc:implement starts now.
Work started on branch ticket-616 via /os-sdlc:implement (session 33dcab60).
Resolution
Done: Model::Project::Validation refuses implementation-open when code_path, test_path, or lint_config does not exist under the root, before retired-test deletion and before the implementations row; CLI label project_validation with a three-line message naming target, existing candidate dirs, and the project.yaml to edit. Project::Test default path is now tests; FlatAttrs picks tests/ or test/ when no test_path line is set; project-config detects tests/test/spec at setup.
Evidence: Branch ticket-616 commit
e011d051; pipeline implementation 7, 26 dispatches, behavior-verifier pass (dispatch 80), suite-check pass twice (81, 84; 1368 runs 0 failures), contract-auditor pass (85). Hand-finish: validation initially checked only explicitly configured keys; corrected to check effective paths and 10 fixtures now create lib/ and tests/.Follow-ups: none captured. Dropped as minor: the candidate directory lists (tests/test/spec, lib/app/src) are repeated in Validation, FlatAttrs, and ProjectConfigCommand. The nil-command-means-pass branch in GateEvaluator stays per the ticket non-goals.