跳到正文
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".

中文简介正在准备中。当前显示原文说明。

集成工具GitHub
查看安装方法

包含的文件(1)

  • SKILL.md11.1 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

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?

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

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月22日 更新

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月22日 更新

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月22日 更新

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月22日 更新

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月22日 更新

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月22日 更新

查看 FriendlyInternet 的全部技能

报告此技能的问题