feat(apm)!: restructure primitives under .apm, entry prompts, full-target ci - #19
Merged
Conversation
Opt-in per PR via the validate-apm label: apm install (resolution + mcp wiring) then apm audit (hidden-unicode scan, install replay, drift diff). Both commands validated locally against this repo - install configures the oddyssey server and exits 0, audit scans clean. Consumer artifacts (.mcp.json, apm.lock.yaml) gitignored. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CI runners carry no harness markers, so apm install needs an explicit --target; claude is CI-only (the package itself stays target-agnostic). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The label-gated job now installs the package consumer-style for all nine harness targets, publishing the materialized file tree of each in the run summary (collapsible per target), then validates the package's own manifest with install + audit. This surfaced issue #20: agent primitives are not deployed by apm install. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
It has no MCP client and the package declares an MCP server, which apm rightly refuses; the exclusion and its reason are stated in the run summary. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
agents/ at the repo root is not part of any APM package contract, so consumers received the skills and the MCP server but never the two agents (#20). All primitives now live under .apm/ in typed subdirectories (.apm/agents/, .apm/skills/) - the canonical APM package layout, verified consumer-side: agents AND skills integrate. BREAKING CHANGE: the agents/ and skills/ directories move under .apm/. Closes #20 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The validation is fast enough to drop the label gate. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Thin launchers only: each parses the arguments into a well-formed mission block and delegates to its agent, which stays the single source of behavior. One .apm/prompts source per verb fans out per harness - verified consumer-side: Claude gets .claude/commands slash commands, Copilot gets .github/prompts. Closes #18 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One matrix leg per harness replaces the shell loop: each leg does the consumer install with its tree in the run summary, then validates the package's own manifest for that same target - no more hardcoded --target claude. fail-fast off so one broken harness does not mask the others. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This was referenced Aug 22, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
More than CI: this PR restructures the package's primitive tree and completes the consumer experience, with the validation pipeline that proved every step.
1. Canonical
.apm/layout (breaking — fixes #20)Top-level
agents/is not part of any APM package contract: consumers received the skills and the MCP server but never the two agents — the core of the product. All primitives now live under.apm/in typed subdirectories:agents/→.apm/agents/(observe-run, otel-instrumentation-expert)skills/→.apm/skills/(otel-guides, observability-cli-guides, setup-local-stack, run-scenario) — unified by choice: one convention, cleaner rootVerified consumer-side on every MCP-capable harness:
2 agents integrated→.claude/agents/,.github/agents/,.opencode/agents/, ...2. Entry-point prompts (fixes #18)
.apm/prompts/odd-observe.prompt.mdandodd-instrument.prompt.md— thin launchers only: parse $ARGUMENTS into the agent's mission block and delegate; the agents stay the single source of behavior. Empirically verified fan-out per harness: Claude →.claude/commands/slash commands, Copilot →.github/prompts/, OpenCode →.opencode/commands/. One source file, no command+prompt pair needed.3.
ci-apmworkflow — the real APM CLI on every PRMatrix over the 8 MCP-capable targets (claude, copilot, cursor, codex, gemini, opencode, windsurf, kiro —
grok-buildexcluded: no MCP client for the declared server),fail-fast: false. Each leg:apm installof this repo into a scratch project, with the materialized file tree published in the run summary — the per-harness deployment is visible on every PRapm install --target <t>+apm auditon the package's own manifest (resolution, MCP wiring, hidden-unicode scan, drift replay)This closes the long-standing gap: the manifest had never been parsed by the real APM CLI (
apm-cli==0.28.0pinned). Consumer artifacts (.mcp.json,apm.lock.yaml) gitignored.BREAKING CHANGE: the
agents/andskills/directories move under.apm/.🤖 Generated with Claude Code