fix(kyberforge): resolve PR #144 review and audit round 1

- factory-audit: no-op hooks, ./ after interpreters, split-quote and
  spaced ${PLUGIN_ROOT} paths, camelCase events in Claude-targeted flat
  files, case-insensitive routing stems, and non-string YAML keys are
  now caught; input: forms and prompt boundary clauses align with
  primitive-author; bats 347 -> 367
- primitive-author: routing forms, quoting guidance, install exit on
  hidden Unicode, argument-hint exception
- forge: drop duplicated gotcha, fit description and body budgets (#143)
- skill-author: primitive-author boundary, Claude-only env vars
- hook: exit unless CLAUDE_PROJECT_DIR is set, so Copilot/Codex never
  run apm update; ADR-0019 correction, ADR-0025 amendment, docs fixes

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KkT7RSDwDbmrM9T34b6sTi
This commit is contained in:
2026-09-28 20:13:43 +00:00
parent b2d77b2945
commit df28351d3e
23 changed files with 591 additions and 147 deletions

View File

@@ -53,15 +53,17 @@ provenance suites stand in the same relation to `scripts/validate-provenance.sh`
Do not add a third script path here on the assumption that a differently named
suite must mean a differently named script.
### Auto-detection is pinned across the pair
### Auto-detection is pinned across the suites
Each entry point decides for itself what it was handed. ADR-0025 states the
rule: a directory containing `SKILL.md` takes the skill flow; an `.agent.md`
file, or a file under a directory named `agents/`, takes the agent flow.
Anything else is rejected rather than guessed at. That behaviour is new with the
merge — before it, each script was hard-wired to one artifact type and nothing
about classification could be wrong — so it is asserted from both sides rather
than in one place:
skill and agent rule: a directory containing `SKILL.md` takes the skill flow; an
`.agent.md` file, or a file under a directory named `agents/`, takes the agent
flow. `scripts/validate.sh` adds three primitive shapes: a `*.instructions.md`
or `*.prompt.md` file takes the instruction or prompt flow wherever it sits, and
a `.json` file directly under a `hooks/` directory takes the hook flow. Any
shape outside the five is rejected rather than guessed at. Classification could
not be wrong before the merge — each script was hard-wired to one artifact type
— so it is asserted from every side rather than in one place:
- the skill-side suites pin the skill-directory classification and the
neither-shape rejection,
@@ -69,6 +71,12 @@ than in one place:
directory that is not `agents/`, and a plain `.md` under `.apm/agents/` — so
that a detector implementing only one of them cannot pass both. Plus a control
asserting an agent file never picks up a skill-only gate.
- `validate-primitive.bats` pins the hook, instruction and prompt shapes,
including the precedence that makes a `*.instructions.md` or `*.prompt.md`
under `agents/` take the primitive flow rather than the agent flow, a hook
file under a package-root `hooks/`, and a `.json` outside `hooks/` matching
no shape. It also pins the primitive exit tiers: every negative case asserts
exit 1 (`assert_failure 1`), and a missing python3 or PyYAML asserts exit 2.
Both skill-side suites additionally pin the `SKILL.md` **file** path, not just
the directory: a pre-commit `files:` hook matches files, so every hook-driven