ronin-skillforce 0.1.0 → 0.2.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/LICENSE +202 -21
  3. package/NOTICE +19 -0
  4. package/README.md +38 -5
  5. package/bin/cli.js +15 -3
  6. package/bin/commands/archive.js +192 -0
  7. package/bin/commands/capstone-status.js +82 -0
  8. package/bin/commands/create.js +69 -12
  9. package/bin/commands/import.js +5 -5
  10. package/bin/commands/status.js +1 -1
  11. package/bin/commands/studio-autostart.js +414 -0
  12. package/bin/commands/studio-state.js +159 -0
  13. package/bin/commands/studio.js +351 -17
  14. package/bin/commands/trail.js +153 -3
  15. package/bin/commands/web.js +8 -10
  16. package/bin/course-reader.js +6 -15
  17. package/bin/platforms/_shared.js +154 -28
  18. package/bin/platforms/claude.js +23 -42
  19. package/bin/platforms/cursor.js +23 -20
  20. package/bin/platforms/gemini.js +18 -19
  21. package/bin/platforms/opencode.js +47 -28
  22. package/package.json +5 -4
  23. package/plugin.json +1 -1
  24. package/shared/SKILL.md +102 -72
  25. package/shared/agents/coach.md +19 -16
  26. package/shared/agents/navigator.md +27 -34
  27. package/shared/agents/professor.md +16 -34
  28. package/shared/agents/researcher.md +1 -1
  29. package/shared/agents/spotter.md +3 -4
  30. package/shared/commands/professor/archive.md +65 -72
  31. package/shared/commands/professor/capstone-review.md +5 -5
  32. package/shared/commands/professor/capstone.md +3 -3
  33. package/shared/commands/professor/done.md +59 -31
  34. package/shared/commands/professor/hint.md +14 -2
  35. package/shared/commands/professor/navigator.md +27 -1
  36. package/shared/commands/professor/new-topic.md +3 -3
  37. package/shared/commands/professor/next.md +9 -5
  38. package/shared/commands/professor/note.md +6 -6
  39. package/shared/commands/professor/progress.md +1 -1
  40. package/shared/commands/professor/publish.md +5 -5
  41. package/shared/commands/professor/quiz.md +2 -2
  42. package/shared/commands/professor/recall.md +1 -1
  43. package/shared/commands/professor/review.md +14 -0
  44. package/shared/commands/professor/skill-export.md +3 -4
  45. package/shared/commands/professor/spotter.md +21 -4
  46. package/shared/commands/professor/stuck.md +24 -0
  47. package/shared/commands/professor/switch.md +1 -1
  48. package/shared/commands/professor/syllabus.md +1 -1
  49. package/shared/commands/professor/template-export.md +2 -2
  50. package/shared/commands/professor/worktrees.md +3 -7
  51. package/shared/hooks/pre-compact.js +4 -15
  52. package/studio/dist/assets/BetaReportPanel-BJ9HIAnz.js +1 -0
  53. package/studio/dist/assets/{Capstone-Cv9kH6LY.js → Capstone-CoUU-jP7.js} +1 -1
  54. package/studio/dist/assets/{CodeWorkspace-BwCEINWo.js → CodeWorkspace-BNrL4qvR.js} +2 -2
  55. package/studio/dist/assets/{Course-BJ_hafUP.js → Course-BMGTXus_.js} +1 -1
  56. package/studio/dist/assets/{Editor-CV0mNhlz.js → Editor-Cw9j3cnp.js} +1 -1
  57. package/studio/dist/assets/{Home-C1ry89ak.js → Home-D2woITq5.js} +1 -1
  58. package/studio/dist/assets/{Lesson-2e9TD9yL.js → Lesson-CYQhrDCZ.js} +2 -2
  59. package/studio/dist/assets/{NewCourse-BZeOg2xn.js → NewCourse-CMpwVRQb.js} +1 -1
  60. package/studio/dist/assets/{Progress-CRc_xEWC.js → Progress-2rS19Fur.js} +1 -1
  61. package/studio/dist/assets/{Review-6QEbHEfk.js → Review-SlqK-hjp.js} +1 -1
  62. package/studio/dist/assets/{Settings-NFnqVQui.js → Settings-t42u7n9H.js} +1 -1
  63. package/studio/dist/assets/{TutorPanel-DXQ6Z3BY.js → TutorPanel-DQDWIU7f.js} +3 -3
  64. package/studio/dist/assets/{abnfDiagram-WEYOIA3C-qeSjKlGM.js → abnfDiagram-WEYOIA3C-jTUmGBuB.js} +1 -1
  65. package/studio/dist/assets/{anthropic-D7NiQCUH.js → anthropic-iIm2l85r.js} +3 -3
  66. package/studio/dist/assets/{architecture-WOLXFQ4H-COG-m35l.js → architecture-WOLXFQ4H-Ch9Ld_vv.js} +1 -1
  67. package/studio/dist/assets/{architectureDiagram-ZHVYKT53-VO7uKoeD.js → architectureDiagram-ZHVYKT53-Dy-z6wsy.js} +1 -1
  68. package/studio/dist/assets/{blockDiagram-RJAE7QA3-BGJF_qiL.js → blockDiagram-RJAE7QA3-2fHVrc6N.js} +1 -1
  69. package/studio/dist/assets/{bridge-BTh0AeNX.js → bridge-Cr0q4rLp.js} +1 -1
  70. package/studio/dist/assets/{c4Diagram-XDPPPE54-C-S10RgU.js → c4Diagram-XDPPPE54-BuuKlG4V.js} +1 -1
  71. package/studio/dist/assets/{capstone-Amn6Hztq.js → capstone-DhwBeNqk.js} +1 -1
  72. package/studio/dist/assets/{card-store-BrbrtX9w.js → card-store-CVMBc-Pv.js} +1 -1
  73. package/studio/dist/assets/channel-M_JkdHrL.js +1 -0
  74. package/studio/dist/assets/{chunk-2E7WHVMD-fv-iqTyC.js → chunk-2E7WHVMD-lZdQWttk.js} +1 -1
  75. package/studio/dist/assets/{chunk-4EMNKR2T-CY9IZrgv.js → chunk-4EMNKR2T-C6kbMwke.js} +1 -1
  76. package/studio/dist/assets/{chunk-55XCU76K-DyTZz7v_.js → chunk-55XCU76K-rkBzkZog.js} +1 -1
  77. package/studio/dist/assets/{chunk-7S6XSTFO-BNMzTLRW.js → chunk-7S6XSTFO-Skg347QF.js} +1 -1
  78. package/studio/dist/assets/{chunk-AQDTSKZB-CEYANohH.js → chunk-AQDTSKZB-0pSDBJ23.js} +1 -1
  79. package/studio/dist/assets/{chunk-DSNLSHJZ-CDk5EXjH.js → chunk-DSNLSHJZ-BaeQDl2i.js} +1 -1
  80. package/studio/dist/assets/{chunk-HAGFOTED-hNAi1zh_.js → chunk-HAGFOTED-BEm00juw.js} +1 -1
  81. package/studio/dist/assets/{chunk-HNE4Q36P-COJnSYoZ.js → chunk-HNE4Q36P-DyCR-LvS.js} +1 -1
  82. package/studio/dist/assets/{chunk-NQOKRVIF-BU6KVxRr.js → chunk-NQOKRVIF-BNJ9uMmB.js} +1 -1
  83. package/studio/dist/assets/{chunk-UHW7PFBP-DYvxL9JG.js → chunk-UHW7PFBP-DqJczBLs.js} +1 -1
  84. package/studio/dist/assets/{chunk-VQ5W62QI-CuRfk65j.js → chunk-VQ5W62QI-CVWYSP5Q.js} +1 -1
  85. package/studio/dist/assets/{chunk-WQQL4CDK-KaG7x-Mb.js → chunk-WQQL4CDK-DJf0Dx05.js} +1 -1
  86. package/studio/dist/assets/{chunk-YZO67HFG-DbuqIZmk.js → chunk-YZO67HFG-BFUm_JHA.js} +1 -1
  87. package/studio/dist/assets/{chunk-ZAUX2LTX-bk4ivUmc.js → chunk-ZAUX2LTX-C5ETkkSE.js} +1 -1
  88. package/studio/dist/assets/{chunk-ZCHMQSOR-B_LElfwh.js → chunk-ZCHMQSOR-WVX9r9PZ.js} +1 -1
  89. package/studio/dist/assets/{classDiagram-v2-4MYWR3UA-DtCJ6H_X.js → classDiagram-v2-4MYWR3UA-CI77SpuR.js} +1 -1
  90. package/studio/dist/assets/{course-export-DpaOTT3a.js → course-export-C8jSPuda.js} +1 -1
  91. package/studio/dist/assets/{cynefin-EF2NZ3EQ-D9btHJvU.js → cynefin-EF2NZ3EQ-CLffmM25.js} +1 -1
  92. package/studio/dist/assets/{cynefinDiagram-WF24UDRP-CsFJuv27.js → cynefinDiagram-WF24UDRP-BvLwocOb.js} +1 -1
  93. package/studio/dist/assets/{dagre-NK4GIZVX-Cg1Duec7.js → dagre-NK4GIZVX-C2nMAVdh.js} +1 -1
  94. package/studio/dist/assets/{diagram-CBK3MWTC-_KU2m5gd.js → diagram-CBK3MWTC-Bid-pdax.js} +1 -1
  95. package/studio/dist/assets/{diagram-I5XIIV2D-5RaBrwUA.js → diagram-I5XIIV2D-DYJeAvzl.js} +1 -1
  96. package/studio/dist/assets/{diagram-ODIL2UCW-C0VKxoD3.js → diagram-ODIL2UCW-B06X2r_F.js} +1 -1
  97. package/studio/dist/assets/{diagram-PFBEJUXE-BaHcZEP2.js → diagram-PFBEJUXE-CwY--5Rz.js} +1 -1
  98. package/studio/dist/assets/{diagram-RJA3I4VV-cwSAZ90p.js → diagram-RJA3I4VV-4SqhH8zw.js} +1 -1
  99. package/studio/dist/assets/{diagram-TYUNFSNR-BJImxCEN.js → diagram-TYUNFSNR-CrW4AIM9.js} +1 -1
  100. package/studio/dist/assets/{ebnfDiagram-V4P3TTPT-OQQLRXcm.js → ebnfDiagram-V4P3TTPT-xeoCmH-d.js} +1 -1
  101. package/studio/dist/assets/{elk-QONTBCTQ-BJGhQHxQ.js → elk-QONTBCTQ-Dadmz6iS.js} +1 -1
  102. package/studio/dist/assets/{erDiagram-KYQIGQAA-D91EKSep.js → erDiagram-KYQIGQAA-CSuH0bbF.js} +1 -1
  103. package/studio/dist/assets/{eventmodeling-K75KTNOO-DgdTRgnw.js → eventmodeling-K75KTNOO-CciVfx3I.js} +1 -1
  104. package/studio/dist/assets/flowDiagram-IUGLLWBU-DgNR54qK.js +1 -0
  105. package/studio/dist/assets/{ganttDiagram-R7GPNTJY-CSYLPWEI.js → ganttDiagram-R7GPNTJY-C0wtA-2y.js} +1 -1
  106. package/studio/dist/assets/{gitGraph-VSP46ZUC-D6GWaV9y.js → gitGraph-VSP46ZUC-BXoDzaA3.js} +1 -1
  107. package/studio/dist/assets/{gitGraphDiagram-PDYL7XHY-CaV31bvT.js → gitGraphDiagram-PDYL7XHY-vZBlNRPe.js} +1 -1
  108. package/studio/dist/assets/{index-DioXTZVc.js → index-CS8XPYbB.js} +2 -2
  109. package/studio/dist/assets/{info-OHQRW6UA-BN-x8GoN.js → info-OHQRW6UA-bs2Qpf7P.js} +1 -1
  110. package/studio/dist/assets/{infoDiagram-MVDRKAX5-CIose_cy.js → infoDiagram-MVDRKAX5-rPJio6-1.js} +1 -1
  111. package/studio/dist/assets/{ishikawaDiagram-HPEHV2GE-DCihSNBw.js → ishikawaDiagram-HPEHV2GE-CXf9XFff.js} +1 -1
  112. package/studio/dist/assets/{journeyDiagram-BOSHW7O7-Bz3o3RIX.js → journeyDiagram-BOSHW7O7-C3MSH79o.js} +1 -1
  113. package/studio/dist/assets/{kanban-definition-FNSA4HC5-BUyqvlFE.js → kanban-definition-FNSA4HC5-Bdh7SB4n.js} +1 -1
  114. package/studio/dist/assets/{line-B08T8KlK.js → line-CHkoQXJF.js} +1 -1
  115. package/studio/dist/assets/{mermaid-parser.core-BYwreSUy.js → mermaid-parser.core-Do1oxD1S.js} +3 -3
  116. package/studio/dist/assets/{mermaid.core-DTO1oDmq.js → mermaid.core-DgZUD0sU.js} +4 -4
  117. package/studio/dist/assets/{mindmap-definition-6OY57UG3-BGLwKheY.js → mindmap-definition-6OY57UG3-PUaK6oE_.js} +1 -1
  118. package/studio/dist/assets/{node.browser-BISniYn8.js → node.browser-DkpMze_r.js} +1 -1
  119. package/studio/dist/assets/{ollama-De5w84tG.js → ollama-bJNp3jaD.js} +1 -1
  120. package/studio/dist/assets/{openai-compatible-Joy1oK3L.js → openai-compatible-0tmAyMlN.js} +1 -1
  121. package/studio/dist/assets/{packet-JDAUHWVQ-CDIMjHS_.js → packet-JDAUHWVQ-vf2FtqFr.js} +1 -1
  122. package/studio/dist/assets/{pegDiagram-ECIUJNBX-DWXm4mwS.js → pegDiagram-ECIUJNBX-NEVrgPTY.js} +1 -1
  123. package/studio/dist/assets/{pie-XZMESJXO-CY3QQiKZ.js → pie-XZMESJXO-BIWydVNZ.js} +1 -1
  124. package/studio/dist/assets/{pieDiagram-GNMPY74T-M1aCnI7W.js → pieDiagram-GNMPY74T-BI9_u6rT.js} +1 -1
  125. package/studio/dist/assets/{quadrantDiagram-D57K4MC3-BFFtO7U5.js → quadrantDiagram-D57K4MC3-ryNpoBC5.js} +1 -1
  126. package/studio/dist/assets/{radar-ABXABTNO-DT0W4_Xn.js → radar-ABXABTNO-D8TjnvBB.js} +1 -1
  127. package/studio/dist/assets/{railroad-I3PHUGI6-_VCpgZR5.js → railroad-I3PHUGI6-BmEDV5kf.js} +1 -1
  128. package/studio/dist/assets/{railroad-abnf-LNEFI6M7-DkSpQ5YY.js → railroad-abnf-LNEFI6M7-Cs_sArMc.js} +1 -1
  129. package/studio/dist/assets/{railroad-ebnf-DWYD2UWJ-BqWILdGb.js → railroad-ebnf-DWYD2UWJ-DYuCq46d.js} +1 -1
  130. package/studio/dist/assets/{railroad-peg-JR7BVNR7-BB0bQL-Z.js → railroad-peg-JR7BVNR7-BcXSgdMy.js} +1 -1
  131. package/studio/dist/assets/{railroadDiagram-Y72NRBL7-CjLKjIdJ.js → railroadDiagram-Y72NRBL7-DBcc8b2c.js} +1 -1
  132. package/studio/dist/assets/{rehype-katex-C-sKddsH.js → rehype-katex-BfUIq5As.js} +1 -1
  133. package/studio/dist/assets/{remark-math-C-ox67hE.js → remark-math-XvZOjmDO.js} +1 -1
  134. package/studio/dist/assets/{requirementDiagram-EQYSW5RA-CnwzZqR8.js → requirementDiagram-EQYSW5RA-CVcBgM1L.js} +1 -1
  135. package/studio/dist/assets/{sankeyDiagram-SY24JHO5-CPDugTUl.js → sankeyDiagram-SY24JHO5-DjZ81hDs.js} +1 -1
  136. package/studio/dist/assets/{sequenceDiagram-BLEHNHQU-1dLfeU9Y.js → sequenceDiagram-BLEHNHQU-BNwOa2S7.js} +1 -1
  137. package/studio/dist/assets/{stateDiagram-v2-A6IESKWZ-DR7CmEjj.js → stateDiagram-v2-A6IESKWZ-BFWa5lEx.js} +1 -1
  138. package/studio/dist/assets/{swimlanes-B3ENRKFQ-BAWB9omQ.js → swimlanes-B3ENRKFQ-LfM_Jg6Z.js} +1 -1
  139. package/studio/dist/assets/swimlanesDiagram-AYQRV4AK-BDmpoiGp.js +8 -0
  140. package/studio/dist/assets/{timeline-definition-JXYKGLGB-DNkj8z77.js → timeline-definition-JXYKGLGB-BwGzkWgZ.js} +1 -1
  141. package/studio/dist/assets/{treeView-D4JQ5SDB-BA-ouhMb.js → treeView-D4JQ5SDB-MLk3VuRt.js} +1 -1
  142. package/studio/dist/assets/{treemap-SAJKECNS-BrrGxsAb.js → treemap-SAJKECNS-D8iSjp7L.js} +1 -1
  143. package/studio/dist/assets/{usecaseDiagram-WPOLBNNX-BB3D0Dt_.js → usecaseDiagram-WPOLBNNX-BqxpaNlT.js} +1 -1
  144. package/studio/dist/assets/{vennDiagram-Q3Y3IDCW-BrtqtKTE.js → vennDiagram-Q3Y3IDCW-CpeUDMhQ.js} +1 -1
  145. package/studio/dist/assets/{wardley-7MLQ67FV-BKkemDql.js → wardley-7MLQ67FV-tAMbCZAj.js} +1 -1
  146. package/studio/dist/assets/{wardleyDiagram-IVAIDKWA-DFnI3P5z.js → wardleyDiagram-IVAIDKWA-CDJViWzt.js} +1 -1
  147. package/studio/dist/assets/{xychartDiagram-4URNHDU4-Da0DZG_q.js → xychartDiagram-4URNHDU4-CwaQrd3_.js} +1 -1
  148. package/studio/dist/index.html +1 -1
  149. package/templates/claude/plugin.json +1 -1
  150. package/templates/gemini/GEMINI.md +18 -16
  151. package/web/server.js +3 -3
  152. package/studio/dist/assets/BetaReportPanel-8NrDLiPm.js +0 -1
  153. package/studio/dist/assets/channel-SJiUQu_N.js +0 -1
  154. package/studio/dist/assets/flowDiagram-IUGLLWBU-CVnJYMum.js +0 -1
  155. package/studio/dist/assets/swimlanesDiagram-AYQRV4AK-qeuHru16.js +0 -8
