feat: add implementation plugin (10 implementation-stage skills) - #78
Conversation
De-coupled from the medley source repo per docs/MIGRATION-PLAYBOOK.md: consumer conventions override bundled ecosystem defaults; cross-plugin references use qualified /<plugin>:<skill> form with graceful degradation; artifacts route to the notes_dir userConfig option. Refs melodic-software/medley#1281 Co-Authored-By: Claude <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_201134ee-73e6-4979-ae01-4ece5d64d2fa) |
|
Claude finished @kyle-sexton's task in 3m 29s —— View job PR Review —
|
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving because Cursor Bugbot skipped (usage limit reached) and did not complete automated review. Human review is needed; no reviewers were assigned because no non-author human maintainers are available on this repository.
Sent by Cursor Approval Agent: Pull Request Router and Approver
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9ac7bf8dc3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
TypeScript change-detection globs now include manifests and lockfiles (package.json, lockfiles, tsconfig*.json) so dependency/config-only changes trigger verification; actionlint runs in no-argument discovery mode so .yaml workflows are linted alongside .yml. Refs melodic-software/medley#1281 Co-Authored-By: Claude <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_b159dd39-787e-4786-9ae1-3d6b6db5291a) |
|
Claude finished @kyle-sexton's task in 1m 18s —— View job PR Review —
|
| # | Finding | Severity | Status |
|---|---|---|---|
| 1 | .editorconfig Go section removal bundled without mention in PR description |
Minor | Open |
| 2 | External marketplace plugin references lack install pointers for consumers | Low | Open |
| 3 | verify-changes/evals/evals.json IDs skip 5 and 6 |
Cosmetic | Open |
| 4 | notes_dir description implies CLAUDE.md override that the config mechanism doesn't enforce |
Minor | Open |
None of these block the PR — the plugin is functionally correct, securely scoped (markdown-only, no hooks, no MCP, no egress), and the two substantive Codex findings are now properly resolved.
Overall
The implementation plugin is in good shape. The two P2 Codex findings were correctly addressed: TypeScript verification now triggers on manifest/config-only changes, and actionlint no longer silently skips .yaml workflow files. No new issues introduced by this commit.
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving because Cursor Bugbot skipped (usage limit reached) and did not complete automated review. Human review is needed; no reviewers were assigned because no non-author human maintainers are available on this repository.
Sent by Cursor Approval Agent: Pull Request Router and Approver
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_adfdecdc-163f-4a2c-b34a-38383820932b) |
|
Claude finished @kyle-sexton's task in 3m 25s —— View job PR Review —
|
| # | Finding | Prior severity | Status |
|---|---|---|---|
| 1 | .editorconfig Go section removed without mention |
Minor | ✅ Resolved — merge 54cf325 restored it; PR now clean vs. main |
| 2 | External marketplace refs (andrej-karpathy-skills, dotnet-ai, dotnet-template-engine, dotnet-test, document-skills) lack install pointers |
Low | Open |
| 3 | verify-changes/evals/evals.json IDs skip 5 and 6 (sequence is 1–4, 7–10) |
Cosmetic | Open |
| 4 | notes_dir description claims CLAUDE.md "takes precedence" — mechanism doesn't enforce that |
Minor | Open |
Verification of prior P2 Codex fixes (commit 2305865)
Both fixes confirmed correct and still present:
TypeScript globs now include manifests and lockfiles — build/reference/ecosystem-config.md L40:
globs: ["*.ts", "*.tsx", "*.js", "*.jsx", "*.mjs", "package.json", "package-lock.json", "pnpm-lock.yaml", "yarn.lock", "tsconfig*.json"]lint/reference/ecosystem-config.md TypeScript globs intentionally remain narrower (source files only — correct, changing a lockfile doesn't require re-linting source).
actionlint in no-arg discovery mode — lint/reference/ecosystem-config.md L67:
check-cmd: |
actionlint # no args — discovers all workflow files itself (.yml and .yaml)Residual observations (no blockers introduced by the merge)
notes_dir description wording (plugin.json L16): still reads "A working-notes convention declared in your own project's CLAUDE.md or rules takes precedence." Per the fresh docs, ${user_config.notes_dir} is the actual interpolated value — the CLAUDE.md convention doesn't technically override it, the consumer just sets the config option to match. The description is technically misleading. Suggested tightening: "Project-relative directory for implementation artifacts. Set this to match your project's working-notes convention."
Eval ID gap (verify-changes/evals/evals.json): IDs sequence is 1–4, then 7–10. IDs 5–6 absent. Cosmetic only — the eight eval cases that exist are solid.
Overall
The plugin is functionally correct, securely scoped (markdown-only, no hooks, no MCP, no egress, no secrets), and all substantive review findings are now resolved. The merge commit cleanly eliminates the last structural concern. None of the three remaining open items (external-plugin discoverability note, eval ID gap, config description wording) block merging.
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving because Cursor Bugbot skipped (usage limit reached) and did not complete automated review. Human review is needed; no reviewers were assigned because no non-author human maintainers are available on this repository.
Sent by Cursor Approval Agent: Pull Request Router and Approver
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 54cf325bb7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
/build and /lint change detection previously saw only git status --porcelain, so checkpoint-committed work was skipped at pre-PR verification time. On a clean tree both skills now classify the branch diff vs the default-branch merge-base; an explicit caller file list still overrides both paths. Refs melodic-software/medley#1281 Co-Authored-By: Claude <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_9f496efe-7c0b-4ac3-a19f-c57f110f26bc) |
|
Claude finished @kyle-sexton's task in 1m 38s —— View job PR Review —
|
| # | Finding | Severity | Status |
|---|---|---|---|
| 1 | .editorconfig Go section removal bundled without mention |
Minor | ✅ Resolved — merge 54cf325 restored it |
| 2 | External marketplace refs lack install pointers | Low | Open |
| 3 | verify-changes/evals IDs skip 5–6 (sequence 1–4, 7–10) |
Cosmetic | Open |
| 4 | notes_dir description claims CLAUDE.md "takes precedence" — mechanism doesn't enforce it |
Minor | Open |
| Codex P2 | Build/lint skips committed changes on clean worktree | P2 | ✅ Resolved — 5db736b |
| Codex P1 | Bare sibling-skill refs break in plugin form | P1 | Author-declined (locked decision per #1281; smoke-tested) |
Overall
The plugin is in good shape. The clean-tree branch-diff fallback correctly resolves the most substantive outstanding finding, and both affected skills were updated consistently. The three remaining open items are cosmetic or documentation-clarity level — none block merging. Security posture is unchanged: markdown-only skills, no hooks, no MCP, no egress.
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving because Cursor Bugbot skipped (usage limit reached) and did not complete automated review. Human review is needed; no reviewers were assigned because no non-author human maintainers are available on this repository.
Sent by Cursor Approval Agent: Pull Request Router and Approver
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_536b0eeb-2cf0-4f57-a71d-1b2424340023) |
|
Claude finished @kyle-sexton's task in 2m 17s —— View job PR Review —
|
| # | Finding | Severity | Status |
|---|---|---|---|
| 1 | .editorconfig Go section removed without mention |
Minor | ✅ Resolved — merge 54cf325 restored it; confirmed still clean vs origin/main |
| Codex P2a | TypeScript globs excluded manifests/lockfiles | P2 | ✅ Resolved — 2305865 |
| Codex P2b | actionlint missed .yaml workflows |
P2 | ✅ Resolved — 2305865 |
| Codex P2c | Build/lint skips committed changes on clean worktree | P2 | ✅ Resolved — 5db736b |
| Codex P1 | Bare sibling-skill refs break in plugin form | P1 | Author-declined per locked decision in medley#1281; smoke-tested ✓ |
| 2 | External marketplace refs lack install pointers | Low | Open |
| 3 | verify-changes/evals IDs skip 5–6 (sequence 1–4, 7–10) |
Cosmetic | Open |
| 4 | notes_dir description claims CLAUDE.md "takes precedence" |
Minor | Open |
| 5 | <default-branch> placeholder in git merge-base has no resolution hint |
Observation | Open |
| 6 | argument-hint says "auto-detect from git status" — understates the branch-diff fallback |
Cosmetic | Open |
Detail on remaining open items
Finding 4 — notes_dir description wording (plugin.json L16)
The description still reads: "A working-notes convention declared in your own project's CLAUDE.md or rules takes precedence."
${user_config.notes_dir} is the interpolated value the skills actually use — a CLAUDE.md convention doesn't technically override it, the consumer just sets the config option to match. The "takes precedence" claim is technically ambiguous.
Suggested tightening: "Project-relative directory for implementation artifacts. Set this to match your project's working-notes convention." Fix this →
Finding 5 — <default-branch> placeholder (build/SKILL.md L57, lint/SKILL.md L59)
Both skills use git diff --name-only $(git merge-base <default-branch> HEAD)..HEAD with <default-branch> as a symbolic placeholder. This works well for main-based repos. For repos using develop, trunk, or another default, the model infers it from context — which is usually correct but is silent about how to resolve it.
A brief parenthetical would make the intent explicit: $(git merge-base <default-branch> HEAD) → $(git merge-base <default-branch> HEAD) # detect via: git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|refs/remotes/origin/||'; default to main. Not a blocker — the skill's consumer-conventions-win framing means a project's CLAUDE.md will typically supply this context. Fix this →
Finding 6 — argument-hint understates detection (build/SKILL.md L5)
argument-hint: "... — default: auto-detect from git status"This user-visible hint no longer fully describes the detection logic (git status → branch diff fallback). A small tightening: "default: auto-detect from changed files" would be accurate for both detection paths without being verbose. Cosmetic only. Fix this →
What's confirmed correct
- Manifest (
plugin.json): valid schema, explicitversion: 0.1.0, correct author/license/keywords,notes_dirwith sensible default. - Marketplace entry: correct
category: development, tags match skill content, JSON placement clean. - Repo-agnostic design: all artifact paths use
${user_config.notes_dir}/<topic-slug>/; no hardcoded paths or project-specific values. - SSOT decomposition:
/buildowns detection + commands;/lintowns lint-only;/verify-changesdelegates without reimplementing. Chain is coherent. - Consumer-conventions-win: explicitly stated in both
buildandlintreference configs; portable defaults are clearly labeled as such. - Graceful degradation: all cross-plugin references use "when [plugin] is installed" + inline fallback — confirmed for sibling refs (
/tdd:tdd,/planning:architect, etc.) and external refs (/andrej-karpathy-skills:karpathy-guidelines,dotnet-ai:*, etc.). - Security: markdown-only skills, no hooks, no MCP servers, no
../reach-outs, no absolute paths, no egress, no secrets, no PII. - Evals:
verify-changesevals cover the key routing behaviors (mode detection, Stage 1 gate, redirect to/verify-improvement, live-app delegation).test-diagnose,test-e2e,test-write,verify-improvementevals are also solid. - TypeScript globs: now include
package.json,package-lock.json,pnpm-lock.yaml,yarn.lock,tsconfig*.json— dependency/config-only PRs correctly trigger TypeScript verification. - actionlint: no-argument discovery mode; covers both
.ymland.yamlworkflow files. - Clean-tree fallback: both
buildandlintnow fall back to branch diff on a clean worktree — checkpoint-committed work gets classified at pre-PR verify time.
Overall
The implementation plugin is merge-ready. All substantive findings across three review rounds are resolved. The five remaining open items are Minor/Cosmetic/documentation-clarity level and none block merging. The latest merge sync is clean — session-flow only, no interference with the implementation plugin.
There was a problem hiding this comment.
Risk: medium. Not approving because Cursor Bugbot skipped (usage limit reached) and did not complete automated review. Human review is needed; no reviewers were assigned because no non-author human maintainers are available on this repository.
Sent by Cursor Approval Agent: Pull Request Router and Approver
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 023f13c085
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| ## Pre-computed context | ||
|
|
||
| Working tree status: !`git status --porcelain 2>/dev/null || echo ""` | ||
| Changed files (vs HEAD): !`git diff --name-only HEAD 2>/dev/null || echo ""` |
There was a problem hiding this comment.
Include branch-diff files in outcome targeting
In the clean-tree pre-PR flow produced by /implement checkpoint commits, this precomputed list is empty, but Stage 2 later decides E2E triggers and the implementation inventory by “inspect changed files.” Fresh evidence beyond the earlier /build finding is that /verify-changes itself still only exposes git diff --name-only HEAD, so committed API/UI changes can pass the mechanical branch-diff fallback while skipping runtime/outcome checks that depend on the PR diff.
Useful? React with 👍 / 👎.
|
|
||
| python: | ||
| enabled: true | ||
| globs: ["*.py", "pyproject.toml", "uv.lock"] |
There was a problem hiding this comment.
Add Python dependency manifests to build detection
For Python dependency/config-only changes such as requirements.txt, poetry.lock, setup.cfg, or pytest.ini, these globs do not classify the Python ecosystem unless a .py, pyproject.toml, or uv.lock file also changed. In those PRs /implementation:build can report no affected ecosystem and skip tests/lint even though the dependency or test/lint configuration change can break the project.
Useful? React with 👍 / 👎.
## What - **Collapse 4 selector jobs into 1**: `ci.yml` ran four identical per-lane `select-runner.yml` preflights (`select-hygiene`, `select-hook-utils-sync`, `select-plugin-gate`, `select-miro-plugin`). They are now one `select-runner` job with the exact same inputs and observer secret; every lane (`hygiene`, `zizmor`, `hook-utils-sync`, `plugin-gate`, `miro-plugin`, `runner-policy`) rewires to it with its existing `!cancelled() && result == 'success'` gate and `outputs.runner || 'ubuntu-24.04'` fallback unchanged. `ci-status` and triggers/concurrency are untouched. - **Pin bump de50a08 → 3415de3** in `ci.yml` and `pr-title.yml`: the liveness selector routes on fleet liveness (any online managed runner keeps the workload self-hosted; GitHub queues on a busy fleet) and drops the rerun-to-hosted branch (melodic-software/ci-workflows#86). The SHA is allowlisted owner-scoped for melodic-software in the synced runner policy (melodic-software/standards#100). - **Docs**: `docs/CI-RUNNER-ROUTING.md` now describes the one-preflight-per-workflow contract instead of one selector per workload. ## Not changed - `zizmor.yml@de50a08` stays pinned: de50a08 is the only zizmor contract SHA approved in the standards-distributed `policy.json`; bumping it would fail the runner-policy gate. ## Verification - `GITHUB_REPOSITORY=melodic-software/claude-code-plugins node .github/standards/runner-policy/runner-policy.mjs --root .` → `Runner policy passed.` - `actionlint` and `markdownlint-cli2` clean on the changed files. Part of melodic-software/github-iac#79, epic #78. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01EPDbXgonTuFwFwdTtHaCmw <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes how every CI lane picks runners and bumps the governed selector contract; mis-routing or selector failure would block workloads, though gates and fallbacks are unchanged. > > **Overview** > **Consolidates CI runner selection** so `ci.yml` runs one shared `select-runner` preflight instead of four duplicate per-lane selector jobs; all lanes (`hygiene`, `zizmor`, `hook-utils-sync`, `plugin-gate`, `miro-plugin`, `runner-policy`) still gate on selector success and use the same `outputs.runner || 'ubuntu-24.04'` expression. > > **Bumps** the pinned `select-runner.yml` reusable workflow from `de50a08` to `3415de3` in `ci.yml` and `pr-title.yml` (liveness-based routing; reruns can reuse a prior successful selector result). **`zizmor.yml` stays on `de50a08`** per runner-policy allowlisting. > > **Updates** `docs/CI-RUNNER-ROUTING.md` to document one selector per workflow rather than one per workload. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 600d4b5. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>


Refs melodic-software/medley#1281
What
New
implementationplugin bundling ten skills as one implementation-stage capability:/implementation:implement— inline plan execution: mode detection (feature/fix/refactor/config), TDD-by-default cadence, build+test after each logical block, green-checkpoint commits, divergence detection routing back to planning, phase-boundary handoffs/implementation:implement-dispatch— orchestrated execution variant: scope-fenced worker briefs, subagent dispatch, evidence-verified returns, main-side builds, conservative-option deviations log/implementation:build— build+test+lint for changed files, auto-detecting affected ecosystems (.NET, Python, TypeScript, Bash, PowerShell, Markdown); the command-table SSOT sibling skills compose/implementation:lint— lint/format-only pass with--fixmode, honoring each tool's config-file opt-in/implementation:test-write/test-plan/test-diagnose/test-e2e— test authoring, coverage-gap analysis, failure diagnosis loop, live E2E evidence capture (incl. non-UI smoke playbook)/implementation:verify-changes— mechanical prerequisite gate + outcome verification with change-type-detected criterion (feature / fix / refactor)/implementation:verify-improvement— baseline-vs-after measurable-improvement verification; no baseline → honest "cannot quantify"Marketplace entry:
category: development, tagsimplementation, build, lint, testing, tdd, e2e, verification, skill.plugin.jsonpinsversion: 0.1.0with oneuserConfigoption (notes_dir, default.claude/notes, consumer-convention-wins).De-coupling from the source repo
.work/<slug>/slice machinery replaced with${user_config.notes_dir}/<topic-slug>/artifacts + generic inline guidance; medley rule citations inlined as generic principles.reference/ecosystem-config.mdinbuildandlint) that the consuming project's own documented commands override ("consumer conventions win")./tdd:tdd,/playwright:playwright,/discovery:research,/planning:architect,/session-flow:handoff,/session-flow:retro,/diagnose:diagnose— each "when installed", with an inline fallback. Sibling refs inside the plugin stay bare per the locked issue decision.Gate evidence
claude plugin validate --strict ./plugins/implementation— PASSclaude plugin validate --strict .(catalog manifest) — PASSclaude plugin details(via--plugin-dir): always-on ~1,409 tok (build ~140 / implement ~150 / implement-dispatch ~130 / lint ~130 / test-diagnose ~120 / test-e2e ~130 / test-plan ~120 / test-write ~140 / verify-changes ~170 / verify-improvement ~180); on-invoke ~950–7.4k per skill--plugin-dirsmoke test in a clean non-medley repo (freshgit initscratch dir):/implementation:test-planinvoked headless; repliedSMOKE-OK implementation:test-plan— correct plugin namespacetyposover the plugin + shared files: clean. markdownlint / editorconfig-checker not runnable locally on this worker (npm not installed on the machine after reboot) — deferring those two lanes to this repo's CI gates.Security review (plugin-acceptance)
evals/evals.jsontest fixtures, an established pattern in this marketplace).notes_dir); no secrets anywhere.../reach-outs, no absolute paths; all references relative inside the plugin; consumer artifacts written only under the consumer-configured notes directory.🤖 Generated with Claude Code
Note
Low Risk
Markdown-only plugin content and catalog wiring; no hooks, MCP, or secrets. Skills may instruct running consumer-repo CLI in other projects, consistent with sibling plugins.
Overview
Adds a new
implementationmarketplace plugin (plugins/implementation/,version0.1.0) and registers it in.claude-plugin/marketplace.jsonplus the root README catalog.The plugin ships ten user-invocable skills as markdown workflows:
implement/implement-dispatch(inline vs worker orchestration, divergence and phase handoffs),build/lint(polyglot verification with sharedreference/ecosystem-config.mdand per-ecosystem context),test-write,test-plan,test-diagnose,test-e2e,verify-changes, andverify-improvement. Cross-plugin calls (e.g.tdd,planning,playwright) are optional with inline fallbacks; consumerCLAUDE.md/ rules override default commands. Artifacts default tonotes_dir(.claude/notes).Several skills include
evals/evals.jsonfixtures. Content is lifted from the medley source and generalized (no medley-specific paths or CI gates in the bundle).Reviewed by Cursor Bugbot for commit 023f13c. Bugbot is set up for automated code reviews on this repo. Configure here.