Skip to content

feat(teach-me): /teach-me primer + drill plugin (closes #61)#80

Merged
ethanolivertroy merged 1 commit into
mainfrom
feat/teach-me-plugin
Apr 26, 2026
Merged

feat(teach-me): /teach-me primer + drill plugin (closes #61)#80
ethanolivertroy merged 1 commit into
mainfrom
feat/teach-me-plugin

Conversation

@ajy0127

@ajy0127 ajy0127 commented Apr 26, 2026

Copy link
Copy Markdown
Contributor

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-me gets 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 by mattpocock/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-unified and /grc-engineer:frameworks rather than duplicating the SCF client.

The plugin lives at plugins/teach-me/ as a top-level cross-cutting plugin (not under personas/ or frameworks/) — 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

  • Connector
  • Framework plugin
  • Persona plugin
  • Documentation
  • Community / governance
  • CI / automation
  • Other — new top-level plugin (Learning category, cross-cutting)

Schema impact

  • No schema changes
  • schemas/finding.schema.json changed
  • Another schema or contract surface changed

The plugin consumes Findings as references and emits no Findings of its own. No contract surface touched.

Test plan

$ bash tests/validate-plugin-manifests.sh
…
── plugins/teach-me/.claude-plugin/plugin.json
plugins/teach-me/.claude-plugin/plugin.json valid
  ✓ plugins/teach-me/.claude-plugin/plugin.json

Validated 35 manifest(s).
All manifests valid.

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:scope and /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 real grc-engineer commands.

CHANGELOG

  • No CHANGELOG entry needed
  • I added a CHANGELOG entry
  • A maintainer should add the CHANGELOG entry during merge

Entry under [Unreleased] → Added.

Notes for reviewers

  • Legal posture: same as framework plugins — paraphrase, never quote. Every command file and skill prompt restates this rule. Worth scanning the four command files for any accidental verbatim phrasing.
  • No new schema, no scripts, no Findings emission. The plugin is self-contained Markdown commands + skill prompts, structured like plugins/frameworks/singapore-pdpa/ (the scaffold-framework reference shape).
  • Quiz state is in-session only for v0.1. A future version may opt-in write a coverage map to grc-data/learning/; flagged in the skill prompt and command doc.
  • Discoverability: registered in .claude-plugin/marketplace.json after grc-reporter; new "Learning" subsection added to the README plugin-categories area; workflow-table row added.
  • Closes A "/teach-me" -sh skill or plugin to help get up to speed on frameworks and requirements faster #61 (Ethan's original "/teach-me" -ish skill or plugin to help get up to speed on frameworks faster).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added teach-me plugin (v0.1.0) with four learning-focused commands: framework primers, control explanations with implementation guidance, GRC role onboarding resources, and interactive Socratic quizzes.
  • Documentation

    • Added complete documentation for teach-me commands with usage examples, installation instructions, and detailed feature descriptions.

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>
@ajy0127 ajy0127 requested a review from a team as a code owner April 26, 2026 20:20
@coderabbitai

coderabbitai Bot commented Apr 26, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

A new teach-me plugin is introduced to the marketplace and repository, providing educational commands for learning GRC frameworks, controls, and practitioner roles through framework primers, control deep-dives, role onboarding, and interactive quizzes via four new command/skill specifications.

Changes

Cohort / File(s) Summary
Plugin Registration
.claude-plugin/marketplace.json, plugins/teach-me/.claude-plugin/plugin.json
Adds plugin manifest metadata and marketplace entry for teach-me v0.1.0 with source path, description, author, repository, and license information.
Changelog & Documentation
CHANGELOG.md, README.md, plugins/teach-me/README.md
Documents new plugin release, enumerates supported commands (/teach-me:framework, /teach-me:control, /teach-me:role, /teach-me:quiz), installation instructions, and clarifies non-goals and delegation behavior.
Command Specifications
plugins/teach-me/commands/framework.md, plugins/teach-me/commands/control.md, plugins/teach-me/commands/role.md, plugins/teach-me/commands/quiz.md
Defines user-facing command interfaces, expected outputs, runtime delegation patterns, and usage examples for framework primers, control lookups, role onboarding, and Socratic drills.
Skill Specifications
plugins/teach-me/skills/control-explainer/SKILL.md, plugins/teach-me/skills/framework-tutor/SKILL.md, plugins/teach-me/skills/socratic-drill/SKILL.md
Specifies internal skill behaviors including control resolution, cross-framework mapping, paraphrasing guardrails, delegation to existing plugins, and session-scoped quiz tracking without persistence.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

Suggested reviewers

  • ethanolivertroy

Poem

🐰 A teach-me plugin hops into view,
Four commands to help practitioners through,
Frameworks explained with Socratic flair,
Controls unwrapped without copyright glare,
Quiz sessions bloom—no scores kept, but care! 🌱

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat(teach-me): /teach-me primer + drill plugin (closes #61)' directly and clearly describes the main change: adding a teach-me plugin with primer and drill commands.
Linked Issues check ✅ Passed All coding objectives from issue #61 are met: framework primers, control explanations via SCF crosswalk, role-based onboarding, and Socratic drilling with optional inspiration from existing implementations.
Out of Scope Changes check ✅ Passed All changes are directly scoped to issue #61: new teach-me plugin with commands, skills, documentation, manifest registration, and changelog entry. No unrelated modifications detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/teach-me-plugin

Comment @coderabbitai help to get the list of available commands and usage tips.

@greptile-apps

greptile-apps Bot commented Apr 26, 2026

Copy link
Copy Markdown

Greptile Summary

This PR introduces the teach-me plugin — a new top-level "Learning" category plugin providing four commands (/teach-me:framework, /teach-me:control, /teach-me:role, /teach-me:quiz) backed by three skill prompts (framework-tutor, control-explainer, socratic-drill). The plugin is self-contained Markdown, reuses existing SCF client commands, and follows the established plugin structure well. Three minor P2 issues were found: the plugin.json description embeds a \"Closes #61\" issue reference that is noise in a distributed manifest, the framework-tutor skill's output-format instruction says "seven-section primer" but step 3 enumerates eight sections (a mismatch that could cause the model to silently drop a section), and the README quick-start example uses the SCF-IAC-01 prefix format inconsistently with every other ID example in the plugin.

Confidence Score: 5/5

Safe 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

Filename Overview
plugins/teach-me/.claude-plugin/plugin.json New plugin manifest; description field contains "Closes #61" issue reference that is inappropriate for user-facing marketplace text.
plugins/teach-me/README.md Plugin README; quick-start example uses /teach-me:control SCF-IAC-01 with an SCF- prefix that doesn't match the bare ID format (IAC-01) used throughout the rest of the plugin.
plugins/teach-me/skills/framework-tutor/SKILL.md Core tutor skill; step 3 lists 8 primer sections but output format instruction refers to a "seven-section primer," which could cause the model to drop a section.
plugins/teach-me/commands/framework.md Well-specified command doc covering arguments, output shape, delegation chain, constraints, and examples.
plugins/teach-me/commands/control.md Clear command reference with delegation steps; ID resolution logic (SCF/framework/plain-English) is well-documented.
plugins/teach-me/commands/quiz.md Quiz command doc matches the socratic-drill skill's session flow; stop-word list is a subset of the skill's list (minor discrepancy, not user-facing).
plugins/teach-me/commands/role.md Role onboarding command doc; delegation to framework-tutor skill is correctly documented and consistent with SKILL.md.
plugins/teach-me/skills/control-explainer/SKILL.md Well-structured skill prompt; resolution pipeline (SCF → crosswalk → framework plugin notes) is clearly specified; legal/IP guardrails are explicit.
plugins/teach-me/skills/socratic-drill/SKILL.md Detailed session-loop design with coverage-tracking, difficulty levels, evaluation rules, and a defined coverage-summary format; no issues found.
.claude-plugin/marketplace.json teach-me entry added after grc-reporter; entry is valid and well-formed.
CHANGELOG.md CHANGELOG entry added under [Unreleased] → Added; comprehensive single-bullet summary of the new plugin.
README.md Workflow table row and new "Learning" plugin-category subsection added; placement and formatting are consistent with existing sections.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["/teach-me:framework &lt;name&gt;"] -->|invokes| FT["framework-tutor skill"]
    B["/teach-me:role &lt;persona&gt;"] -->|invokes| FT
    C["/teach-me:control &lt;id&gt;"] -->|invokes| CE["control-explainer skill"]
    D["/teach-me:quiz &lt;framework&gt;"] -->|invokes| SD["socratic-drill skill"]

    FT -->|"/grc-engineer:frameworks"| SCF_META["SCF framework metadata"]
    FT -->|"reads"| PLUGIN_EXPERT["plugins/frameworks/&lt;name&gt;/skills/&lt;name&gt;-expert/SKILL.md"]
    FT -->|"reads"| PERSONA_CMDS["plugins/&lt;persona&gt;/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["&lt;framework&gt;-expert SKILL.md"]
Loading

Comments Outside Diff (1)

  1. plugins/teach-me/skills/framework-tutor/SKILL.md, line 435 (link)

    P2 Section count mismatch: "seven-section primer" vs eight sections

    Step 3 in the ## Steps for /teach-me:framework block enumerates eight items (purpose → who must comply → mandatory artifacts → cadence → regulator → control families → common misinterpretations → next commands). The ## Output format section then tells the model to "Use H2 (##) for the seven-section primer," which contradicts the eight-item list above it. A model following the output-format instruction literally may collapse two sections together.

Reviews (1): Last reviewed commit: "feat(teach-me): add /teach-me primer + d..." | Re-trigger Greptile

@@ -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.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 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.

Suggested change
/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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 6249726 and 6b0216d.

📒 Files selected for processing (12)
  • .claude-plugin/marketplace.json
  • CHANGELOG.md
  • README.md
  • plugins/teach-me/.claude-plugin/plugin.json
  • plugins/teach-me/README.md
  • plugins/teach-me/commands/control.md
  • plugins/teach-me/commands/framework.md
  • plugins/teach-me/commands/quiz.md
  • plugins/teach-me/commands/role.md
  • plugins/teach-me/skills/control-explainer/SKILL.md
  • plugins/teach-me/skills/framework-tutor/SKILL.md
  • plugins/teach-me/skills/socratic-drill/SKILL.md

Comment on lines +11 to +13
```
/teach-me:control <control-id> [--lens=<framework>]
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

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.

Comment on lines +11 to +13
```
/teach-me:framework <framework-name> [--background=<level>]
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

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.

Comment on lines +11 to +13
```
/teach-me:quiz <framework> [--focus=<area>] [--difficulty=<level>]
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

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.

Comment on lines +11 to +13
```
/teach-me:role <persona> [--background=<level>]
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 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
done

Repository: 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 -5

Repository: 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 -5

Repository: 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 -B2

Repository: 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.md

Repository: 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.

Suggested change
- 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.

Comment on lines +51 to +58
```
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>
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

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.**

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/<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.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@ethanolivertroy ethanolivertroy merged commit 229e925 into main Apr 26, 2026
4 checks passed
@ethanolivertroy ethanolivertroy deleted the feat/teach-me-plugin branch April 26, 2026 21:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

A "/teach-me" -sh skill or plugin to help get up to speed on frameworks and requirements faster

2 participants