feat(education): teach 0.7.0 — upstream pedagogy port, research-grounded lessons, configurable workspace roots - #2958
Conversation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
… ledger Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…anding persisted Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…red per topic-docs convention) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…dagogy with marketplace machinery Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…-skill improvements Eight phases, impact-ordered per the Brief's execution contract; baseline dogfood findings F1-F15 mapped into phases; stress-test rounds pending. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…hanized, consumer sweep, non-vacuous checks Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…ounding, mode-split root default, body-side config resolution Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…grounding ladder to teach Phase 1 of docs/topics/teach-skill-comparison/PLAN.md: - SKILL.md gains "Fluency vs storage strength": fluency-vs-storage distinction (upstream terms quoted; Bjork's storage-vs-retrieval naming noted), desirable-difficulty triad (retrieval practice, spacing, interleaving scoped to skills practice), and the knowledge/skills difficulty asymmetry. - Knowledge layer's grounding bullet replaced by a four-tier "Research grounding" ladder: tier 0 no-dispatch (repo files Read this turn / verified RESOURCES.md citations), tier 1 /discovery:research with inline-fetch + /context7:lookup + /firecrawl:firecrawl fallbacks terminating at built-in WebSearch/WebFetch, tier 2 /discovery:research-deep seeding, tier 3 /knowledge:map-corpus + digests — every cross-plugin name presence-gated; ~1 research dispatch/session cap; never parametric recall at any tier (the ladder decides which fetch, never whether). - /discovery:blindspot intake, /dometrain:grounding, /x:read added as gated adjacent sources. - Mission interview harvests fields the opening message already answers (baseline F11). - context/exercises.md + context/assessment.md: equal-length quiz-answer rule; effortful-retrieval design rule. - context/resources.md: verification scoped by mode — Repo-Sources- only is compliant in codebase mode (baseline F7). - PLAN.md Phase 1 tag advanced to [DONE]. Sanity evidence: grep -c "storage strength" SKILL.md = 2; grep -c "discovery:research" SKILL.md = 2; map-corpus/blindspot/ dometrain/x:read/context7/firecrawl/research-deep each within 3 lines of an installed-guard phrase; grep -c "equal" context/exercises.md = 1 (and 1 in assessment.md). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…ibrary in teach Phase 2 of docs/topics/teach-skill-comparison/PLAN.md: - context/lessons.md: lesson format flips to interactive, self- contained lesson.html by default WHERE the learner's host can render it; headless/SSH/remote/cloud hosts (no local browser) and interactivity-pays-nothing lessons stay markdown. The open- lesson affordance shares the host check. "The durable trio stays markdown" (reference.md, learning records, GLOSSARY.md). - Assets library: workspace assets/ holds lesson.css + quiz.js; scripted awk splice injects assets into the self-contained page via SPLICE:STYLE / SPLICE:QUIZ markers — assets never re-pass through model output after first authoring (MUST). - Quiz component contract: per-question answer shuffling (no positional tells; view-source limitation stated, not an integrity guarantee) + copy-out result block the learner pastes back into chat — the coach grades in conversation and records evidence; the page never self-certifies. - Artifact-share flavor: presence-gated publish-as-artifact offer. - Reuse-first extended: read assets/ before authoring, extract reusable pieces back into assets/. - SKILL.md: assets/ added to Workspace layout; lesson.md-vs-html replacement rule deduped to ONE full statement in lessons.md (baseline F12) — tree line, format paragraph, and explain row now point there. - lessons.md machine-state bullet (plugin-data path + topic-docs URL) deliberately untouched — Phase 3 consumer-sweep territory. - PLAN.md Phase 2 tag advanced to [DONE]. Sanity evidence: grep -c "assets/" SKILL.md = 1; grep -ci "shuffl" lessons.md = 1; grep -ci "copy.*back|paste.*back" lessons.md = 1; grep -c "never both" SKILL.md = 1; grep -c "durable trio stays markdown" lessons.md = 1; raw.githubusercontent count in lessons.md unchanged at 1; markdownlint-cli2 (repo config) 0 issues. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…opic default Phase 3 of docs/topics/teach-skill-comparison/PLAN.md. Learning workspaces are classified as user documents (deliberate, documented deviation from the plugin-data default — rationale in the education CHANGELOG [Unreleased] entry and README). Consumer sweep (grep -rn CLAUDE_PLUGIN_DATA plugins/education/) dispositions: teach SKILL.md layout root/auto-create bullet/ pre-compute/Resume-Status header AMENDED to the ladder; context/lessons.md machine-state bullet AMENDED (root token + relational topic-docs pointer with non-raw URL fallback, baseline F8); evals.json eval 1 AMENDED (root-ladder expectation); README storage + config sections AMENDED; quiz-me hits KEPT (its own report_library_dir seam, out of scope). - SKILL.md "Workspace root resolution": rung 1 project declaration -> rung 2 workspace_root userConfig (library_dir value grammar; repo-tree guard) -> rung 3 ask-once persisted in the plugin-data pointer file (machine-local cache; adopt-existing-root before asking; silent skip when non-interactive or plugin-data missing) -> rung 4 OS Documents "Claude Learning" home, topic mode only, exists-AND-not-$HOME guard, Windows known folder per docs/conventions/windows-path-emit/ -> rung 5 plugin-data compat fallback. Ladder-highest root wins; duplicates surfaced, never merged; one-time migration offer recorded in the pointer file; cloud-sync/in-repo/temp/committed root hazards documented. - Mode split (approved [FALLBACK]): codebase workspaces stay plugin-data by default — privacy over visibility for repo-derived snippets. - user_config token NEVER in pre-compute (empirical bad-substitution load crash, #1687 guard): the token renders in a body table (quiz-me:37 pattern); pre-compute passes CLAUDE_* only and is BYTE-UNCHANGED from 0.6.x; body re-invokes the script with resolved roots; exit 2 (probe broken -> manual glob) distinguished from printed "none". - list-workspaces.sh: multi-root scan (placeholder/empty roots filtered; all-filtered = exit 2), --default-root helper (platform Documents + Claude Learning, never created, fail-loud native Windows resolution), linked-worktree hoist via git rev-parse --git-common-dir with legacy per-worktree slugs scanned and labeled. Signature stays backward-compatible with the 0.6.x pre-compute call (atomic-skew guard). - list-workspaces.test.sh: 29 checks — multi-root incl. space- bearing root, placeholder-unset, all-placeholder exit 2, --default-root xdg stub + $HOME-guard + absent-Documents, worktree hoist + legacy labeling. - plugin.json: workspace_root userConfig (directory); README options block re-synced via scripts/sync-plugin-options-docs.py; education:setup surfaces/validates the new key. Acknowledged gaps (recorded per plan): Windows Documents known- folder branch is not machine-verifiable in this container (manual verification owed); rung 2 is grep-provable but not exercisable in the dogfood harness. Sanity evidence: list-workspaces.test.sh exit 0 (29 checks); grep -c git-common-dir SKILL.md = 1; grep -c workspace_root plugin.json = 1; grep -c raw.githubusercontent lessons.md = 0; grep -c "under the plugin data dir" evals.json = 0; CHANGELOG rationale greps = 3; shellcheck clean; markdownlint (repo config) 0 issues; evals.json + plugin.json schema-valid; changelog-parity --check passes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…gram affordances Phase 4 of docs/topics/teach-skill-comparison/PLAN.md: - SKILL.md Resume gains an explicit due-for-review step: floor concepts weighed by latest-record age x domain velocity are surfaced BEFORE advancing the frontier, opening with a retrieval question on a due concept (ties the ported spacing doctrine to the resume machinery — the scheduler gap upstream acknowledges). - status stays one-line-per-workspace on filename + mtime heuristics only (no file bodies); it adds a due-for-review flag, with per-concept detail deferred to resume of that workspace. - context/assessment.md ZPD: floor revisit is scheduled-by-age, not occasional — quick retrieval question, not a re-lecture. - context/lessons.md open-lesson affordance: permission-gated offer via macOS open / Linux xdg-open (visible degradation when absent) / Windows start-explorer.exe from Git Bash; skipped entirely on remote/web/cloud/SSH hosts (hand back the path), reusing the Phase 2 host check. - /education:quiz-me composed as same-plugin sibling WITHOUT a presence gate; its quiz results count as learning-record evidence (Session Close). - Concept diagrams: /visualization:visualize when installed, native mermaid fallback stated; dataviz constraints named for in-lesson charts. - PLAN.md Phase 4 tag advanced to [DONE]. Sanity evidence: grep -ci "due.*review" SKILL.md = 2; quiz-me mention 0 guard-phrases within 3 lines (same-plugin, ungated); grep -ci xdg-open lessons.md = 1 with open/start/explorer.exe siblings; grep -ci mermaid SKILL.md = 1; markdownlint (repo config) 0 issues. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
Phase 5 of docs/topics/teach-skill-comparison/PLAN.md — the residual F-items from .work/teach-skill-comparison/dogfood/baseline/FINDINGS.md not absorbed by Phases 1-4: - F1 smart default covers whole-repo/deictic subjects: routes to codebase and derives a stable content name (repo basename + scope word) recorded as the raw subject name. (grep -ci "whole repo|entire repo|this repo" SKILL.md = 2) - F2 deictic slug rule at the slug bullet: resolve deixis to a content name first, never slug it. (grep -c "never slug the deixis" SKILL.md = 1) - F3 codebase action argument renamed to <topic> with the concepts/-are-smaller-units mapping stated; mission.md heading updated. (grep -rc "codebase <concept>" = 0) - F4 New Workspace reordered: mission interview BEFORE workspace creation — the interview crystallizes the raw name the slug and collision guard need. (awk section shows interview step 1, create step 2) - F5 NOTES.md seeded from interview constraints; GLOSSARY.md explicitly deferred until the first demonstrated term. (NOTES.md hits in flow = 2) - F6 mission-title identity duty stated where titles are authored. (grep -c "identity, not prose" mission.md = 1) - F9 empty/boilerplate/contradictory guidance-file handling in Codebase Mode step 1: flag, fall back README->docs->code, record in RESOURCES.md. (grep = 1) - F10 prior-knowledge record uses scan-and-increment (hardcoded 0001 filename removed = 0 hits) and the flow links context/assessment.md for the format. - F13 glossary _Avoid_ line marked OPTIONAL; never invent a weak alias to fill the template. (grep -c OPTIONAL glossary.md = 1) - PLAN.md Phase 5 tag advanced to [DONE]. markdownlint (repo config): 0 issues. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…ribution row Phase 6 of docs/topics/teach-skill-comparison/PLAN.md: - mattpocock-skills.md: teach moved OUT of "Not adopted" (that row was provably false — the original port took his workspace vocabulary, near-verbatim FORMAT-spec content, and K-S-W/ZPD/ community-delegation pedagogy with learning-record doctrine) into a full Derived attribution row: taken / rejected (cwd-as- workspace, Codex sidecar, HTML references) / added house-built (codebase mode, primer, assess, staleness, evals, collision guards, root ladder) / re-adopted in education 0.7.0 (storage- strength pedagogy, HTML-first lessons, assets library), with the teach-skill-comparison topic cited as the audit. - mattpocock-skills-v12-map.md row 22: CONVERGENT -> DERIVED, counterpart corrected to education:teach, pointing at the attribution table for the full record. - PLAN.md Phase 6 tag advanced to [DONE]. Sanity evidence: grep -c "education:teach" docs/upstream/mattpocock-skills.md = 1 (attribution table); grep -c "teach.*(education plugin covers)" = 0; markdownlint (repo config) 0 issues. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…g entry Phase 7 of docs/topics/teach-skill-comparison/PLAN.md: - evals.json extended with five new cases: research-grounding tier selection (7), workspace-root ladder resolution incl. mode split and placeholder-unset handling (8), platform-aware lesson format + assets splice + open affordance (9), due-for-review surfacing at resume (10), deictic-subject codebase routing with stable naming (11). Eval 1's root expectation was amended in Phase 3. Schema-valid against plugins/skill-quality/reference/ evals.schema.json. - Equal-length quiz-answer rule verified present in BOTH context/exercises.md and context/assessment.md (Phase 1). - /skill-quality:check (check-skill.sh): PASS — 0 errors, 2 advisories (263/500 lines vs 200 soft target; no gotchas surface — no observed post-ship failure history yet). - docs-hygiene pass: compress audit classifies SKILL.md SKIP (author-time-disciplined, expected yield <=3%; the skill's own soft-block for always-loaded instruction files) — no mutating compression applied, so no asserted-token rewording risk. Listing budget: teach is disable-model-invocation and spends none of the shared budget; the marketplace-wide aggregate WARN is pre-existing and advisory. - education 0.7.0 (minor — two consumer-visible default changes: lesson format, topic-workspace location): plugin.json bumped; the Phase 3 [Unreleased] section relabeled ## [0.7.0] and extended with the full release notes. check-changelog-parity --check / --check-bump origin/main / --check-preserved all pass. - Cumulative re-run of every Phase 1-6 sanity grep AFTER the docs-hygiene pass: all hold (values in prior phase commits; storage strength=3, never both=1, durable trio=1, test suite 29 checks PASS, provenance greps 1/0). - PLAN.md Phase 7 tag advanced to [DONE]. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…fter-dogfood run Phase 8 of docs/topics/teach-skill-comparison/PLAN.md: the marker proves the dogfood agent reads the LIVE working tree (not a cached install) before the before/after comparison is trusted. Removed in the Phase 8 completion commit once the after-run reports it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
…ry removed Phase 8 of docs/topics/teach-skill-comparison/PLAN.md, closing the approved plan: - After-dogfood run executed by a fresh-context agent at 0.7.0 against the IDENTICAL baseline persona script (same learner turns, same scripted git-hooks misconception, same sanctioned plugin-data substitution -> dogfood/after/). The canary TEACH-CANARY-h3rpag-p8 was reported verbatim from SKILL.md line 12 — live working-tree reload proven — and is removed by this commit (grep count now 0). - Comparison written (memory slice: dogfood/ COMPARISON-BEFORE-AFTER.md beside the two runs, per the topic-docs convention; distilled verdict recorded in PLAN.md Phase 8): baseline defect findings F1-F13 RESOLVED with live evidence, F15 partially (exit-2 semantics witnessed; unset- creation path test-covered), strengths F14 preserved. Zero defensive external fetches (baseline: 2); mechanical deictic routing; harvest-first interview with no re-asked questions; platform-aware markdown fallback + open-offer skip honest on the headless host; Tier-0 grounding throughout. - Scoped per DA #7: rung 4 Documents, rung 2 userConfig, the HTML/splice/quiz branch, tier-1+ research, and Windows known- folder resolution remain mechanically covered (29-check test suite, evals 7-9, acknowledged Windows manual gap) — never claimed dogfood-proven. - Six minor new findings recorded as refinement candidates (none caused wrong behavior): rung-3 mode qualifier by inference, duplicate probe re-invocation, glossary promotion granularity, Tier-0 platform-claim boundary / egress-blocked tier-1 gap, unconditional assets/ in the layout diagram, next-focus persistence home. - PLAN.md Phase 8 tag advanced to [DONE] — all eight phases DONE. Sanity evidence: grep -c TEACH-CANARY SKILL.md = 0; dogfood/after/ holds transcript + findings + workspace; COMPARISON-BEFORE-AFTER.md exists with the per-finding table; markdownlint 0 issues; list-workspaces.test.sh PASS. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
The approved PLAN.md (Brief + 8 phases, all DONE) is published in the PR description; durable outcomes already live in their permanent homes (education CHANGELOG 0.7.0 rationale, docs/upstream attribution row). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
Security review (
|
Code review complete
Ran the Posted 3 inline findings:
One additional finding could not be anchored inline because the affected line wasn't touched by this diff:
Everything else checked out: the |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: eda4ea1a36
ℹ️ 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".
…x review findings - list-workspaces.test.sh clears the inherited git environment (GIT_DIR et al) so fixture builds cannot write into the caller's .git/config (fixture-git-isolation-gate). - Rung 3 ask-once is now explicitly topic-mode only; codebase workspaces never get a Documents offer (closes the contradiction with the mode split). - status excludes superseded learning records via a status-line grep instead of counting them as active floor (false due-for-review flags). - education:setup reads the rung-3 pointer file before reporting the effective workspace root. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
|
Last security-reviewed head: |
Security-review finding: rung 1 of the workspace-root ladder reads a path from the consuming repo's CLAUDE.md/rules — attacker-controlled content when teaching a third-party repo — with no validation, unlike rung 2. The declared value now must satisfy rung 2's value grammar, anything carrying shell metacharacters or substitution syntax is refused loudly (falling to the next rung), and resolved roots from every rung are passed as inert argv data only, never interpolated into hand-composed command strings (list-workspaces.sh, assets splice, open-lesson commands). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
… path Pointer discipline on durable surfaces (docs/conventions/topic-docs): the CHANGELOG entry and the upstream attribution row pointed at docs/topics/teach-skill-comparison/, deleted at close-out; both now cite PR #2958, matching the file's existing path-less audit-citation precedent. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
|
Claude has reviewed this PR 3 times. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
…ADME The <concept> -> <topic> rename landed everywhere except the consumer-facing README (code-review finding 3); no other survivors repo-wide. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
Code review (
|
Eval 12 guards the rung-3 mode scoping (a first codebase workspace never gets an ask-once/Documents offer); eval 13 guards status excluding superseded learning records from the due-for-review heuristic. Both bugs were independently caught by two review lanes — cases added per the code-review pass's non-blocking observation. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
|
Claude finished @kyle-sexton's task in 1m 32s —— View job Security review (
|
|
Claude finished @kyle-sexton's task in 1m 2s —— View job Code review (
|
No linked issue
Summary
Makes
education:teachthe best-of-both-worlds general-purpose learning coach: a full-file comparison against its upstream (mattpocock/skillsteach, v1.2.3 @068b6e0) plus a research pass on the author's published rationale identified pedagogy we dropped in the port and machinery we have that upstream lacks — this PR repatriates the former, strengthens the latter, and corrects the upstream attribution record that misclassified the relation as "Not adopted".Fix
Eight phases, each its own commit (
dedd0942…96997af8, plus close-outeda4ea1a):/discovery:researchcapped per session → tier 2 research-deep → tier 3/knowledge:map-corpus+ digests), all cross-plugin names presence-gated with fallback chains ending at built-in tools.assets/library — platform-aware default (headless hosts keep markdown), scripted asset splicing (assets never re-pass through model output), answer-shuffling quiz component with a copy-out result block graded in chat; the durable trio (reference, records, glossary) stays markdown.workspace_rootuserConfig (library_dirvalue grammar) → ask-once (machine-local pointer) → OS-Documents default for topic mode (existence-guarded, proper casing, windows-path-emit convention) → plugin-data fallback; codebase mode stays plugin-data by default (cloud-sync privacy); worktrees unified viagit rev-parse --git-common-dir; config token kept out of pre-compute (empirically a load-crash on the fix(skills): pre-compute Class 2 remainder — genuine shell expansion mixed into pre-compute in 5 plugins (canonical tracker; scope in comments, body list superseded) #1687 path).docs/upstream/mattpocock-skills.mdgains the missingteach→education:teachDerived row; v1.2 map row 22 corrected (our mission/glossary/resources context docs are near-verbatim ports of his FORMAT specs).Verification
bash plugins/education/skills/teach/scripts/list-workspaces.test.sh— exit 0 (matrix includes placeholder-unset,$HOME-guard, fake-Documents cases).bash scripts/check-changelog-parity.sh --checkand--check-bump origin/main— both exit 0.TEACH-CANARY-h3rpag-p8reported verbatim by the after-run then removed (grep -c= 0 at HEAD). Honestly-scoped verdict: the Documents rung, HTML-openable branch, and full tier-1 research are mechanically covered (tests + evals) — unwitnessable in the headless dogfood container, and not claimed otherwise. Windows path handling carries an acknowledged manual-verification gap.Related
N/A — upstream reference: mattpocock/skills v1.2.3 (
068b6e0); audit provenance recorded indocs/upstream/mattpocock-skills.md.Approved PLAN.md (Brief + 8-phase plan, published at close-out; contract slice pruned in eda4ea1)
🤖 Generated with Claude Code
https://claude.ai/code/session_01SUiFZXmwMYiqKnQ4RM233y
Generated by Claude Code