- factory-audit: ./ and bare/absolute script checks scoped to command position (no false FAILs on ./src or printf); hook sources limited to .apm/hooks or package-root hooks/; Kiro-aware lowercase events; unfilled template placeholders FAIL; repo-only instructions FAIL at any scope; Vale description FAIL documented; bats 367 -> 378 - primitive-author: split-quote/spaced paths and handler-less entries promoted to Must; Step 4.2 renders into a scratch consumer instead of a no-op dry run; dispatch and gate hand-off trimmed - apm-workflow 1.0.2: mutual boundary with primitive-author - forge: no double package bump; gotcha wording - skill-author: create keeps seeded 0.1.0 (ADR-0022); portable, retry-safe new-skill.sh; template and flow consistency fixes - hook docs: cite the ADR-0019 correction; guard caveat Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KkT7RSDwDbmrM9T34b6sTi
3.6 KiB
source_keys
| source_keys | |||
|---|---|---|---|
|
Authoring an apm prompt
Reached from SKILL.md Step 1 for a prompt. Run the Gate, then write against the description
contract and the checklist, then return to SKILL.md Step 3.
Gate
This repo holds a prompt to ADR-0029, which is stricter than apm: apm calls a prompt "a callable
program", but on Claude it deploys as a command that is a skill in every respect except that it
keeps fewer frontmatter keys, apm drops disable-model-invocation so it can never be made
user-only, and Codex receives no prompts at all. A prompt that carries procedure is therefore a
worse skill on every harness.
- Reusable know-how, steps, gotchas, bundled files, or anything the model should find on its
own → a skill. Stop and hand to
skill-author; if a short steering message is still wanted afterwards, come back and write it against the new skill. - A single-intent message the user would otherwise type repeatedly, steering existing skills or
agents by name → continue. Confirm each skill or agent it names exists and is not
disable-model-invocation: true: the prompt's body reaches the model, and the model cannot invoke a skill that sets it, so the steering would dead-end (the same checkfactory-audit's prompt flow applies).
Description contract
One plain, user-facing sentence stating the action and naming the skills or agents it steers — "Review the
current PR with gitea-prs and factory-audit, then summarise the findings." No "Use when"
trigger clause and no Not X -> Y boundary: on Claude the description is model-visible, and a
trigger clause invites the router to pick the wrapper over the skills it wraps.
Checklist
Copy assets/templates/name.prompt.md.template and drop .template only on the final path.
Must:
- The path is
.apm/prompts/<name>.prompt.md, directly in that directory, not a symlink or hardlink.<name>is a safe path segment and unique across.apm/prompts/and the package root; it becomes the Copilot filename and the Claude/commandname. descriptionis present and non-empty.- Every
input:name matches^[A-Za-z][\w-]{0,63}$, written in the object form- pr_number: "The PR to review". Never copy apm's published- name: pr_number/description: …example: apm reads the map's keys, so it produces the argumentsnameanddescription. - Every
${input:x}in the body is declared ininput:, and every declared name is used. Withoutinput:, no${input:…}may appear — it would reach Claude unrewritten.
Should:
- Frontmatter keys stay within
description,allowed-tools,model,argument-hintandinput. Claude drops everything else with only a warning. The exception: a Copilot-only key (agent,tools, …) that is intended, with its Claude drop accepted and said so. The research files this as a Must; it is a Should here because only the author can say a Copilot-only key is intended. - The description follows the contract above: one plain sentence, no trigger or boundary clause, naming the skills or agents it steers.
- Spell keys in kebab-case —
allowed-tools,argument-hint— not the camelCase aliases. - Omit
argument-hintwheninput:is set, unless the<a> <b>form apm synthesises from the input names is inadequate; an explicitargument-hintwins. - Keep one intent per prompt, and write the body as second-person instructions.
- Keep
descriptionto 250 characters or fewer. - Give
modela slug the target accepts. Copilot ignoresallowed-toolsandmodel, so neither constrains a Copilot run.