You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|`pnpm verify`|**The repo's gate** — `check` + `skills:check` + `typecheck` + `test`, in CI's order, and the root `verify` key. CI runs the same commands as one step each, so one run reports every failure; `test/ci-gate.test.ts` fails if the two lists drift. |
26
26
|`pnpm check`| Lint + format check only — a subset of the gate, not the gate. `pnpm check:fix` applies both fixers. |
27
-
|`pnpm skills:sync`| Regenerates nine artifacts from the skill folders. **Run after touching any skill.**|
27
+
|`pnpm skills:sync`| Regenerates eleven artifacts from the skill folders. **Run after touching any skill.**|
28
28
|`pnpm skills:check`| The CI guard for the above. Fails if any of them drifted. |
29
29
|`pnpm typecheck`|`tsc --noEmit`. `erasableSyntaxOnly` is on, so an enum fails here, not at runtime. |
30
30
|`pnpm test`|`node --test` over `test/` — the resolver, the schema, skill self-containment, the CI-gate guard, the conformance-gate guard, the link destinations, and the `CLAUDE.md`/`AGENTS.md` mirror. |
31
31
|`pnpm skills:link`| Symlinks every skill into **both**`~/.claude/skills/` (Claude Code) and `~/.agents/skills/` (Codex, Cursor, OpenCode, Gemini CLI) for live local testing — whole-folder, except a skill carrying a dev-artifact dir (`evals/`) links entry by entry to leave the fixture out, per destination. `pnpm skills:unlink` clears both; the destination list lives once, in `scripts/skills-lib.sh` ([ADR-0016](docs/99.adr/0016-link-into-every-client-skills-path.md)). |
32
32
|`pnpm skills:conformance`| Validates every skill against the Agent Skills spec with `skills-ref`, pinned and run in Docker. **Not in `verify`** — the gate stays pnpm-only; this needs Docker. Its own workflow. |
33
33
34
-
**Nine artifacts are generated — never hand-edit them:** the root `README.md` skills table, each `skills/<category>/README.md`, `.claude-plugin/plugin.json`, `skills.sh.json`'s groupings, the `<skills-config>` block plus `templates/resolve-config.sh` mirrored into each config-reading skill (source: `scripts/config-block.md` and `scripts/resolve-config.sh`), the `<skills-authority>` / `<skills-authority-reduced>` author-authority block mirrored into each skill that reads third-party text (source: `scripts/authority-block.md`), the `<skills-verify>` / `<skills-verify-isolated>` check-command block mirrored into each skill that runs the repo's gate (source: `scripts/verify-block.md`), the `<skills-worklock>` single-flight-lock spec mirrored into the four `work-*` skills (source: `scripts/worklock-block.md`), and the `<skills-plan>` plan-presentation rule mirrored into each skill that puts a plan in front of a human (source: `scripts/plan-block.md`, roster in `test/isolation.test.ts`). A new category also needs an entry in `CATEGORIES` in `scripts/gen-skills.ts`, or the sync fails loudly.
34
+
**Eleven artifacts are generated — never hand-edit them:** the root `README.md` skills table, each `skills/<category>/README.md`, `.claude-plugin/plugin.json`, `skills.sh.json`'s groupings, the `<skills-config>` block mirrored into each skill that hosts it — with `templates/resolve-config.sh` copied into each skill that _names_ it, which is every host **plus** the two queue skills that delegate the prose and still run the script (source: `scripts/config-block.md` and `scripts/resolve-config.sh`), the `<skills-authority>` / `<skills-authority-reduced>` author-authority block mirrored into each skill that reads third-party text (source: `scripts/authority-block.md`), the `<skills-verify>` / `<skills-verify-isolated>` check-command block mirrored into each skill that runs the repo's gate (source: `scripts/verify-block.md`), the `<skills-worklock>` single-flight-lock spec mirrored into the two work-loop **unit** skills — the two `*-queue` skills name their worker's REFERENCE for it instead, which is what lets them skip both this block and the config one (source: `scripts/worklock-block.md`, roster in `test/isolation.test.ts`), the `<skills-plan>` plan-presentation rule mirrored into each skill that puts a plan in front of a human (source: `scripts/plan-block.md`, roster in `test/isolation.test.ts`), the `<skills-tldr>` report-lead rule mirrored into each skill whose run **ends** in a report — a strict subset of the plan roster, since a skill leads with a result only where it closes by reporting one (source: `scripts/tldr-block.md`, roster in `test/isolation.test.ts`), and the `<skills-forge>` forge/host resolution rule mirrored into each skill that drives a forge — the same two `*-queue` skills name their worker's REFERENCE for this one too (source: `scripts/forge-block.md`, roster in `test/isolation.test.ts`). A new category also needs an entry in `CATEGORIES` in `scripts/gen-skills.ts`, or the sync fails loudly.
35
35
36
36
## Non-obvious tooling
37
37
@@ -49,8 +49,8 @@ Retyping a change is exactly how the two drift; one reflowed line or reworded cl
49
49
`.github/workflows/` is authoritative. Four behaviours that mislead if unknown:
50
50
51
51
-**CI runs `on: pull_request` only, so a commit pushed straight to `dev` is never checked by CI.** The AI work loop is configured `branch:dev` — it commits to the shared branch with no PR — which makes `pnpm verify`, run locally before the push, the _only_ automated gate between such a change and the release branch. That is why the root `verify` key is the full gate and not just lint plus format: nothing downstream would catch a broken test, a type error, or a drifted generated artifact until the rollup PR.
52
-
-**CI skips draft PRs** — a draft's empty check list is not a pass.
53
-
-**CodeQL only fires on `**/*.{js,ts,mjs,cjs}` or workflow changes** — it will not run on a markdown-only PR, which is most PRs here.
52
+
-**Every PR workflow skips drafts, and that is now load-bearing rather than incidental** — a draft's check list is not a pass. `work-implement` opens its PRs as drafts on purpose and `work-review` marks one ready only once it would accept, so CI is spent once per _finished_ instead of once per push (**The draft gate** in `work-implement`'s REFERENCE). Each of the three therefore needs both halves: the draft gate _and_`ready_for_review` in its trigger `types`, or the un-draft fires nothing. All three gate on the **job**, so a draft reports one `skipping` row per gated job rather than an empty list — which is why anything reading those checks must discard `skipping` outright instead of treating a non-failing list as green.
53
+
-**CodeQL runs on every PR to `main`/`dev`, markdown-only ones included** — `codeql.yml` carries no `paths:` filter, so both matrix legs (`actions`, `javascript-typescript`) analyse every pull request; only the draft gate above holds it back. It is not the cheap no-op a path-scoped workflow would be, and the work loop's CI read depends on knowing which workflows a head actually triggers, so this is worth having right.
54
54
-**The skill conformance check is a separate workflow, scoped to `skills/**` and its own script** — so it does not run on a PR that touches neither, and, like everything else here, never on a push straight to `dev`. It re-tiers the deliberate `disallowed-tools` (ADR-0007) instead of failing on it; `test/conformance-gate.test.ts` pins that list to `validate-skills`' prose. Running it locally needs Docker, which is why `pnpm verify` does not.
0 commit comments