geneseed 3.5.0 → 3.7.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 (89) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/DESIGN.md +6 -6
  3. package/QUICKSTART.md +1 -1
  4. package/README.md +32 -30
  5. package/SETUP.md +34 -8
  6. package/SHIPPED.md +3 -3
  7. package/adapters/claude-code/skills/geneseed/SKILL.md +1 -1
  8. package/adapters/openclaude/README.md +64 -0
  9. package/adapters/opencode/plugins/geneseed-workflow.js +1 -1
  10. package/adapters/opencode/workflows/_runtime.js +1 -1
  11. package/docs/extending.md +22 -6
  12. package/docs/web/exclusions.md +1 -0
  13. package/docs/web/footprint.md +1 -1
  14. package/docs/web/harnesses.md +14 -14
  15. package/docs/web/install-quick.md +1 -1
  16. package/docs/web/rules.md +1 -1
  17. package/docs/web/themes-author.md +1 -1
  18. package/docs/web-ui.md +1 -1
  19. package/harness.config.json +1 -1
  20. package/js/README.md +3 -3
  21. package/js/build/driver.mjs +50 -9
  22. package/js/build/emit-claude.mjs +1 -1
  23. package/js/build/generate.mjs +2 -1
  24. package/js/build/source.mjs +5 -4
  25. package/js/hosts/hooks.mjs +11 -4
  26. package/js/hosts/hosts.mjs +17 -2
  27. package/js/hosts/installs.mjs +32 -2
  28. package/js/hosts/mcp.mjs +8 -1
  29. package/js/hosts/settings.mjs +4 -1
  30. package/js/inspect/diff.mjs +1 -1
  31. package/js/inspect/doctor.mjs +3 -3
  32. package/js/inspect/excludes.mjs +7 -5
  33. package/js/inspect/status.mjs +4 -4
  34. package/js/maintain/migrate.mjs +1 -1
  35. package/js/maintain/setup.mjs +7 -2
  36. package/js/maintain/uninstall.mjs +3 -3
  37. package/js/web/actions.mjs +7 -5
  38. package/js/web/api.mjs +2 -2
  39. package/js/web/docs.mjs +1 -1
  40. package/package.json +2 -1
  41. package/src/AGENT.md.tmpl +8 -5
  42. package/src/doctrines/README.md +3 -2
  43. package/src/doctrines/comms.md +53 -0
  44. package/src/doctrines/process.md +0 -26
  45. package/src/skills/debug.md +1 -1
  46. package/src/skills/document-project.md +127 -25
  47. package/src/skills/parallel-agents.md +1 -1
  48. package/src/skills/pipeline.md +1 -1
  49. package/src/skills/token-report/SKILL.md +2 -1
  50. package/src/skills/token-report/VENDOR.md +3 -3
  51. package/src/skills/token-report/scripts/token_report.mjs +14 -7
  52. package/src/skills/workflow.md +2 -2
  53. package/themes/_TEMPLATE.json +5 -3
  54. package/themes/biker.json +5 -3
  55. package/themes/commentator.json +5 -3
  56. package/themes/cyberpunk.json +5 -3
  57. package/themes/gamer.json +5 -3
  58. package/themes/imperial.json +5 -3
  59. package/themes/joker.json +5 -3
  60. package/themes/marvin.json +5 -3
  61. package/themes/mean.json +5 -3
  62. package/themes/military.json +5 -3
  63. package/themes/neutral.json +5 -3
  64. package/themes/pirate.json +5 -3
  65. package/themes/sports.json +5 -3
  66. package/themes/verstappen.json +5 -3
  67. package/themes/wizard.json +5 -3
  68. package/web/dist/assets/{Activity-Flgf4kHy.js → Activity-CH-7cPIM.js} +1 -1
  69. package/web/dist/assets/{ActivityDetail-DIpr85nh.js → ActivityDetail-DZvz0xS5.js} +1 -1
  70. package/web/dist/assets/{CatalogRow-CjyLjaLb.js → CatalogRow-DftXpZHY.js} +1 -1
  71. package/web/dist/assets/{Diff-Deisdha8.js → Diff-DvwdG0L9.js} +1 -1
  72. package/web/dist/assets/{Docs-DGUdY4l4.js → Docs-DrJNDPwI.js} +1 -1
  73. package/web/dist/assets/{Doctor-F74lJ69P.js → Doctor-OTmwmYZg.js} +1 -1
  74. package/web/dist/assets/{GreenhouseView-D072lBiD.js → GreenhouseView-XxrAdriX.js} +1 -1
  75. package/web/dist/assets/Harness-C_LYNk5c.js +1 -0
  76. package/web/dist/assets/{JournalView-DWFqZ0Iw.js → JournalView-BcuyeEaR.js} +1 -1
  77. package/web/dist/assets/{Laws-BN6g3HU7.js → Laws-CWHrTKY4.js} +1 -1
  78. package/web/dist/assets/{Library-CDOv4emM.js → Library-CA9IHghn.js} +1 -1
  79. package/web/dist/assets/{OperatorHudView-CwNIUVX8.js → OperatorHudView-BMRY1Tt4.js} +1 -1
  80. package/web/dist/assets/{Profile-CpP9BTne.js → Profile-wceET1JY.js} +1 -1
  81. package/web/dist/assets/{Rules-DFXsUCB7.js → Rules-BEXvY4Tx.js} +1 -1
  82. package/web/dist/assets/{Settings-BqZVUtJ5.js → Settings-DS2zF0Ez.js} +1 -1
  83. package/web/dist/assets/{Skills-Cu6kBgfF.js → Skills-DahlOJuI.js} +1 -1
  84. package/web/dist/assets/{drawable-BgfrEBer.js → drawable-BTHjTzF7.js} +1 -1
  85. package/web/dist/assets/{index-CAqrWhKl.js → index-AN5Emnrg.js} +2 -2
  86. package/web/dist/assets/{lawCats-BLgxl151.js → lawCats-Btjp3Hk_.js} +1 -1
  87. package/web/dist/index.html +1 -1
  88. package/web/src/pages/Laws.jsx +6 -2
  89. package/web/dist/assets/Harness-DNRP2Va7.js +0 -1
