Add a fifth skill, teach-artifact, to the artifact-tools plugin. It reads the same two sources the existing recap commands already read — the current working session, or a pull request — and publishes a claude.ai page that teaches a reader how the system works, rather than reporting what changed.
Every existing way to share work in this kit either reports what changed or writes a Markdown file nobody links to. This fills the one empty slot — a shareable page whose job is understanding — and we will know it worked when the plugin's continuous-integration guard validates five skills instead of four and the version reaches 1.12.0.
Read and implement all steps in the plan at docs/plans/add-teach-artifact-skill.md — Ship teach-artifact, the artifact-tools skill that teaches instead of recaps. Verify against the plan's Tests, Verification, and Acceptance Criteria before reporting done. If everything passed, mark completion in docs/plans/add-teach-artifact-skill.md — tick each step's [x] marker and each criterion's - [x], set status: completed — and re-render the HTML from the spec. If any check failed, leave status: in-progress and say which.
More ways to run this plan — goal & workflow prompts, file path
Achieve this goal: Ship teach-artifact, the artifact-tools skill that teaches instead of recaps. The plan at docs/plans/add-teach-artifact-skill.md describes one approach — use it as reference, but optimize for the outcome. Verify against the plan's Tests, Verification, and Acceptance Criteria before reporting done. If everything passed, mark completion in docs/plans/add-teach-artifact-skill.md — tick each step's [x] marker and each criterion's - [x], set status: completed — and re-render the HTML from the spec. If any check failed, leave status: in-progress and say which.
add-teach-artifact-skill.html
docs/plans/add-teach-artifact-skill.html
docs/plans/add-teach-artifact-skill.md
Context
The story behind this plan — what prompted the work and why it matters now.
The artifact-tools plugin already separates its publishing engine from its framing. The three recap commands (eng-recap, team-recap, product-doc) are short files of 60 to 68 lines each; all the real machinery lives in one shared 276-line reference, references/recap-core.md, which owns source resolution, the blocking secret-scanning gate, the page-build rules, and the record that lets a re-run republish to the same link. Each command declares only five things: its audience, its section list, its favicon, its inbox filename stem, and its republish key.
That structure is why this work is small. teach-artifact reuses recap-core unchanged and supplies a different frame, so version 1 ships zero new source-gathering code.
The gap it fills is real and was measured, not assumed. Two skills in the kit already teach — social-media-tools:write-guide writes long-form Markdown into a guides/ folder, and social-media-tools:share-explanation produces a social-card image — but neither publishes a shareable page. The four skills that do publish pages all either recap a change or reproduce a document verbatim. A teaching page is the one combination nothing produces.
The main risk is overlap with team-recap. A teaching page about a session and a team recap of that session can drift into the same document. The mitigation is that the section spine must be teaching-shaped, and step 1 gives that spine its own file so it can be reviewed on its own terms. The stop condition is explicit: if the first real page reads as a team-recap variant, the skill has not earned its slot and should be reconsidered as a fourth recap command instead.
Five choices were settled with the plan's author during the planning interview on 2026-08-07, and are recorded here so a later reader can tell a decision from an assumption. Two of them were the proposal's open questions, answered rather than carried forward: the skill reuses references/recap-core.md directly instead of forking a teach-core.md, because tests/plugins/test-recap-command-dedupe.sh exists precisely to stop the duplication a fork would reintroduce — 168 lines once diverged badly enough that a scrub-gate fix landed in one file out of three; and the section spine is fixed for both sources rather than picked per source, because a fixed heading list is what makes the anti-overlap assertion in step 3 possible at all.
The remaining three shape what actually gets written. The skill opts into recap-core's 20-file diff-hunk budget in pull-request mode, as eng-recap does and the other two commands deliberately do not, because teaching how something works needs the real signatures and error paths that commit messages never carry. The mental-model section earns a diagram by default, inverting recap-core's rule that a diagram is earned only where something changed — a page teaching a system that did not change this week is exactly the page most in need of one. And every diagram carries a prose sentence alongside its caption, because recap-core's documented fallback ships diagram blocks as plain text whenever the browser pane is unavailable, so content living only inside an image is content that can disappear.
Two consequences were discovered by reading the tests rather than the source. The plugin's guard at tests/plugins/test-artifact-tools.sh hard-codes the four current skill names in its validation loop, and continuous integration runs it — so a fifth skill added without touching that file ships completely untested. And because the plan touches a second plugin's README, that plugin needs its own version bump; any edit under a plugin directory does.
This plan sets workflow: never. The renderer would otherwise offer to fan the work out across parallel agents, because it counts seven files across three top-level directories — but the steps are strictly sequential. The tests cannot be written before the skill exists, and the documentation cannot describe a shape that is not settled.
Files that change
Every file this plan touches, and what happens to each one.
kit/plugins/artifact-tools/references/teach-framing.mdnew the fixed teaching section spine, the diagram and walkthrough rules, and the reviewer test that keeps it distinct from team-recapkit/plugins/artifact-tools/skills/teach-artifact/SKILL.mdnew the skill, its five declarations, and its delegation to recap-coretests/plugins/test-artifact-tools.shmodified extend both validation loops to cover a fifth skill and assert republish-key exclusivity- kit/plugins/artifact-tools/
README.mdmodified Features row, Usage line, and the boundary statementCHANGELOG.mdmodified the 1.12.0 entry
.claude-plugin/marketplace.jsonmodified artifact-tools to 1.12.0 and social-media-tools to 2.22.1- kit/plugins/social-media-tools/
README.mdmodified the other half of the boundary statementCHANGELOG.mdmodified the 2.22.1 entry the version bump requires
Steps
The step-by-step work, in order — each step says what to do, why it matters, and how to check it worked.
grep -c '^## ' kit/plugins/artifact-tools/references/teach-framing.md returns at least 5, the spine is written as one fixed list rather than a per-source branch, and the file contains a section naming the extension seam without adding a third source mode.teach-artifact (or pr-<number>-teach in pull-request mode), and republish key teach-artifact-url: with an explicit statement that it never writes the four keys belonging to its siblings.
bash tests/plugins/test-exitplanmode-guard.sh and bash tests/plugins/test-description-budget.sh both exit 0, and grep -q 'teach-artifact-url:' kit/plugins/artifact-tools/skills/teach-artifact/SKILL.md succeeds.teach-artifact to the loop that validates skill frontmatter, add it to the loop that asserts the secret-scanning gate is documented before publishing, correct the header comment and any message that says four skills, add an assertion that the file claims teach-artifact-url: and does not claim any sibling's key as its own, and add an assertion that parses the heading list out of kit/plugins/artifact-tools/references/teach-framing.md and fails if it matches the section list in kit/plugins/artifact-tools/commands/team-recap.md.
bash tests/plugins/test-artifact-tools.sh exits 0, temporarily renaming the new SKILL.md makes it exit non-zero with a message naming teach-artifact, and temporarily pasting team-recap's section list into teach-framing.md makes it exit non-zero on the heading comparison.grep -q 'teach-artifact' kit/plugins/artifact-tools/README.md succeeds and the Features table shows five skill rows.git fetch origin && BASE_REF=main node scripts/check-plugin-versions.mjs exits 0 and reports artifact-tools at 1.12.0.git fetch origin && BASE_REF=main node scripts/check-plugin-versions.mjs exits 0 and reports both plugins above their base-branch versions, and grep -q '2.22.1' kit/plugins/social-media-tools/CHANGELOG.md succeeds.Tests
The tests that prove the change does what it promises.
Definition of done
The plan counts as done when every statement below is true — check each one off as you verify it.
Final check
One last pass to confirm the whole change works end to end.
Load the plugin locally with claude --plugin-dir ./kit/plugins/artifact-tools and ask it to publish a page teaching how this session's work fits together. Confirm three things in order: that teach-artifact activates rather than session-artifact, that the run reports the blocking secret-scanning gate's result before anything is published, and that the resulting page's headings come from teach-framing.md rather than matching team-recap's section list. That last check is the one that proves the objective — a page whose sections mirror team-recap's means the skill is a recap wearing a new name, and the plan has not succeeded regardless of what the tests say.
Then make the same request a second time. Read the record under docs/plans/sessions/ and confirm the skill republished to the URL stored in teach-artifact-url: rather than minting a new link, and that artifact-url:, eng-artifact-url:, team-artifact-url:, and product-artifact-url: in that same record are byte-for-byte unchanged.
Finally run the full guard set from the repository root and confirm every command exits 0: bash tests/plugins/test-artifact-tools.sh, bash tests/plugins/test-description-budget.sh, bash tests/plugins/test-exitplanmode-guard.sh, bash tests/plugins/test-no-shell-expansion.sh, and git fetch origin && BASE_REF=main node scripts/check-plugin-versions.mjs.
Wrapping up
Three gates that must all pass before this plan is marked completed.
Completion Report
- Verification paragraphs 1 and 2 (
claude --plugin-dir ./kit/plugins/artifact-tools, publish a teaching page, then republish and diff the session record) - verified structurally, not by a live run. This session is non-interactive and a real publish is an outward-facing action, so the three behaviours those paragraphs check were asserted against the files instead: the blocking gate precedes the publish bootstrap (
test-artifact-tools.shcheck 4, by line order rather than keyword presence), the page's headings come fromteach-framing.mdand cannot matchteam-recap's list (check 10, proven by pasting that list in and watching the build fail), and the skill declaresteach-artifact-url:while warning itself off all four sibling keys (check 7). What remains unproven by execution is that the skill wins activation againstsession-artifacton a live request, and that a second real run republishes to the stored URL rather than minting a new one. Every acceptance criterion was verified directly; Verification paragraph 3 ran in full.