- factory-audit: hook events judged per deployed target after apm's rename (Claude/Copilot event sets FAIL, others SUGGESTION); Claude plugin layouts accepted as hook sources; interpreter options and sh -c strings checked; bats 378 -> 386 - primitive-author: Must 4/5 match the audit; reference hand-back points at the right steps; Step 4.2 --target all fallback - skill-author: new-skill.sh repair only on the template marker line, so complete skills stay a no-op; provenance and calibration text - forge: restore "already named" qualifier; drop false HITL claim - apm-workflow: token example uses an env var - docs/hooks.md: the apm-hooks.json sidecar is committed, not ignored Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KkT7RSDwDbmrM9T34b6sTi
4.0 KiB
4.0 KiB
name, description, allowed-tools, metadata
| name | description | allowed-tools | metadata | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| primitive-author | Use when the user wants an apm hook, instruction or prompt file created, or audit findings or feedback applied to an existing one. Not read-only review -> factory-audit. Not skills -> skill-author. Not agents -> agent-author. | Bash Read Write Edit |
|
Gotchas
apm compile --validateis not a gate: it only warns on instructions, exits 0, and never reads prompts.apm installexits 1 only on a hook payload Copilot would reject or on critical hidden Unicode; bad prompt input names and dropped keys merely warn —/factory-auditis the only check that fails on the rest.- Never draft with the real suffix outside
.apm/<type>/. apm's local discovery globs**/*.instructions.mdacross the whole tree, so a draft named that way anywhere in the repo becomes a real instruction. The templates carry a trailing.templatefor this reason; drop it only on the final path. - Never hand-write
.claude/settings.json, even to test a hook. apm owns that file (ADR-0019), overwrites it outright when it is malformed, andapm audit --cifails on anything it would not have written.
Step 1 — Dispatch
| Target or intent | Type | Reference |
|---|---|---|
A hook — .apm/hooks/<name>.json, or "run X whenever Y happens" |
hook | references/hook.md |
An instruction — .apm/instructions/<name>.instructions.md, or a rule for files matching a pattern |
instruction | references/instruction.md |
A prompt — .apm/prompts/<name>.prompt.md, or a reusable message the user types to kick off work |
prompt | references/prompt.md |
Read only the reference matching the resolved type — each is self-contained. If the target sits inside a git worktree, capture rtk git log --oneline -1 before touching the filesystem; Step 4 needs it.
Step 2 — Boundary gate
Run the reference's Gate section before writing anything. A failed gate stops this skill: hand over to the owner the Gate names. Never bend the artifact to pass the gate.
Step 3 — Create or improve
| Condition | Action |
|---|---|
| No file at the target path | Create: copy the reference's template from assets/templates/, drop .template, fill every FILL IN and FILL_IN_ placeholder, and apply the reference's checklist |
| File exists, at least one signal | Improve: read the whole file, then apply each signal against the reference's checklist |
| File exists, no signal | Stop and ask whether the user meant a new file or has feedback to apply |
Signals: grill output, /factory-audit findings, inline feedback, session context. Group findings by root cause and fix the cause once.
Step 4 — Validate and close
- Run
/factory-auditon the file, inline in this context; resolve every FAIL before reporting done, including the### ProseFAILs Vale raises on an instruction or prompt body or description. - Render it: in a fresh
mktemp -ddirectory, runrtk apm install <absolute path to the owning package> --target <its targets:, or all when it declares none>, then read what each target received —.claude/settings.jsonand.github/hooks/,.claude/rules/and.github/instructions/, or.claude/commands/and.github/prompts/. A local path deploys the working tree;--dry-runrenders nothing and a repo-root install resolves the remote'smain. - Bump the owning package's
apm.ymlversion:— minor for a new hook, instruction or prompt, patch for a fix — unless this branch already bumped it for unreleased work. None of these is released on its own version — bump the package even if an instruction carries an optionalversion:key. - Commit verification. Inside a git worktree, once the audit is clean, run
rtk git addandrtk git commit, then confirmrtk git log --oneline -1changed from Step 1's hash: staged-but-uncommitted work is lost if the tree is cleaned up. Outside a worktree, report done on a clean audit and name that as the reason.