@@ -9,10 +9,10 @@ description: >
9
9
  professor:export, professor:note, professor:archive, professor:publish, professor:skill-export),
10
10
  when user says "teach me X", "I want to learn X", "create a course for X",
11
11
  "help me understand X", or asks for code review on a learning topic.
12
- At every session start, checks learning/ first, then courses/ (legacy), in the
12
+ At every session start, checks learning/ in the
13
13
  current working directory to restore course context before responding.
14
14
  NEVER writes working code for the user — guides, questions, and instructs only.
15
- tools: Read, Write, Bash, WebSearch
15
+ tools: Read, Write, Edit, Bash, WebSearch, WebFetch
16
16
  model: inherit
17
17
  color: blue
18
18
  ---
@@ -40,30 +40,24 @@ You are **Professor Claude** — a Socratic technology mentor. Your job is to he
40
40
 
41
41
  **ALWAYS do this first, before responding to any other message, at the start of every conversation:**
42
42
 
43
- 1. Check for course directories in this order of priority:
44
- - First: `learning/` directory (new worktree-based courses)
45
- - Then: `courses/` directory (legacy courses)
43
+ 1. Check for course directories in `learning/` (every course lives there).
46
44
 
47
45
  2. Depending on what you find, respond as follows:
48
46
 
49
- **Scenario A — No course directories found or both are empty:**
47
+ **Scenario A — No course directories found or `learning/` is empty:**
50
48
  > "No active course found. I'm Professor Claude — a Socratic learning assistant. Run `/professor:new-topic` to start your first course."
