本文へ移動
cccskills
無料GitHub で公開

crouton-change-control

The router for how a change legally happens in this repo — which sign-off gate fires for which kind of change, what counts as approval, how the packages-edit guard works, and how work is allowed to reach main. Use when starting ANY change and unsure which rules apply, when an Edit to packages/* gets BLOCKED, when a pipeline issue sits on status:blocked and you need to know what unblocks it, or when asked "do I need sign-off for this", "how do I get this merged", "can I deploy this", "who approves X", "why won't my approval label/reaction do anything".

インストール方法を見る

含まれるファイル(1)

  • SKILL.md11.1 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Crouton Change Control — the router

One-line purpose: given "I want to change X", tell you which gates fire, which skill runs them, what approval looks like, and the legal path to main — an index with rationale, never the mechanics (those live in AGENTS.md, root CLAUDE.md, and the gate skills cited below).

When to use / when NOT to use

SituationGo to
"Which rules apply to this change?" · blocked edit · stuck status:blocked · "how does this reach main?"this skill
Actually running a gateschema-review, ui-proposal, test-review, review skills
Issue/epic/label mechanics, epic walk-upgithub-tasks skill
Commit mechanicscommit skill (/commit)
Workflow-file anatomy, secrets, deploy pipeline internalssibling crouton-ci-and-deploy-map
The incident stories behind the rulessibling crouton-failure-archaeology
"Is this error a known failure?"sibling crouton-diagnostics-index

Trust order where sources disagree: see sibling crouton-docs-trust-map §1. Two known self-contradictions are flagged in §3 and §4.

1. Decision table — "I want to change X"

Step 0, always: a tracking GitHub issue exists before code (ISSUE-FIRST, a HARD GATE — AGENTS.md "The loop"). Then resolve the stage — never guess from folder names:

node scripts/harness-stages.mjs <path>   # → stage, deploy target, gates(required/opt-in)

Verified 2026-07-02: packages/* → stage: package, gates(required): test-first; apps/* → stage: app, gates(opt-in): test-first; pocs/* → stage: poc, no gates, deploy: preview; anything else (e.g. scripts/) → unstaged.

I want to change…Stage / gate that firesSkill that runs itApprover
Hand-written logic in packages/*edit guard (§3) + test-first required (#774)test-review — agree the failing test before codethe human owner, by comment (§2)
A collection schema (schemas/*.json, crouton config, generate_collection)schema sign-off (#314)schema-review — field table before generatingsame
A visual surface (.vue, app/components|layouts|pages/**, theme, app CSS)UI sign-off (#307)ui-proposal — live staging preview, or --static mockupsame
Code in apps/* (non-visual, non-schema)test-first is opt-in only — note the opt-in mechanism is undefined (open #783)—normal PR flow
Anything in pocs/*no required gates; preview deploys via deploy-pocs.ymlpoc-deploy for the preview URLnone pre-merge
A bug fix anywherearchaeology-first (#424) before the fixbug-archaeologyfinding recorded on the issue
A new appgoes in pocs/, not apps/ (root CLAUDE.md)crouton / poc-deploypromotion to apps/ = launch decision
A deploystaging only, ever, by default (#318, §5)deploy / merge to mainproduction: explicit human ask → deploy-production
.claude/skills/**CI freshness check skills-doc.ymlrun node scripts/gen-skills-doc.mjs (register in its META)CI
.claude/routing.json / agent modelsCI drift check routing-registry.ymlrun node scripts/gen-routing.mjsCI
A spec.json entry to status: "settled"hook gate-spec-signoff.mjs blocks unless signedOff is recorded (#988/#992)specrecorded sign-off, not assertion

harness.config.mjs also names code-review and sec in its gate vocabulary, but no stage declares them required — in practice per-PR CI review gates (red-team.yml, a11y.yml, frontend-review.yml) fire by changed-path instead (see crouton-ci-and-deploy-map).

2. Approval semantics (#572) — one loop for every gate

  • Hold state = the status:blocked label on the issue. The gate PR (if any) is a draft.
  • The ONLY resume signal is a reply comment whose body matches /\b(approve|approved|lgtm)\b/i, posted by a human (non-Bot). Verified in .github/workflows/resume-on-comment.yml: it triggers only on issue_comment: created, on the blocked ISSUE itself — not a PR (!github.event.issue.pull_request in the job if) — + status:blocked + comment.user.type != 'Bot'. So an approval comment posted on the draft gate PR does nothing — reply on the issue. A 👍 reaction raises no event; the ui-approved label exists but nothing listens for it. Reactions, labels, and PR comments do nothing.
  • On approval, a deterministic step in that same workflow finds the draft gate PR (linked to the issue, base is epic/*), marks it ready, merges with a merge commit — never squash, and removes status:blocked. The link is matched from GitHub's own linked-issue relation first, then from a line-start Closes / Fixes / Resolves / Sub-issue / Refs #<issue> in the body (#1663 — it used to demand the literal Closes #NN, and a PR saying Sub-issue: #NN made the approval a silent no-op). Write Closes #<issue> anyway — it stays the canonical form, even on an epic/* PR where GitHub won't auto-close.
  • Any other reply = a change request: iterate and re-hold. A no-op resume goes red (artifact-gate, #603).
  • Who approves: this is a solo-dev repo — the owner (@pmcp). "Done" is derived from a recorded sign-off, never self-asserted (AGENTS.md "Done is signed off, not asserted"; the #988 incident — see crouton-failure-archaeology).
  • Epic close has its own comment signal: /close-epic, valid only when the epic already carries status:ready-to-close (postmortem ran first) — verified in close-epic-on-comment.yml.

3. The packages-edit guard

packages/* is edit-guarded (harness.config.mjs declares it; the live enforcer is the PreToolUse hook .claude/hooks/gate-package-edits.sh, wired in .claude/settings.json on Edit|Write — it deliberately hardcodes packages/* for speed, #955). Two approval channels, verified in the hook:

  1. Interactive: after explicit user approval, echo '<package-name>' >> .claude/.package-edit-approved (one name per line, gitignored). Remove it when done.
  2. Epic-scoped (#350): export CROUTON_PACKAGE_EDIT_APPROVED="<pkg> [<pkg>…]" — survives spawned agents/worktrees, can't be committed.

Safety net: guard-package-approval.yml fails any PR to main that commits the approval file. The agent pipeline adds a second net: automerge-epic-subpr.yml holds any bot sub-PR touching packages/ for a human even on an epic branch (#339).

⚠️ Contradiction, stated: root CLAUDE.md and the hook's own comment call the file "session-scoped", but open issue #701 documents that /commit cleanup deletes the file, so multi-commit package work re-blocks (one epic needed 3 unlocks). Until #701 lands: expect to re-approve after each /commit, or use the env-var channel for a whole epic. Never route around the gate itself.

4. How work reaches main

The interactive flow (feature branch → /commit → PR Closes #NN → merge preserving commits) is owned by AGENTS.md (The loop, Commits) and the github-tasks/commit skills — read it there. What's specific here, verified in the workflows:

Agent pipeline: workers PR into an epic/<NN>-<slug> branch; non-gate bot PRs auto-merge there when green (automerge-epic-subpr.yml, merge commit); gate PRs wait for §2. The pipeline stops at the epic branch — nothing reaches main on its own: the epic→main PR is a human act (the #686 lesson, from that epic's postmortem — cited, not reproduced). It also never deploys production (§5).

5. The non-negotiables (rule → incident behind it)

RuleEnforced byIncident / evidence
Issue-first — issue before codedocumented only (SessionStart reminder text; no code gate)AGENTS.md HARD GATE; treat a missing issue like a failing build
Staging-only deploys — prod needs /deploy-production on explicit human ask (#318)structural: verified in deploy-apps.yml — the detect job hard-codes env=staging for push/pull_request; only workflow_dispatch with the literal production choice yields a prod entry (defensive whitelist)#318, #347
Archaeology-first for bugs (#424)documented HARD GATE; bug-archaeology skilla "code bug" that was really a stale pnpm symlink — a symptom-fix would have edited unbroken code (#424)
Done is signed off, not assertedgate-spec-signoff.mjs hook for spec ledgers; §2 for everything else#988: green build + typecheck + live deploy URL all true while the app 500'd on every request — see crouton-failure-archaeology
No package-shipped D1 migrations for infra tablesconvention + the rejected-PR precedent#680/#685/#700: package migrations apply before the app's and collide — sanctioned pattern in the db-migrations skill; full story in crouton-failure-archaeology
Provenance headers on agent-posted GitHub comments (lead with 🤖)PreToolUse hook require-comment-provenance.mjs (blocks the interactive add_issue_comment path)agent comments post under the human @pmcp account and would otherwise impersonate the owner

6. When NOT to gate

Owned by AGENTS.md (Sign-off gates: "when unsure a diff is in scope, don't gate") and root CLAUDE.md (per-gate scope definitions under UI/Schema/Test Sign-Off) — read them there. The one-line summary: gates guard the expensive step; a false hold costs a human round-trip.

Provenance and maintenance

verified: 2026-07-02

Facts verified against the working tree: scripts/harness-stages.mjs run live on 4 paths; resume-on-comment.yml (trigger, approval regex, merge-commit step), deploy-apps.yml (staging hard-coding + dispatch whitelist), automerge-epic-subpr.yml (packages/ hold, no-squash), close-epic-on-comment.yml (label precondition), guard-package-approval.yml, .claude/hooks/gate-package-edits.sh + gate-spec-signoff.mjs + require-comment-provenance.mjs wiring in .claude/settings.json, issue #701 body (via GitHub API). Incident narratives (#686, #988, #680/#685) are cited from issues/postmortems, not reproduced. Re-verify with:

node scripts/harness-stages.mjs packages/crouton-core/x.ts   # stage/gate model still current?
grep -n "issue_comment" .github/workflows/resume-on-comment.yml   # approval still comment-only?
grep -n "production" .github/workflows/deploy-apps.yml | head     # #318 still structural?
gh issue view 701 --json state                                    # approval-scope contradiction fixed yet?

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

a11y

無料

Accessibility review for Vue surfaces — the code-cleaning analog of /code-review and /simplify, pointed at WCAG/ARIA. Reviews just your diff (or a package/file), rates findings by severity, and either comments inline on the PR (--comment) or applies the safe fixes for you (--fix). Steers the depth-aware `a11y` subagent. Use when asked to "check accessibility", "a11y this", "audit ARIA/keyboard", or run /a11y.

日本語の概要は準備中です。原文の説明を表示しています。

FriendlyInternet/nuxt-crouton102026年10月13日 更新

ask-human

無料

Emit a blocking question the owner can read in ~10 seconds and answer in one reply — the scannable, recommendation-first handoff every agent posts when it hits a fork it can't own. Leads with the one decision + a recommendation, carries the 🤖 provenance header, doubles as the

日本語の概要は準備中です。原文の説明を表示しています。

FriendlyInternet/nuxt-crouton102026年10月13日 更新

audit

無料

Audit packages for documentation completeness, detect drift between code and docs, and maintain documentation quality across the monorepo. Use when checking package docs, running audits, or reviewing documentation health.

日本語の概要は準備中です。原文の説明を表示しています。

FriendlyInternet/nuxt-crouton102026年10月13日 更新

Author a placeable layout block that looks right at ANY pane size. The one hard rule — size to the PANE with container queries (@container), never the viewport — plus list/form playbooks and the sizing contract (minWidth etc.) the viability metric reads. Use when adding/converting a croutonLayoutBlocks block, or when a block overflows/breaks in a narrow pane.

日本語の概要は準備中です。原文の説明を表示しています。

FriendlyInternet/nuxt-crouton102026年10月13日 更新

When a bug or regression is reported, the FIRST step — before fixing — is to research how and when it was introduced (git archaeology), then record that finding on the tracking issue/PR. Use the moment a bug, error, broken build, or "this used to work" is reported, before writing a fix. Produces a first-bad-commit (or "not a code regression") note you paste onto the issue.

日本語の概要は準備中です。原文の説明を表示しています。

FriendlyInternet/nuxt-crouton102026年10月13日 更新

commit

無料

Smart, granular git commits following monorepo conventions. Analyzes changes, filters to session-relevant files, groups by intent, and uses conventional commit format. Use when committing code changes.

日本語の概要は準備中です。原文の説明を表示しています。

FriendlyInternet/nuxt-crouton102026年10月13日 更新

FriendlyInternet のスキルをすべて見る

このスキルの問題を報告する