Cross-Repo Spec Tracking¶
Problem¶
A developer wants to track work that lives in repository B from repository A's spec namespace, because A is where they do most of their workflow (planning, review, gates). They create a SPEC-NNN in A whose deliverable lives in B.
This sounds reasonable. It is not. It produces:
- Duplicate specs: The same spec text, problem, goal, and user stories appear in both A and B. They drift independently.
- Meaningless quality gates: A's
/vt-c-4-reviewand/vt-c-5-finalizecannot inspect a deliverable in another repo. The gates either get bypassed silently or run against nothing. - Audit confusion: Was the work shipped under A-SPEC-NNN or B-SPEC-MMM? Both, neither, somewhere between?
- Activation pingpong: Stale activations linger in A because A's workflow never sees the actual completion event in B.
Symptoms (how this is detectable)¶
- A spec in your repo's
specs/references a target path under another repo (/Users/.../<other-repo>/). - The other repo has its own
specs/directory with a parallel spec ID and matching content. - The cross-referenced spec is
status: in_progressfor an unusually long time, with no commits on its feature branch. git login your repo shows zero work for the spec;git login the other repo shows the work shipped under a different spec ID.
Pattern: One repo, one spec namespace¶
A spec MUST live in the repository that owns its deliverable. The target repository's filesystem and CI are the authority on what shipped and when.
Two specific rules¶
-
No cross-repo spec creation. If you find yourself opening
specs/NNN-thing/in repo A whose target is repo B, stop. Openspecs/NNN-thing/in repo B instead. -
External references go in
intake/projects.yaml, notspecs/. If repo A's workflow needs to know about repo B's work (e.g., for cross-project status dashboards), register repo B inintake/projects.yamlas a consuming project. That gives A awareness of B without claiming to govern B.
Decision tree¶
Where does the deliverable live?
├─ In this repo → spec in specs/, normal workflow
├─ In a sibling repo I own → spec in THAT repo's specs/, register
│ the sibling in intake/projects.yaml
│ if I need cross-project status
└─ In an external/upstream repo → no spec at all; this is upstream work,
track via intake/inbox/ or a feedback
issue, not a SPEC-NNN
What to do when you discover a duplicate¶
When auditing reveals you already have a duplicate cross-repo spec (the case that triggered this pattern), close the local spec with full provenance:
-
In the local spec's
state.yaml, setstatus: completedwithduplicate_ofpointing at the canonical spec:status: completed activated_at: "<original date>" completed_at: "<actual ship date in the canonical repo>" duplicate_of: repo: <org/repo> spec: SPEC-NNN spec_path: specs/N-slug/ ship_commit: <abbrev sha> ship_date: YYYY-MM-DD gate_bypass: date: "<closure date>" reason: | Cross-repo duplicate. Quality gates ran in the canonical repo; running them again here would be meaningless. skipped_gates: [plan_gate, build_gate, review_gate, finalize_gate] -
Mirror the dates:
completed_atshould be the actual ship date in the canonical repo, not the date you discovered the duplicate. This keeps the registry's progress trends honest. -
Don't delete the spec file. Leave it as a tombstone — it's a permanent pointer for anyone who later wonders "what was V025-SPEC-119 about?"
-
If a worktree exists for the duplicate, tear it down. There is no work left to do.
Why bother registering the lesson at all?¶
The same mistake is easy to make again because:
- A spec creation is a low-friction action (one
/vt-c-activate --from-prd). - The "deliverable lives in repo B" detail is often missed during activation.
- The downstream cost (duplicate tracking, gate bypass, audit confusion) only shows up months later.
Capturing the pattern means future activation flows can flag the issue at activation time: "This spec's target path is outside this repo. Did you mean to create the spec in the target repo instead?"
Where this came from¶
V025-SPEC-119 (Open Brain Documentation Site) was created on 2026-03-24 in V025-claude-toolkit, with target path /Users/rolf/01-repositories/01-VisiTrans/open-brain/. On the same day, the open-brain repo's local SPEC-001 (specs/1-docs-site/) was created with identical text and shipped to completion (commit d8ff56a in open-brain).
V025-SPEC-119 then sat as in_progress for ~6 weeks until a workflow audit caught the duplicate during a /vt-c-shape invocation. The shape skill was correctly stopped before generating gray-area questions because the premise (deliverable doesn't exist) was false.
Related¶
intake/projects.yaml— proper place to register sibling/consumer repos- V025-SPEC-119 — origin (closed as duplicate)
- open-brain SPEC-001 (
specs/1-docs-site/in Visitrans/open-brain) — canonical