setup
Skill2 starsChanged 15 days agoMITView on GitHub
This skill should be used when "milestone-driver:setup" is invoked directly, or auto-invoked by triage, solve-issue, or solve-milestone when the driver profile is absent or missing a required Core key (`integrationBranch`, `protectedBranch`, or `sourceGlobs`). Guides an interactive first-run bootstrap that infers every profile key from repo signals, presents detected defaults with plain-language descriptions, lets the user accept/edit/skip optional keys (stating each skip-consequence), migrates a legacy root `milestone-driver.json` to `.milestone-config/driver.json` on first run and writes the assembled profile there, and returns control so the original task continues - no re-invocation needed.
191 other projects use a version of this.
Adopted by
Most recently taken up by
- hydra-db/hydradb-claude-codetheir own version, first seen Nov 8, 2026
- WALKERKILLER/Look-Tongji-Notestheir own version, first seen Nov 8, 2026
- steerlabs/opensteertheir own version, first seen Nov 8, 2026
- ansvisor/ansvisortheir own version, first seen Nov 8, 2026
- dsifry/metaswarmtheir own version, first seen Nov 8, 2026
- anombyte93/prd-taskmastertheir own version, first seen Nov 8, 2026
Used with
Projects with it also use add-voice-transcription, add-discord and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
juancruzmunozalbeloSkilladd-voice-transcription
Add voice message transcription to NanoClaw using OpenAI's Whisper API. Automatically transcribes WhatsApp voice notes so the agent can read and respond to them.
Also in 5 projects that use this
MicrosoftSkilladd-discord
Add Discord bot channel integration via Chat SDK.
Also in 11 projects that use this
MicrosoftSkilladd-slack
Add Slack channel integration via Chat SDK.
Also in 11 projects that use this
juancruzmunozalbeloSkilladd-telegram-swarm
Add Agent Swarm (Teams) support to Telegram. Each subagent gets its own bot identity in the group. Requires Telegram channel to be set up first (use /add-telegram). Triggers on "agent swarm", "agent teams telegram", "telegram swarm", "bot pool".
Also in 7 projects that use this
- +8 more from microsoft
Other versions191 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 191
- anthropics/knowledge-work-plugins★ 35ksame name
- garrytan/gbrain★ 32ksame name
- gavrielc/nanoclaw★ 31ksame name
- nanocoai/nanoclaw★ 31ksame name
- qwibitai/nanoclaw★ 31ksame name
- Q00/ouroboros★ 6.3ksame name
- pytorch/executorch★ 5.2ksame name
- agenticnotetaking/arscontexta★ 3.5ksame name
- aws/agent-toolkit-for-aws★ 3.4ksame name
- spotify/portal-ai-plugins★ 2.8ksame name
181 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository3 other files it gives its agents.
- solve-issueSkill
- solve-milestoneSkill
- triageSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. 0 are common, 4 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 171 edited versions we read keep these.
4
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 5
If ${CLAUDE_PLUGIN_ROOT} appears unexpanded, it is the parent of the skills/ directory that holds this file.
- Distinctive: line 29
Before asking anything, gather signals from the repo.
- Distinctive: line 68
Hard-stop condition: If any of the three required Core keys cannot be inferred and the user cannot supply a value, stop with a clear …
- Very specific: line 118
Wave precondition prompt: When - and only when - the user selects "wave", fire this informational, non-blocking prompt:
- Very specific: line 124
Milestone precondition prompt: When, and only when, the user selects "milestone", fire this informational, non-blocking prompt.
- Very specific: line 132
Only per-worker unit runs execute concurrently, so a shared test DB (or other shared external service) is the one parallel-safety hazard.
- Distinctive: line 160
Run this tier as a four-step flow:
- Very specific: line 214
After the profile is written (Phase 3) and before returning control, ensure all six runtime taxonomy labels exist in the target repo.
- Very specific: line 229
Run this before bulk provisioning.
- Very specific: line 238
If neither legacy label exists, the rename errors harmlessly and the block below creates judgment call fresh.
- Very specific: line 242
Use gh label create --force for all six labels.
- Very specific: line 271
Read ${CLAUDE_PLUGIN_ROOT}/skills/citation-format.md - the one format every citation in those slots takes.
- Distinctive: line 275
Never present a blank prompt.
- Very specific: line 277
Do not write a partial profile.
“Common” is measured: kept by at least 6 in 10 of the 171 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
If ${CLAUDE_PLUGIN_ROOT} appears unexpanded, it is the parent of the skills/ directory that holds this file.
setup - first-run profile bootstrap
Generate or repair the driver profile through a guided, inference-first flow. The canonical location is <repo>/.milestone-config/driver.json; new profiles are always written there, and an existing legacy root <repo>/milestone-driver.json is migrated there by the preamble that runs before Phase 1.
Contents
- When this runs
- Procedure
- Output style
- Non-negotiables
When this runs
- Auto-invoked by
triage,solve-issue, orsolve-milestonewhen the driver profile is absent or missing a required Core key. - Direct invocation (
/milestone-driver:setup) when onboarding a new repo or repairing an existing profile.
Migration preamble (run first, before Phase 1), so Phase 1 pre-fills from the already-migrated canonical file. Resolve the profile: <repo>/.milestone-config/driver.json exists → use it. Else a legacy root <repo>/milestone-driver.json exists → migrate it first (mkdir -p .milestone-config; git mv <repo>/milestone-driver.json <repo>/.milestone-config/driver.json when git-tracked, else plain mv), then continue. Else it is a new project (Phase 3 creates the canonical file). Idempotent: once .milestone-config/driver.json exists this is a no-op. Both present → .milestone-config/driver.json wins; no move, no overwrite, no deletion of the leftover root file. The transitional read covers the gap before the move lands.
Procedure
Phase 1 - Silent project-evaluation pass
Before asking anything, gather signals from the repo. Run these checks silently (no output yet):
| Signal | Command / check |
| Repo default branch | git symbolic-ref refs/remotes/origin/HEAD → strip refs/remotes/origin/; fall back to gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name' |
| Integration-branch candidates | git branch -a - look for develop, dev, development, integration |
| Repo layout | List top-level dirs + key files: package.json, *.sln, *.csproj, Makefile, pyproject.toml, Cargo.toml |
| Unit test command | package.json → .scripts.test; presence of test .csproj; Makefile targets test; pyproject.toml [tool.pytest]; Cargo.toml |
| E2E test indicators | Appium config, Playwright config (playwright.config.*), Selenium project, run-e2etests.* script |
| Visual-capture indicators | A dev/test sign-in seam (e.g. a /dev/sign_in route, a sign_in_as/test-login helper), a server boot command (bin/rails server, npm run dev, a Procfile web: entry), and/or appearance signals (dark: Tailwind variants, a theme toggle, prefers-color-scheme) |
| Preflight (fast pre-PR checks) command | .pre-commit-config.yaml present → pre-commit run --all-files; package.json .scripts.lint → npm run lint; Makefile lint/check target → make lint / make check |
| Stack signals | Language/framework files for domainSkills mapping (see table below) |
| Versioning target | Presence of .claude-plugin/plugin.json - present → default to versioned; absent → suggest versioning: false |
| Existing profile | Read .milestone-config/driver.json if present, else the legacy root milestone-driver.json - pre-fill any already-set keys; a pre-filled domainSkills runs through The expansion below before it is offered |
| Detected file | Inferred domainSkills candidate |
*.csproj / *.sln with Maui | the expansion of maui-skills:* |
*.csproj / *.sln (non-MAUI) | omit (no bundled domain skill) |
package.json with Angular | ["angular-skills:angular-developer"] |
skills/** + agents/** + hooks/** | the expansion of plugin-dev:*, plus superpowers:writing-skills |
package.json (generic Node) | omit |
| Python project | omit |
The expansion is ${CLAUDE_PLUGIN_ROOT}/scripts/expand-domain-skills.{sh,ps1} ~/.claude/plugins/cache <entry>… (pwsh on Windows, bash elsewhere); its stdout is the value offered in Phase 2, for an inferred candidate and for a value pre-filled from the existing profile alike. An entry it names on stderr as unresolved: is dropped, never offered - it resolves to no invocable name. An expansion returning nothing records no domainSkills key at all: an empty expansion is an absent key, and the dropped entries are still named to the user.
Phase 2 - Tier-by-tier confirmation
Present keys in these tiers: Core → Testing → E2E → Triage / Visual → Visual Capture → Preflight → Integration → Release → Enrichment → External integrations. Within each tier, show one key at a time (or a logical group). For every key: state the plain-language label, show the detected default (or an illustrative example if none was detected), and - for optional keys - state the skip-consequence on the same line. Accept, edit, or skip; never leave a field blank without an explicit skip choice. On Codex each question is a mandatory gate and the Skill tool is $skill-name: skills/runtime-codex.md.
Tier: Core - integrationBranch, protectedBranch, and sourceGlobs are required and cannot be skipped (hard-stop if genuinely unknowable). implementerAgent is auto-filled with the bundled default - show it, confirm, move on; it never hard-stops.
| Key | Plain-language label | Inference fallback if not detected |
protectedBranch | "Which branch must I never push or PR to? (Your release / default branch.)" | Show main as example |
integrationBranch | "Which branch should I open PRs into and merge work onto?" | Show develop as example; if no gitflow branch found, ask explicitly |
sourceGlobs | "Which path patterns are 'source' that only the implementer subagent may edit?" | Infer from repo layout (e.g. ["src/**","tests/**"] for Node; ["YourApp/**","YourApp.Tests/**"] for .NET; ["skills/**","agents/**","hooks/**"] for a Claude Code plugin) |
implementerAgent | "Which agent authors the code? (Rarely changed - the bundled default is fine for most repos.)" | Auto-fill "milestone-driver:implementer" - show it, confirm, move on |
Hard-stop condition: If any of the three required Core keys cannot be inferred and the user cannot supply a value, stop with a clear message and write no partial profile.
Tier: Testing (optional)
| Key | Plain-language label | Skip-consequence |
unitTestCmd | "What command runs your unit tests?" | Skip → "No unit tests - I won't gate commits on them; the implementer verifies behavior another way." |
Tier: E2E (optional; skip the whole tier if no E2E signals were detected)
| Key | Plain-language label | Skip-consequence |
e2eTestCmd | "What command runs your end-to-end / UI tests?" | Skip → "No E2E gate." |
e2eEnv | "What device/endpoint should the E2E runner target? (e.g. {\"endpoint\":\"127.0.0.1:4723\",\"device\":\"Android emulator (AVD)\"} for Appium)" | Skip → "No E2E environment recorded." |
Tier: Triage / Visual (optional; pure preference - no Phase-1 inference signal, because a repo's UI surfaces are not reliably detectable from layout and gating the question on a detector would reintroduce the bug of never asking. Always presented, with the example below as the default.)
| Key | Plain-language label | Skip-consequence |
uiSurfaceGlobs | "Which path patterns mark your UI surfaces - the files whose changes a human should look at? (e.g. [\"PrayerApp/Views/**\",\"**/*.xaml\"] for MAUI; [\"app/views/**\",\"app/components/**\"] for a web app.)" | Skip → two layers stay off: no design-lens review in triage (UI issues never reach design-reviewer), and no visual capture (nothing is identified as a UI surface, so the Visual Capture tier is skipped). |
Tier: Visual Capture (optional; presented only when both gates pass - (a) a visual-capture signal was detected in Phase 1, and (b) uiSurfaceGlobs was captured above. Both must hold: a native UI stack (MAUI, WPF) has UI surfaces, so uiSurfaceGlobs is captured, but has no server or URL to poll and should omit visualCapture entirely (docs/profile-schema.md (This block is a)). If either gate fails, skip the tier silently.)
The visualCapture block declares how an automated visual-capture flow boots a seeded/persona app server - a local app instance preloaded with test data and signed in as a test persona, so the flow can reach real authed screens - and what it captures. Present the keys one at a time, with the detected default and the skip-consequence on the same line:
| Key | Plain-language label | Skip-consequence |
visualCapture.serverCmd | "What command boots your seeded/test app server? (e.g. bin/rails server -e test -p 3000)" | Skip → required: no visualCapture block is written at all, and no screenshots are attached; the PR merges on green CI like any other. |
visualCapture.readyUrl | "What /health-style URL should the ready probe poll to know the server is up? (e.g. http://127.0.0.1:3000/health)" | Skip → required: no visualCapture block is written at all, and no screenshots are attached; the PR merges on green CI like any other. |
visualCapture.signInPath | "What is your passwordless test sign-in path, persona-templated? (e.g. /dev/sign_in/{persona})" | Skip → required: no visualCapture block is written at all, and no screenshots are attached; the PR merges on green CI like any other. |
visualCapture.persona | "Which seeded persona should capture sign in as? (Default: super-admin, so every surface is reachable.)" | Skip → default "super-admin" used at runtime. |
visualCapture.viewports | "Which named viewports should I capture? (Default: {\"desktop\":{\"width\":1440,\"height\":900}}. Detected an appearance/mobile signal? Add e.g. \"mobile\":{\"width\":390,\"height\":844}.)" | Skip → default desktop-only viewport used at runtime. |
visualCapture.appearances | "Which appearances should I capture? (Default: [\"light\"]. Detected dark: variants / a theme toggle / prefers-color-scheme? Suggest [\"light\",\"dark\"].)" | Skip → default single-appearance [\"light\"] used at runtime. |
Required-key rule: serverCmd, readyUrl, and signInPath must all be supplied together; the optional keys resolve to their defaults when skipped. If the user accepts the tier but skips any one of the three, write no visualCapture block at all - a node missing a required key is treated as absent and logged at runtime.
Write rule: accepting the tier writes only the keys the user supplied as a sparse object - omitted optional sub-keys (persona, viewports, appearances) are not written and resolve at runtime. Skipping the tier writes no visualCapture block (no null, no empty object). Aborting mid-tier writes no partial node.
Tier: Preflight (optional; present the inferred candidate, or an example such as pre-commit run --all-files if none was detected)
| Key | Plain-language label | Skip-consequence |
preflightCmd | "What runs your project's fast pre-PR checks (lint, format, static analysis, security scan)? Runs after /code-review, before commit, or once at milestone end under milestone granularity. Give either an explicit command (e.g. pre-commit run --all-files, make lint, npm run lint, bundle exec standardrb && bundle exec brakeman -q), or the reserved value github-ci to defer the gate entirely to your GitHub Actions CI - no local check runs; your PR's own CI run is the preflight." | Skip → "No preflight gate; CI-only lint/scan, caught on the PR instead of locally." |
Tier: Integration (optional; pure preference - no Phase-1 signal, since granularity is not detectable. Show "milestone" as the default.)
| Key | Plain-language label | Skip-consequence |
integrationGranularity | "How should built issues integrate: one PR per issue, one PR per dependency wave, or one PR for the whole milestone (default)? Milestone mode folds every issue in locally and pushes once at the end, so a milestone costs one push, one PR, and one CI run instead of one per issue (branch mechanics: skills/solve-milestone/milestone-granularity.md)." | Skip → milestone under solve-milestone (one push, one PR, one CI run for the whole milestone); a standalone solve-issue run integrates per issue. |
Wave precondition prompt. When - and only when - the user selects "wave", fire this informational, non-blocking prompt:
"Wave mode blocks the whole wave on one red CI run; it needs strong local gates. Is
preflightCmdset, and isunitTestCmdyour full suite (not a subset)? If you want partial-merge - the failing issue isolates, the rest merge - useissue."
The prompt does not block: after acknowledgement, "wave" is still written.
Milestone precondition prompt. When, and only when, the user selects "milestone", fire this informational, non-blocking prompt. After acknowledgement, "milestone" is still written:
"Milestone mode pushes once, at the end, so no issue branch reaches origin during the run. If one of your own workflows triggers on a push to every branch, exclude the
milestone-*prefix so you do not pay for the assembled milestone twice:branches-ignore: ['milestone-*'], orbranches: ['**', '!milestone-*'](order matters, negate last). Set one form per event, never both. Seeskills/solve-milestone/milestone-granularity.mdfor the branch mechanics,docs/consumer-setup.mdfor the full walkthrough."
Write rule: omit integrationGranularity when milestone is chosen (absent-means-milestone, same convention as versioning); write "wave" or "issue" only when explicitly chosen. Aborting before Phase 3's write persists nothing.
Conditional question: parallel (present only when a unitTestCmd was supplied/detected in Phase 1. Otherwise skip it silently: no unitTestCmd means no shared-external-service hazard.)
Only per-worker unit runs execute concurrently, so a shared test DB (or other shared external service) is the one parallel-safety hazard. Present the question after integrationGranularity:
| Key | Plain-language label | Answer mapping |
parallel | "Your unit tests may share external services (like a test DB) across concurrent builds. Is your harness isolated per worker so parallel builds are safe?" | Yes → parallel: true. No → parallel: false. Skip → omit parallel; the run-start interview asks on the first solve-milestone run. |
See the Phase 3 write rule for why a Yes/No answer records an explicit boolean.
Tier: Release (optional; default inferred from the .claude-plugin/plugin.json presence signal)
| Key | Plain-language label | Skip-consequence |
versioning | "Should I bump a plugin version on each PR via .claude-plugin/plugin.json? (Inferred default: file present → versioned; absent → suggest version-free.)" | Skip → key omitted → opportunistic versioning: the milestone title is parsed for a version; a miss silently degrades to version-free (never prompts). Choose explicit versioning: true to make a miss/ambiguity prompt the operator instead (or degrade with a warning when non-interactive). For explicit version-free, choose the inferred versioning: false. |
Tier: Enrichment (optional; show inferred values - accept with one keystroke)
| Key | Plain-language label | Skip-consequence |
domainSkills | "Any stack-specific skills every planner, implementer and reviewer loads first, on every dispatch? Exact plugin:skill names (e.g. [\"maui-skills:maui-data-binding\", \"maui-skills:maui-shell-navigation\"])" | Skip → "Agents rely on general docs + repo conventions only." |
nonNegotiables | "Any hard constraints the implementer must honour? (framework versions, platform targets)" | Skip → "None recorded." |
standingDocs | "Any .project/ sections every build should read? <doc>#<heading> entries (e.g. [\"conventions.md#Naming\", \"design-philosophy.md#Error & failure philosophy\"])" | Skip → "No standing docs. Each packet quotes the rules its change needs." |
A skipped standingDocs writes no key.
Every domainSkills value - inferred, pre-filled, or typed - runs through The expansion (above), and the expansion is what setup records, so a wildcard is never rejected for being one. Reject only an entry the expansion returns as unresolved: - the Skill tool takes one exact name, so an unexpandable wildcard has no invocation - with exactly: domainSkills entries are exact plugin:skill names; "<entry>" is not invocable.
Tier: External integrations (optional; presented only on direct /milestone-driver:setup invocations. When setup is auto-invoked as a bootstrap sub-step, skip this tier entirely - never an interactive Trello question mid-run.)
Run this tier as a four-step flow:
Re-run behavior. If
integrations.trelloalready exists in the profile (Phase 1 pre-filled it), show the existingboardIdas the default in Step 3 and the existinglistsoverrides as defaults in Step 4. The user can accept, edit, or re-configure - the full flow still runs, pre-filled.
- Detect Trello MCP availability by probing
mcp__trello__get_health. If the tool is absent or errors, print "Trello MCP (@delorenj/mcp-server-trello) not available in this session - skipping External integrations tier." and move on to Phase 3. - Offer the integration with a plain-language label and skip-consequence:
- Label: "Would you like to configure Trello board integration? (
@delorenj/mcp-server-trellois available in this session.)" - Skip-consequence: "Skip → Trello integration not configured - all Trello sync steps skip silently in future runs."
- On skip: move on to Phase 3.
- Label: "Would you like to configure Trello board integration? (
- Board picker (on accept): call
mcp__trello__list_boardsto fetch the user's boards. Present board names in a table for selection. Store the selected board's ID asintegrations.trello.boardId.- On failure: fall back to manual text entry - "Enter your Trello board ID directly:" and use the entered value. (The board ID is visible in the Trello board URL.)
- List mapping (after board selection):
- Attempt to fetch the board's actual lists via
mcp__trello__get_lists. - On success: present those list names for the queue / inProgress / inReview mapping, with the three defaults (
"Queue","In Progress","In Review") shown as suggestions. - On failure: fall back to manual text entry for each of the three, using the defaults as suggestions. Wrong names are tolerated: the runtime skill auto-creates any missing list.
- Defaults accepted → omit
listsfrom the written profile (absent-means-default). Only overridden sub-keys are written (sparse object - e.g. only"queue": "Backlog"if only queue was changed). - User aborts at any point → write no partial
integrations.trellonode: either the fullboardIdand any overridden list names are written, or nothing is.
- Attempt to fetch the board's actual lists via
| Key | Plain-language label | Skip-consequence |
integrations.trello.boardId | "Which Trello board should I track milestone work on? (Select from your boards above.)" | Skip → no Trello integration configured. |
integrations.trello.lists.queue | "What is your 'queue' list name? (Default: Queue)" | Skip → default "Queue" used at runtime. |
integrations.trello.lists.inProgress | "What is your 'in progress' list name? (Default: In Progress)" | Skip → default "In Progress" used at runtime. |
integrations.trello.lists.inReview | "What is your 'in review' list name? (Default: In Review)" | Skip → default "In Review" used at runtime. |
Phase 3 - Write and confirm
The migration preamble has already relocated any legacy root profile, so Phase 3 has only two cases:
- New project - neither file present: create
.milestone-config/(mkdir -p .milestone-config) and write the assembled profile to.milestone-config/driver.json. Never write a fresh profile to the root. - Existing profile -
.milestone-config/driver.jsonpresent: write the assembled profile there in place. If a leftover rootmilestone-driver.jsonis also present, the canonical file wins: do not overwrite it from the root, and do not delete the leftover (the operator removes it; no.gitignorechange is made).
Assemble the full profile object as valid JSON - every key, both the Phase-1 pre-filled values and the keys the user accepted or edited in Phase 2 - and write it to .milestone-config/driver.json. Drop no accepted key: a key pre-filled in Phase 1 and left unedited in Phase 2 is still written. Omit only a key the user explicitly skipped (never write null or empty values for it).
Two conventions govern the optional keys. For versioning and integrationGranularity, omit the default: omit versioning when versioned is chosen and write versioning: false only for version-free; omit integrationGranularity on milestone and write "wave" or "issue" only when picked. For parallel, deviate deliberately - write the explicit boolean the user chose (true on Yes, false on No) whenever the Integration-tier question was answered, and omit parallel only when that question was not shown (no unitTestCmd) or was skipped. Do not "correct" this back to omit-the-default: omitting a made decision would re-fire the run-start DB-hazard interview on every solve-milestone run whenever unitTestCmd is present.
Print the final file contents so the user can verify.
.milestone-config/driver.json written.
{
"integrationBranch": "develop",
"protectedBranch": "main",
"sourceGlobs": ["skills/**", "agents/**", "hooks/**"],
"implementerAgent": "milestone-driver:implementer"
}Phase 4 - Provision the runtime label taxonomy
After the profile is written (Phase 3) and before returning control, ensure all six runtime taxonomy labels exist in the target repo. This runs both on direct /milestone-driver:setup invocations and any time setup is auto-invoked as a bootstrap sub-step.
Taxonomy (single source of truth)
| Label | Color (hex) | Description |
in progress | 1D76DB | Branch open with partial or parked work; not yet done |
blocked | B60205 | Can't proceed; waiting on something external (unmerged dependency, unverified E2E) |
needs design | 5319E7 | Design direction required before building |
needs decision | D93F0B | Non-design human decision required |
needs review | 0E8A16 | Built; a PR whose CI came back red, needing a human before it can merge |
judgment call | FBCA04 | Borderline autonomous call - audit post-run |
Reconcile the existing judgment-call label
Run this before bulk provisioning. A repo may carry a legacy label named judgment-call or ⚠ judgment-call; renaming it here preserves all existing issue/PR associations:
# If the legacy label exists, rename it (preserves all issue/PR associations):
gh label edit "judgment-call" --name "judgment call" --color FBCA04
# or, if the legacy name includes the warning prefix:
gh label edit "⚠ judgment-call" --name "judgment call" --color FBCA04If neither legacy label exists, the rename errors harmlessly and the block below creates judgment call fresh. Either path is idempotent.
Idempotent provisioning
Use gh label create --force for all six labels; the judgment call row updates the just-reconciled label. Run them as a flat list - no shell loop.
gh label create "in progress" --color 1D76DB --description "Branch open with partial or parked work; not yet done" --force
gh label create "blocked" --color B60205 --description "Can't proceed; waiting on something external (unmerged dependency, unverified E2E)" --force
gh label create "needs design" --color 5319E7 --description "Design direction required before building" --force
gh label create "needs decision" --color D93F0B --description "Non-design human decision required" --force
gh label create "needs review" --color 0E8A16 --description "Built; a PR whose CI came back red, needing a human before it can merge" --force
gh label create "judgment call" --color FBCA04 --description "Borderline autonomous call - audit post-run" --forceApply-time label helper (for consuming skills)
The gh label create --force idiom above is the canonical apply-time label helper that solve-milestone and solve-issue call immediately before each gh issue edit --add-label "<name>", including when they apply a label triage recommended:
gh label create "<name>" --color <hex> --description "<desc>" --forceusing the color and description from the taxonomy table above, so a fresh consumer repo that has never run /milestone-driver:setup still receives the label on first use.
Phase 5 - Return control
Return control to the caller immediately. Do not ask the user to re-run the calling skill. The bootstrap is a sub-step, not a restart.
Output style
Read ${CLAUDE_PLUGIN_ROOT}/skills/output-style.md - the single source of truth for this plugin's output contract. Its ## Terminal output section governs what this skill prints; its ## GitHub-facing prose, ## When prose is the correct form, and ## Evidence slots sections govern any comment or PR body this skill writes. Plain English. Write every response, document, and GitHub issue, milestone, comment, and PR body in plain, concise English. Never include hypothesis, conjecture, or defensive text.
Read ${CLAUDE_PLUGIN_ROOT}/skills/citation-format.md - the one format every citation in those slots takes.
Non-negotiables
- Never present a blank prompt. Every key shows either a detected default or an illustrative example.
- Skip always states its consequence. A user who skips knows exactly what gate or behavior is affected.
- Do not write a partial profile. Either all three required Core keys are present, or no file is written. (
implementerAgentis auto-filled; the optional keys may be omitted.) - Committing the profile: writing the file is enough for the gates to read it this session. On a direct invocation, suggest the user commit it (
git add .milestone-config/driver.json && git commit -m "chore: add milestone-driver profile") so every clone and CI has it; when a legacy rootmilestone-driver.jsonwas migrated, thegit mvis already staged and is committed by the same flow. When setup is auto-invoked as a bootstrap sub-step, leave the commit to the normal flow - do not create a commit on the current branch.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

