One gem source rule: path to the ~/dev checkout, no pin, no symlink (os_git first) #1630
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#1630
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
Our own gems reach their consumers in three different ways, and two of them break:
os_gitpath: ../os-git, else~/.claude/plugins/os-gitcc-os/pluginscannot use a sibling path. A plugin-cache copy rewrites its lock to an absolute path and fails underBUNDLE_FROZEN.forgejo-apigit:sourcellm-stack,decision-model,procmanpath: ~/dev/<repo>ADR-0303 clause 4 still says the Forgejo git source is the rule and a path source is only a local override. Practice reversed it.
Jared's requirement (2026-11-09): a gem commit must not force a change in any consumer project. The source may name the repository, but no commit, branch, or version pin. This must work on each new machine with no manual step.
Approach
path:to the machine's checkout of the gem's repository, at the fixed location~/dev/<repo>(for os_git:~/dev/cc-os/plugins/os-git). Forgejo is how a machine gets and updates the checkout (clone, then pull). Bundler never fetches from Forgejo. A path source records no revision, so a gem commit changes no lock./os-adr:create. It supersedes ADR-0303 clause 4 and states the~/dev/<repo>layout as a machine contract.os_gitconsumer to the rule:plugins/os-sdlc,plugins/os-me,plugins/os-backlog. Remove the sibling-or-symlink logic.bin/refresh-pluginsor the check it calls). It reports each gem repository that a Gemfile names and that is not cloned at~/dev/<repo>, with the clone command.~/.claude/plugins/os-gitlink step fromdocs/implementation-status/os-git.md.Not in this ticket: moving
forgejo-apioff its git source. File it as a follow-up with the ADR, because os-backlog and os-sdlc both pin it.Required work: none beyond the acceptance criteria.
Acceptance criteria
plugins/os-git, when os-sdlc, os-me, and os-backlog boot, then each loads the new code and noGemfile.lockchanges.~/.claude/plugins/os-gitdoes not exist, when os-sdlc, os-me, and os-backlog boot, then each boots.~/dev/cc-os, when the global plugin setup path runs, then it names the missing checkout and the clone command.Origin
path:source; rewritten 2026-11-09 after Jared ruled out the symlink and any pinned git sourceplugins/*/Gemfile,bin/refresh-plugins,docs/adr/0303-*VERDICT: CREATE
From #1594: with no link, every os-backlog CLI command exits 1 and advises bundle install, not ln -s; decision-sweep and wakeup-poll print backtraces. The hook warns and exits 0.
Create or check the ~/.claude/plugins/os-git link in plugin setupto One gem source rule: path to the ~/dev checkout, no pin, no symlink (os_git first)Resolution
Done: os_git is declared by path to ~/dev/cc-os/plugins/os-git in os-sdlc, os-me, and os-backlog (no sibling, no symlink, no pin). bin/refresh-plugins reports each missing ~/dev checkout with its clone command (lib/gem_checkout_check.rb, bin/check-gem-checkouts runs it alone). plugins/os worktree and handoff, and the repo-root links in os, os-adr, os-backlog, os-aidd-lint, fall back to the ~/dev checkout instead of ~/.claude/plugins/os-git. ADR-0310 states the rule; ADR-0303 clause 4 and ADR-0257 item 2 removed by amend; ruling 95 supersedes ruling 56.
Evidence: main
4b8f679c(ADR),80617272a(ruling 95),49bc34d87d747f4e1863cd44049merged inf5303d531. AC1: each lock records PATH remote /home/jared/dev/cc-os/plugins/os-git with no revision; the cached copies of os-sdlc, os-me, os-backlog boot under BUNDLE_FROZEN and load os_git from ~/dev/cc-os/plugins/os-git. AC2: no Gemfile or Ruby file under plugins/ reads ~/.claude/plugins/os-git (grep 0 matches outside .md). AC3: gem_checkout_check_test 5 runs 0 failures; sample output names the missing checkout and git clone command. AC4: ADR-0310 Accepted. Link tests: os, os-adr, os-backlog, os-aidd-lint, os-git delegation, os handoff+worktree smoke all green. Plugin cache refreshed by worktree finish with no mutation run active.Follow-ups: #1648 moves forgejo-api to the path source. Skill and reference .md text that calls ~/.claude/plugins/os-git/bin/os-git goes with #1631 (PATH); the symlink is removed after #1631.
Correction to the follow-ups line: the
~/.claude/plugins/os-gitlink stays. Every cc-os plugin has the same link, and the shell PATH reads each plugin'sbin/through it. The ban in ADR-0310 covers gem sources only, and no gem source uses the link now.