Extract shared .sdlc/project.yaml behavior into a cc-os gem #922
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#922
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
Jared asked for this ticket on 2026-10-03: "Capture the .sdlc/project.yaml gem ticket."
Jared's position: the plugin codebases should not call each other. Tiny-to-small shared functionality may be duplicated. Meaningful or somewhat complex shared functionality goes into a gem or gems.
He suspects that most CRUD on
.sdlc/project.yamlbelongs in such a gem: models such asProjectandTargetthat read or change values in project.yaml, or compose, validate, and write the file. Each plugin would then do its special task and would not build the shared project/target configuration again.This ticket needs a design ruling from Jared. An ADR is required before work starts.
Observed
Investigation of which plugins touch project configuration (grep over
plugins/, 2026-10-03):.sdlc/project.yaml. This weakens the case for a gem today: there is no second consumer. Every non-test hit forproject.yamlis underplugins/os-sdlc/.plugins/os-sdlc/lib/os_sdlc/adapter/project/config.rb(Config.load,load_shared,read,document,write,save_tracker,merge_keys;yaml_pathat line 39),adapter/project/root_search.rb(finds the file),model/project.rbandmodel/project/*.rb(target.rb,codebase.rb,test.rb,lint.rb,root.rb,artifact_dir.rb,validation.rb,target_selection_error.rb),command/project/config_command.rbandcontroller/project/onboarding.rb(theproject-configCLI that writes it).plugins/os/lib/worktree/checkout.rb:51creates the.sdlcdirectory andplugins/os/lib/worktree/linked_entries.rb:6links.sdlc/pipeline.db; neither reads project.yaml..cc-os/configis a separate file with a separate owner:plugins/os-backlog/lib/backlog/config.rb,config_data.rb,config_locator.rb(tracker key). It is a different schema; whether it belongs in the same gem is an open point.forgejo-api(ADR-0257) is shared by os-backlog and os-sdlc;procmanandpb-mirrorlive in~/dev/ruby-gems/(ADR-0219, ADR-0150). No gem lives inside cc-os today.gems/does not exist; the repo root holdsassets autoresearch bin docs lib plugins reference teach tests tuning. The rootlib/holdsarch_metricsandstatus_table_trimmer.rb, not shared plugin code.ADRs found by
os-adr:find:GemfileandGemfile.lock, loaded through one boot file. A shared gem fits: each plugin adds it to itsGemfile. Vendoring is rejected, so copying the whole file logic is not covered.code_pathalias). The gem must implement this schema.Project::Yaml,Document). Check why they were retired.Correction to the origin of this idea: Jared first read the need for this gem from a test that became a subprocess call in #860. That reading was incorrect for that test. The test calls os-sdlc's own
bin/os-sdlc, so it shows no cross-plugin call. Jared keeps the gem idea on its own merit.Reproduce
n/a: design ticket, nothing to reproduce.
Approach
Rule on these open points before any build. An ADR is required before work starts.
cc-os/gems/<gem>(Jared's lean: it givesgems/the same flexibility asplugins/),cc-os/<gem>, orcc-os/libraries/<gem>(Jared suspects this violates YAGNI). Gems normally live in~/Dev/ruby-gems/; this one is specific to cc-os plugins.Project,Target, and the CRUD inadapter/project/config.rb) and which stay in os-sdlc; whether.cc-os/configjoins the gem./os-adr:createfor the decision; it amends ADR-0166 and cites ADR-0257, ADR-0219, ADR-0150 and the project.yaml schema ADRs.Required work: none beyond the acceptance criteria.
Acceptance criteria
Origin