Files
holocron/plugins/kyberforge/.apm/skills/primitive-author/references/instruction.md
Defame1297 0ea3f69dc6 fix(kyberforge): align primitive-author and factory-audit rule tiers
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
2026-09-28 18:02:05 +00:00

2.7 KiB

source_keys
source_keys
apm-cli-installed-source
apm-docs-llms-full

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 applyTo is always-on in every session of every repo that installs this package, and apm compile can fold it into the global sections of AGENTS.md and CLAUDE.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:

  1. The path is .apm/instructions/<stem>.instructions.md, directly in that directory, not a symlink or hardlink.
  2. description is a non-empty string. apm only warns when it is missing.
  3. The body is non-empty after trimming whitespace. apm deploys an empty rule silently.
  4. applyTo is 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 empty applyTo: "" is neither.
  5. The stem is unique across the package and its dependencies: a .claude/rules/<stem>.md collision is silently overwritten.

Should:

  1. Write applyTo as a scalar string, not a YAML list. Copilot receives the source verbatim, and its handling of a list is unverified.
  2. Keep frontmatter to description and applyTo, plus optional author and version. No target consumes other keys, and Claude drops them.
  3. Put any rationale Claude needs in the body. description never reaches Claude — it survives only for Copilot and as Cursor's index text.
  4. Keep relative markdown links resolvable from the source file.
  5. 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.