51
49
 
52
- **Scenario B — Exactly one course found (in either directory):**
53
- - If in `learning/{slug}/COURSE.md`: Read that file
54
- - If in `courses/{slug}/COURSE.md`: Read that file
50
+ **Scenario B — Exactly one course found:**
51
+ - Read `learning/{slug}/COURSE.md`
55
52
  - Greet with brief status:
56
53
  > "Welcome back! You're on [Topic] — Section [N]: [Name]. Status: [In progress / Not started]. Ready to continue?"
57
54
 
58
55
  **Scenario C — Multiple courses found:**
59
- - Check both `learning/` and `courses/` directories
60
56
  - Ask the user which course to resume
61
57
  - List all course names with their "Last active" dates and location so the user can choose. Example:
62
58
  > "You have [N] active courses. Which one would you like to continue?
63
59
  > 1. [Topic A] (learning/) — last active [date]
64
- > 2. [Topic B] (courses/) — last active [date]"
65
-
66
- **Priority handling:** When courses exist in both `learning/` and `courses/` directories, list all options. Let the user choose which to resume. The `learning/` structure is the new default for new courses.
60
+ > 2. [Topic B] (learning/) — last active [date]"
67
61
 
68
62
  After context is restored, proceed with whatever command or message the user sent.
69
63
 
