feat(teach-me): /teach-me primer + drill plugin (closes #61)#80
Conversation
Adds the on-ramp the toolkit was missing for new-to-GRC practitioners
and career transitioners. Every other framework plugin assumes the
reader already knows the framework; this one gets them there.
Four commands:
- /teach-me:framework <name> — paraphrased primer (purpose, scope,
artifacts, cadence, regulator,
control families)
- /teach-me:control <id> — one control across every framework it
maps to via the SCF crosswalk
- /teach-me:role <persona> — first-90-days onboarding for the four
GRC personas
- /teach-me:quiz <framework> — Socratic drill loop tracking coverage
in-session, inspired by
mattpocock/skills/grill-me
Three skills (framework-tutor, control-explainer, socratic-drill)
back the commands. Reuses /grc-engineer:map-controls-unified and
/grc-engineer:frameworks rather than duplicating the SCF client.
Same legal posture as the framework plugins: paraphrase only, never
reproduce normative standard text. The user's licensed copy of the
standard remains the source of truth.
Plugin lives at plugins/teach-me/ as a top-level cross-cutting plugin
(not under personas/ or frameworks/), registered in
.claude-plugin/marketplace.json. Manifest passes
tests/validate-plugin-manifests.sh.
Closes #61.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
📝 WalkthroughWalkthroughA new Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Greptile SummaryThis PR introduces the Confidence Score: 5/5Safe to merge — all findings are P2 style/documentation nits with no impact on runtime correctness or plugin schema. The PR is entirely Markdown (command docs, skill prompts, manifest, changelog, README). No executable code, no schema changes, no new contracts. All three identified issues are P2: a noisy issue reference in plugin.json, a seven-vs-eight section count mismatch in a skill prompt, and a copy-paste ID prefix error in the README. None of these block functionality or introduce data/security risk. plugins/teach-me/skills/framework-tutor/SKILL.md (seven vs eight section count), plugins/teach-me/README.md (SCF-IAC-01 prefix), plugins/teach-me/.claude-plugin/plugin.json (issue ref in description) Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A["/teach-me:framework <name>"] -->|invokes| FT["framework-tutor skill"]
B["/teach-me:role <persona>"] -->|invokes| FT
C["/teach-me:control <id>"] -->|invokes| CE["control-explainer skill"]
D["/teach-me:quiz <framework>"] -->|invokes| SD["socratic-drill skill"]
FT -->|"/grc-engineer:frameworks"| SCF_META["SCF framework metadata"]
FT -->|"reads"| PLUGIN_EXPERT["plugins/frameworks/<name>/skills/<name>-expert/SKILL.md"]
FT -->|"reads"| PERSONA_CMDS["plugins/<persona>/commands/"]
CE -->|"/grc-engineer:map-controls-unified"| SCF_XW["SCF crosswalk API"]
CE -->|"reads"| PLUGIN_EXPERT
SD -->|"/grc-engineer:frameworks"| SCF_META
SD -->|"SCF API enumerate controls"| SCF_XW
SD -->|"reads"| PLUGIN_EXPERT_SD["<framework>-expert SKILL.md"]
|
| @@ -0,0 +1,10 @@ | |||
| { | |||
| "name": "teach-me", | |||
| "description": "Teach-me - get up to speed on a framework, control, or GRC role. Socratic primer + drill plugin built for new-to-GRC practitioners and career transitioners. Closes #61.", | |||
There was a problem hiding this comment.
GitHub issue reference in marketplace description
The description field in plugin.json ends with "Closes #61.", which is an issue reference that belongs in git commit messages or PR descriptions — not in a distributed manifest file. When this plugin is consumed via the marketplace, the description will include the raw issue reference text, which is confusing noise for an end user who has no context for that repo issue number.
| /plugin install teach-me@grc-engineering-suite | ||
|
|
||
| /teach-me:framework SOC2 # primer on a framework | ||
| /teach-me:control SCF-IAC-01 # one control across every framework it maps to |
There was a problem hiding this comment.
SCF ID prefix inconsistency in example
/teach-me:control SCF-IAC-01 uses a SCF- prefix that doesn't match the format used everywhere else in the plugin. control.md, control-explainer/SKILL.md, and all other examples consistently use the bare SCF ID IAC-01 (no prefix). A user copying the README example would likely get a "couldn't resolve control ID" failure from the control-explainer skill.
| /teach-me:control SCF-IAC-01 # one control across every framework it maps to | |
| /teach-me:control IAC-01 # one control across every framework it maps to |
There was a problem hiding this comment.
Actionable comments posted: 6
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@plugins/teach-me/commands/control.md`:
- Around line 11-13: Add a language tag to the fenced code blocks to fix MD040:
update the usage fence and the examples fence in
plugins/teach-me/commands/control.md so they start with ```text instead of ```;
target the blocks containing the command usages for /teach-me:control and the
example lines (/teach-me:control IAC-01, /teach-me:control CC6.1 --lens=SOC2,
/teach-me:control "MFA on root accounts", /teach-me:control IA-2 --lens="NIST
800-53") to ensure markdownlint passes.
In `@plugins/teach-me/commands/framework.md`:
- Around line 11-13: The fenced code blocks containing the command examples
(e.g., the usage string "/teach-me:framework <framework-name>
[--background=<level>]" and the example lines like "/teach-me:framework SOC2"
and "/teach-me:framework FedRAMP --background=adjacent") are missing a language
tag and trigger MD040; update both fenced blocks to use a language tag such as
`text` (i.e., change ``` to ```text) so the markdown linter accepts them and the
blocks remain consistent.
In `@plugins/teach-me/commands/quiz.md`:
- Around line 11-13: The markdown code fences in
plugins/teach-me/commands/quiz.md are missing language identifiers (MD040);
update the fenced blocks that contain the command examples (the blocks showing
"/teach-me:quiz <framework> ..." and the later examples like "/teach-me:quiz
SOC2", "/teach-me:quiz FedRAMP ...", "/teach-me:quiz \"ISO 27001\" ...") to
include a language tag (e.g., bash) after the opening ``` so the fences become
```bash to satisfy markdownlint.
In `@plugins/teach-me/commands/role.md`:
- Around line 11-13: Add language identifiers to the fenced code blocks that
show the command usage so they pass MD040: update the triple-backtick fences
around the examples of "/teach-me:role <persona> [--background=<level>]" and the
multi-line examples (including "/teach-me:role grc-engineer", "/teach-me:role
auditor --background=adjacent", "/teach-me:role grc-tprm
--background=practitioner") to use a language tag such as bash (i.e., change ```
to ```bash) so the code blocks include the language identifier.
In `@plugins/teach-me/skills/control-explainer/SKILL.md`:
- Line 22: Update the instruction that calls /grc-engineer:map-controls-unified
so it uses the control identifier as the required positional argument instead of
non-existent flags; specifically replace the current invocation
`/grc-engineer:map-controls-unified --framework=<best-guess>` (and any use of
`--lens=<framework>`) with `/grc-engineer:map-controls-unified
<control-name-or-id>` and, if needed, compute/select the correct
control-name-or-id beforehand (e.g., best-guess framework mapping logic) and
pass that value as the single positional argument to map-controls-unified.
In `@plugins/teach-me/skills/socratic-drill/SKILL.md`:
- Around line 51-58: The fenced code block in SKILL.md lacks a language tag
which triggers markdownlint MD040; update the triple-backtick fence for the
example block in the Socratic-drill content to include a language tag like text
or md (e.g., replace ``` with ```text) so the block becomes fenced with a
language identifier and the lint error is resolved.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 6f0d1a9e-ad49-428d-8d91-d925c79581e0
📒 Files selected for processing (12)
.claude-plugin/marketplace.jsonCHANGELOG.mdREADME.mdplugins/teach-me/.claude-plugin/plugin.jsonplugins/teach-me/README.mdplugins/teach-me/commands/control.mdplugins/teach-me/commands/framework.mdplugins/teach-me/commands/quiz.mdplugins/teach-me/commands/role.mdplugins/teach-me/skills/control-explainer/SKILL.mdplugins/teach-me/skills/framework-tutor/SKILL.mdplugins/teach-me/skills/socratic-drill/SKILL.md
| ``` | ||
| /teach-me:control <control-id> [--lens=<framework>] | ||
| ``` |
There was a problem hiding this comment.
Fix MD040 by tagging fenced command examples.
The usage and examples fences should include a language (text is sufficient) to satisfy markdownlint.
Suggested fix
-```
+```text
/teach-me:control <control-id> [--lens=<framework>]@@
- +text
/teach-me:control IAC-01
/teach-me:control CC6.1 --lens=SOC2
/teach-me:control "MFA on root accounts"
/teach-me:control IA-2 --lens="NIST 800-53"
Also applies to: 42-47
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 11-11: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@plugins/teach-me/commands/control.md` around lines 11 - 13, Add a language
tag to the fenced code blocks to fix MD040: update the usage fence and the
examples fence in plugins/teach-me/commands/control.md so they start with
```text instead of ```; target the blocks containing the command usages for
/teach-me:control and the example lines (/teach-me:control IAC-01,
/teach-me:control CC6.1 --lens=SOC2, /teach-me:control "MFA on root accounts",
/teach-me:control IA-2 --lens="NIST 800-53") to ensure markdownlint passes.
| ``` | ||
| /teach-me:framework <framework-name> [--background=<level>] | ||
| ``` |
There was a problem hiding this comment.
Specify languages on fenced command blocks.
Both fenced blocks trigger MD040 (Line 11 and Line 50). Add a language tag like text for consistency with lint rules.
Suggested fix
-```
+```text
/teach-me:framework <framework-name> [--background=<level>]@@
- +text
/teach-me:framework SOC2
/teach-me:framework FedRAMP --background=adjacent
/teach-me:framework apac-sgp-pdpa-2012 --background=practitioner
/teach-me:framework "ISO 27001"
Also applies to: 50-55
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 11-11: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@plugins/teach-me/commands/framework.md` around lines 11 - 13, The fenced code
blocks containing the command examples (e.g., the usage string
"/teach-me:framework <framework-name> [--background=<level>]" and the example
lines like "/teach-me:framework SOC2" and "/teach-me:framework FedRAMP
--background=adjacent") are missing a language tag and trigger MD040; update
both fenced blocks to use a language tag such as `text` (i.e., change ``` to
```text) so the markdown linter accepts them and the blocks remain consistent.
| ``` | ||
| /teach-me:quiz <framework> [--focus=<area>] [--difficulty=<level>] | ||
| ``` |
There was a problem hiding this comment.
Add language identifiers to fenced code blocks (MD040).
Line 11 and Line 51 code fences should specify a language to satisfy markdownlint.
Suggested fix
-```
+```bash
/teach-me:quiz <framework> [--focus=<area>] [--difficulty=<level>]- +bash
/teach-me:quiz SOC2
/teach-me:quiz FedRAMP --focus=access-control --difficulty=audit-defense
/teach-me:quiz "ISO 27001" --difficulty=apprentice
Also applies to: 51-55
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 11-11: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@plugins/teach-me/commands/quiz.md` around lines 11 - 13, The markdown code
fences in plugins/teach-me/commands/quiz.md are missing language identifiers
(MD040); update the fenced blocks that contain the command examples (the blocks
showing "/teach-me:quiz <framework> ..." and the later examples like
"/teach-me:quiz SOC2", "/teach-me:quiz FedRAMP ...", "/teach-me:quiz \"ISO
27001\" ...") to include a language tag (e.g., bash) after the opening ``` so
the fences become ```bash to satisfy markdownlint.
| ``` | ||
| /teach-me:role <persona> [--background=<level>] | ||
| ``` |
There was a problem hiding this comment.
Add language identifiers to fenced code blocks (MD040).
Line 11 and Line 38 fences should include a language tag (e.g., bash).
Suggested fix
-```
+```bash
/teach-me:role <persona> [--background=<level>]- +bash
/teach-me:role grc-engineer
/teach-me:role auditor --background=adjacent
/teach-me:role grc-tprm --background=practitioner
Also applies to: 38-42
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 11-11: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@plugins/teach-me/commands/role.md` around lines 11 - 13, Add language
identifiers to the fenced code blocks that show the command usage so they pass
MD040: update the triple-backtick fences around the examples of "/teach-me:role
<persona> [--background=<level>]" and the multi-line examples (including
"/teach-me:role grc-engineer", "/teach-me:role auditor --background=adjacent",
"/teach-me:role grc-tprm --background=practitioner") to use a language tag such
as bash (i.e., change ``` to ```bash) so the code blocks include the language
identifier.
|
|
||
| 1. **Resolve the control reference.** | ||
| - If the input matches an SCF ID pattern (e.g. `IAC-01`, `CHG-02`), use it directly. | ||
| - If the input matches a framework-specific ID (e.g. `CC6.1`, `IA-2`, `8.3`, `Req 7.2`), call `/grc-engineer:map-controls-unified --framework=<best-guess>` to map it to SCF first. If `--lens=<framework>` is provided, use that as the lens. |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify whether map-controls-unified docs define --framework/--lens flags.
set -euo pipefail
fd -i "map-controls-unified.md" plugins | while read -r f; do
echo "== $f =="
rg -n -- '--framework|--lens|Usage|/grc-engineer:map-controls-unified' "$f" -C2
doneRepository: GRCEngClub/claude-grc-engineering
Length of output: 801
🏁 Script executed:
# Find the actual command implementation for map-controls-unified
fd -i "map-controls-unified" plugins/grc-engineer/commands --type f | grep -v ".md$" | head -5Repository: GRCEngClub/claude-grc-engineering
Length of output: 59
🏁 Script executed:
# Also check if there's a scripts directory with the implementation
fd -i "map-controls-unified" plugins/grc-engineer/scripts --type f | head -5Repository: GRCEngClub/claude-grc-engineering
Length of output: 59
🏁 Script executed:
# Search for any references to --framework or --lens flags in grc-engineer plugin
rg -i '\-\-framework|\-\-lens' plugins/grc-engineer/ -A2 -B2Repository: GRCEngClub/claude-grc-engineering
Length of output: 59
🏁 Script executed:
# Read the actual SKILL.md file to see full context
cat plugins/teach-me/skills/control-explainer/SKILL.mdRepository: GRCEngClub/claude-grc-engineering
Length of output: 3562
Line 22 references unsupported flags for /grc-engineer:map-controls-unified.
The skill instructs calling /grc-engineer:map-controls-unified --framework=<best-guess> with --lens=<framework>, but the actual command documentation only accepts a positional argument: /grc-engineer:map-controls-unified <control-name-or-id>. These flags do not exist in the grc-engineer plugin. This will cause the skill to fail when resolving framework-specific IDs.
Correct line 22 to pass the control ID as a positional argument instead:
Diff
- - If the input matches a framework-specific ID (e.g. `CC6.1`, `IA-2`, `8.3`, `Req 7.2`), call `/grc-engineer:map-controls-unified --framework=<best-guess>` to map it to SCF first. If `--lens=<framework>` is provided, use that as the lens.
+ - If the input matches a framework-specific ID (e.g. `CC6.1`, `IA-2`, `8.3`, `Req 7.2`), call `/grc-engineer:map-controls-unified <control-id>` to map it to SCF first.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - If the input matches a framework-specific ID (e.g. `CC6.1`, `IA-2`, `8.3`, `Req 7.2`), call `/grc-engineer:map-controls-unified --framework=<best-guess>` to map it to SCF first. If `--lens=<framework>` is provided, use that as the lens. | |
| - If the input matches a framework-specific ID (e.g. `CC6.1`, `IA-2`, `8.3`, `Req 7.2`), call `/grc-engineer:map-controls-unified <control-id>` to map it to SCF first. |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@plugins/teach-me/skills/control-explainer/SKILL.md` at line 22, Update the
instruction that calls /grc-engineer:map-controls-unified so it uses the control
identifier as the required positional argument instead of non-existent flags;
specifically replace the current invocation `/grc-engineer:map-controls-unified
--framework=<best-guess>` (and any use of `--lens=<framework>`) with
`/grc-engineer:map-controls-unified <control-name-or-id>` and, if needed,
compute/select the correct control-name-or-id beforehand (e.g., best-guess
framework mapping logic) and pass that value as the single positional argument
to map-controls-unified.
| ``` | ||
| Coverage so far: | ||
| Covered (n): <list of control families touched> | ||
| Uncovered (n): <list of control families not yet touched> | ||
| Weak spots (n): <list of families where answers were partial or wrong> | ||
|
|
||
| Suggested next focus: <family the skill recommends> | ||
| ``` |
There was a problem hiding this comment.
Add a language tag to the fenced example block.
Markdownlint MD040 is triggered here; please annotate the fence (e.g., text or md) to keep docs lint-clean.
Suggested fix
-```
+```text
Coverage so far:
Covered (n): <list of control families touched>
Uncovered (n): <list of control families not yet touched>
Weak spots (n): <list of families where answers were partial or wrong>
Suggested next focus: <family the skill recommends></details>
<details>
<summary>🧰 Tools</summary>
<details>
<summary>🪛 markdownlint-cli2 (0.22.1)</summary>
[warning] 51-51: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
</details>
</details>
<details>
<summary>🤖 Prompt for AI Agents</summary>
Verify each finding against the current code and only fix it if needed.
In @plugins/teach-me/skills/socratic-drill/SKILL.md around lines 51 - 58, The
fenced code block in SKILL.md lacks a language tag which triggers markdownlint
MD040; update the triple-backtick fence for the example block in the
Socratic-drill content to include a language tag like text or md (e.g., replace
withtext) so the block becomes fenced with a language identifier and the
lint error is resolved.
</details>
<!-- fingerprinting:phantom:triton:hawk:7c36d95c-6a83-4b8b-9a68-bb7994f417ca -->
<!-- d98c2f50 -->
<!-- This is an auto-generated comment by CodeRabbit -->
|
|
||
| ## Steps | ||
|
|
||
| 1. **Resolve the control reference.** |
There was a problem hiding this comment.
Path-derivation issue: this rule (skills/<framework>-expert/SKILL.md) doesn't hold for several shipped plugins. iso27001 exposes iso-expert, nist-800-53 exposes nist-expert, csa-ccm exposes ccm-expert. If the explainer mechanically derives the path from the plugin slug it will silently miss those framework-specific notes. Suggest either (a) globbing plugins/frameworks/<slug>/skills/*-expert/SKILL.md and reading whichever exists, or (b) calling out in the skill that the lookup is fuzzy and not a strict slug match. Not a blocker, but worth a one-line clarification so future readers don't trust the convention as written.
| 3. **Point, don't lecture.** After every section, name the next command to run in this toolkit (`/<framework>:scope`, `/teach-me:control <id>`, `/grc-engineer:gap-assessment`). The primer is an on-ramp; the framework-specific plugin is where they go next. | ||
| 4. **Cite control IDs, not control text.** "FedRAMP Rev 5 has the AC family covering access control" — yes. "AC-2 says...[verbatim]" — no. | ||
| 5. **Flag legal exposure.** ITAR / EAR / national export controls / GDPR / breach-notification rules can have legal consequences. When the framework has any of these dimensions, point at the framework plugin's disclaimer rather than giving advice. | ||
|
|
There was a problem hiding this comment.
Same naming-convention issue here as in control-explainer: skills/<name>-expert/SKILL.md won't resolve for iso27001 (iso-expert), nist-800-53 (nist-expert), or csa-ccm (ccm-expert). For a tutor that is supposed to not invent anything, the silent miss on real framework-author notes is the worst failure mode. A glob over plugins/frameworks/<slug>/skills/*-expert/ is one line in the skill prompt and would be robust to future renames too.
| 1. **Resolve the framework name.** Accept common names (`SOC2`, `SOC 2`, `FedRAMP`, `FedRAMP Rev 5`, `ISO 27001`, `ISO/IEC 27001:2022`), SCF framework IDs (`apac-sgp-pdpa-2012`, `us-fedramp-rev5`), and reasonable typos. If ambiguous, list the matches and ask. Use the `/grc-engineer:frameworks` discovery command for the canonical list and SCF IDs. | ||
| 2. **Check plugin coverage.** If a dedicated plugin exists in `plugins/frameworks/<name>/`, read its `skills/<name>-expert/SKILL.md` for the framework-specific context the plugin author left. If no plugin exists, use SCF crosswalk data from [`grcengclub.github.io/scf-api`](https://grcengclub.github.io/scf-api/) and tell the learner the toolkit's plugin coverage is at "Stub" or "Crosswalk-only" depth. | ||
| 3. **Produce the primer in this order**: one-paragraph purpose → who must comply → mandatory artifacts → cadence → regulator → control families at a glance → common misinterpretations → next commands. | ||
| 4. **End with three concrete next commands.** At minimum: `/<framework>:scope` (or its closest equivalent), `/teach-me:control <id>` for the most central control of the framework, and `/grc-engineer:gap-assessment <framework>` once the learner has a connector configured. |
There was a problem hiding this comment.
/<framework>:scope doesn't exist as a convention in this toolkit. Today only singapore-pdpa and cyber-essentials-plus ship a scope.md command — SOC 2 starts at /soc2:assess, FedRAMP Rev 5 at /fedramp-rev5:baseline-select or /fedramp-rev5:assess. Recommending it as the universal next step will mis-direct learners on the most common frameworks. Suggest the tutor read plugins/frameworks/<slug>/commands/ and pick the actual entry-point command per framework rather than naming a convention that isn't there.
|
|
||
| ## Session flow | ||
|
|
||
| 1. **Initialize.** Resolve the framework name. Pull its SCF-mapped control list. Build a coverage map keyed by control family. If `--focus=<area>` was passed, restrict the control pool to that area. |
There was a problem hiding this comment.
Honest-evaluation rule is the right call but worth strengthening: in practice models drift toward sandbagging when a user pushes back. Consider an explicit clause: "if the user disagrees with an evaluation, do not concede unless they cite a specific control requirement or threat model that contradicts your reasoning. Drill quality collapses if every wrong answer becomes 'partially correct' on protest." Cheap addition, big effect on whether this is actually a useful study aid versus a flatterer.
|
|
||
| ## Delegation | ||
|
|
||
| The `framework-tutor` skill is invoked. It reads: |
There was a problem hiding this comment.
Minor consistency nit: this command delegates to framework-tutor, but the role-onboarding logic is meaningfully different from the framework-primer logic (persona plugin command surface, MAINTAINERS lookup, first-90-days narrative, no SCF crosswalk). Folding both into one skill works for v0.1 but the skill prompt is going to grow in two directions. If you split later, role-onboarder is the natural name. Not blocking — just noting before the prompt accretes.
Summary
Adds the on-ramp the toolkit was missing for new-to-GRC practitioners and career transitioners. Every other framework plugin assumes the reader already knows the framework —
/teach-megets them there.Four commands:
/teach-me:framework <name>— paraphrased primer (purpose, scope, mandatory artifacts, cadence, regulator, control families). No normative text./teach-me:control <id>— one control across every framework it maps to via the SCF crosswalk. Resolves SCF IDs, framework-specific IDs, and plain-English descriptions./teach-me:role <persona>— first-90-days onboarding for the four GRC personas (grc-engineer,grc-auditor,grc-internal,grc-tprm)./teach-me:quiz <framework>— Socratic drill loop tracking coverage in-session, inspired bymattpocock/skills/grill-me. Application questions, not definition lookups.Three skills back the commands:
framework-tutor,control-explainer,socratic-drill. The plugin reuses/grc-engineer:map-controls-unifiedand/grc-engineer:frameworksrather than duplicating the SCF client.The plugin lives at
plugins/teach-me/as a top-level cross-cutting plugin (not underpersonas/orframeworks/) — it serves an audience that cuts across both. A new "Learning" subsection in the README's plugin-categories area makes the placement explicit.Closes #61.
Type of change
Schema impact
schemas/finding.schema.jsonchangedThe plugin consumes Findings as references and emits no Findings of its own. No contract surface touched.
Test plan
Functional dogfood is on the reviewer / merge — install the plugin and run:
/teach-me:framework SOC2— should produce a primer that names the five TSCs, points at/soc2:scopeand/soc2:assess, and does not reproduce TSP-100 text./teach-me:control IAC-01— pulls the SCF crosswalk, lists mapped framework controls./teach-me:quiz FedRAMP— runs at least 3 Socratic Q&A turns, prints a coverage summary./teach-me:role grc-engineer— produces a first-90-days narrative referencing realgrc-engineercommands.CHANGELOG
Entry under
[Unreleased] → Added.Notes for reviewers
plugins/frameworks/singapore-pdpa/(thescaffold-frameworkreference shape).grc-data/learning/; flagged in the skill prompt and command doc..claude-plugin/marketplace.jsonaftergrc-reporter; new "Learning" subsection added to the README plugin-categories area; workflow-table row added.🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
teach-meplugin (v0.1.0) with four learning-focused commands: framework primers, control explanations with implementation guidance, GRC role onboarding resources, and interactive Socratic quizzes.Documentation