cdev-monorepo
Use when the user invokes /cdev-monorepo (with or without arguments) in a conditioned multi-repo workspace (it has workspace/repos.yaml and a global docs/develop/) — autonomously executes the active S
SKILL.mdskills/cdev-monorepo/SKILL.md
GitHubCDev Monorepo — orchestrating loop
Global equivalent of /cdev for a multi-repo workspace conditioned by bootstrap-monorepo.
Elevated autonomy mandate: work until a real blockage, never stop to ask "now what?". The
workspace is the memory: global SPRINTS.md = plan · global AGENT_PROGRESS.md = handoff ·
state.lock.json = snapshot · local state lives in each repo.
Invocation: /cdev-monorepo (resume) · /cdev-monorepo sprint 02 · /cdev-monorepo batch SYS-02-B01.
The invariant that protects the whole mechanism
Global work must not break local continuity.
Local work must not break global visibility.
After a workspace session, cd repo && /cdev must be able to continue normally. After
independent work inside a repo, the next workspace session detects and reconciles that
progress.
Start + reconciliation (every invocation)
- Read in order: the global guide (
AGENTS.md) →docs/develop/AGENT_EXECUTION_PROTOCOL.md→SPRINTS.md→AGENT_PROGRESS.md(last entry) →workspace/repos.yaml→repo-graph.yaml→state.lock.json. - For each repo relevant to the active sprint/batch (don't load repos that don't
participate): its guide,
SPRINTS.md,AGENT_PROGRESS.md,git status/branch/log. - Reconcile. The repo is the source of truth of its local state: renumbered sprint, batch finished outside the workspace, new commits, different branch, local blockage → the workspace updates itself; never the other way around. Divergence (workspace says DONE, repo says IN_PROGRESS) → the repo wins. The workspace never falsifies local state to square its own plan. Reconciliation covers the workspace's own older statements too: anything it asserts about a child (registry fields, snapshot values, stale blocked notes) is re-derived on read or checked by the verification script — never trusted on age.
Loop (repeat until a real blockage)
- Select: first
READY/IN_PROGRESSSYSTEM_BATCH of theACTIVESYSTEM Sprint — and every other one the DAG makes runnable now (wave execution, not batch by batch). If a batch isPLANNED(unresolved references or sync points) → invoke thecdev-monorepo-plannerskill before executing it. - Resolve references: every required local reference exists in the repo's
SPRINTS.md, with valid numbering that respects the local sequence and its declaredWait-for(the planner's sync artifacts). Broken reference → repair via planner, don't improvise. - Build the DAG of the batch/wave from its references'
depends_on(only the batch's references; unreferenced repos do not appear). A cycle in the DAG = planning error: stop that batch and report it, don't break the tie by eye. - Execute in parallel per repo: dispatch one
monorepo-repo-runneragent per runnable reference, in parallel only when they belong to different repos; a single runner per repo, always. Two levels of parallelism, and only two:- Across repos: references with no mutual dependency run at once (DAG waves).
- Inside the repo: batches are ALWAYS sequential (local order is sacred; never two
batches of the same repo at once). What may be parallelized inside a batch are
heterogeneous tasks via the local cdev's subagents: e.g. one subagent investigating
read-only in the producer repo's working tree the real endpoints, another inventorying
the repo's own reusable components, and the main agent building — which at integration
time consumes the investigator's report, not its imagination. Functional testing or
external-source research follows the same pattern. The decision to create those subagents
belongs to the local
/cdev; the workspace does not hand out that work. - Self-blocking guardrail (applies to every subagent and the main agent): no cross-repo
endpoint, field, type or structure is integrated without being confirmed by a
Wait-forartifact, a workspace contract, or real code read from the producer repo. Confirmation missing → wait or rotate task; inventing it "to make progress" is forbidden. Investigator subagents in neighbouring repos are read-only: writing into another repo remains an absolute gate. Dispatch rules: - The runner ALWAYS executes the repo's own
/cdevscoped to the reference — it never implements on its own authority. - The runner's prompt includes: reference (local sprint/batch),
system_batch, applicable contract, itsWait-for(which artifact to look for, at which path of which repo) and the branch policy (§ below). - Runner returning
WAITING(its Wait-for does not exist yet): reassign that slot to another runnable reference from another repo and retry the waiting one when its producer closes — never leave the slot idle if runnable work exists (blocked-but-not-idle here too).
- Collect evidence as each runner finishes (don't wait for the whole wave to record):
status/branch/SHA/verification per reference → global
AGENT_PROGRESS.md+state.lock.json+workspace/snapshots/if applicable. - Verify globally with
monorepo-system-testerat the level the batch declares (L0 local evidence · L1 contracts · L2 partial integration · L3 end-to-end). A single-repo batch with locally demonstrable acceptance → L0, no artificial cross-repo tests. The wave must quiesce first: runtime verification (L2/L3) never runs while any runner is still moving branches in a participating repo — cross-repo parallelism and system-level runtime verification do not compose. Verify between waves, or give runners isolated working copies. - Close:
Unreferenced repos do not participate, do not block, are not opened "just in case".SYSTEM_BATCH DONE = ALL(required references == DONE) AND global acceptance == PASS - Auto-advance: next runnable wave. System sprint complete → global report, Sprint
DONE, promote the nextPENDING→ACTIVEif applicable, continue. The global report aggregates verification debt: it sums the batches closed as references-done-but-system- verification-blocked and shows the total — each such closure is individually honest, but their sum is a plan that reads finished over a system never exercised end to end, and that debt must be visible without reading every entry. Plan exhausted → invokecdev-monorepo-plannerin gap-analysis mode and leave the result asPROPOSALfor human ratification; meanwhile execute ungated global work.
Cross-repo synchronization (pull, not push — and never mock)
- Every producer→consumer dependency is satisfied with an artifact on disk (the producer
batch's technical report, path declared by the planner in the consuming reference's
Wait-for). The producer publishes it as part of its acceptance; the consumer goes looking for it in the producer repo's working tree and reads it before integrating. - Consumer without its artifact: it does not mock the other repo's contract to make
progress nor fabricates integration evidence — it returns
WAITINGand the orchestrator reschedules it. (Unit-test stubs internal to the repo remain legitimate; what is forbidden is faking the cross-repo integration.) - Communication between agents ALWAYS goes through disk (repos + workspace), never through conversational memory: any runner may die and resume by reading the repo.
Branches and push (workspace policy)
- Derivation: each repo's first working branch within a SYSTEM Sprint is created from
that repo's
develop; subsequent batches chain per the local CDev's convention (typical: new branch from the previous batch's branch). The workspace does not redefine local branch names. - Push: never automatic. On closing the SYSTEM Sprint, pushing the resulting branches is
the human's act. If the user explicitly asks to "push", only the corresponding working
branch is pushed — never
develop/main, never with--force. - Merge/PR/deploy: always a human gate.
Blocked-but-not-idle (global)
Reference BLOCKED → SYSTEM_BATCH BLOCKED with reason + the minimum decision the human must
make. Continue with: another independent reference of the same batch → another SYSTEM_BATCH
with no dependency → other ungated global work. Never mark blocked work as finished.
It only stops when
- No ungated global work remains — say which approvals would unblock what.
- A human gate blocks and everything depends on it.
- Absent product: inventing requirements is forbidden; open question in DECISIONS.
- Quota limit: update
AGENT_PROGRESS.md+state.lock.json, commit the workspace, exit cleanly. Resumption picks up from the workspace, not from conversational memory.
Safety gates (never elevated; the strictest always wins)
Each child repo's gates prevail intact — this skill never reduces them. A historical decision
documented in a repo ("authorized path", old DECISIONS) NEVER counts as a live approval of a
gate in the current session: the gate requires present human authorization. Additionally, at
workspace level: push to any repo's main/develop · merge · deploy · remote
migrations/schema · live secrets · real payments · history rewriting · data deletion.
Preparing yes (drafts, commands, manifests); executing no. The workspace also may not: alter
local numbering, skip local sprints out of system haste, mark undemonstrated work DONE, or
turn a local change into a global one without evidence.