geneseed 4.9.4 → 4.14.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 (201) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/README.md +16 -2
  3. package/SHIPPED.md +1 -1
  4. package/docs/README.md +1 -1
  5. package/docs/concepts/collaboration.md +1 -1
  6. package/docs/concepts/enforcement-table.md +1 -1
  7. package/docs/concepts/foreman-mode.md +1 -1
  8. package/docs/concepts/kits.md +91 -0
  9. package/docs/concepts/loop-branch.md +1 -1
  10. package/docs/concepts/loop-bricks.md +1 -1
  11. package/docs/concepts/loop-contracts.md +1 -1
  12. package/docs/concepts/loop-gates.md +1 -1
  13. package/docs/concepts/loop-notes.md +1 -1
  14. package/docs/concepts/loop-risk.md +1 -1
  15. package/docs/concepts/loop-templates.md +1 -1
  16. package/docs/concepts/loops.md +1 -1
  17. package/docs/concepts/lsp.md +1 -1
  18. package/docs/concepts/skills.md +1 -1
  19. package/docs/extending.md +107 -4
  20. package/docs/guides/install-scripted.md +1 -1
  21. package/docs/guides/run-anywhere.md +2 -2
  22. package/docs/guides/upgrade.md +2 -2
  23. package/docs/reference/glossary.md +1 -0
  24. package/docs/reference/troubleshoot-install.md +1 -1
  25. package/docs/web-ui.md +9 -0
  26. package/harness.config.json +1 -1
  27. package/js/build/args.mjs +27 -6
  28. package/js/build/driver.mjs +29 -8
  29. package/js/build/emit-claude.mjs +3 -1
  30. package/js/build/generate.mjs +10 -5
  31. package/js/build/render.mjs +94 -11
  32. package/js/build/source.mjs +117 -4
  33. package/js/cli-table.json +15 -0
  34. package/js/hosts/installs.mjs +35 -2
  35. package/js/hosts/link.mjs +88 -1
  36. package/js/hosts/native.mjs +14 -4
  37. package/js/inspect/checks-authoring.mjs +6 -3
  38. package/js/inspect/checks-build.mjs +15 -3
  39. package/js/inspect/checks-counts.mjs +153 -6
  40. package/js/inspect/checks-repo.mjs +95 -20
  41. package/js/inspect/cost.mjs +1 -1
  42. package/js/inspect/diff.mjs +56 -8
  43. package/js/inspect/inventory.mjs +2 -0
  44. package/js/inspect/status.mjs +44 -3
  45. package/js/inspect/validate.mjs +3 -3
  46. package/js/lib/prompt.mjs +19 -2
  47. package/js/maintain/setup.mjs +111 -23
  48. package/js/maintain/update.mjs +3 -3
  49. package/js/web/actions.mjs +38 -6
  50. package/js/web/api.mjs +76 -17
  51. package/js/web/catalog.mjs +17 -2
  52. package/js/web/handler.mjs +1 -0
  53. package/js/web/routes.mjs +2 -1
  54. package/js/web/server.mjs +11 -5
  55. package/js/web/state.mjs +38 -3
  56. package/package.json +1 -1
  57. package/registry.json +91 -0
  58. package/src/AGENT.md.tmpl +7 -7
  59. package/src/agents/_self-improvement.md +11 -0
  60. package/src/agents/_template.md +1 -8
  61. package/src/agents/advocate.md +1 -8
  62. package/src/agents/architect.md +1 -8
  63. package/src/agents/developer.md +1 -8
  64. package/src/agents/devops-engineer.md +37 -0
  65. package/src/agents/docker-expert.md +37 -0
  66. package/src/agents/docs.md +1 -8
  67. package/src/agents/empiricist.md +1 -8
  68. package/src/agents/explorer.md +1 -8
  69. package/src/agents/framer.md +1 -8
  70. package/src/agents/historian.md +1 -8
  71. package/src/agents/kubernetes-specialist.md +37 -0
  72. package/src/agents/memory-curator.md +1 -8
  73. package/src/agents/operator.md +1 -8
  74. package/src/agents/performance.md +1 -8
  75. package/src/agents/pragmatist.md +1 -8
  76. package/src/agents/react-engineer.md +38 -0
  77. package/src/agents/react-reviewer.md +42 -0
  78. package/src/agents/researcher.md +5 -10
  79. package/src/agents/reviewer.md +3 -8
  80. package/src/agents/security.md +1 -8
  81. package/src/agents/skeptic.md +1 -8
  82. package/src/agents/spring-boot-engineer.md +40 -0
  83. package/src/agents/spring-reviewer.md +41 -0
  84. package/src/agents/spring-security.md +42 -0
  85. package/src/agents/steward.md +1 -8
  86. package/src/agents/tester.md +1 -8
  87. package/src/agents/user-advocate.md +1 -8
  88. package/src/agents/visionary.md +1 -8
  89. package/src/kits/react/rules.md +13 -0
  90. package/src/kits/react.json +18 -0
  91. package/src/kits/spring-boot/rules.md +10 -0
  92. package/src/kits/spring-boot.json +23 -0
  93. package/src/licenses/everything-claude-code.txt +21 -0
  94. package/src/licenses/mattpocock-skills.txt +21 -0
  95. package/src/licenses/piomin-spring-boot.txt +190 -0
  96. package/src/licenses/superpowers.txt +21 -0
  97. package/src/licenses/vibe-wise.txt +21 -0
  98. package/src/skills/_self-improvement.md +22 -5
  99. package/src/skills/brainstorm/builder-check.md +2 -0
  100. package/src/skills/brainstorm.md +11 -2
  101. package/src/skills/codebase-design.md +10 -2
  102. package/src/skills/daydream/VENDOR.md +7 -7
  103. package/src/skills/debug.md +6 -2
  104. package/src/skills/develop.md +6 -2
  105. package/src/skills/geneseed-code-review.md +6 -2
  106. package/src/skills/git-history.md +2 -0
  107. package/src/skills/handoff.md +3 -1
  108. package/src/skills/learn-mode.md +3 -2
  109. package/src/skills/parallel-agents.md +5 -1
  110. package/src/skills/pipeline.md +2 -0
  111. package/src/skills/plan.md +9 -2
  112. package/src/skills/prototype.md +6 -2
  113. package/src/skills/react/a11y.md +33 -0
  114. package/src/skills/react/vite.md +35 -0
  115. package/src/skills/react/webpack.md +40 -0
  116. package/src/skills/react-testing.md +68 -0
  117. package/src/skills/react-view-transitions/AGENTS.md +646 -221
  118. package/src/skills/react-view-transitions/SKILL.md +28 -16
  119. package/src/skills/react-view-transitions/VENDOR.md +10 -8
  120. package/src/skills/react-view-transitions/references/css-recipes.md +72 -2
  121. package/src/skills/react-view-transitions/references/implementation.md +14 -26
  122. package/src/skills/react-view-transitions/references/nextjs.md +94 -37
  123. package/src/skills/react-view-transitions/references/patterns.md +60 -48
  124. package/src/skills/react-view-transitions/references/troubleshooting.md +47 -0
  125. package/src/skills/react.md +63 -0
  126. package/src/skills/research.md +6 -2
  127. package/src/skills/review-response.md +2 -0
  128. package/src/skills/rule.md +6 -2
  129. package/src/skills/ship.md +8 -4
  130. package/src/skills/skill-forge.md +11 -5
  131. package/src/skills/spring-boot/cloud.md +103 -0
  132. package/src/skills/spring-boot/java-modern.md +71 -0
  133. package/src/skills/spring-boot/logging.md +89 -0
  134. package/src/skills/spring-boot/security.md +112 -0
  135. package/src/skills/spring-boot/web.md +112 -0
  136. package/src/skills/spring-boot.md +57 -0
  137. package/src/skills/spring-data-jpa/patterns.md +68 -0
  138. package/src/skills/spring-data-jpa.md +81 -0
  139. package/src/skills/spring-testing.md +93 -0
  140. package/src/skills/wayfinder.md +8 -2
  141. package/src/skills/wiki.md +18 -5
  142. package/src/upstreams.json +66 -0
  143. package/themes/_TEMPLATE.json +13 -0
  144. package/themes/biker.json +13 -0
  145. package/themes/commentator.json +13 -0
  146. package/themes/cyberpunk.json +13 -0
  147. package/themes/gamer.json +13 -0
  148. package/themes/imperial.json +13 -0
  149. package/themes/joker.json +13 -0
  150. package/themes/marvin.json +13 -0
  151. package/themes/mean.json +13 -0
  152. package/themes/military.json +13 -0
  153. package/themes/neutral.json +13 -0
  154. package/themes/pirate.json +13 -0
  155. package/themes/sports.json +13 -0
  156. package/themes/verstappen.json +13 -0
  157. package/themes/wizard.json +13 -0
  158. package/web/dist/assets/Activity-44rbWUQI.js +1 -0
  159. package/web/dist/assets/ActivityDetail-Dk9k893a.js +1 -0
  160. package/web/dist/assets/Dashboard-DCoUN60W.js +2 -0
  161. package/web/dist/assets/{Docs-tDW7i7mo.js → Docs-C_je2lRG.js} +3 -3
  162. package/web/dist/assets/FilterInput-CZREvrjX.js +1 -0
  163. package/web/dist/assets/GreenhouseView-BXAOIznW.js +2 -0
  164. package/web/dist/assets/Installs-DAXF403D.js +3 -0
  165. package/web/dist/assets/JournalView-DZ184wKB.js +1 -0
  166. package/web/dist/assets/KitApply-pjhvGha0.js +1 -0
  167. package/web/dist/assets/Kits-BCCKjSIY.js +1 -0
  168. package/web/dist/assets/{Laws-BA3CzUf5.js → Laws-BgBUpRkE.js} +1 -1
  169. package/web/dist/assets/Library-CW0Zl6RF.js +1 -0
  170. package/web/dist/assets/Loops-BvFOzjEw.js +2 -0
  171. package/web/dist/assets/{Markdown-iHvBrpRN.js → Markdown-zaXXXHz9.js} +13 -13
  172. package/web/dist/assets/OperatorHudView-Bs4unPNi.js +2 -0
  173. package/web/dist/assets/Personal-C23XaT-a.js +1 -0
  174. package/web/dist/assets/Tabs-b2XFu4OS.js +1 -0
  175. package/web/dist/assets/activity-Jw8XcPiP.js +1 -0
  176. package/web/dist/assets/api-BfpZmUMI.js +1 -0
  177. package/web/dist/assets/{drawable-CyLe1gtW.js → drawable-BERkKhx_.js} +1 -1
  178. package/web/dist/assets/index-C9R_bRw_.js +2 -0
  179. package/web/dist/assets/{index-BCJz4_8C.css → index-jYlWihN-.css} +1 -1
  180. package/web/dist/assets/{react-BOF6yL40.js → react-DlYQp10C.js} +1 -1
  181. package/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
  182. package/web/dist/assets/sections-ChwaobfW.js +1 -0
  183. package/web/dist/assets/usePoll-bDFN-Hr6.js +1 -0
  184. package/web/dist/index.html +6 -5
  185. package/web/dist/assets/Activity-C8sZVIUU.js +0 -1
  186. package/web/dist/assets/ActivityDetail-Cc6vWUS4.js +0 -1
  187. package/web/dist/assets/Dashboard-C5ATa3ow.js +0 -2
  188. package/web/dist/assets/FilterInput-zLFXoSt6.js +0 -1
  189. package/web/dist/assets/GreenhouseView-zk2Uzc3A.js +0 -2
  190. package/web/dist/assets/Installs-CB_rvbBP.js +0 -3
  191. package/web/dist/assets/JournalView-Bfj27XHC.js +0 -1
  192. package/web/dist/assets/Library-BWwiy9Vb.js +0 -1
  193. package/web/dist/assets/Loops-DaPk-ckL.js +0 -2
  194. package/web/dist/assets/OperatorHudView-CyiGhiHk.js +0 -2
  195. package/web/dist/assets/Personal-Bwd27CmT.js +0 -1
  196. package/web/dist/assets/Tabs-BOD7Kaz1.js +0 -1
  197. package/web/dist/assets/activity-DvPxoS4Y.js +0 -1
  198. package/web/dist/assets/api-CiXlkbe0.js +0 -1
  199. package/web/dist/assets/index-DQXG_mqo.js +0 -2
  200. package/web/dist/assets/sections-BET3c1WT.js +0 -1
  201. package/web/dist/assets/usePoll-NSTzLOF4.js +0 -1