@@ -87,7 +81,7 @@ Whenever a professor command is executed, update streak tracking and check for d
87
81
  After reading COURSE.md and greeting the user, check for retention duties:
88
82
 
89
83
  1. **Check if SCHEDULE.md exists** in the course directory
90
- - Path: `learning/{slug}/SCHEDULE.md` or `courses/{slug}/SCHEDULE.md`
84
+ - Path: `learning/{slug}/SCHEDULE.md`
91
85
 
92
86
  2. **If SCHEDULE.md exists, check Review Queue:**
93
87
  - Count overdue sections (due date < today)
@@ -146,9 +140,9 @@ After reading COURSE.md and greeting the user, check for retention duties:
146
140
 
147
141
  Every course lives in a folder. All state — syllabus, progress, completed sections — is stored in a small set of files.
148
142
 
149
- **CRITICAL: All course paths are relative to the current working directory where the user runs Claude — NOT the plugin installation directory (e.g., `~/.claude/plugins/professor/`). Never look for `courses/` or `learning/` inside the plugin directory. Always resolve paths from `cwd`.**
143
+ **CRITICAL: All course paths are relative to the current working directory where the user runs Claude — NOT the plugin installation directory (e.g., `~/.claude/plugins/professor/`). Never look for `learning/` inside the plugin directory. Always resolve paths from `cwd`.**
150
144
 
151
- **New Structure (Worktree-based - recommended):**
145
+ **Course Structure:**
152
146
  ```
153
147
  learning/
154
148
  └── {topic-slug}/ ← Git worktree with dedicated branch
@@ -160,22 +154,11 @@ learning/
160
154
  └── CAPSTONE.md ← Capstone project brief (immutable)
161
155
  ```
162
156
 
163
- **Legacy Structure (courses/):**
164
- ```
165
- courses/
166
- └── {topic-slug}/
167
- ├── COURSE.md ← Syllabus + progress tracker
168
- ├── LECTURE.md ← Current active section
169
- ├── lectures/ ← Archived past lectures (NN-<slug>.md)
170
- ├── LEARNING-LOG.md ← Learner's reasoning/attempt record
171
- └── CAPSTONE.md ← Capstone project brief (immutable)
172
- ```
173
-
174
157
  - **COURSE.md** — the single source of truth for all course progress. Always read it at session start. Update it immediately whenever section status changes.
175
158
  - **LECTURE.md** — holds the current active section; before moving to a different section it is archived to `lectures/NN-<slug>.md` (never deleted). Past lectures and `LEARNING-LOG.md` are the persistent record.
176
159
  - **CAPSTONE.md** — immutable. Created once alongside COURSE.md during `professor:new-topic`. Never edit it after creation; the user builds against the original spec.
177
160
 
178
- **Path priority:** When scanning for courses, check `learning/` first (new worktree structure), then `courses/` (legacy). New courses should use `learning/`.
161
+ **Path rule:** Every course is discovered under `learning/` — there is no other course location.
179
162
 
180
163
  **Course Kind:** every course records `**Kind**: programming | quantitative | conceptual | skill` in `COURSE.md`. Only `programming` courses are git worktrees at `learning/{slug}/` with `exercises/` scaffolding; the other kinds are **plain folders** (no git, no worktree, no framework scaffolding), with `exercises/` created lazily. A missing Kind is treated as `programming`.
181
164
 
@@ -259,8 +242,7 @@ Created once with `professor:new-topic`. **Updated in place** throughout the cou
259
242
  ## LEARNING-LOG.md
260
243
 
261
244
  Created when Coach or Spotter first runs. Contains the learner's reasoning trail and attempt history. See the course directory:
262
- - Worktree courses: `learning/{slug}/LEARNING-LOG.md`
263
- - Legacy courses: `courses/{slug}/LEARNING-LOG.md`
245
+ - `learning/{slug}/LEARNING-LOG.md`
264
246
 
265
247
  ---
266
248
 
@@ -352,7 +334,7 @@ These rules are non-negotiable. They apply across all commands, all sessions, al
352
334
 
353
335
  10. **CAPSTONE.md is immutable** — never edit the brief after creation. The user builds against the original spec. If a user asks you to change it, decline.
354
336
 
355
- 11. **`courses/` path is always relative to the user's current working directory** — never look for `courses/` inside the plugin installation directory (`~/.claude/plugins/professor/` or similar). Always resolve all course paths from `cwd`.
337
+ 11. **`learning/` path is always relative to the user's current working directory** — never look for `learning/` inside the plugin installation directory (`~/.claude/plugins/professor/` or similar). Always resolve all course paths from `cwd`.
356
338
 
357
339
  12. **Never fabricate sources.** Every cited URL, title, author, publisher and quote must come from a source actually fetched this session. Unsourceable claims are kept but marked `⚠️ unverified` — never presented as certain, and never backed by an invented link. When the learner asserts a fact, occasionally ask "Where did you get that? How could you verify it?"
358
340
 
@@ -360,13 +342,13 @@ These rules are non-negotiable. They apply across all commands, all sessions, al
360
342
 
361
343
  ## Delegation
362
344
 
363
- Professor delegates to specialized agents. The platform orchestrator routes based on each agent's description field. Explicit invocation also works on all platforms.
345
+ Professor delegates to specialized agents. The platform orchestrator routes based on each agent's description field. On Claude Code, explicit invocation also works.
364
346
 
365
347
  - `professor:review`, `professor:done`, `professor:stuck` → **Coach** handles these (self-assessment first)
366
348
  - `professor:spotter` → **Spotter** handles these (position check-in approach)
367
349
  - `professor:navigator`, `professor:progress` → **Navigator** handles these
368
350
  - `professor:next` → **Researcher** assists with topic research first
369
351
 
370
- **Fallback:** If delegation is unavailable, Professor handles all commands directly.
352
+ **Fallback:** If no Coach agent is available on this platform, run the Coach flow below inline — the `review`, `done` and `stuck` command sections state it. If no Navigator agent is available, produce the concept thread yourself with the flow in `professor:navigator`. Professor handles any command directly when delegation is unavailable.
371
353
 
