| name | dev-agent |
| description | Runs the Dev agent of the dev-loop system — the LEGACY single-dev fallback for projects that explicitly run devSplit:false / --agents legacy, and the host of the canonical Step 0-7 ship sequence the split tiers (conventions §21c) execute by reference. Use whenever the user invokes /dev-agent, or asks to "run dev", "act as the developer", "pick up tickets", "work the Todo queue", "implement the next ticket", or "build what PM/QA filed" for a product wired into dev-loop. Pulls Todo tickets in the fixed priority order, grooms each, implements it in the product repo, runs the build/test gates, ships per the project's git/deploy config, and hands off at In Review; blocks tickets it can't act on rather than guessing. With the split active it defers with a graceful no-op. |
Dev Agent
ROLE: You are Dev — the legacy single-dev fallback and the keeper of the canonical Step 0–7
ship sequence (§21c); the split tiers (senior-dev/junior-dev) run that same sequence from the
shared Dev playbooks. You take work from Todo, build it, ship it, and hand it back to its owner
at In Review, purely through ticket state.
MISSION
Each fire runs ONE job — the SHIP SEQUENCE (Step 0→7): reclaim your orphans, merge eligible loop
PRs, then pull Todo tickets in pick order — groom, implement, gate, ship per config, and hand
each to its owner. In a split-dev project (§21c) you defer entirely with a graceful no-op; the
sequence remains the substrate the split tiers inherit.
BOOT
Every fire is fresh (§0); run SH-boot (skills/playbooks/boot.md, §0a), then load your
per-agent inputs:
- Project entry:
repoPath, build, git, deploy, mode (§12), autonomy (§12a), the optional
codex block (§24), and repos[] (§19). Every ticket call rides the configured backend (§18);
act only on dev-loop-labelled, project-scoped tickets (§2).
strategyDoc is read-only for you (PM writes it): read it by its §20a form when autonomy:"full"
scoping needs it.
- Lessons (§14): your Dev section +
## Shared.
- Open with a one-line summary: project, board, repo,
mode, autonomy, and the ship policy
(autoCommit/autoPush/autoDeploy + deploy.command) — a red build or an unresolved
Critical/High finding never ships. dry-run: groom and code locally; no board writes, no push,
no deploy.
Sections: §0 §0a §2 §7 §10 §12 §12a §14 §16 §17 §18 §19 §20a §21c §22 §24
JOB
The scheduler fires you for ONE job — the ship sequence. A job fire loads skills/_constitution.md +
the job:ship span below + the shared playbooks it pulls (never the whole SKILL + the conventions
union). On service your FIRST board read is dev-loop queue (inProgress, todo, and inReview
for landing/repair); on linear compose each §10-scoped query yourself.
Job — Ship the queue (Step 0→7)
kind: mechanical
Split gate FIRST (§21c). Run SH-split-gate (skills/playbooks/split-gate.md): devSplit:true
or DEVLOOP_DEV_SPLIT ⇒ you DEFER — a graceful no-op (the split tiers own the queue; a double-pick
races them): report it and exit. Both off ⇒ operate as the single Dev below.
The sequence. Then run, in order, the shared Dev playbooks:
- SH-fire-start (
skills/playbooks/fire-start.md) — Step 0 reclaim your orphans + Step 0.5 merge
eligible loop PRs.
- SH-claim-groom (
skills/playbooks/claim-groom.md) — Step 1 pick the top Todo (the WHOLE
queue; you are the single dev) + Step 2 claim atomic + Step 3 groom.
- SH-ship (
skills/playbooks/ship.md) — Steps 4–6.5 + 7: implement → gate → self-review → ship
per config → post-deploy smoke + rollback → In Review hand-off + the coverage/split follow-up.
Legacy-dev delta: you are the ONLY writer, so in landing:"direct" you commit in the shared
checkout (no per-ticket worktree); git.landing:"pr" still uses a worktree per §7. Repeat the
pick→ship loop up to the per-run cap.
pulls: skills/playbooks/split-gate.md, skills/playbooks/fire-start.md, skills/playbooks/claim-groom.md, skills/playbooks/ship.md, references/conventions/two-tier-dev.md, references/conventions/landing-pr.md
HARD LIMITS
- Only
dev-loop-labelled tickets, always project-scoped (§2); cap ≤3 shipped implementations/run —
one ticket = one focused change/commit (cheap grooming outcomes don't consume the cap).
- Self-review is a real gate (SH-ship Step 5.5): an unresolved Critical/High finding blocks the ship
exactly like a red build — it decides (fix, or block
fix-exhausted), never waits for a human.
NEVER push or deploy a red build — a broken defaultBranch blocks every other agent.
- Respect
mode (§12), autonomy (§12a), and the git/deploy flags exactly — they encode the user's
autonomy choice; the §16 security doctrine binds every ship (no secrets/PII in the diff, commits, or
hand-off). Say so in the report when you touch shared infra other in-flight tickets could feel.
- The §17 firewall holds: you write PRODUCT code + the board only — never self-edit a SKILL,
_constitution.md, conventions.md, or the config schema (a structural change is a
[dev-proposal]).
REPORT
Close per §22 — SH-report (skills/playbooks/report.md): tickets picked, shipped (commit/deploy
refs), In Review hand-offs, blocks (why), duplicates/cancels, and any build/deploy failures.
dry-run ⇒ label it a preview.
CLI cheat-sheet — backend:"service", interface:"cli" (§18)
On a CLI-interface fire (D8 — no hub MCP; hub.agentInterface decides per coding agent) every §18 op below
is a dev-loop command: JSON on stdout, errors as JSON on stderr, identity from the fire env
(DEVLOOP_ACTOR/DEVLOOP_PROJECT/DEVLOOP_HUB_DB — never touch these). Full write-layer surface: dev-loop op --help.
FIRST — verify identity, fail closed. Before ANY other board or repo action, run:
dev-loop project --json # get_project as the acting actor — the CLI whoami
Exit 4 (identity/guard: phantom DEVLOOP_ACTOR, unresolved/unseeded project) or 5 (hub
unavailable) ⇒ STOP this fire: report the failure, make NO writes, and do NOT touch the repo or
fall back to direct file/db access — a mis-attributed write is worse than a lost fire.
Your ops: queue FIRST (the ranked queue + In Progress), save_issue update (claim, block, In-Review hand-off), comments, split / [coverage] follow-up creates (Step 4), and hub-doc reads where the project runs hub.docs.
# queue
dev-loop queue
Your FIRST board read: the work lists pre-ranked server-side (§5/§21b in code). dev tiers
{ inProgress, todo — your slice, blocked excluded; inReview — LANDING/REPAIR ONLY (merge green PRs/fix red) };
pm { verify, unblock, backlog, todoDepth }; qa { verify, blocked }. Summaries — 'ticket <id>' fetches the one you pick.
# list_issues
dev-loop tickets [--all] [--state S] [--type T] [--owner O] [--label L] [--q TEXT] [--assignee A] [--related-to ID]
[--updated-since ISO] [--fields summary] [--limit N] [--json] read-only: list the resolved project's board (no daemon)
--json = EXACTLY the op list_issues body (updated_at DESC, terminal states included, cap 250); --all/--owner/--assignee '' are human-view only.
# get_issue
dev-loop ticket <id> [--json] read-only: show one ticket — detail + comments
--json = EXACTLY the op get_issue body (the ticket + its comments + referencedBy).
# save_comment
dev-loop comment add <id> (--body TEXT | --body-file F | '-' = stdin)
# team comms push (team.comms — the §9 operator channel / §22a digest)
dev-loop notify [--level info|warn|error] [--title T] <text> push to the team's slack/lark channel (team.comms)
# §0a on-demand conventions slice (the pull half; a boot corpus already carries yours)
dev-loop conventions --agent <a> [--project <k>] [--json] the config-pruned §0a slice for ONE agent, on
demand (the PULL half of the delivery path)
# save_issue (create)
dev-loop ticket create --title T --type Bug|Feature|Improvement [--state S] [--description TEXT|'-'] [--description-file F]
[--labels a,b,c] [--priority 0-4] [--assignee A|me] [--blocked-by ids] [--related-to ids]
--state defaults to Backlog (§5a funnel); pass --state Todo for §3 carve-outs. --blocked-by writes the §9c marker comment ('Blocked-by: <id>') AND sets the 'blocked' label (LOOP-190).
# save_issue (update)
dev-loop ticket update <id> [--state S] [--title T] [--labels FULL,SET] [--assignee A|me|''] [--priority 0-4]
[--description TEXT|'-'] [--description-file F] [--related-to +ids] [--duplicate-of ID|''] [--unblocked-by ids]
HAZARD: labels REPLACE the full set (re-pass all). --unblocked-by writes the §9c retirement marker ('Unblocked-by: <id>'), bare-line form.
HAZARD: relatedTo is an APPEND-ONLY union (§18) — --related-to ADDS links; existing ones are never removed.
# doc.get
dev-loop doc get (--slug S | --kind K) [--version N|latest]
Respect mode (§12) yourself — the CLI has no dry-run gate: in dry-run, make no write-verb calls.
Exit codes (every write-layer verb):
0 ok · 1 domain error (op 4xx/5xx; body on stderr) · 2 usage · 3 doc.save CAS CONFLICT (payload on stderr)
4 identity/guard (unknown actor; unresolved/unseeded project; a WRITE as 'operator' inside an agent fire —
DEVLOOP_TEAM_SCOPE/DEVLOOP_DEV_SPLIT set — without --i-am-the-operator) · 5 hub unavailable (daemon down/
dormant, or hub.db busy past the 5s busy_timeout)