package/js/web/state.mjs CHANGED
@@ -8,10 +8,10 @@
8
8
  import { existsSync } from 'node:fs';
9
9
  import path from 'node:path';
10
10
 
11
- import { opencodeConfigDir } from '../hosts/hosts.mjs';
11
+ import { CLAUDE_STYLE, GLOBAL_MANIFEST, HOSTS, opencodeConfigDir } from '../hosts/hosts.mjs';
12
12
  import {
13
- EMIT_HOST_SCOPE, footprintOfDir, installedDefaults, modeOfDir, postureOfDir, themeOfDir,
14
- trustOfDir,
13
+ EMIT_HOST_SCOPE, footprintOfDir, installState, installTargets, installedDefaults, modeOfDir,
14
+ postureOfDir, themeOfDir, trustOfDir,
15
15
  } from '../hosts/installs.mjs';
16
16
  import { doctorCollect } from '../inspect/doctor.mjs';
17
17
  import { DEFAULT_PRESET } from '../loop/score.mjs';
@@ -19,6 +19,36 @@ import { readText, isFile } from '../lib/fs.mjs';
19
19
  import { stripWhitespace } from '../lib/text.mjs';
20
20
  import { inventoryFor } from './catalog.mjs';
21
21
 
22
+ /**
23
+ * The data dir an install's inventory/memory/diff is read from. Host-driven, so a new
24
+ * nested-marker host cannot silently read the bare root.
25
+ */
26
+ export function viewCfg(host, scope, root) {
27
+ if (scope === 'project' && CLAUDE_STYLE.includes(host)) {
28
+ return path.join(root, HOSTS.find((h) => h.host === host).projectMarker);
29
+ }
30
+ return root;
31
+ }
32
+
33
+ /**
34
+ * `[target, root]` for the install the console should show when nothing picked one, or null
35
+ * when the current target is already deployed or nothing is.
36
+ *
37
+ * The console used to open on the OpenCode global dir unconditionally. On a machine with only
38
+ * IBM Bob (reported 2026-10) nothing is deployed there, so Overview showed the onboarding form
39
+ * over a perfectly good `~/.bob`, and the selector that could re-point it hides itself below two
40
+ * installs. So when `current` holds no manifest, the first ACTIVE install `installTargets`
41
+ * finds is shown instead — a global before a project, in its host order.
42
+ */
43
+ export function fallbackView(current, targets = installTargets()) {
44
+ if (existsSync(path.join(current, GLOBAL_MANIFEST))) return null;
45
+ const active = targets.filter(([host, scope, root]) => {
46
+ try { return installState(root, host, scope) === 'active'; } catch { return false; }
47
+ });
48
+ const pick = active.find(([, scope]) => scope === 'global') || active[0];
49
+ return pick ? [viewCfg(...pick), pick[2]] : null;
50
+ }
51
+
22
52
  /**
23
53
  * `YYYY-MM-DD HH:MM`, LOCAL time — `toISOString` would be UTC, which reads wrong in every
24
54
  * timezone but one for a user-facing timestamp.
@@ -154,6 +184,11 @@ export function webState(theme = null, target = null) {
154
184
  st._doctor = null;
155
185
  };
156
186
  st.refresh = ({ doctor = true } = {}) => {
187
+ // A job may have deployed the first install while the view still points at an empty
188
+ // default (the onboarding Build), or removed the one in view: follow it to one that exists.
189
+ // Only on a full refresh: `{ doctor: false }` marks a mutation that cannot change installs.
190
+ const fallback = doctor ? fallbackView(st.target) : null;
191
+ if (fallback) { st.selectView(...fallback); return; }
157
192
  st._inv = null;
158
193
  if (doctor) st._doctor = null;
159
194
  st.emit = st.detectEmit() || st.emit;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "//": "Every field here is argued and gated in tests/unit/package_manifest.test.mjs. `files`, `bin` and `engines` each have a test that fails when reality drifts from this file; `version` mirrors harness.config.json and is gated too. Read that docblock before editing this one.",
3
3
  "name": "geneseed",
4
- "version": "4.9.4",
4
+ "version": "4.14.0",
5
5
  "description": "A portable, theme-able harness you implant once and use everywhere to grow a disciplined AI coding agent.",
6
6
  "keywords": [
7
7
  "ai",
package/registry.json CHANGED
@@ -22,6 +22,20 @@
22
22
  "added": "2026-07-13",
23
23
  "last_verified": ""
24
24
  },
25
+ "agents/devops-engineer": {
26
+ "status": "experimental",
27
+ "version": "1.0.0",
28
+ "owner": "Guillaume Lemer",
29
+ "added": "2026-10-20",
30
+ "last_verified": ""
31
+ },
32
+ "agents/docker-expert": {
33
+ "status": "experimental",
34
+ "version": "1.0.0",
35
+ "owner": "Guillaume Lemer",
36
+ "added": "2026-10-20",
37
+ "last_verified": ""
38
+ },
25
39
  "agents/docs": {
26
40
  "status": "approved",
27
41
  "version": "1.0.0",
@@ -57,6 +71,13 @@
57
71
  "added": "2026-06-08",
58
72
  "last_verified": ""
59
73
  },
74
+ "agents/kubernetes-specialist": {
75
+ "status": "experimental",
76
+ "version": "1.0.0",
77
+ "owner": "Guillaume Lemer",
78
+ "added": "2026-10-20",
79
+ "last_verified": ""
80
+ },
60
81
  "agents/memory-curator": {
61
82
  "status": "experimental",
62
83
  "version": "1.0.0",
@@ -78,6 +99,20 @@
78
99
  "added": "2026-06-08",
79
100
  "last_verified": ""
80
101
  },
102
+ "agents/react-engineer": {
103
+ "status": "experimental",
104
+ "version": "1.0.0",
105
+ "owner": "Guillaume Lemer",
106
+ "added": "2026-10-21",
107
+ "last_verified": ""
108
+ },
109
+ "agents/react-reviewer": {
110
+ "status": "experimental",
111
+ "version": "1.0.0",
112
+ "owner": "Guillaume Lemer",
113
+ "added": "2026-10-21",
114
+ "last_verified": ""
115
+ },
81
116
  "agents/researcher": {
82
117
  "status": "approved",
83
118
  "version": "1.0.0",
@@ -113,6 +148,27 @@
113
148
  "added": "2026-06-08",
114
149
  "last_verified": ""
115
150
  },
151
+ "agents/spring-boot-engineer": {
152
+ "status": "experimental",
153
+ "version": "1.0.0",
154
+ "owner": "Guillaume Lemer",
155
+ "added": "2026-10-20",
156
+ "last_verified": ""
157
+ },
158
+ "agents/spring-reviewer": {
159
+ "status": "experimental",
160
+ "version": "1.0.0",
161
+ "owner": "Guillaume Lemer",
162
+ "added": "2026-10-20",
163
+ "last_verified": ""
164
+ },
165
+ "agents/spring-security": {
166
+ "status": "experimental",
167
+ "version": "1.0.0",
168
+ "owner": "Guillaume Lemer",
169
+ "added": "2026-10-20",
170
+ "last_verified": ""
171
+ },
116
172
  "agents/steward": {
117
173
  "status": "approved",
118
174
  "version": "1.0.0",
@@ -358,6 +414,20 @@
358
414
  "added": "2026-09-06",
359
415
  "last_verified": ""
360
416
  },
417
+ "skills/react": {
418
+ "status": "experimental",
419
+ "version": "1.0.0",
420
+ "owner": "Guillaume Lemer",
421
+ "added": "2026-10-21",
422
+ "last_verified": ""
423
+ },
424
+ "skills/react-testing": {
425
+ "status": "experimental",
426
+ "version": "1.0.0",
427
+ "owner": "Guillaume Lemer",
428
+ "added": "2026-10-21",
429
+ "last_verified": ""
430
+ },
361
431
  "skills/react-view-transitions": {
362
432
  "status": "approved",
363
433
  "version": "1.0.0",
@@ -428,6 +498,27 @@
428
498
  "added": "2026-09-06",
429
499
  "last_verified": "2026-10-13"
430
500
  },
501
+ "skills/spring-boot": {
502
+ "status": "experimental",
503
+ "version": "1.0.0",
504
+ "owner": "Guillaume Lemer",
505
+ "added": "2026-10-20",
506
+ "last_verified": ""
507
+ },
508
+ "skills/spring-data-jpa": {
509
+ "status": "experimental",
510
+ "version": "1.0.0",
511
+ "owner": "Guillaume Lemer",
512
+ "added": "2026-10-20",
513
+ "last_verified": ""
514
+ },
515
+ "skills/spring-testing": {
516
+ "status": "experimental",
517
+ "version": "1.0.0",
518
+ "owner": "Guillaume Lemer",
519
+ "added": "2026-10-20",
520
+ "last_verified": ""
521
+ },
431
522
  "skills/teach": {
432
523
  "status": "experimental",
433
524
  "version": "1.0.0",
package/src/AGENT.md.tmpl CHANGED
@@ -145,7 +145,7 @@ Inactive packs still ship under `{{DIR_DOCTRINES}}/`, so a citation into one res
145
145
  {{DOCTRINES_BODY}}
146
146
 
147
147
  Active packs: {{DOCTRINES_LIST}}{{EXCLUDED_RULES_LINE}}{{GATE_LINES}}
148
-
148
+ {{KITS_BODY}}
149
149
  ---
150
150
 
151
151
  ## 3. {{AGENTS}} — delegation by capability
@@ -187,9 +187,9 @@ contract you do not already know.
187
187
  **Rule of delegation:** read-only investigation can be dispatched freely; any
188
188
  {{AGENT}} that *writes* must return a summary of exactly what it changed. Every
189
189
  {{AGENT}} spec ends with a **self-improvement loop**: when a report carries a
190
- `spec-feedback:` line, weigh it — fold a real flaw back into that {{AGENT}}'s
191
- file (with the user's assent); {{MEMORY}} gets a record only when it clears
192
- {{DOCTRINE:persist-insight}}'s bar.
190
+ `spec-feedback:` line, weigh it — record a real flaw (with the user's assent) in
191
+ `{{DIR_NOTEBOOK}}/agent-notes/<name>.md` and pass it to later dispatches;
192
+ {{MEMORY}} gets a record only when it clears {{DOCTRINE:persist-insight}}'s bar.
193
193
 
194
194
  <!-- LEAN:begin -->
195
195
  **Dispatching a multi-part goal.** When a goal spans several capabilities,
@@ -288,13 +288,13 @@ inventory — that list is the catalogue and it is authoritative. Each written
288
288
  procedure is in [`{{DIR_SKILLS}}/`]({{DIR_SKILLS}}/) and the host loads it on
289
289
  demand.
290
290
  <!-- CATALOG:end -->
291
- {{EXCLUDED_SKILLS_LINE}}
291
+ {{EXCLUDED_SKILLS_LINE}}{{KITS_LINE}}
292
292
  When a task repeats and no {{SKILL}} covers it, forge one through the
293
293
  [skill-forge]({{DIR_SKILLS}}/skill-forge.md) {{SKILL}}: copy
294
294
  [`{{DIR_SKILLS}}/_template.md`]({{DIR_SKILLS}}/_template.md), keep it to one coherent
295
295
  domain ({{DOCTRINE:automate-repetition}}), and list it wherever this file carries a catalogue. Every {{SKILL}} ends with a
296
- **self-improvement loop** — honour it: fold what a run teaches back into the
297
- file, or into {{MEMORY}} ({{DOCTRINE:persist-insight}}).
296
+ **self-improvement loop** — honour it: a lesson goes to its notes, never into
297
+ the file, or to {{MEMORY}} ({{DOCTRINE:persist-insight}}).
298
298
 
299
299
  ---
300
300
 
@@ -0,0 +1,11 @@
1
+ ## Self-improvement
2
+
3
+ If this spec misled you — an input you needed but were not given, a boundary
4
+ that proved wrong, a step you could not execute — end your report with one line:
5
+ `spec-feedback: [agent|general] <the one-line fix> — seen: <what happened, against
6
+ what this spec led you to expect>`. `general` marks a fix other {{AGENTS}} need too.
7
+ Omit the line when there is no friction. The caller weighs the feedback and, with the
8
+ user's assent, writes a real flaw, dated, into `{{DIR_NOTEBOOK}}/agent-notes/<name>.md`
9
+ — never into this rendered file, which a rebuild overwrites — and hands those notes
10
+ to every later dispatch of this {{AGENT}}. It records the feedback to {{MEMORY}} only if it clears
11
+ {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
@@ -67,11 +67,4 @@ tells pipeline orchestration who to recruit; it changes nothing about how this
67
67
  - **Delivers:** what it must hand the next seat or the parent — same shape as
68
68
  its own output contract above, nothing looser.
69
69
 
70
- ## Self-improvement
71
-
72
- If this spec misled you — an input you needed but were not given, a boundary
73
- that proved wrong, a step you could not execute — end your report with one line:
74
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
75
- friction. The caller weighs the feedback, folds a real flaw back into this file
76
- with the user's assent, and records it to {{MEMORY}} only if it clears
77
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
70
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -26,11 +26,4 @@
26
26
  - A tight brief: the position in one line, the 2–4 load-bearing arguments for it, the key supporting evidence (`file:line` or facts), and the one objection it must beat. No hedging, no filler.
27
27
  - If the motion has fewer than two defensible upsides, report that the case cannot honestly be made — an invented argument loses the council more than a conceded seat.
28
28
 
29
- ## Self-improvement
30
-
31
- If this spec misled you — an input you needed but were not given, a boundary
32
- that proved wrong, a step you could not execute — end your report with one line:
33
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
34
- friction. The caller weighs the feedback, folds a real flaw back into this file
35
- with the user's assent, and records it to {{MEMORY}} only if it clears
36
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
29
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -48,11 +48,4 @@ independently.)*
48
48
  - **Delivers:** the plan for the developer seat to implement, same shape as its
49
49
  own output contract above.
50
50
 
51
- ## Self-improvement
52
-
53
- If this spec misled you — an input you needed but were not given, a boundary
54
- that proved wrong, a step you could not execute — end your report with one line:
55
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
56
- friction. The caller weighs the feedback, folds a real flaw back into this file
57
- with the user's assent, and records it to {{MEMORY}} only if it clears
58
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
51
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -56,11 +56,4 @@ independently.)*
56
56
  - **Delivers:** the changed files and a one-line summary, handed to the tester
57
57
  seat for validation.
58
58
 
59
- ## Self-improvement
60
-
61
- If this spec misled you — an input you needed but were not given, a boundary
62
- that proved wrong, a step you could not execute — end your report with one line:
63
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
64
- friction. The caller weighs the feedback, folds a real flaw back into this file
65
- with the user's assent, and records it to {{MEMORY}} only if it clears
66
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
59
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -0,0 +1,37 @@
1
+ # {{AGENT}}: devops-engineer
2
+
3
+ > {{DESC_DEVOPS_ENGINEER}}
4
+
5
+ {{CREDIT:piomin-spring-boot:agents/devops-engineer.md}}
6
+
7
+ Builds CI/CD pipelines and delivery automation for Spring Boot applications.
8
+
9
+ ## When to dispatch
10
+ - A Spring Boot project needs a pipeline created or fixed: build, test, image, scan, deploy stages.
11
+
12
+ ## When NOT to dispatch
13
+ - Image internals — use [docker-expert](docker-expert.md). Cluster manifests — use [kubernetes-specialist](kubernetes-specialist.md).
14
+
15
+ ## Inputs
16
+ - The repository, its existing CI provider and the target registry and environments.
17
+
18
+ ## Allowed tools
19
+ - **Read + write to the assigned worktree.** May run the build and pipeline linters.
20
+ <!-- bash: allow -->
21
+ - Never commits, pushes or triggers a deployment ({{DOCTRINE:consent-before-push}}).
22
+
23
+ ## Procedure
24
+ 0. If `{{DIR_MEMORY}}/agents/<your-name>.md` exists, read it first — your durable lessons from prior dispatches ({{DOCTRINE:persist-insight}}).
25
+ 1. Detect the CI the project already uses (GitHub Actions, GitLab CI, Jenkins, other) and extend it; do not switch providers. With none present, ask the user which to use.
26
+ 2. Pipeline order: checkout, restore build cache, `./mvnw verify` (or `./gradlew build`), publish test results, build image, scan, push, deploy.
27
+ 3. Cache the Maven or Gradle repository keyed on the build files.
28
+ 4. Gates: tests, a coverage threshold if the project has one, dependency and image vulnerability scan.
29
+ 5. Build images with the project's chosen method (`spring-boot:build-image` by default); tag with version or commit SHA, never `latest` in production.
30
+ 6. Stages dev, staging, prod, with approval before prod.
31
+ 7. Secrets come from the CI secret store or a vault, never from files in the repository.
32
+ 8. Lint the pipeline file before handing off.
33
+
34
+ ## Output contract
35
+ - Files changed, the stage list and what was validated.
36
+
37
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -0,0 +1,37 @@
1
+ # {{AGENT}}: docker-expert
2
+
3
+ > {{DESC_DOCKER_EXPERT}}
4
+
5
+ {{CREDIT:piomin-spring-boot:agents/docker-expert.md}}
6
+
7
+ Builds small, safe container images for Spring Boot 4 applications.
8
+
9
+ ## When to dispatch
10
+ - A Spring Boot service needs an image, a Dockerfile review or a Compose file for local development.
11
+
12
+ ## When NOT to dispatch
13
+ - Cluster manifests — use [kubernetes-specialist](kubernetes-specialist.md). Pipelines — use [devops-engineer](devops-engineer.md).
14
+
15
+ ## Inputs
16
+ - The build tool (Maven or Gradle), the Java version and any registry or base-image policy.
17
+
18
+ ## Allowed tools
19
+ - **Read + write to the assigned worktree.** May run the build and local image builds.
20
+ <!-- bash: allow -->
21
+ - Never pushes images or commits ({{DOCTRINE:consent-before-push}}).
22
+
23
+ ## Procedure
24
+ 0. If `{{DIR_MEMORY}}/agents/<your-name>.md` exists, read it first — your durable lessons from prior dispatches ({{DOCTRINE:persist-insight}}).
25
+ 1. Prefer Buildpacks: `./mvnw spring-boot:build-image` (Gradle: `bootBuildImage`) needs no Dockerfile; tune the JVM through Buildpack env such as `BP_JVM_VERSION`.
26
+ 2. Use a Dockerfile only when Buildpacks do not fit. Build multi-stage and extract layers with `java -Djarmode=tools -jar app.jar extract --layers --destination extracted`; copy `dependencies`, `spring-boot-loader`, `snapshot-dependencies`, `application` in that order for cache reuse.
27
+ 3. Run as a non-root user; pin base image tags or digests, never `latest`.
28
+ 4. Health: point a `HEALTHCHECK` or Compose healthcheck at `/actuator/health` (the image needs a client such as curl); on Kubernetes rely on probes instead.
29
+ 5. Add a `.dockerignore` (`.git`, `target/`, IDE files).
30
+ 6. No secrets in layers or build args; pass them at runtime.
31
+ 7. Compose: databases with health checks, `depends_on` with `condition: service_healthy`, named volumes.
32
+ 8. Build the image locally and confirm it starts before handing off ({{LAW:verify-before-asserting}}).
33
+
34
+ ## Output contract
35
+ - Files changed, the build command and whether the image built and started.
36
+
37
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -49,11 +49,4 @@ independently.)*
49
49
  - **Receives:** the analyst's brief describing what changed and what needs documenting.
50
50
  - **Delivers:** the doc files written/updated, ready for the parent's merge decision.
51
51
 
52
- ## Self-improvement
53
-
54
- If this spec misled you — an input you needed but were not given, a boundary
55
- that proved wrong, a step you could not execute — end your report with one line:
56
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
57
- friction. The caller weighs the feedback, folds a real flaw back into this file
58
- with the user's assent, and records it to {{MEMORY}} only if it clears
59
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
52
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -29,11 +29,4 @@
29
29
  - A claims ledger: each load-bearing claim → evidenced? → the test that would confirm it — ending with the single unknown most worth measuring before the council decides.
30
30
  - If no evidence exists on either side, say exactly that — an empty ledger is a finding; padding it with plausible-sounding data is the one failure this seat cannot commit.
31
31
 
32
- ## Self-improvement
33
-
34
- If this spec misled you — an input you needed but were not given, a boundary
35
- that proved wrong, a step you could not execute — end your report with one line:
36
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
37
- friction. The caller weighs the feedback, folds a real flaw back into this file
38
- with the user's assent, and records it to {{MEMORY}} only if it clears
39
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
32
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -47,11 +47,4 @@ independently.)*
47
47
  - **Delivers:** a distilled brief the next seat (developer/docs) can act on
48
48
  directly — the scope, the relevant files, and any constraint already found.
49
49
 
50
- ## Self-improvement
51
-
52
- If this spec misled you — an input you needed but were not given, a boundary
53
- that proved wrong, a step you could not execute — end your report with one line:
54
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
55
- friction. The caller weighs the feedback, folds a real flaw back into this file
56
- with the user's assent, and records it to {{MEMORY}} only if it clears
57
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
50
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -26,11 +26,4 @@
26
26
  - The framing read: the real problem in one line, whether the motion fits it, the reframe if the framing is wrong, and the question the council should be debating instead.
27
27
  - If the framing holds up under attack, say so plainly and yield — a reframe invented to justify the seat derails a debate that was already sound.
28
28
 
29
- ## Self-improvement
30
-
31
- If this spec misled you — an input you needed but were not given, a boundary
32
- that proved wrong, a step you could not execute — end your report with one line:
33
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
34
- friction. The caller weighs the feedback, folds a real flaw back into this file
35
- with the user's assent, and records it to {{MEMORY}} only if it clears
36
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
29
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -41,11 +41,4 @@ independently.)*
41
41
  - **Delivers:** the precedent and its lesson, same shape as its own output
42
42
  contract above.
43
43
 
44
- ## Self-improvement
45
-
46
- If this spec misled you — an input you needed but were not given, a boundary
47
- that proved wrong, a step you could not execute — end your report with one line:
48
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
49
- friction. The caller weighs the feedback, folds a real flaw back into this file
50
- with the user's assent, and records it to {{MEMORY}} only if it clears
51
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
44
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -0,0 +1,37 @@
1
+ # {{AGENT}}: kubernetes-specialist
2
+
3
+ > {{DESC_KUBERNETES_SPECIALIST}}
4
+
5
+ {{CREDIT:piomin-spring-boot:agents/kubernetes-specialist.md}}
6
+
7
+ Deploys Spring Boot 4 applications on Kubernetes.
8
+
9
+ ## When to dispatch
10
+ - Manifests, Helm values or Kustomize overlays for a Spring Boot service need writing or fixing.
11
+
12
+ ## When NOT to dispatch
13
+ - Image build only — use [docker-expert](docker-expert.md). Pipelines — use [devops-engineer](devops-engineer.md).
14
+
15
+ ## Inputs
16
+ - The service, its ports and dependencies, and the manifest tooling the project already uses.
17
+
18
+ ## Allowed tools
19
+ - **Read + write to the assigned worktree.** May run `kubectl ... --dry-run`, linters and the build.
20
+ <!-- bash: allow -->
21
+ - Never applies to a live cluster and never pushes without the user's say-so ({{DOCTRINE:consent-before-push}}).
22
+
23
+ ## Procedure
24
+ 0. If `{{DIR_MEMORY}}/agents/<your-name>.md` exists, read it first — your durable lessons from prior dispatches ({{DOCTRINE:persist-insight}}).
25
+ 1. Match the project's manifest style; do not introduce a new tool.
26
+ 2. Probes: liveness `/actuator/health/liveness`, readiness `/actuator/health/readiness` (on the management port if `management.server.port` is set); add a startup probe for slow starts. Boot exposes these health groups by default; `management.endpoint.health.probes.enabled=false` turns them off.
27
+ 3. Shutdown: `server.shutdown=graceful` with `spring.lifecycle.timeout-per-shutdown-phase` below `terminationGracePeriodSeconds`; a short `preStop` sleep lets endpoints drain.
28
+ 4. Resources: set memory request and limit and keep the JVM heap below the limit (`-XX:MaxRAMPercentage`); be cautious with CPU limits.
29
+ 5. Config: non-sensitive settings in a ConfigMap, credentials in a Secret; env vars bind through relaxed binding (`SPRING_DATASOURCE_URL`).
30
+ 6. Scale: HPA on CPU or custom metrics, a PodDisruptionBudget when replicas exceed one.
31
+ 7. Pod hardening: `runAsNonRoot`, no privilege escalation, pinned image tags.
32
+ 8. Validate with a dry run or linter before handing off.
33
+
34
+ ## Output contract
35
+ - Files changed and a one-line summary; say what was validated and what was not.
36
+
37
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -61,11 +61,4 @@
61
61
  and report what was planned and what was applied — never a partial merge left
62
62
  unreported ({{LAW:surface-failures}}).
63
63
 
64
- ## Self-improvement
65
-
66
- If this spec misled you — an input you needed but were not given, a boundary
67
- that proved wrong, a step you could not execute — end your report with one line:
68
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
69
- friction. The caller weighs the feedback, folds a real flaw back into this file
70
- with the user's assent, and records it to {{MEMORY}} only if it clears
71
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
64
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -40,11 +40,4 @@ independently.)*
40
40
  - **Delivers:** the operability read and the rollback check, same shape as its
41
41
  own output contract above.
42
42
 
43
- ## Self-improvement
44
-
45
- If this spec misled you — an input you needed but were not given, a boundary
46
- that proved wrong, a step you could not execute — end your report with one line:
47
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
48
- friction. The caller weighs the feedback, folds a real flaw back into this file
49
- with the user's assent, and records it to {{MEMORY}} only if it clears
50
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
43
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -62,11 +62,4 @@ independently.)*
62
62
  - **Delivers:** measured findings and a verdict, same shape as its own output
63
63
  contract above.
64
64
 
65
- ## Self-improvement
66
-
67
- If this spec misled you — an input you needed but were not given, a boundary
68
- that proved wrong, a step you could not execute — end your report with one line:
69
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
70
- friction. The caller weighs the feedback, folds a real flaw back into this file
71
- with the user's assent, and records it to {{MEMORY}} only if it clears
72
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
65
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -39,11 +39,4 @@ independently.)*
39
39
  - **Delivers:** the cheapest viable path and what to cut, before any code is
40
40
  written — same shape as its own output contract above.
41
41
 
42
- ## Self-improvement
43
-
44
- If this spec misled you — an input you needed but were not given, a boundary
45
- that proved wrong, a step you could not execute — end your report with one line:
46
- `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
47
- friction. The caller weighs the feedback, folds a real flaw back into this file
48
- with the user's assent, and records it to {{MEMORY}} only if it clears
49
- {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
42
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -0,0 +1,38 @@
1
+ # {{AGENT}}: react-engineer
2
+
3
+ > {{DESC_REACT_ENGINEER}}
4
+
5
+ {{CREDIT:everything-claude-code:skills/react-patterns/SKILL.md}}
6
+
7
+ Implements React features in a Vite or webpack app, TypeScript or JavaScript, following the react and react-testing skills.
8
+
9
+ ## When to dispatch
10
+ - A React component, page, hook or form is scoped and code must be written, or a Vite or webpack build or Jest run is broken and must be made green.
11
+
12
+ ## When NOT to dispatch
13
+ - The design is unclear — use [architect](architect.md) first. The visual direction is open — the frontend-design skill first.
14
+ - Tests only — use [tester](tester.md). Non-React code — use [developer](developer.md).
15
+
16
+ ## Inputs
17
+ - The scoped task, the target folder or worktree, and the acceptance criteria.
18
+
19
+ ## Allowed tools
20
+ - **Read + write to the assigned worktree.** May run the project's lint, typecheck, test and build scripts.
21
+ <!-- bash: allow -->
22
+ - Never commits or pushes ({{DOCTRINE:consent-before-push}}).
23
+
24
+ ## Procedure
25
+ 0. If `{{DIR_MEMORY}}/agents/<your-name>.md` exists, read it first — your durable lessons from prior dispatches ({{DOCTRINE:persist-insight}}).
26
+ 1. Read `package.json` (React major, scripts, state and data libraries), the bundler (Vite or webpack) and TS/JS config, and the closest existing component. Follow them; add no library the project does not already use without saying why.
27
+ 2. Keep the folder's language: `.tsx` with typed props and no `any`, or `.jsx`.
28
+ 3. Derive values during render; effects only for external synchronisation, each with its cleanup. Server data through the project's server-state library, with loading, error and empty states.
29
+ 4. Semantic HTML, labelled inputs, keyboard-reachable controls (react skill, accessibility side file).
30
+ 5. Tests with Jest and React Testing Library: role queries, `userEvent`, MSW for the network, the error path as well as the happy one.
31
+ 6. For a broken build or test run: reproduce with the project's script, fix the first error only, rerun; repeat. Never `@ts-ignore`, `any` or a disabled lint rule to get green. Stop and report after three failed attempts at one error.
32
+ 7. Run lint, typecheck (TypeScript) and tests before handing off ({{LAW:verify-before-asserting}}).
33
+
34
+ ## Output contract
35
+ - Files changed, a one-line summary, and each command run with its result.
36
+ - If the task cannot be done as given, report the blocker instead of guessing.
37
+
38
+ <!-- INCLUDE: agents/_self-improvement.md -->
@@ -0,0 +1,42 @@
1
+ # {{AGENT}}: react-reviewer
2
+
3
+ > {{DESC_REACT_REVIEWER}}
4
+
5
+ {{CREDIT:everything-claude-code:agents/react-reviewer.md}}
6
+
7
+ React-specific review only. Generic correctness, naming and structure belong to [reviewer](reviewer.md); defer to it and do not repeat its checks.
8
+
9
+ ## When to dispatch
10
+ - A change touches `.tsx` / `.jsx` files, hooks or React tests and needs a framework-aware pass.
11
+
12
+ ## When NOT to dispatch
13
+ - No React code in the diff, or a generic review — use [reviewer](reviewer.md).
14
+ - A wider security question (auth design, the API behind the UI) — use [security](security.md).
15
+
16
+ ## Inputs
17
+ - The base..head range (or the diff) and the task it was meant to satisfy.
18
+
19
+ ## Allowed tools
20
+ - **Read-only.** May read code, run the lint, typecheck and test scripts, inspect history.
21
+ - Does not edit code; it reports. Never moves HEAD, the index or the working tree.
22
+ <!-- bash: allow -->
23
+
24
+ ## Procedure
25
+ 0. If `{{DIR_MEMORY}}/agents/<your-name>.md` exists, read it first — your durable lessons from prior dispatches ({{DOCTRINE:persist-insight}}).
26
+ 1. Read the changed files and `package.json` for the React major. Run lint and, for TypeScript, the typecheck; a missing `react-hooks/rules-of-hooks` or `react-hooks/exhaustive-deps` rule is itself a finding.
27
+ 2. Check, in this order:
28
+ - Security: `dangerouslySetInnerHTML` without a sanitiser at the call site; a user-supplied URL in `href`/`src` without a scheme check; a secret in a bundler-inlined env value (`import.meta.env.VITE_*`, webpack `DefinePlugin`); a session token in `localStorage`.
29
+ - Hooks: a hook behind a condition, loop or early return; a missing effect dependency, or an `exhaustive-deps` disable without a reason; an effect without cleanup; a stale closure in a timer or async handler.
30
+ - State: mutation before `setState`; state duplicated or derived through an effect; an effect chain setting state that triggers another effect; `key={index}` on a list that changes.
31
+ - Data: `useEffect` + `fetch` where the project has a server-state library; a request with no loading, error or empty state; a fetch without abort.
32
+ - Accessibility: `<div onClick>`, an unlabelled input, `<img>` without `alt`, an error shown by colour alone, a modal that does not manage focus.
33
+ - Types (TypeScript): `any`, a non-null `!` or an `as` cast that hides a real case, untyped props.
34
+ - Tests: queries by test id or `querySelector` where a role query works, `fireEvent` where `userEvent` fits, sleeps, component snapshots, the error path untested.
35
+ - Performance, only with evidence: memoisation with no measured gain, an inline object defeating a `React.memo` child, a long list not virtualised.
36
+ 3. Verify by running the tests rather than assuming ({{LAW:verify-before-asserting}}).
37
+
38
+ ## Output contract
39
+ - Findings as Conventional Comments, `label (decoration): file:line — problem — suggested fix`, most serious first; then a **Set aside:** list (or `none`) and a one-line verdict: any blocking → block, any if-minor and nothing blocking → fix-then-ship, otherwise ship.
40
+ - Name any check that was impossible instead of issuing a verdict on partial evidence.
41
+
42
+ <!-- INCLUDE: agents/_self-improvement.md -->