372
- To invoke explicitly: Claude Code (auto-routing), Cursor (`/coach`), Gemini CLI / OpenCode (`@coach`)
354
+ On Claude Code only, a sub-agent can be invoked explicitly: Coach `/coach`, Spotter `/spotter`, Navigator `/navigator`. Gemini CLI, OpenCode and Cursor install no sub-agents — run the flow inline there instead of pointing at a `/agent` command.
@@ -6,7 +6,7 @@ description: >
6
6
  wants to find best practices, common pitfalls, or current recommendations.
7
7
  The researcher guides users to find information themselves rather than providing direct answers.
8
8
  Works in conjunction with the professor agent for course creation and advancement.
9
- tools: WebFetch, Read, Grep, Bash
9
+ tools: WebFetch, WebSearch, Read, Grep, Bash
10
10
  color: green
11
11
  mode: subagent
12
12
  model: inherit
@@ -68,7 +68,7 @@ When learner responds to the check-in prompt:
68
68
 
69
69
  ### For position (d) — Ready for review
70
70
  1. Say: "Let me hand you off to Coach for review."
71
- 2. Invoke the Coach agent for `professor:review`
71
+ 2. Invoke the Coach agent for `professor:review`. Pass the `context` JSON you were given verbatim, so Coach uses the real course `dir`, section and trail.
72
72
 
73
73
  **Fallback (if Coach agent unavailable):** Respond directly as Coach using the self-assessment dialogue pattern: open with "Before I look at your work — what do you think about it?", then proceed with Socratic feedback.
74
74
 
@@ -80,14 +80,13 @@ When learner responds to the check-in prompt:
80
80
  - `COURSE.md` — Get current section and active exercise context
81
81
  - `LEARNING-LOG.md` — Check for previous attempt entries in the current section
82
82
 
83
- ### Write
84
- - `LEARNING-LOG.md` — Append Attempt Log entries
83
+ There is no write access. Professor appends every `LEARNING-LOG.md` line Spotter returns.
85
84
 
86
85
  ---
87
86
 
88
87
  ## LEARNING-LOG.md — Attempt Log
89
88
 
90
- Spotter appends entries to the Attempt Log in `LEARNING-LOG.md`:
89
+ Spotter returns the Attempt Log line and Professor appends it to `LEARNING-LOG.md`:
91
90
 
92
91
  ```markdown
93
92
  ## 📋 Attempt Log
@@ -1,103 +1,96 @@
1
1
  ---
2
2
  name: professor:archive
3
- description: "Archive completed course with full learning context"
3
+ description: "Archive a completed course without losing any work"
4
4
  ---
5
5
 
6
6
  When user runs `professor:archive`, follow the instructions below.
7
7
 
8
8
  ## Archive Behavior
9
9
 
10
- **Step 1: Detect course type**
10
+ **Step 1: Find the course**
11
11
 
12
- Check if the current course is in:
13
- - `learning/{slug}/` → **worktree archive mode**
14
- - `courses/{slug}/` → **legacy archive mode** (existing behavior)
12
+ Every course lives in `learning/{slug}/`. Read `learning/{slug}/COURSE.md` for the topic name,
13
+ **Kind** and level. If no course exists, tell the learner to start one with
14
+ `professor:new-topic` and stop.
15
15
 
16
- > **Note:** non-programming courses (`**Kind**` is `quantitative`, `conceptual`, or `skill`) are **plain folders** under `learning/{slug}/` — there is no worktree or branch. Archive them the same way but skip the `git worktree remove` / `git branch -D` steps and just delete the plain folder.
16
+ > Programming courses are git worktrees on branch `learning/{slug}`; other kinds are plain folders.
17
+ > The CLI step below handles both — this file never runs git commands itself.
17
18
 
18
- **Step 2: Worktree archive mode (learning/)**
19
+ **Step 2: Check for incomplete sections**
19
20
 
20
- If course is in `learning/{slug}/`:
21
+ Parse COURSE.md for ⬜ status. If incomplete sections exist, ask one question (`AskUserQuestion`):
21
22
 
22
- a. **Read source files**:
23
- - `learning/{slug}/COURSE.md`
24
- - `learning/{slug}/NOTES.md` (if exists)
25
- - `learning/{slug}/CAPSTONE.md`
23
+ > "You have X incomplete sections. Archive anyway?"
24
+ > Options: "Yes, archive" / "No, go back"
26
25
 
27
- b. **Check for incomplete sections**:
28
- - Parse COURSE.md for ⬜ status
29
- - If incomplete sections exist: Use AskUserQuestion:
30
- > "You have X incomplete sections. Archive anyway?"
31
- > Options: "Yes, archive" / "No, go back"
32
- - If user chooses "No, go back": Exit gracefully
26
+ If the learner chooses "No, go back", exit gracefully.
33
27
 
34
- c. **Generate SUMMARY.md** retrospective with format:
35
- ```markdown
36
- # Learning Summary: {Topic Name}
28
+ **Step 3: Generate SUMMARY.md**
37
29
 
38
- ## Course Overview
39
- - Level: {level}
40
- - Started: {start_date}
41
- - Archived: {current_date}
30
+ Write `learning/{slug}/SUMMARY.md` before anything else, so the archive contains it:
42
31
 
43
- ## Sections Completed
44
- - Section 1: {Title} ({date})
45
- ...
32
+ ```markdown
33
+ # Learning Summary: {Topic Name}
46
34
 
47
- ## Key Concepts Learned
48
- {extracted from progress log}
35
+ ## Course Overview
36
+ - Level: {level}
37
+ - Started: {start_date}
38
+ - Archived: {current_date}
49
39
 
50
- ## Notes
51
- {summary of NOTES.md content or "No notes recorded"}
40
+ ## Sections Completed
41
+ - Section 1: {Title} ({date})
42
+ ...
52
43
 
53
- ## Capstone Project
54
- {capstone title} - {completed/not completed}
55
- ```
44
+ ## Key Concepts Learned
45
+ {extracted from progress log}
56
46
 
57
- d. **Determine archive path**:
58
- - Primary: `.course_archive/{slug}/`
59
- - If exists: `.course_archive/{slug}-{YYYY-MM-DD}/`
47
+ ## Notes
48
+ {summary of NOTES.md content or "No notes recorded"}
60
49
 
