project.rb batch 4/2: RootSearch and Setup ask Git::Repo for the repo boundary #584
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#584
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?
Map: #586
Batch 4 of the project.rb responsibility refactor, ticket 2 of 3. Follows ticket 1.
Audit: tuning/responsibility-audit/runs/16-project-rb-batch3-reaudit/report.md.
Capability: repository-boundary-detection. Owner:
OsSdlc::Git::Repo(existing,repo?at git/repo.rb:38, confidence 0.85).Map: maps/poodr-ticket-implementation.yaml.
Cases (one red round, all listed)
Project::RootSearch.call(start)where the repo boundary directory holds a.gitfile (a worktree or submodule) stops at that directory and returns nil when no project.yaml lies between. Today it walks past it (root_search.rb:32 testsFile.directory?).Project::RootSearch.call(start)with a.gitdirectory boundary behaves as today (tests/project/root_search_test.rb:32 already covers this).Project::Setup#upserton a directory that holds a.sdlc/project.yamlbut is not inside a git repo raisesHarnessError"not inside a git repo". Today the existing yaml skips the guard (setup.rb:13). User decision 2026-09-14: git is always required; worktrees depend on it.Owner sketch
Git::Repogains one predicate that answers "is this directory itself the top of a repo or worktree" (rev-parse --show-toplevelequals the dir).repo?alone is not enough: it is true for every subdirectory. Delegate to the question, not to the.gitpath.Callers that delegate
boundary?upsertTests that touch the old behavior (planned, not discovered)
git init)ADR
Amends ADR-0185 (Setup precondition now unconditional) and ADR-0174 (Git::Repo gains the toplevel predicate). Create the amending ADR when the ticket lands.
Structural follow-through
rg '\.git"' plugins/os-sdlc/lib/os_sdlc/projectreturns nothing.Work started on branch ticket-584 via os-sdlc pipeline (map poodr-ticket-implementation.yaml, batch 4 map #586).
Resolution
Done: Batch 4/2 merged to main
30b2b93, ADR-0188. Git::Repo#top_level? is the single repo-boundary definition; RootSearch#boundary? delegates to it (a .git file now stops the climb); Setup#upsert requires a git repo unconditionally and refuses a targets-shaped file via Project::Yaml#refuse_targets_shaped!.Evidence: Suite 1184 runs 0 failures; rubocop clean; rg for .git path tests under lib/os_sdlc/project returns nothing. Pipeline impl 15: 19 dispatches, bound_exhausted at suite-check. Deviations: (1) capture agent filed the ticket with an empty body (only 'Map: #586'); impl 14 failed at change-auditor in 21 s; body written from the scratchpad and impl 15 opened. (2) programmer relayed the reviewer's dispatch id; settled via implementation-report + gate + subagent-stop (haiku). (3) pre-existing test test_load_climbs_out_of_a_worktree_whose_dot_git_is_a_file asserted the removed behavior; sonnet rewrote it and made fixture repos real (git init / git worktree add). (4) sonnet fixer added an unused initial: keyword on RootSearch and a duplicated targets-shaped refusal in Setup; haiku removed both. (5) ADR skill wrote the file into the main checkout from the worktree, twice; moved by hand, stray superseded-by stamps reverted.
Follow-ups: none