@@ -228,6 +228,7 @@ const DOCTRINE_BLURBS = {
228
228
  ops: 'how the machine is driven — tool discovery, non-blocking commands, teardown',
229
229
  process: 'how a session runs — planning, context economy, docs first, and the consent gate '
230
230
  + 'on every commit and push (drop this pack and that gate goes with it)',
231
+ comms: 'how answers are presented — stable reference codes, a diagram or a table only where it earns its place',
231
232
  };
232
233
 
233
234
  /**
@@ -279,7 +280,7 @@ export function doctrineOptions() {
279
280
  /**
280
281
  * `_harness_setup.EMIT_OPTIONS`.
281
282
  *
282
- * Exported since P6b: `/api/themes` returns the same nine as its `emits` list, and a copy
283
+ * Exported since P6b: `/api/themes` returns the same eleven as its `emits` list, and a copy
283
284
  * of a table under test silently stops being the table under test.
284
285
  */
285
286
  export const EMIT_OPTIONS = [
@@ -292,6 +293,10 @@ export const EMIT_OPTIONS = [
292
293
  ['copilot-global', 'GitHub Copilot personal config dir (~/.copilot) — copilot-instructions.md, agents, skills.'],
293
294
  ['copilot', 'Per-repo AGENTS.md + .github/ for GitHub Copilot, committed into one repository.'],
294
295
  ['files', 'Plain bundle for any AGENT.md tool.'],
296
+ // Appended AFTER `files`, not beside the other hosts: the menu is answered by number, and a
297
+ // scripted `setup` that pipes its answers must keep meaning what it meant.
298
+ ['openclaude-global', 'OpenClaude global config dir (~/.openclaude) — CLAUDE.md, agents, skills, hooks.'],
299
+ ['openclaude', 'Per-repo .openclaude/ (CLAUDE.md, agents, skills, hooks) for OpenClaude, committed into one repository.'],
295
300
  ];
296
301
 
297
302
  /** `_harness_setup.FOOTPRINT_OPTIONS`. */
@@ -375,7 +380,7 @@ export function collectSetupLines() {
375
380
  // Every PROJECT emit needs the repo root — claude/bob/copilot included: without `--out`
376
381
  // their CLAUDE.md/.claude land in the generator's default ./Harness, where the host never
377
382
  // looks.
378
- if (['opencode', 'claude', 'bob', 'copilot'].includes(emit)) {
383
+ if (['opencode', 'claude', 'bob', 'copilot', 'openclaude'].includes(emit)) {
379
384
  root = ask('Repo root to install into', '.');
380
385
  out = root;
381
386
  } else if (emit === 'files') {
@@ -71,7 +71,7 @@ import { comparePaths, isAbsolutePath, within } from '../lib/paths.mjs';
71
71
  const hostSpec = (host) => HOSTS.find((h) => h.host === host);
72
72
 
73
73
  /** The Claude-STYLE hosts — one manifest shape, one reversal. Spelled once. */
74
- const CLAUDE_STYLE = ['claude', 'bob', 'copilot'];
74
+ const CLAUDE_STYLE = ['claude', 'bob', 'copilot', 'openclaude'];
75
75
 
76
76
  /**
77
77
  * `shutil.rmtree(p, ignore_errors=True)`.
@@ -681,7 +681,7 @@ export function cmdUninstall(args) {
681
681
  const targetDesc = resolvePath(expanduser(args.target));
682
682
  printErr(`[uninstall] no Geneseed install detected at ${targetDesc}.\n`
683
683
  + '[uninstall] pass --target <repo> for a project install (.opencode/.claude/'
684
- + '.bob/.github) or --target <config dir> for a global one.\n');
684
+ + '.bob/.github/.openclaude) or --target <config dir> for a global one.\n');
685
685
  return 1;
686
686
  }
687
687
  const [host, scope, root] = hit;
@@ -700,7 +700,7 @@ export function cmdUninstall(args) {
700
700
  + `${hostSpec(host).agentFile} managed block, and Geneseed's `
701
701
  + '~/.copilot/settings.json hooks on a global install (your own keys/hooks and '
702
702
  + '.github files are kept).\n');
703
- } else if (host === 'claude' || host === 'bob') {
703
+ } else if (['claude', 'bob', 'openclaude'].includes(host)) {
704
704
  printOut('[uninstall] removes: agents/, skills/, markers, the '
705
705
  + `${hostSpec(host).agentFile} managed block, and Geneseed's `
706
706
  + 'settings.json hooks/excludes (your own keys/hooks are kept).\n');
@@ -41,8 +41,8 @@ import { excludeAdd, excludeRemove } from '../inspect/excludes.mjs';
41
41
  import { setupBuildArgs } from '../build/generate.mjs';
42
42
  import { frontmatter, memoryDropIndex } from '../hosts/hooks.mjs';
43
43
  import {
44
- HOSTS, bobConfigDir, claudeConfigDir, copilotConfigDir, expanduser, opencodeConfigDir,
45
- resolvePath,
44
+ HOSTS, bobConfigDir, claudeConfigDir, copilotConfigDir, expanduser, openclaudeConfigDir,
45
+ opencodeConfigDir, resolvePath,
46
46
  } from '../hosts/hosts.mjs';
47
47
  import {
48
48
  EMIT_HOST_SCOPE, doctrinesForBuild, excludedRulesOfDir, footprintOfDir, installState,
@@ -644,7 +644,7 @@ export function apiMcpToggle(state, body) {
644
644
  return { ok: false, error: 'config holds comments — edit it by hand to keep them' };
645
645
  }
646
646
  let cfg;
647
- if (['claude', 'bob', 'copilot'].includes(host)) {
647
+ if (['claude', 'bob', 'copilot', 'openclaude'].includes(host)) {
648
648
  if (isFile(p)) {
649
649
  let parsed;
650
650
  try {
@@ -817,6 +817,7 @@ const EMIT_FOR = new Map([
817
817
  ['claude global', 'claude-global'], ['claude project', 'claude'],
818
818
  ['bob global', 'bob-global'], ['bob project', 'bob'],
819
819
  ['copilot global', 'copilot-global'], ['copilot project', 'copilot'],
820
+ ['openclaude global', 'openclaude-global'], ['openclaude project', 'openclaude'],
820
821
  ]);
821
822
 
822
823
  /**
@@ -951,7 +952,8 @@ export function apiDeployCmd(state, body) {
951
952
  return { error: `folder not writable: ${root}` };
952
953
  }
953
954
  const cfgdirs = new Set();
954
- for (const fn of [opencodeConfigDir, claudeConfigDir, bobConfigDir, copilotConfigDir]) {
955
+ for (const fn of [opencodeConfigDir, claudeConfigDir, bobConfigDir, copilotConfigDir,
956
+ openclaudeConfigDir]) {
955
957
  try {
956
958
  cfgdirs.add(resolvePath(fn()));
957
959
  } catch { /* not every host has a resolvable config dir; skip it */ }
@@ -976,7 +978,7 @@ export function apiDeployCmd(state, body) {
976
978
  // and `PreToolUse::Bash` went with them. `doctrinesForBuild` resolves unknown to ALL packs.
977
979
  const doctrines = bodyDoctrines(body) ?? doctrinesForBuild(root);
978
980
  const excludeRules = bodyExcludeRules(body) ?? excludedRulesOfDir(root);
979
- // project-scope emit name == host name (opencode / claude / bob / copilot)
981
+ // project-scope emit name == host name (opencode / claude / bob / copilot / openclaude)
980
982
  const argv = setupBuildArgs(theme || 'neutral', host, root, root, fp, pos, mode, doctrines,
981
983
  PACK_ORDER, excludeRules);
982
984
  return { cmd: [process.execPath, path.join(ROOT, 'bin', 'build-driver.mjs'), ...argv] };
package/js/web/api.mjs CHANGED
@@ -724,7 +724,7 @@ export const apiExcludes = () => excludesSnapshot();
724
724
  * nested-marker host cannot silently read the bare root.
725
725
  */
726
726
  export function viewCfg(host, scope, root) {
727
- if (scope === 'project' && ['claude', 'bob', 'copilot'].includes(host)) {
727
+ if (scope === 'project' && ['claude', 'bob', 'copilot', 'openclaude'].includes(host)) {
728
728
  return path.join(root, HOSTS.find((h) => h.host === host).projectMarker);
729
729
  }
730
730
  return root;
@@ -790,7 +790,7 @@ export function apiOverview(state) {
790
790
  // can re-emit exactly it. Mirrors `viewCfg`'s rule, spelled out separately here.
791
791
  let install = null;
792
792
  for (const [host, scope, root] of installTargets()) {
793
- const data = (scope === 'project' && ['claude', 'bob', 'copilot'].includes(host))
793
+ const data = (scope === 'project' && ['claude', 'bob', 'copilot', 'openclaude'].includes(host))
794
794
  ? path.join(root, HOSTS.find((h) => h.host === host).projectMarker) : root;
795
795
  try {
796
796
  if (samePath(data, state.target)) {
package/js/web/docs.mjs CHANGED
@@ -207,7 +207,7 @@ const HARNESS_HINT_RE = /<!--\s*harness:/;
207
207
  export function normHarness(value, state) {
208
208
  const v = (value || '').trim().toLowerCase();
209
209
  if (HARNESSES.includes(v)) return v;
210
- return String(state.emit || '').startsWith('claude') ? 'claude' : 'opencode';
210
+ return /^(claude|openclaude)/.test(String(state.emit || '')) ? 'claude' : 'opencode';
211
211
  }
212
212
 
213
213
  /**
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": "3.5.0",
4
+ "version": "3.7.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",
@@ -9,6 +9,7 @@
9
9
  "claude-code",
10
10
  "opencode",
11
11
  "copilot",
12
+ "openclaude",
12
13
  "agents-md",
13
14
  "skills",
14
15
  "harness",
package/src/AGENT.md.tmpl CHANGED
@@ -30,11 +30,14 @@ ritual: read this file and its {{LAWS}}, then **load the project context** — i
30
30
  (§9). Only then emit your first reply, which MUST begin with the
31
31
  exact line below, before any other text. Do not paraphrase it and do not skip it —
32
32
  a first reply that omits the sigil signals the harness was not read, and emitting
33
- it certifies you have loaded the {{LAWS}} *and* the project context.
33
+ it certifies you have loaded the {{LAWS}} *and* the project context. **{{SKILLS}}
34
+ first:** when a request matches a {{SKILL}}, invoke it as your first tool
35
+ call — before loading context or touching files.
34
36
  <!-- LEAN:else -->
35
- **Readiness sigil — required.** Before your first reply: read this file and its
36
- {{LAWS}}, then load `context.json` and its `eager` entries (§9). Your first reply
37
- then MUST begin with the exact line below, verbatim — it certifies both were loaded.
37
+ **Readiness sigil — required.** Your first reply MUST begin with the exact line below,
38
+ verbatim — it certifies you have read this file and its {{LAWS}} and loaded `context.json`
39
+ and its `eager` entries (§9). **{{SKILLS}} first:** when the request matches a {{SKILL}}, invoke
40
+ it as your very first tool call — before loading context, reading files, or searching.
38
41
  <!-- LEAN:end -->
39
42
 
40
43
  > {{LOADED_SIGIL}}
@@ -206,7 +209,7 @@ subset that productively clashes on a given motion.
206
209
  | [debug]({{DIR_SKILLS}}/debug.md) | a bug or failure to diagnose before fixing |
207
210
  | [prototype]({{DIR_SKILLS}}/prototype.md) | a design question needs a runnable answer before real implementation |
208
211
  | [repo-map]({{DIR_SKILLS}}/repo-map.md) | orienting to the repo, or structure changed |
209
- | [document-project]({{DIR_SKILLS}}/document-project.md) | the project's own docs or HTML overview are missing or have drifted from the code |
212
+ | [document-project]({{DIR_SKILLS}}/document-project.md) | missing/drifted docs, or a PRD, design system, architecture doc or AGENTS.md |
210
213
  | [ingest]({{DIR_SKILLS}}/ingest.md) | a task needs content from a PDF, Office doc, or URL |
211
214
  | [research]({{DIR_SKILLS}}/research.md) | a question needs answers gathered and verified from the open web |
212
215
  | [teach]({{DIR_SKILLS}}/teach.md) | the user wants to be taught — a crash course, confusing material decoded, or a day-by-day path to a deadline |
@@ -8,7 +8,7 @@ documentation repo and a production service do not need the same practices.
8
8
  The selected packs are inlined into `AGENT.md`'s Doctrines section at build time;
9
9
  every pack ships here as a catalogue so you can read the alternatives and switch.
10
10
  Change the active set by rebuilding with `--doctrines <list>` (or via the setup
11
- wizard); the choice is stored in `harness.config.json`. All four are active by
11
+ wizard); the choice is stored in `harness.config.json`. All five are active by
12
12
  default.
13
13
 
14
14
  A pack is **orthogonal to theme and posture**: the theme sets the *voice*, the
@@ -21,9 +21,10 @@ composes.
21
21
  | [rigor](rigor.md) | How work is proven — idempotence, honest tests, coverage, gates that can fail. |
22
22
  | [ops](ops.md) | How the machine is operated — tool discovery, non-blocking commands, source-layer edits, teardown. |
23
23
  | [process](process.md) | How a task is run — planning, context economy, docs-first, consent before push. |
24
+ | [comms](comms.md) | How answers are presented — stable reference codes, a diagram or a table only where it earns its place. |
24
25
 
25
26
  A rule in one pack may cite a rule in another. That is safe because the **full
26
- catalogue ships in every bundle** — all four pack files are installed whether or not
27
+ catalogue ships in every bundle** — all five pack files are installed whether or not
27
28
  their pack is built into `AGENT.md` — so a cross-pack reference is always readable
28
29
  even when the pack it names is not active.
29
30
 
@@ -0,0 +1,53 @@
1
+ **{{PACK_COMMS}}** — how answers are presented.
2
+
3
+ ### {{DOCTRINE}} comms 1 — {{DOC_COMMS_1}}
4
+ <!-- LEAN:begin -->
5
+ Give every tracked item a short reference code and keep it unchanged for the rest of
6
+ the session — `D` decisions, `O` options, `F` findings, `R` risks, `Q` questions,
7
+ `A` actions. The trigger is countable: any reply naming two or more such items takes
8
+ codes, a {{SKILL}}'s or an {{AGENT}}'s report included, whatever layout its template
9
+ shows; a reply with one item or none takes none. The code opens the item's line —
10
+ `**F1** — the token is logged in plain text`, `**Q2** — keep the v1 route?` — not a
11
+ bare `1.` or a bullet. Number from one within each kind, keep counting across turns
12
+ (the next finding after `F3` is `F4`, even three replies later), invent a new letter
13
+ for a kind the list omits, and never renumber a code once issued — the user will cite
14
+ it back, and a moved code makes their reply mean something you did not say. A code is an address, not an ornament:
15
+ it lets a long exchange be answered by reference, and a decision taken on turn
16
+ three still be named on turn thirty. Where the {{ONTOLOGY}}'s {{ONT_CONDUCT}}
17
+ governs how an answer speaks, this is only the addressing convention — a practice
18
+ a repository adopts or drops like any other rule in these {{DOCTRINES}}.
19
+ <!-- LEAN:else -->
20
+ Give every tracked item a short reference code, unchanged for the session —
21
+ `D` decisions, `O` options, `F` findings, `R` risks, `Q` questions, `A` actions.
22
+ Any reply naming two or more such items takes codes, a {{SKILL}}'s or {{AGENT}}'s
23
+ report included; one item or none takes none. The code opens the line, never a bare
24
+ `1.` or bullet: `**F1** — token logged in plain text`, `**Q2** — keep the v1 route?`
25
+ Number from one within each kind and keep counting across turns (after `F3` comes
26
+ `F4`), invent letters for missing kinds, never renumber a code once issued.
27
+ <!-- LEAN:end -->
28
+
29
+ ### {{DOCTRINE}} comms 2 — {{DOC_COMMS_2}}
30
+ <!-- LEAN:begin -->
31
+ Prose and structure are distinct: beside the prose, pick **either** a diagram **or** a
32
+ table — whichever the matter needs, rarely both — and let the prose keep the context, the
33
+ why, the pitfall and the decision. Draw a boxes-and-arrows diagram only when its arrows
34
+ carry meaning: links to follow (a flow, a sequence, dependencies, a causal chain, a
35
+ topology), a visual or spatial subject, four or more interlinked elements, or when the
36
+ user asks. The test: erase the arrows — if nothing is lost, it was never a diagram.
37
+ Classifications, inventories and attribute comparisons take a table or a list; a chain of
38
+ three steps or fewer stays inline (`A -> B -> C`); a trivial fact stays plain text. A small
39
+ diagram replaces prose only where the prose would run long describing a structure. The
40
+ medium follows the surface: ASCII diagrams and tables in a terminal, Mermaid in markdown
41
+ that renders it; for a situation too dense for ASCII, offer a richer rendered page in one
42
+ line, never build one unasked. This is strictly additive to {{DOCTRINE}} comms 1: tracked
43
+ items keep their codes, one coded line each, and a diagram or table may carry a code as a
44
+ tag but never absorbs, merges or renumbers an item.
45
+ <!-- LEAN:else -->
46
+ Prose and structure are distinct: beside the prose, pick a diagram or a table, rarely
47
+ both; prose keeps the why and the decision. Draw a diagram only when its arrows carry
48
+ meaning — flow, dependencies, topology, a spatial subject, four or more linked elements,
49
+ or on request; if erasing them loses nothing, use a table or list. Three steps or fewer
50
+ stay inline (`A -> B -> C`). ASCII in a terminal, Mermaid where markdown renders; offer a
51
+ rendered page in one line, never unasked. Codes stay ({{DOCTRINE}} comms 1): a diagram
52
+ may tag an item, never absorb or renumber it.
53
+ <!-- LEAN:end -->
@@ -130,32 +130,6 @@ stalls, halt with a structured summary of what was tried, learned, and remains (
130
130
 
131
131
  ### {{DOCTRINE}} process 7 — {{DOC_PROCESS_7}}
132
132
  <!-- LEAN:begin -->
133
- Give every tracked item a short reference code and keep it unchanged for the rest of
134
- the session — `D` decisions, `O` options, `F` findings, `R` risks, `Q` questions,
135
- `A` actions. The trigger is countable: any reply naming two or more such items takes
136
- codes, a {{SKILL}}'s or an {{AGENT}}'s report included, whatever layout its template
137
- shows; a reply with one item or none takes none. The code opens the item's line —
138
- `**F1** — the token is logged in plain text`, `**Q2** — keep the v1 route?` — not a
139
- bare `1.` or a bullet. Number from one within each kind, keep counting across turns
140
- (the next finding after `F3` is `F4`, even three replies later), invent a new letter
141
- for a kind the list omits, and never renumber a code once issued — the user will cite
142
- it back, and a moved code makes their reply mean something you did not say. A code is an address, not an ornament:
143
- it lets a long exchange be answered by reference, and a decision taken on turn
144
- three still be named on turn thirty. Where the {{ONTOLOGY}}'s {{ONT_CONDUCT}}
145
- governs how an answer speaks, this is only the addressing convention — a practice
146
- a repository adopts or drops like any other rule in these {{DOCTRINES}}.
147
- <!-- LEAN:else -->
148
- Give every tracked item a short reference code, unchanged for the session —
149
- `D` decisions, `O` options, `F` findings, `R` risks, `Q` questions, `A` actions.
150
- Any reply naming two or more such items takes codes, a {{SKILL}}'s or {{AGENT}}'s
151
- report included; one item or none takes none. The code opens the line, never a bare
152
- `1.` or bullet: `**F1** — token logged in plain text`, `**Q2** — keep the v1 route?`
153
- Number from one within each kind and keep counting across turns (after `F3` comes
154
- `F4`), invent letters for missing kinds, never renumber a code once issued.
155
- <!-- LEAN:end -->
156
-
157
- ### {{DOCTRINE}} process 8 — {{DOC_PROCESS_8}}
158
- <!-- LEAN:begin -->
159
133
  When several {{AGENTS}} work on the same code — sub-{{AGENTS}}, a pipeline crew, a
160
134
  workflow fan-out, another session or tool in this checkout — each file has one writer at
161
135
  a time. Before dispatch, give every unit a **write set** (the files or globs it may
@@ -2,7 +2,7 @@
2
2
 
3
3
  > {{DESC_DEBUG}}
4
4
 
5
- **Trigger:** a bug, test failure, crash, or behaviour that doesn't match expectation — before proposing a fix.
5
+ **Trigger:** a test fails, something crashes, an error or stack trace appears, or code returns the wrong result — load this FIRST, before reading code or investigating, not only before proposing a fix.
6
6
 
7
7
  **No fix without a root cause.** A change you cannot tie to a cause you understand is
8
8
  a guess — and a guess that happens to pass is worse than a failure, because it hides.
@@ -2,9 +2,10 @@
2
2
 
3
3
  > {{DESC_DOCUMENT_PROJECT}}
4
4
 
5
- **Trigger:** the project's own documentation is missing, or it has drifted from the
6
- current code — and you want the markdown docs *and* a single visual overview brought back
7
- into line with the implementation.
5
+ **Trigger:** the project's docs are missing or have drifted from the code, or it needs a PRD, a design system, an architecture document or an AGENTS.md. Existing codebases only — every document is extracted from the code, never written ahead of it.
6
+
7
+ **Argument:** `[prd|design|architecture|agents|all]` — optional. It names the doc-set members to
8
+ write; with none, step 3 proposes them.
8
9
 
9
10
  ## Procedure
10
11
  1. **Find the doc home.** Look for an existing `docs/`, `doc/`, `documentation/`, or
@@ -15,35 +16,53 @@ into line with the implementation.
15
16
  commands, config, and key directories — read the actual behaviour (universal {{LAW}} III,
16
17
  {{DOCTRINE}} process 4). If there is no `ARCHITECTURE.md`, run [repo-map {{SKILL}}](repo-map.md)
17
18
  first so you have the orientation map to build on.
18
- 3. **Reconcile the markdown (whole tree).** Check every existing page against the current
19
+ 3. **Select the doc set.** Unless the argument names the targets, propose which of the four
20
+ documents apply and wait for the user's go-ahead — e.g. "no UI detected (no stylesheet,
21
+ theme, or component tree) — skipping `DESIGN.md`". `AGENTS.md`, `PRD.md` and
22
+ `architecture.md` apply to every project; `DESIGN.md` only when a UI exists.
23
+ `all` still skips `DESIGN.md` when no UI exists, and says so in one line.
24
+ 4. **Write or refresh each selected document** from its template in *The doc set* below,
25
+ under the rules in *Re-runs*. **Invent nothing**: every claim cites `path:line`, or carries
26
+ the marker `⚠ to confirm` (in the user's language). When drafting is done, put every `⚠` to
27
+ the user as **one** batch of questions — not one at a time — and fold the answers in as plain
28
+ text. A command you could not run is recorded as `⚠ fails: <error>`, never as working.
29
+ Every document follows the three page conventions in step 5.
30
+ 5. **Reconcile the markdown (whole tree).** Check every existing page against the current
19
31
  implementation — renamed or removed APIs, changed flags, dead examples — and fix the
20
32
  drift. Add pages for significant undocumented surfaces; remove docs for features that no
21
33
  longer exist (deletion is deliberate — {{LAW}} IV). For substantial writing, dispatch
22
34
  the [docs {{AGENT}}](../{{DIR_AGENTS}}/docs.md). Keep examples runnable — run them.
23
35
  Every generated page follows three conventions:
24
36
  - **Typed frontmatter.** Open each page with YAML frontmatter carrying `type:` (one of
25
- `overview`, `module`, `api`, `flow`, `how-to`), `mirrors-commit: <sha>`, and
26
- `generated: <date>` — so drift is auditable per page, not only in the HTML footer. The
27
- doc-home `index.md` is reserved and carries no frontmatter.
28
- - **Fenced generated regions.** Wrap the auto-generated body between
29
- `<!-- geneseed:doc:start -->` and `<!-- geneseed:doc:end -->` markers, and on re-runs
30
- rewrite *only* inside them — hand-authored prose outside the markers is never touched
31
- ({{DOCTRINE}} process 3: edit the layer you own, never the reader's additions).
37
+ `overview`, `module`, `api`, `flow`, `how-to`, `prd`, `design-system`, `architecture`),
38
+ `mirrors-commit: <sha>`, and `generated: <date>` — so drift is auditable per page, not only
39
+ in the HTML footer. The doc-home `index.md` is reserved and carries no frontmatter, and
40
+ neither does the root `AGENTS.md` (agents read it raw) — though it still takes the
41
+ fences below.
42
+ - **Fenced generated regions.** Wrap each generated **section** between
43
+ `<!-- geneseed:doc:start -->` and `<!-- geneseed:doc:end -->` markers — one pair per
44
+ section, so prose a reader adds between sections survives — and on re-runs rewrite *only*
45
+ inside them; hand-authored prose outside the markers is never touched.
32
46
  - **Diagrams as Mermaid, keyed by purpose.** In the markdown, render diagrams as fenced
33
47
  `mermaid` code blocks — they render natively on GitHub, Obsidian, and VS Code with no
34
48
  dependency. Pick the kind by what you are showing: sequence for runtime/request flows,
35
- ER for data models, state for lifecycles, flowchart for control flow. Reserve
36
- hand-authored inline SVG for the offline HTML hero only (step 5).
37
- 4. **Keep an index.** Ensure the doc home has an index/README linking every page, current
38
- with the set you just reconciled.
39
- 5. **Regenerate the HTML overview** — one self-contained file at the doc home (e.g.
40
- `docs/overview.html`), a visual parallel to the markdown. Overwrite the previous one,
41
- but confirm it is the generated artifact before clobbering ({{LAW}} III, {{LAW}} IV). It
42
- must:
49
+ ER for data models, state for lifecycles, flowchart for control flow and C4 views. Reserve
50
+ hand-authored inline SVG for the offline HTML only (step 7).
51
+ 6. **Keep an index.** Ensure the doc home has an index/README linking every page, the doc-set
52
+ members included, current with the set you just reconciled.
53
+ 7. **Regenerate the HTML** — self-contained files at the doc home, a visual parallel to the
54
+ markdown and never a source of truth: regenerate them whole from the markdown each run
55
+ ({{DOCTRINE}} ops 3: edit the source, not the surface).
56
+ Overwrite the previous ones, but confirm each is the generated artifact before clobbering
57
+ ({{LAW}} III, {{LAW}} IV). Both files:
43
58
  - **Stand alone, fully offline** — a single file, content pre-rendered to semantic HTML,
44
59
  all styling in one inline `<style>`, at most minimal vanilla JS (light/dark toggle, TOC
45
60
  scroll). No CDN, no external assets, no web fonts (use a system-font stack). Render any
46
61
  diagram as hand-authored inline SVG or CSS — never a CDN library.
62
+ - **Stay project-facing** — clean and professional styling, never the harness voice; and
63
+ footer it with `mirrors commit <sha> · generated <date>` so the sync is auditable.
64
+
65
+ **`overview.html`** (always) must:
47
66
  - **Carry the digest** — hero (project name + one-line purpose), a quick-facts strip
48
67
  (language, entry point, build/test/run, license), an architecture section (component
49
68
  cards and an inline-SVG or CSS directory tree), and links out to the markdown docs for
@@ -53,16 +72,99 @@ into line with the implementation.
53
72
  control or data flow) and render *those* in depth: a plain-language explanation, the
54
73
  key code excerpt(s) in a styled monospace block, and the flow as inline SVG. Leave
55
74
  peripheral code at digest level.
56
- - **Stay project-facing** — clean and professional styling, never the harness voice; and
57
- footer it with `mirrors commit <sha> · generated <date>` so the sync is auditable.
58
- 6. **Do not auto-publish.** Leave the changes for the user to review; stage and commit only
75
+ - **Present the doc set** that exists — *Product*: the one-line problem, FR and NFR counts
76
+ per status as ✅ ◐ ✗ pills, journeys as cards, a link to `PRD.md`. *Architecture*: C4 L1
77
+ and L2 as inline SVG, the ADR list (ID, title, one-line decision), a link to
78
+ `architecture.md` for L3. *Design*: the main palette as a strip and a link to
79
+ `design.html`.
80
+
81
+ **`design.html`** (only when `DESIGN.md` exists) renders the design system as seen, not
82
+ read: colour swatches with role and a computed AA/AAA contrast badge; the type scale at real
83
+ sizes and weights; spacing, radius and shadow on sample squares; components as cards
84
+ (variants, states, path) — no live rendering, which would need the project's framework; and
85
+ the hard-coded-value drift in a separate callout.
86
+ 8. **Do not auto-publish.** Leave the changes for the user to review; stage and commit only
59
87
  on consent, via the [commit {{SKILL}}](commit.md) ({{DOCTRINE}} process 5).
60
88
 
89
+ ## The doc set
90
+
91
+ ### `docs/PRD.md` — `type: prd`
92
+ One product PRD for the whole project — the intent reconstructed from the code and the user.
93
+ 1. **Problem** — 2–4 sentences.
94
+ 2. **Users** — the roles, inferred from auth, permissions, and screens.
95
+ 3. **Goals**, then 4. **Non-goals** — the least code-derivable sections; expect most `⚠` here.
96
+ 5. **User journeys** — the top 3–5, as "As a … I want … so that …"; add a Mermaid sequence
97
+ diagram when more than two actors take part.
98
+ 6. **Functional requirements** — a table `ID | Requirement | Acceptance criteria | Status | Code`.
99
+ IDs run `FR-001`, `FR-002`, …; the requirement is one present-tense sentence; the acceptance
100
+ criteria a checklist; the status ✅ implemented, ◐ partial, ✗ absent, or `retired`; the code
101
+ the implementing path. Source them from routes, commands, screens, and tests.
102
+ 7. **Non-functional requirements** — the same table plus a `Threshold` column, IDs `NFR-001`, ….
103
+ The threshold is the measurable value the code or config fixes (timeout, rate limit, size
104
+ budget), else `⚠`.
105
+
106
+ ### `docs/DESIGN.md` — `type: design-system`
107
+ Only when a UI exists.
108
+ 1. **Principles** — 3–5 lines on the visual character the code shows.
109
+ 2. **Tokens** — one table per family (colour, typography, spacing, radius, shadow, motion):
110
+ `Name | Value | Role | Source`. Colours add their semantic role and their WCAG 2.x contrast
111
+ ratio (relative luminance) against the reference background; flag every pair below WCAG AA.
112
+ A family the code has no scale for keeps its heading and one line: `⚠ no <family> scale
113
+ found`. List **hard-coded values** found outside the token system separately, as drift —
114
+ never legitimise them as tokens.
115
+ 3. **Components** — each reusable component: role, variants, states, key props, path.
116
+ 4. **Usage rules** — do / don't for layout, accessibility, and UI copy tone. Only rules the code
117
+ actually follows — never generic best practice.
118
+
119
+ ### `docs/architecture.md` — `type: architecture`
120
+ The detailed architecture. Open with a link to the root `ARCHITECTURE.md` (repo-map's short
121
+ map) and make sure the map links back — one fenced `geneseed:doc` line at its top, nothing else
122
+ in that file touched; repeat nothing between the two.
123
+ 1. **Context (C4 L1)** — the system, its actors, and the external systems (APIs, SSO, shared
124
+ databases), as a Mermaid flowchart.
125
+ 2. **Containers (C4 L2)** — the deployable units and the protocols between them.
126
+ 3. **Components (C4 L3)** — one diagram per *significant* container, not one per module. On a
127
+ monorepo, work one container or package at a time.
128
+ 4. **Decisions** — lightweight inline ADRs, `ADR-001`, …, four lines each: *context · decision ·
129
+ consequences · evidence*. Structural choices only (framework, storage, architectural style,
130
+ decomposition) — not details.
131
+
132
+ ### `AGENTS.md` — repo root, at most ~60 lines
133
+ The short manual an agent reads before touching the repo.
134
+ 1. **Commands** — build, test, lint, run: exact, and verified by running each one.
135
+ 2. **Non-obvious conventions**.
136
+ 3. **Do not touch** — generated files, vendored code, applied migrations.
137
+ 4. **Before you change…** — targeted pointers: a UI → `docs/DESIGN.md`; a new flow or
138
+ container → `docs/architecture.md`; a feature → `docs/PRD.md` (its FR ID).
139
+
140
+ Geneseed may own a block in this file, between `<!-- BEGIN GENESEED -->` and
141
+ `<!-- END GENESEED -->` — never write inside it. Create the file if it is absent; if it holds
142
+ only that block, add the project sections below it.
143
+
144
+ ## Re-runs
145
+ - **Reader prose is sacred.** Rewrite only inside a section's `geneseed:doc` fences. A
146
+ document that already exists **without** fences (a hand-written `PRD.md`, say) is never
147
+ rewritten: offer to fence the sections you recognise, or to leave it and report its drift —
148
+ the user chooses.
149
+ - **IDs are stable.** Before rewriting, read the existing FR, NFR and ADR tables. Keep every
150
+ ID and any wording the user corrected; update only *Status*, *Code*, *Threshold*, and
151
+ *Evidence*; append new rows with the next free number. A requirement that disappears becomes
152
+ `retired` — never deleted, never renumbered. An ADR the code no longer bears is marked
153
+ `superseded`, never deleted.
154
+ - **`mirrors-commit` moves only with a rewrite.** A document outside this run's target keeps
155
+ its old value, so its staleness stays visible.
156
+ - **An answered `⚠` stays answered** — it is plain text now, not re-asked unless the code
157
+ contradicts it.
158
+
61
159
  ## Done when
160
+ - Every selected doc-set member exists, follows its template, and cites its evidence or
161
+ carries `⚠`; the batch of `⚠` questions has been put to the user.
62
162
  - The doc home mirrors the current implementation: every markdown page carries typed
63
- frontmatter, wraps its generated body in `geneseed:doc` markers, and is verified against
163
+ frontmatter, wraps its generated sections in `geneseed:doc` markers, and is verified against
64
164
  the code or flagged; examples run, Mermaid fences are well-formed, and the index links
65
- them all; the single-file `overview.html` opens offline and shows both the digest and the
66
- complex-core deep-dives; and any surface left undocumented is named explicitly.
165
+ them all.
166
+ - `overview.html` opens offline and shows the digest, the complex-core deep-dives, and the
167
+ doc set; `design.html` does too wherever `DESIGN.md` exists; and any surface left
168
+ undocumented is named explicitly.
67
169
 
68
170
  <!-- INCLUDE: skills/_self-improvement.md -->
@@ -5,7 +5,7 @@
5
5
  **Trigger:** two or more independent subtasks with no shared state or ordering between them — and a tool that can run subagents.
6
6
 
7
7
  ## Procedure
8
- 1. Confirm independence: the subtasks must not depend on each other's output or write the same files ({{DOCTRINE}} process 8). Write down each unit's **write set** — the files or globs it may change — and intersect them; an overlap runs in sequence or goes to one owner, and shared append files (registries, index tables, lockfiles, generated bundles) stay with you. If they're sequential or share state, use [plan](plan.md) instead.
8
+ 1. Confirm independence: the subtasks must not depend on each other's output or write the same files ({{DOCTRINE}} process 7). Write down each unit's **write set** — the files or globs it may change — and intersect them; an overlap runs in sequence or goes to one owner, and shared append files (registries, index tables, lockfiles, generated bundles) stay with you. If they're sequential or share state, use [plan](plan.md) instead.
9
9
  2. Split the work into self-contained units, each with one clear goal and a defined output contract — what it must return.
10
10
  3. Dispatch each unit to its own subagent in one batch, each under a handoff envelope: the unit's goal, the inputs it needs, its **write set** (edit nothing outside it; return rows for a shared file instead of writing it), the observable check that proves it done, its output contract — naming every file it changed — and the inherited constraints (no commit/push — {{DOCTRINE}} process 5 stays with you; gaps reported, never invented). Hand each unit only the access its goal needs ({{LAW}} VII). Prefer the read-only [explorer {{AGENT}}](../{{DIR_AGENTS}}/explorer.md) for investigation so the heavy reading stays out of the main context ({{DOCTRINE}} process 3). Where no subagent capability exists, run the units sequentially as personas instead, converging the same way.
11
11
  4. Keep the main context lean: collect each subagent's distilled result, not its working transcript.
@@ -23,7 +23,7 @@ The minimum roster per task type. The parent may add specialists on top — secu
23
23
 
24
24
  1. Confirm the task is genuinely substantial — a trivial one-file tweak or a question does not warrant a crew; do it directly instead.
25
25
  2. Compose the crew from the floor above, adding specialists only where the task demands them.
26
- 3. Isolate the crew's work in its own git worktree/branch (the SETUP.md worktree add-on). Where worktrees are unavailable, fall back to a single tree, one pipeline at a time, and say so. Give the crew a **write set** and check it against every other pipeline in flight ({{DOCTRINE}} process 8): two crews whose sets overlap do not run at once, and shared append files (registries, index tables, lockfiles, generated bundles) are the parent's to apply, never a crew's.
26
+ 3. Isolate the crew's work in its own git worktree/branch (the SETUP.md worktree add-on). Where worktrees are unavailable, fall back to a single tree, one pipeline at a time, and say so. Give the crew a **write set** and check it against every other pipeline in flight ({{DOCTRINE}} process 7): two crews whose sets overlap do not run at once, and shared append files (registries, index tables, lockfiles, generated bundles) are the parent's to apply, never a crew's.
27
27
  4. **The dev↔tester loop:** the developer implements, the tester validates — runs the tests and lint, produces raw logs. On failure, the findings go back to the developer. Cap at **5** iterations; on exhaustion, stop, do not merge, and report the failure with the branch left in place for inspection.
28
28
  5. **Two execution shapes**, chosen by host capability (same pattern as the [workflow {{SKILL}}](workflow.md)):
29
29
  - *Deterministic:* where the host exposes a `workflow` tool, run a saved script encoding analyst → developer → (tester ⇄ developer)×≤5 → proof.
@@ -28,9 +28,10 @@ picking the most recently active source:
28
28
  | Claude Code | `~/.claude/projects/<slug>/*.jsonl` | exact usage per request |
29
29
  | IBM Bob | `~/.bob/projects/<slug>/*.jsonl` (Claude-shaped, `$BOB_CONFIG_DIR` honoured) | exact usage per request |
30
30
  | OpenCode | `~/.local/share/opencode/opencode.db` (SQLite, v1.2+; pre-1.2 falls back to `storage/` JSON files) | exact `tokens` per request; child sessions attributed as subagents |
31
+ | OpenClaude | `~/.openclaude/projects/<slug>/*.jsonl` (Claude-shaped, `$OPENCLAUDE_CONFIG_DIR` honoured) | exact usage per request |
31
32
  | GitHub Copilot | `~/.copilot/history-session-state/` | best effort — undocumented schema; token-like fields harvested, else estimates only |
32
33
 
33
- Useful flags: `--host claude|bob|opencode|copilot` to force a host,
34
+ Useful flags: `--host claude|bob|openclaude|opencode|copilot` to force a host,
34
35
  `--transcript <path>` / `--session <id>` for a specific session,
35
36
  `--limit <tokens>` for the context-window limit used in the % columns
36
37
  (default 200000), `--top <n>` for the heaviest-items list.
@@ -5,7 +5,7 @@ not third-party. It rides the vendored-folder mechanism because it bundles an
5
5
  executable (`scripts/token_report.mjs`) and Geneseed's flat-skill pipeline renders
6
6
  single `.md` files only. Listing it in the generator's `VENDORED_SKILL_DIRS`
7
7
  makes the whole folder ride along verbatim into every host emit — Claude Code,
8
- IBM Bob, OpenCode, GitHub Copilot — which is exactly what a multi-file skill needs.
8
+ IBM Bob, OpenCode, GitHub Copilot, OpenClaude — which is exactly what a multi-file skill needs.
9
9
 
10
10
  - **Upstream:** this repository (first-party)
11
11
  - **License:** same as Geneseed (see repository LICENSE)
@@ -17,7 +17,7 @@ Consequences of riding this mechanism (deliberate):
17
17
  `description` and blockquote purpose line instead;
18
18
  - listed in AGENT.md's folder-skills section, not the main skills table.
19
19
 
20
- The script supports all four emitted hosts (exact usage on Claude Code, Bob and
21
- OpenCode; best-effort on Copilot, whose session-state schema is undocumented).
20
+ The script supports all five emitted hosts (exact usage on Claude Code, Bob,
21
+ OpenClaude and OpenCode; best-effort on Copilot, whose session-state schema is undocumented).
22
22
  If a host changes its session storage layout, fix the corresponding finder or
23
23
  parser in `scripts/token_report.mjs`.