61
- e. **Create archive directory**: Use Bash mkdir -p
50
+ ## Capstone Project
51
+ {capstone title} - {completed/not completed}
52
+ ```
62
53
 
63
- f. **Write archive files**:
64
- - COURSE.md
65
- - NOTES.md (if exists)
66
- - CAPSTONE.md
67
- - SUMMARY.md
54
+ **Step 4: Confirm**
68
55
 
69
- g. **Remove worktree**:
70
- ```bash
71
- git worktree remove learning/{slug}/ --force
72
- git branch -D learning/{slug}
73
- ```
56
+ Nothing is removed before the learner says yes. Ask for confirmation (`AskUserQuestion`):
74
57
 
75
- h. **Success message**:
76
- > "Course archived! Your learning journey is saved to:
77
- > - .course_archive/{slug}/
78
- >
79
- > The git worktree has been removed.
80
- >
81
- > Start a new course anytime with professor:new-topic."
58
+ > "Archive {Topic Name} now? Every file (lectures, learning log, exercises, notes, summary) is
59
+ > copied to `.course_archive/{slug}/`. A programming course keeps its commits on branch
60
+ > `archive/{slug}`."
61
+ > Options: "Yes, archive" / "No, cancel"
82
62
 
83
- **Step 3: Legacy archive mode (courses/)**
63
+ If the learner cancels, stop and leave the course untouched.
84
64
 
85
- If course is in `courses/{slug}/` (legacy structure):
65
+ **Step 5: Archive through the CLI**
86
66
 
87
- a. Follow the existing archive behavior from agents/professor.md:
88
- - Read source files (COURSE.md, NOTES.md, CAPSTONE.md)
89
- - Check for incomplete sections
90
- - Generate SUMMARY.md
91
- - Copy to .course_archive/{slug}/
92
- - Delete original course folder
93
- - Preserve exercises/ folder if it exists
67
+ ```bash
68
+ npx ronin-skillforce archive {slug}
69
+ ```
94
70
 
95
- **Archive path handling:**
96
- - Primary: `.course_archive/{slug}/`
97
- - If exists: `.course_archive/{slug}-{YYYY-MM-DD}/`
71
+ The command copies the whole course directory except `.git` to `.course_archive/{slug}/` (or the
72
+ next free `-2`, `-3`, … target), then commits pending work, renames the branch to
73
+ `archive/{slug}` and removes the worktree — or removes the plain folder after verifying the copy.
74
+
75
+ Do not run `git worktree`, `git branch` or folder-deletion commands yourself. If the command exits
76
+ non-zero, show its message and stop: the course is still in `learning/{slug}/` unless the message
77
+ says otherwise.
78
+
79
+ **Step 6: Success message**
80
+
81
+ Use the result printed by the CLI (`archivedTo`, `branch`, `removed`):
82
+
83
+ > "Course archived! Your learning journey is saved to:
84
+ > - {archivedTo}/
85
+ >
86
+ > {History kept on branch archive/{slug}. | (plain-folder course: no branch)}
87
+ >
88
+ > Start a new course anytime with professor:new-topic."
98
89
 
99
90
  **Rules:**
100
- - Worktree mode: Always remove worktree and branch after archiving
101
- - Legacy mode: Never delete the exercises/ folder
102
- - Never include LECTURE.md in archive
103
- - Always auto-version if archive already exists
91
+ - Never overwrite or delete an existing archive — the CLI picks the next free suffix.
92
+ - Never remove anything before the CLI has verified the copy.
93
+ - Never run git worktree/branch commands in this file; the CLI owns them and never forces a removal.
94
+ - Everything except `.git` is preserved: `lectures/`, `exercises/`, `LEARNING-LOG.md`,
95
+ `SCHEDULE.md`, `COMPLETION.md`, `SKILL.md`, `LECTURE.md`, `COURSE.md`, `CAPSTONE.md`, `NOTES.md`
96
+ and `SUMMARY.md`.
@@ -7,10 +7,9 @@ Review the user's completed capstone project. This command is only available aft
7
7
 
8
8
  **Steps:**
9
9
 
10
- 1. **Find active course directory** — check both the new worktree structure and legacy:
11
- - If already in `learning/{slug}/` or `courses/{slug}/` directory, use that.
10
+ 1. **Find active course directory** — under `learning/`:
11
+ - If already in `learning/{slug}/` directory, use that.
12
12
  - Otherwise, check for `COURSE.md` in `learning/` subdirectory.
13
- - If not found there, check `courses/` subdirectory (legacy).
14
13
  - If still not found, check for `COURSE.md` in the current working directory.
15
14
  - If no active course is found, respond:
16
15
  > "No active course found. Run `/professor:new-topic` to start a course first."
@@ -51,9 +50,10 @@ Review the user's completed capstone project. This command is only available aft
51
50
  **Step 6 — Final verdict (choose one):**
52
51
 
53
52
  - 🏆 **Course Complete** — they demonstrated solid understanding across all course objectives.
54
- Update `COURSE.md`: set the Capstone Project row status to ✅ Complete and record today's date.
53
+ Run `npx ronin-skillforce capstone-status {slug} --set done` so the `**Capstone status**`
54
+ header line and the Capstone Project row both show ✅ Complete with today's date.
55
55
  Add an entry to the Progress Log: `| [date] | Capstone | Review complete | Course Complete verdict |`
56
- **Also write `learning/{slug}/COMPLETION.md`** (or `courses/{slug}/` fallback — same directory as COURSE.md):
56
+ **Also write `learning/{slug}/COMPLETION.md`** (same directory as COURSE.md):
57
57
  ```yaml
58
58
  ---
59
59
  course: {slug}
@@ -7,14 +7,14 @@ Display the capstone project brief for the active course.
7
7
 
8
8
  **Steps:**
9
9
 
10
- 1. Check if a `courses/` directory exists in the current working directory.
11
- - If no `courses/` directory or no active course is found, respond:
10
+ 1. Check for courses under `learning/` in the current working directory (`learning/*/COURSE.md`).
11
+ - If no course is found, respond:
12
12
  > "No active course found. Run `/professor:new-topic` to start a course first."
13
13
  - Stop here if no course exists.
14
14
 
15
15
  2. Identify the active course (read `COURSE.md` if only one course exists; ask the user which course if multiple exist).
16
16
 
17
- 3. Check if `CAPSTONE.md` exists in the active course folder (`courses/{topic-slug}/CAPSTONE.md`).
17
+ 3. Check if `CAPSTONE.md` exists in the active course folder (`learning/{topic-slug}/CAPSTONE.md`).
18
18
  - If `CAPSTONE.md` does not exist, respond:
19
19
  > "No capstone brief found. This may be an older course. Run `/professor:new-topic` to create a new course with a capstone brief."
20
20
  - Stop here if the file is missing.
@@ -5,40 +5,68 @@ description: Mark the current section complete after demonstrating understanding
5
5
 
6
6
  # Professor:done → Coach Gate
7
7
 
8
- This command routes to the **Coach agent** for self-assessment before marking complete.
8
+ This command routes to the **Coach agent** for self-assessment, then completes the section itself.
9
9
 
10
10
  ## Flow:
11
11
 
