Second clean-context audit found author Must/Should and audit FAIL/SUGGESTION tiers drifting apart, and author Musts the audit never checked. - factory-audit: FAIL on absolute or bare relative hook script paths, an applyTo present but empty, and unbalanced braces/brackets in applyTo; judgment steps for dependency stem collisions, helper .json in hook dirs, unresolvable instruction links, prompt model slugs and second-person bodies; an unmatched glob drops to SUGGESTION; deliberate tier deviations recorded in hook-flow.md; validate.sh --help lists the three new modes; DescriptionOpener message no longer prescribes "Use when". - primitive-author: deprecated routing, extra prompt keys and the prompt description contract become Shoulds; hook Musts gain "contributes an entry", no bare relative paths, and executable-when-run-directly; prompt Must 1 covers hardlinks; Vale prose FAILs resolved at close. - forge: say "hook, instruction or prompt" rather than "apm primitive". Refs #94 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KkT7RSDwDbmrM9T34b6sTi
2.7 KiB
2.7 KiB
source_keys
| source_keys | ||
|---|---|---|
|
Authoring an apm instruction
Reached from SKILL.md Step 1 for an instruction. Run the Gate, then write against the checklist,
then return to SKILL.md Step 3.
Gate
An instruction is a scoped rule: it applies when the agent touches files matching its applyTo
glob. On Claude it deploys to .claude/rules/<stem>.md with applyTo renamed to paths:.
- A rule for this repo alone → it belongs in the repo's AGENTS.md, which is the single
always-on source. Stop and hand to
agentsmd-author. - No file pattern fits → an instruction without
applyTois always-on in every session of every repo that installs this package, andapm compilecan fold it into the global sections ofAGENTS.mdandCLAUDE.md(skipped when.github/instructions/or.claude/rules/is already populated, unless--force-instructions). Say exactly that to the user and continue only on an explicit yes. Legitimate when a package deliberately ships guidance to its consumers; never a default. - Procedure the agent follows step by step → a skill. Stop and hand to
skill-author. - A rule scoped to a file pattern → continue.
Checklist
Copy assets/templates/name.instructions.md.template and drop .template only on the final path.
Must:
- The path is
.apm/instructions/<stem>.instructions.md, directly in that directory, not a symlink or hardlink. descriptionis a non-empty string. apm only warns when it is missing.- The body is non-empty after trimming whitespace. apm deploys an empty rule silently.
applyTois a non-empty glob or comma-separated list — top-level commas only as separators, alternation inside{}("**/*.{ts,tsx}"), braces and brackets balanced — or absent after the Gate's explicit yes. An emptyapplyTo: ""is neither.- The stem is unique across the package and its dependencies: a
.claude/rules/<stem>.mdcollision is silently overwritten.
Should:
- Write
applyToas a scalar string, not a YAML list. Copilot receives the source verbatim, and its handling of a list is unverified. - Keep frontmatter to
descriptionandapplyTo, plus optionalauthorandversion. No target consumes other keys, and Claude drops them. - Put any rationale Claude needs in the body.
descriptionnever reaches Claude — it survives only for Copilot and as Cursor's index text. - Keep relative markdown links resolvable from the source file.
- Check the glob against the tree: one that matches nothing here fires only in consumer repos that have such files, and one broader than the rule's real scope spends context on every file it touches.