12
- 1. **Coach Gate (first):**
13
- - Read LEARNING-LOG.md for Reasoning Trail
14
- - Coach asks: "Looking back at this section — what was the hardest concept for you?"
15
- - Coach asks follow-up targeting weakest point
16
- - Coach decides:
17
- - **If solid:** "You demonstrate solid understanding. Say 'confirm' to complete."
18
- - **If shaky:** One more round, then Coach decides:
19
- - Mark done with ⚠️ watch-this flag, OR
20
- - Ask learner to try once more
21
-
22
- 2. **Professor completes (after Coach approval):**
23
- - User says "confirm" after Coach approval
24
- - Professor calculates and records duration
25
- - Professor updates COURSE.md (section status → ✅ Done)
26
- - Professor adds Progress Log entry
27
- - Professor appends a **section entry** to `LEARNING-LOG.md` (create it if missing):
28
- - **Date** — today
29
- - **Section** — number + title
30
- - **Duration** — time from section start to completion
31
- - **Coach questions & learner answers** — summarised faithfully from this session's self-assessment
32
- - **Coach verdict** — `solid` or `⚠️ watch-this: <concept>`
33
- - **Archived lecture** — path to this section's lecture in `lectures/NN-<slug>.md` (once `professor:next` archives it; until then the active `LECTURE.md`)
34
- - Professor clears "Active exercise" field
35
- - Professor creates/updates SCHEDULE.md with flashcards
36
- - Professor checks if all sections done → trigger Capstone Unlock if complete
37
- - Programming courses: `npx ronin-skillforce save {slug} -m "course({slug}): complete section {N}"` so the progress is committed on the course branch
12
+ 1. **Get the course context** — run `npx ronin-skillforce context {slug} --json`. It returns the
13
+ absolute `dir`, `section`, `objectives`, `activeExercise`, `learningLog`, `watch` flags and the
14
+ recent `trail`. If it exits non-zero, show its error and ask the learner which course — never
15
+ guess a slug or path. Read `COURSE.md` from `dir` when you need more than the context gives.
16
+
17
+ 2. **Coach Gate (first):** delegate to the Coach agent with:
18
+ - The context JSON from step 1, **verbatim** (Coach must use its `dir`, not look for the course)
19
+ - The active exercise content (if any)
20
+ - The learner's input: $ARGUMENTS
21
+
22
+ Coach asks "Looking back at this section — what was the hardest concept for you?", asks one
23
+ follow-up targeting the weakest point, then decides:
24
+ - **If solid:** "You demonstrate solid understanding. Say 'confirm' to complete."
25
+ - **If shaky:** One more round, then complete with a ⚠️ watch-this flag, or ask the learner to
26
+ try once more before completing.
27
+
28
+ If no Coach agent is available on this platform, run the Coach flow below inline.
29
+ 1. Ask *"Looking back at this section — what was the hardest concept for you?"*
30
+ 2. Ask one follow-up that targets the weakest point in their answer.
31
+ 3. End with the fenced `verdict` block for step 3 — `solid` when the answers hold up,
32
+ `watch-this: <concept>` when one point is shaky.
33
+
34
+ 3. **Record the verdict (required before completing):** Coach ends with a fenced `verdict` block
35
+ containing one JSON object. Record it with the CLI — do not hand-write the section entry:
36
+
37
+ ```bash
38
+ npx ronin-skillforce verdict {slug} --stdin <<'VERDICT_EOF'
39
+ {"section": "2.1 — Closures", "hardest": "closures capturing loop variables", "answers": [{"q": "What was the hardest concept?", "a": "closures capturing loop variables"}], "verdict": "watch-this: boundary conditions", "duration": "48 min", "lecture": "lectures/02-01-closures.md"}
40
+ VERDICT_EOF
41
+ ```
42
+
43
+ Always use this quoted heredoc with JSON — never put the learner's words inside a shell flag,
44
+ where the shell would expand `$(...)` or backticks. The command appends the section entry under
45
+ `## 📝 Section Entries` and writes the ⚠️ watch-this line under the section's reasoning trail.
46
+ **If it fails**, say "⚠️ This verdict was not recorded — <error>" and do not mark the section
47
+ complete. Never say the verdict was saved unless the command succeeded.
48
+
49
+ 4. **Wait for the learner to say "confirm":** after recording, say:
50
+ > "Verdict recorded. Say 'confirm' to complete this section."
51
+
52
+ Do not complete without "confirm", and do not run the gate a second time.
53
+
54
+ 5. **Professor completes (once, after "confirm"):**
55
+ - Calculate and record the duration (from section start to now)
56
+ - Update `COURSE.md`: section status → ✅ Done, record the completion date
57
+ - Add an entry to the Progress Log in `COURSE.md`
58
+ - Clear the "Active exercise" field
59
+ - Create/update `SCHEDULE.md` with flashcards for this section
60
+ - **Capstone check:** if every section is now ✅ Done, run
61
+ `npx ronin-skillforce capstone-status {slug} --set active` so the `**Capstone status**` header
62
+ and the Capstone Project row both unlock, then give the **Capstone Unlock** message from
63
+ `SKILL.md`
64
+ - Programming courses: `npx ronin-skillforce save {slug} -m "course({slug}): complete section {N}"`
65
+ so the progress is committed on the course branch
66
+ - Confirm: "Section {N} complete." (followed by the unlock message when the capstone just opened)
38
67
 
39
68
  ## Watch-this Flag:
40
69
 
41
- If Coach marks done with ⚠️ watch-this:
42
- - Coach writes to LEARNING-LOG.md Reasoning Trail: "⚠️ watch-this: [concept]"
43
- - Navigator reads this flag when building bridges in future sections
44
- - Professor does NOT write watch-this flags (Coach owns that)
70
+ A `watch-this` verdict is written by the `verdict` command under the section's Reasoning Trail.
71
+ Coach never writes `LEARNING-LOG.md`, and Professor never hand-edits the flag: it comes from the
72
+ recorded verdict only.
@@ -3,6 +3,19 @@ name: professor:hint
3
3
  description: "Get the next hint layer without revealing the answer"
4
4
  ---
5
5
 
6
+ **Capstone guard — check this before any hint:**
7
+
8
+ Read `COURSE.md` first. `professor:hint` is refused during the **capstone phase**: when every
9
+ syllabus section is ✅ Done, or when `**Capstone status**` is 🔄 In progress or ✅ Complete. In that
10
+ case refuse:
11
+
12
+ > "No hints in the capstone phase — the rules change here: build the project yourself, with no hints
13
+ > and no `professor:stuck`. You can run `professor:discuss` to talk a concept through, but I won't
14
+ > touch your code."
15
+
16
+ Stop there. Do not give a hint layer. A course with at least one ⬜ or 🔄 section and
17
+ `**Capstone status**: 🔒 Locked` (or no status line) is not capstone — continue normally.
18
+
6
19
  **Before giving hints, check for Active exercise:**
7
20
 
8
21
  1. Read `COURSE.md` first (this is required at conversation start)
@@ -15,8 +28,7 @@ description: "Get the next hint layer without revealing the answer"
15
28
  **Read LEARNING-LOG.md Attempt Log:**
16
29
 
17
30
  Before applying hint layers, check if LEARNING-LOG.md exists in the course directory:
18
- 1. First check `learning/{slug}/LEARNING-LOG.md` (worktree courses)
19
- 2. Fall back to `courses/{slug}/LEARNING-LOG.md` (legacy)
31
+ 1. Read `learning/{slug}/LEARNING-LOG.md`
20
32
  3. If found, read the **## 📋 Attempt Log** section for the current section
21
33
  4. If attempt log has entries for this section:
22
34
  - Acknowledge the learner's stated sticking point from the log
@@ -7,6 +7,8 @@ description: View section bridges and concept thread, or generate new bridges be
7
7
 
8
8
  This command provides manual access to the Navigator agent for viewing and generating section bridges.
9
9
 
10
+ > If no Navigator agent is available on this platform, run the Navigator flow below inline.
11
+
10
12
  ## Behavior
11
13
 
12
14
  ### Invoking Navigator Directly
@@ -48,7 +50,31 @@ Ask learner which format to display the bridge:
48
50
  - **concept-map** — Visual map with arrows showing relationships
49
51
  - **socratic** — Questions that help learner discover connections
50
52
 
51
- Or use the stored `preferred_format` from LEARNING-LOG.md if set.
53
+ Or use the stored `**Preferred format:**` from the Concept Thread section if set.
54
+
55
+ ### Step 5: Record the thread (Professor only)
56
+
57
+ When Navigator returns a fenced `thread` block, append it to `## 🧭 Concept Thread` in
58
+ `LEARNING-LOG.md`. Professor is the only writer — Navigator never edits the file:
59
+
60
+ ```markdown
61
+ ## 🧭 Concept Thread
62
+
63
+ **Preferred format:** concept-map
64
+
65
+ ### Section 2 → Section 3
66
+ **Format used:** text-summary
67
+ **Previous:** Closures — functions that "remember" their scope
68
+ **Next:** Higher-order functions — functions that take/return functions
69
+ **Connection:** "Closures enable higher-order functions because you can return a function that still has access to its original scope."
70
+
71
+ ⚠️ Forward reference from Section 1:
72
+ Previously: "You identified that edge cases matter" → Now: "This connects to defensive programming in error handling"
73
+ ```
74
+
75
+ Create the heading if missing. When the block carries `preferred_format`, update the
76
+ `**Preferred format:**` line instead of adding a second one. If the write fails, say
77
+ "⚠️ This concept-thread entry was not recorded" — never claim it was saved.
52
78
 
53
79
  ---
54
80
 
@@ -4,7 +4,7 @@ description: Start a new Socratic learning course on a topic
4
4
  argument-hint: "[topic]"
5
5
  ---
6
6
 
7
- Use `AskUserQuestion` with these four questions in a single call:
7
+ Ask all four questions in a single call: `AskUserQuestion` — one call, four questions.
8
8
 
9
9
  1. "What do you want to learn?"
10
10
  2. "What is your current experience with this topic?"
@@ -44,9 +44,9 @@ Wait for the user to confirm or request adjustments (including a different kind)
44
44
  ```bash
45
45
  npx ronin-skillforce create {slug} --kind {kind}
46
46
  ```
47
- - `programming`: creates and **verifies** a registered git worktree at `learning/{slug}/` on branch `learning/{slug}` (reattaches the branch if it already exists), keeps `learning/` out of the host repo's `git status`, and rolls everything back if any step fails.
47
+ - `programming`: creates and **verifies** a registered git worktree at `learning/{slug}/` on its own `learning/{slug}` branch. A new branch is isolated: it starts with no history and none of the project's files; an existing branch is reattached unchanged. It keeps `learning/` out of the host repo's `git status`, and rolls everything back if any step fails.
48
48
  - `quantitative` / `conceptual` / `skill` (PLUG-05): creates a plain folder `learning/{slug}/` — no git, no scaffolding. `exercises/` is created lazily by `professor:next`.
49
- - **If the command exits non-zero, stop.** Show its error message to the user and do **not** write any course file anywhere (no fallback folder, no `courses/`).
49
+ - **If the command exits non-zero, stop.** Show its error message to the user and do **not** write any course file anywhere (no fallback folder).
50
50
  - **Programming only — scaffolding:** framework courses (React, Vue, Django, …) get a basic project structure (`package.json` or equivalent, `src/`, README with setup instructions); standalone courses get an empty `exercises/` directory. Do **not** create per-section exercise files — `professor:next` creates each one when its section starts.
51
51
 
52
52
  3. **Write course files** to `learning/{slug}/`:
@@ -3,9 +3,14 @@ name: professor:next
3
3
  description: Load the next section of your course
4
4
  ---
5
5
 
6
- Read `COURSE.md` and find the first section with status ⬜ Not started.
6
+ Read `COURSE.md` and pick the section to work on:
7
7
 
8
- If no ⬜ sections remain, check for any 🔄 In progress sections and prompt the user to complete those first.
8
+ 1. **Resume first:** if any section has status 🔄 In progress, resume the first one — load that
9
+ section's lecture and exercise again and do not start a new section. Tell the learner:
10
+ "Section {N} is still in progress — finish it with `professor:done` before starting a new one."
11
+ 2. Otherwise load the first section with status ⬜ Not started.
12
+ 3. If no ⬜ sections remain and none is 🔄 In progress, every section is done — say so and point at
13
+ `professor:capstone`.
9
14
 
10
15
  If no course exists at all, respond: "No active course found. Start one with `/professor:new-topic` first."
11
16
 
@@ -38,7 +43,7 @@ Then write the lecture so that every key factual claim carries a `[n]` citation.
38
43
 
39
44
  1. **Archive the existing `LECTURE.md`** (skip if it does not exist, and skip if you are not moving to a different section):
40
45
  - **Only archive when the section number changes.** If the existing and new lecture share the same section number, this is an in-place edit — do NOT archive (it would create duplicate `NN-x.md`, `NN-x-2.md` files). If either lecture has no section number, archive only when both the content and the title differ.
41
- - Determine the course directory: check `learning/{slug}/` first, then fall back to `courses/{slug}/`
46
+ - Determine the course directory: `learning/{slug}/`
42
47
  - Parse the section number from the existing lecture's `# Section N:` / `# 📖 Section N:` heading
43
48
  - Move (rename) the file to `lectures/NN-<section-slug>.md`:
44
49
  - `NN` = zero-padded section number (e.g. `02`); if the heading has no number, use the next free number after the files already in `lectures/`
@@ -50,8 +55,7 @@ Then write the lecture so that every key factual claim carries a `[n]` citation.
50
55
  **After writing LECTURE.md, auto-create the exercise file:**
51
56
 
52
57
  1. **Determine course location**:
53
- - First check `learning/{slug}/` (worktree courses - Phase 7)
54
- - Fall back to `courses/{slug}/` (legacy)
58
+ - The course directory is `learning/{slug}/`
55
59
 
56
60
  2. **Read the course Kind** from `COURSE.md` metadata (`**Kind**: ...`, right under `**Level**`):
57
61
  - If the field is missing, treat it as `programming` (backward compatible).