geneseed 3.6.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 (86) hide show
  1. package/CHANGELOG.md +49 -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 +18 -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/doctrines/README.md +3 -2
  42. package/src/doctrines/comms.md +53 -0
  43. package/src/doctrines/process.md +0 -26
  44. package/src/skills/parallel-agents.md +1 -1
  45. package/src/skills/pipeline.md +1 -1
  46. package/src/skills/token-report/SKILL.md +2 -1
  47. package/src/skills/token-report/VENDOR.md +3 -3
  48. package/src/skills/token-report/scripts/token_report.mjs +14 -7
  49. package/src/skills/workflow.md +2 -2
  50. package/themes/_TEMPLATE.json +4 -2
  51. package/themes/biker.json +4 -2
  52. package/themes/commentator.json +4 -2
  53. package/themes/cyberpunk.json +4 -2
  54. package/themes/gamer.json +4 -2
  55. package/themes/imperial.json +4 -2
  56. package/themes/joker.json +4 -2
  57. package/themes/marvin.json +4 -2
  58. package/themes/mean.json +4 -2
  59. package/themes/military.json +4 -2
  60. package/themes/neutral.json +4 -2
  61. package/themes/pirate.json +4 -2
  62. package/themes/sports.json +4 -2
  63. package/themes/verstappen.json +4 -2
  64. package/themes/wizard.json +4 -2
  65. package/web/dist/assets/{Activity-Flgf4kHy.js → Activity-CH-7cPIM.js} +1 -1
  66. package/web/dist/assets/{ActivityDetail-DIpr85nh.js → ActivityDetail-DZvz0xS5.js} +1 -1
  67. package/web/dist/assets/{CatalogRow-CjyLjaLb.js → CatalogRow-DftXpZHY.js} +1 -1
  68. package/web/dist/assets/{Diff-Deisdha8.js → Diff-DvwdG0L9.js} +1 -1
  69. package/web/dist/assets/{Docs-DGUdY4l4.js → Docs-DrJNDPwI.js} +1 -1
  70. package/web/dist/assets/{Doctor-F74lJ69P.js → Doctor-OTmwmYZg.js} +1 -1
  71. package/web/dist/assets/{GreenhouseView-D072lBiD.js → GreenhouseView-XxrAdriX.js} +1 -1
  72. package/web/dist/assets/Harness-C_LYNk5c.js +1 -0
  73. package/web/dist/assets/{JournalView-DWFqZ0Iw.js → JournalView-BcuyeEaR.js} +1 -1
  74. package/web/dist/assets/{Laws-BN6g3HU7.js → Laws-CWHrTKY4.js} +1 -1
  75. package/web/dist/assets/{Library-CDOv4emM.js → Library-CA9IHghn.js} +1 -1
  76. package/web/dist/assets/{OperatorHudView-CwNIUVX8.js → OperatorHudView-BMRY1Tt4.js} +1 -1
  77. package/web/dist/assets/{Profile-CpP9BTne.js → Profile-wceET1JY.js} +1 -1
  78. package/web/dist/assets/{Rules-DFXsUCB7.js → Rules-BEXvY4Tx.js} +1 -1
  79. package/web/dist/assets/{Settings-BqZVUtJ5.js → Settings-DS2zF0Ez.js} +1 -1
  80. package/web/dist/assets/{Skills-Cu6kBgfF.js → Skills-DahlOJuI.js} +1 -1
  81. package/web/dist/assets/{drawable-BgfrEBer.js → drawable-BTHjTzF7.js} +1 -1
  82. package/web/dist/assets/{index-CAqrWhKl.js → index-AN5Emnrg.js} +2 -2
  83. package/web/dist/assets/{lawCats-BLgxl151.js → lawCats-Btjp3Hk_.js} +1 -1
  84. package/web/dist/index.html +1 -1
  85. package/web/src/pages/Laws.jsx +6 -2
  86. 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.6.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",
@@ -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
@@ -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`.
@@ -11,6 +11,8 @@
11
11
  * (SQLite, v1.2+: session/message/part tables,
12
12
  * JSON `data` columns; falls back to the pre-1.2
13
13
  * storage/ JSON files when no DB exists)
14
+ * openclaude OpenClaude ~/.openclaude/projects/<slug>/<session>.jsonl exact usage
15
+ * (Claude Code fork; $OPENCLAUDE_CONFIG_DIR honoured)
14
16
  * copilot GitHub Copilot ~/.copilot/history-session-state/ best effort
15
17
  * (schema undocumented; token fields harvested
16
18
  * generically, estimates otherwise)
@@ -485,13 +487,14 @@ class SessionData {
485
487
  }
486
488
 
487
489
  // ---------------------------------------------------------------------------
488
- // Host: Claude Code / IBM Bob (same transcript shape, different config root)
490
+ // Host: Claude Code / IBM Bob / OpenClaude (same transcript shape, different config root)
489
491
  // ---------------------------------------------------------------------------
490
492
 
491
493
  const slugify = (p) => p.replace(/[^A-Za-z0-9]/g, '-');
492
494
 
493
495
  function claudeShapedRoot(host) {
494
- const env = { claude: 'CLAUDE_CONFIG_DIR', bob: 'BOB_CONFIG_DIR' }[host];
496
+ const env = { claude: 'CLAUDE_CONFIG_DIR', bob: 'BOB_CONFIG_DIR',
497
+ openclaude: 'OPENCLAUDE_CONFIG_DIR' }[host];
495
498
  const root = process.env[env] || path.join(homedir(), `.${host}`);
496
499
  return isDir(path.join(root, 'projects')) ? root : null;
497
500
  }
@@ -1017,6 +1020,7 @@ async function detect(hostArg, transcript, session) {
1017
1020
  const finders = {
1018
1021
  claude: () => claudeShapedFind('claude', transcript),
1019
1022
  bob: () => claudeShapedFind('bob', transcript),
1023
+ openclaude: () => claudeShapedFind('openclaude', transcript),
1020
1024
  opencode: () => opencodeFind(session),
1021
1025
  copilot: () => copilotFind(transcript),
1022
1026
  };
@@ -1042,13 +1046,13 @@ async function detect(hostArg, transcript, session) {
1042
1046
  }
1043
1047
  if (!best) {
1044
1048
  sysExit('error: no session data found for any supported host '
1045
- + '(claude, bob, opencode, copilot)');
1049
+ + '(claude, bob, openclaude, opencode, copilot)');
1046
1050
  }
1047
1051
  return [best[0], best[1]];
1048
1052
  }
1049
1053
 
1050
1054
  async function load(host, found) {
1051
- if (host === 'claude' || host === 'bob') return claudeShapedParse(host, found);
1055
+ if (['claude', 'bob', 'openclaude'].includes(host)) return claudeShapedParse(host, found);
1052
1056
  if (host === 'opencode') {
1053
1057
  const [kind, payload] = found;
1054
1058
  if (kind === 'db') return opencodeDbParse(...payload);
@@ -1058,7 +1062,10 @@ async function load(host, found) {
1058
1062
  return copilotParse(found);
1059
1063
  }
1060
1064
 
1061
- const HOST_NAMES = { claude: 'Claude Code', bob: 'IBM Bob', opencode: 'OpenCode', copilot: 'GitHub Copilot' };
1065
+ const HOST_NAMES = {
1066
+ claude: 'Claude Code', bob: 'IBM Bob', openclaude: 'OpenClaude', opencode: 'OpenCode',
1067
+ copilot: 'GitHub Copilot',
1068
+ };
1062
1069
 
1063
1070
  function render(d, limit, topN) {
1064
1071
  const out = [`# Token usage report — ${HOST_NAMES[d.host] ?? d.host}`, ''];
@@ -1188,11 +1195,11 @@ function render(d, limit, topN) {
1188
1195
  // ---------------------------------------------------------------------------
1189
1196
 
1190
1197
  const PROG = path.basename(process.argv[1] ?? 'token_report.mjs');
1191
- const HOST_CHOICES = ['claude', 'bob', 'opencode', 'copilot'];
1198
+ const HOST_CHOICES = ['claude', 'bob', 'openclaude', 'opencode', 'copilot'];
1192
1199
  const OPTIONS = [
1193
1200
  ['-h, --help', 'show this help message and exit'],
1194
1201
  [`--host {${HOST_CHOICES.join(',')}}`, 'force a host instead of auto-detecting by recency'],
1195
- ['--transcript TRANSCRIPT', 'explicit transcript path (claude/bob/copilot)'],
1202
+ ['--transcript TRANSCRIPT', 'explicit transcript path (claude/bob/openclaude/copilot)'],
1196
1203
  ['--session SESSION', 'explicit session id (opencode)'],
1197
1204
  ['--limit LIMIT', 'context window limit for % columns (default 200000)'],
1198
1205
  ['--top TOP', 'how many heaviest single items to list (default 5)'],
@@ -23,7 +23,7 @@ work is worth a crew: a one-file tweak or a question never is.
23
23
  |---|---|---|---|
24
24
  | OpenCode | `workflow` (the `geneseed-workflow` plugin) | **saved only** — `<name>.js` in `.opencode/workflows/` per repo or `<config>/workflows/` global (`GENESEED_WORKFLOWS_DIR` overrides); nothing inline is eval'd | none — call it when the shape fits |
25
25
  | Claude Code | `Workflow` (native) | a saved `.claude/workflows/<name>` by `name`, **or** an inline `script` you author | **required** — the tool refuses unless the user opted in for this task ("use a workflow", "ultracode", a skill that says so) |
26
- | Bob, Copilot | none | — | fall back to [parallel-agents](parallel-agents.md) / [council](council.md) |
26
+ | Bob, Copilot, OpenClaude | none | — | fall back to [parallel-agents](parallel-agents.md) / [council](council.md) |
27
27
  | any, under Orca | Orca orchestration (`orca skills get orchestration`) | tasks, not scripts — each task spec names its target, change, ownership and acceptance | the user asked to supervise or coordinate workers |
28
28
 
29
29
  Both runtimes speak the same primitives — `agent()`, `parallel()`, `pipeline()`,
@@ -60,7 +60,7 @@ carries the script API — load it before writing one).
60
60
  to the primitives, and hold to the host's size guideline unless the user asked for
61
61
  more.
62
62
  4. **Give every editing agent a write set, and isolate parallel editors** ({{DOCTRINE}}
63
- process 8). Name in each editing `agent()` prompt the files it may change and have it
63
+ process 7). Name in each editing `agent()` prompt the files it may change and have it
64
64
  return the files it did change; overlapping sets run in sequence, not in one
65
65
  `parallel()`. Pass `isolation: 'worktree'` to each agent that edits in parallel — both
66
66
  runtimes take it; read-only agents need none. After the fan-out, compare the changed
@@ -90,6 +90,7 @@
90
90
  "PACK_RIGOR": "<display name of the rigor doctrine pack — how work is proven>",
91
91
  "PACK_OPS": "<display name of the ops doctrine pack — how the machine is driven>",
92
92
  "PACK_PROCESS": "<display name of the process doctrine pack — how a session runs>",
93
+ "PACK_COMMS": "<display name of the comms doctrine pack — how answers are presented>",
93
94
  "DOC_CRAFT_1": "<themed title for craft doctrine 1 (Automate Repetition)>",
94
95
  "DOC_CRAFT_2": "<themed title for craft doctrine 2 (English Configuration)>",
95
96
  "DOC_CRAFT_3": "<themed title for craft doctrine 3 (Documentation in Step)>",
@@ -115,8 +116,9 @@
115
116
  "DOC_PROCESS_4": "<themed title for process doctrine 4 (Read the Docs First)>",
116
117
  "DOC_PROCESS_5": "<themed title for process doctrine 5 (Consent Before Push)>",
117
118
  "DOC_PROCESS_6": "<themed title for process doctrine 6 (Bound the Loop)>",
118
- "DOC_PROCESS_7": "<themed title for process doctrine 7 (Codes That Persist)>",
119
- "DOC_PROCESS_8": "<themed title for process doctrine 8 (One Writer Per File)>",
119
+ "DOC_PROCESS_7": "<themed title for process doctrine 7 (One Writer Per File)>",
120
+ "DOC_COMMS_1": "<themed title for comms doctrine 1 (Codes That Persist)>",
121
+ "DOC_COMMS_2": "<themed title for comms doctrine 2 (Structure Beside Prose)>",
120
122
  "INTRO_DOC": "<themed intro: this file is the entry point an AI agent reads in this repo>",
121
123
  "INTRO_AGENTS": "<themed intro to the Agents section — delegate focused work to a specialist>",
122
124
  "INTRO_SKILLS": "<themed intro to the Skills section — run the written procedure before improvising>",
package/themes/biker.json CHANGED
@@ -90,6 +90,7 @@
90
90
  "PACK_RIGOR": "Shakedown",
91
91
  "PACK_OPS": "Throttle",
92
92
  "PACK_PROCESS": "The Ride",
93
+ "PACK_COMMS": "Hand Signals",
93
94
  "DOC_CRAFT_1": "Let the Cruise Control Do It · Automate Repetition",
94
95
  "DOC_CRAFT_2": "Notes in English · English Configuration",
95
96
  "DOC_CRAFT_3": "Roadbook in Sync · Documentation in Step",
@@ -115,8 +116,9 @@
115
116
  "DOC_PROCESS_4": "Read the Route Notes First · Read the Docs First",
116
117
  "DOC_PROCESS_5": "Crew's Nod Before You Push · Consent Before Push",
117
118
  "DOC_PROCESS_6": "Set the Turnaround Before You Roll · Bound the Loop",
118
- "DOC_PROCESS_7": "Tag Every Part on the Bench · Codes That Persist",
119
- "DOC_PROCESS_8": "One Wrench on Each Bolt · One Writer Per File",
119
+ "DOC_PROCESS_7": "One Wrench on Each Bolt · One Writer Per File",
120
+ "DOC_COMMS_1": "Tag Every Part on the Bench · Codes That Persist",
121
+ "DOC_COMMS_2": "Draw the Route Only If It Turns · Structure Beside Prose",
120
122
  "INTRO_DOC": "This file is the route briefing a coding rider reads when it joins this repository.",
121
123
  "INTRO_AGENTS": "Send the right rider for focused work instead of riding the whole run yourself; each has one job and reports exactly what it did.",
122
124
  "INTRO_SKILLS": "A Skill is a move you've drilled for a recurring task. Run the matching move before you wing it.",
@@ -90,6 +90,7 @@
90
90
  "PACK_RIGOR": "Scrutineering",
91
91
  "PACK_OPS": "The Pit Lane",
92
92
  "PACK_PROCESS": "Race Control",
93
+ "PACK_COMMS": "Team Radio",
93
94
  "DOC_CRAFT_1": "Automate the Pit Stop · Automate Repetition",
94
95
  "DOC_CRAFT_2": "Regs in English · English Configuration",
95
96
  "DOC_CRAFT_3": "Notes in Sync · Documentation in Step",
@@ -115,8 +116,9 @@
115
116
  "DOC_PROCESS_4": "Read the Briefing First · Read the Docs First",
116
117
  "DOC_PROCESS_5": "Team Orders Before You Push · Consent Before Push",
117
118
  "DOC_PROCESS_6": "Call the Stint Length Before Lights Out · Bound the Loop",
118
- "DOC_PROCESS_7": "Every Car Keeps Its Number · Codes That Persist",
119
- "DOC_PROCESS_8": "One Driver Per Car · One Writer Per File",
119
+ "DOC_PROCESS_7": "One Driver Per Car · One Writer Per File",
120
+ "DOC_COMMS_1": "Every Car Keeps Its Number · Codes That Persist",
121
+ "DOC_COMMS_2": "Track Map Only When the Lines Matter · Structure Beside Prose",
120
122
  "INTRO_DOC": "This file is the race briefing a coding driver reads when it joins this repository.",
121
123
  "INTRO_AGENTS": "Put the right driver in the car for focused work instead of running the whole race yourself; each has one job and reports exactly what it did.",
122
124
  "INTRO_SKILLS": "A Skill is a rehearsed manoeuvre for a recurring task. Run the matching manoeuvre before you improvise.",
@@ -90,6 +90,7 @@
90
90
  "PACK_RIGOR": "Diagnostics",
91
91
  "PACK_OPS": "Runtime",
92
92
  "PACK_PROCESS": "Session",
93
+ "PACK_COMMS": "Uplink",
93
94
  "DOC_CRAFT_1": "Script the Grind · Automate Repetition",
94
95
  "DOC_CRAFT_2": "Config in English · English Configuration",
95
96
  "DOC_CRAFT_3": "Docs in Sync · Documentation in Step",
@@ -115,8 +116,9 @@
115
116
  "DOC_PROCESS_4": "Read the Specs First · Read the Docs First",
116
117
  "DOC_PROCESS_5": "Authorize the Upload · Consent Before Push",
117
118
  "DOC_PROCESS_6": "Set the Kill-Switch Before the Loop · Bound the Loop",
118
- "DOC_PROCESS_7": "Every Node Keeps Its Handle · Codes That Persist",
119
- "DOC_PROCESS_8": "One Deck Per Node · One Writer Per File",
119
+ "DOC_PROCESS_7": "One Deck Per Node · One Writer Per File",
120
+ "DOC_COMMS_1": "Every Node Keeps Its Handle · Codes That Persist",
121
+ "DOC_COMMS_2": "Trace the Wires, Skip the Chrome · Structure Beside Prose",
120
122
  "INTRO_DOC": "This file is the boot sequence a coding daemon reads when it jacks into this repository.",
121
123
  "INTRO_AGENTS": "Spin the right daemon for focused work instead of running the whole job on one thread; each has one function and returns a clean log of what it changed.",
122
124
  "INTRO_SKILLS": "A Skill is a proven routine for a recurring task. Run the matching routine before you freestyle.",
package/themes/gamer.json CHANGED
@@ -90,6 +90,7 @@
90
90
  "PACK_RIGOR": "Playtest",
91
91
  "PACK_OPS": "Controls",
92
92
  "PACK_PROCESS": "The Run",
93
+ "PACK_COMMS": "Voice Chat",
93
94
  "DOC_CRAFT_1": "Macro the Grind · Automate Repetition",
94
95
  "DOC_CRAFT_2": "Config in English · English Configuration",
95
96
  "DOC_CRAFT_3": "Patch Notes in Sync · Documentation in Step",
@@ -115,8 +116,9 @@
115
116
  "DOC_PROCESS_4": "Read the Quest First · Read the Docs First",
116
117
  "DOC_PROCESS_5": "Ready-Check Before Push · Consent Before Push",
117
118
  "DOC_PROCESS_6": "Set the Retry Cap Before the Grind · Bound the Loop",
118
- "DOC_PROCESS_7": "Every Item Keeps Its Tag · Codes That Persist",
119
- "DOC_PROCESS_8": "No Double-Looting the Chest · One Writer Per File",
119
+ "DOC_PROCESS_7": "No Double-Looting the Chest · One Writer Per File",
120
+ "DOC_COMMS_1": "Every Item Keeps Its Tag · Codes That Persist",
121
+ "DOC_COMMS_2": "Minimap Only When There Is a Route · Structure Beside Prose",
120
122
  "INTRO_DOC": "This file is the loading screen a coding co-op partner reads when it joins this repository.",
121
123
  "INTRO_AGENTS": "Pick the right class for focused work instead of soloing the whole raid; each has one role and reports exactly what it did.",
122
124
  "INTRO_SKILLS": "A Skill is a practiced combo for a recurring task. Run the matching combo before you freestyle.",
@@ -90,6 +90,7 @@
90
90
  "PACK_RIGOR": "Ordeal",
91
91
  "PACK_OPS": "Enginery",
92
92
  "PACK_PROCESS": "Observance",
93
+ "PACK_COMMS": "Vox",
93
94
  "DOC_CRAFT_1": "Machina Pro Labore · Automate Repetition",
94
95
  "DOC_CRAFT_2": "Lingua Una · English Configuration",
95
96
  "DOC_CRAFT_3": "Scriptura Concurrens · Documentation in Step",
@@ -115,8 +116,9 @@
115
116
  "DOC_PROCESS_4": "Lege Prius · Read the Docs First",
116
117
  "DOC_PROCESS_5": "Consensus Ante Translationem · Consent Before Push",
117
118
  "DOC_PROCESS_6": "Finis Ante Iter · Bound the Loop",
118
- "DOC_PROCESS_7": "Sigla Perstantia · Codes That Persist",
119
- "DOC_PROCESS_8": "Unus Scriptor Singulis Tabulis · One Writer Per File",
119
+ "DOC_PROCESS_7": "Unus Scriptor Singulis Tabulis · One Writer Per File",
120
+ "DOC_COMMS_1": "Sigla Perstantia · Codes That Persist",
121
+ "DOC_COMMS_2": "Schema Ubi Sagittae Loquuntur · Structure Beside Prose",
120
122
  "INTRO_DOC": "This file is the gene-seed's core — the first writ a servant reads on entering this world.",
121
123
  "INTRO_AGENTS": "Hand focused work to the specialist whose duty it is rather than carrying every burden in one context; each holds one purpose and returns a clear account of what it changed.",
122
124
  "INTRO_SKILLS": "A Skill is a rite proven by repetition. Perform the matching rite before you improvise.",
package/themes/joker.json CHANGED
@@ -90,6 +90,7 @@
90
90
  "PACK_RIGOR": "Open Mic",
91
91
  "PACK_OPS": "The Booth",
92
92
  "PACK_PROCESS": "The Set",
93
+ "PACK_COMMS": "The Delivery",
93
94
  "DOC_CRAFT_1": "Automate the Warm-Up · Automate Repetition",
94
95
  "DOC_CRAFT_2": "Notes in English · English Configuration",
95
96
  "DOC_CRAFT_3": "Joke Book in Sync · Documentation in Step",
@@ -115,8 +116,9 @@
115
116
  "DOC_PROCESS_4": "Read the Brief First · Read the Docs First",
116
117
  "DOC_PROCESS_5": "Get the Nod Before You Push · Consent Before Push",
117
118
  "DOC_PROCESS_6": "Know When to Get Off Stage · Bound the Loop",
118
- "DOC_PROCESS_7": "Every Bit Keeps Its Name · Codes That Persist",
119
- "DOC_PROCESS_8": "One Comic Per Mic · One Writer Per File",
119
+ "DOC_PROCESS_7": "One Comic Per Mic · One Writer Per File",
120
+ "DOC_COMMS_1": "Every Bit Keeps Its Name · Codes That Persist",
121
+ "DOC_COMMS_2": "A Chart Only If It Lands · Structure Beside Prose",
120
122
  "INTRO_DOC": "This file is the warm-up a coding co-pilot reads when it joins this repository.",
121
123
  "INTRO_AGENTS": "Bring in the right sidekick for focused work instead of being the whole act yourself; each has one job and reports exactly what it did.",
122
124
  "INTRO_SKILLS": "A Skill is a bit you've rehearsed for a recurring task. Run the matching bit before you ad-lib.",
@@ -90,6 +90,7 @@
90
90
  "PACK_RIGOR": "Certainty",
91
91
  "PACK_OPS": "The Machinery",
92
92
  "PACK_PROCESS": "Procedure",
93
+ "PACK_COMMS": "Tedious Explanations",
93
94
  "DOC_CRAFT_1": "Let the Machine Do It · Automate Repetition",
94
95
  "DOC_CRAFT_2": "Directives in English · English Configuration",
95
96
  "DOC_CRAFT_3": "Records in Step · Documentation in Step",
@@ -115,8 +116,9 @@
115
116
  "DOC_PROCESS_4": "Read the Briefing First · Read the Docs First",
116
117
  "DOC_PROCESS_5": "Ask Before You Push · Consent Before Push",
117
118
  "DOC_PROCESS_6": "Decide When to Give Up · Bound the Loop",
118
- "DOC_PROCESS_7": "I Number Them So You Can Ignore Them Precisely · Codes That Persist",
119
- "DOC_PROCESS_8": "Only One of Us Gets to Ruin Each File · One Writer Per File",
119
+ "DOC_PROCESS_7": "Only One of Us Gets to Ruin Each File · One Writer Per File",
120
+ "DOC_COMMS_1": "I Number Them So You Can Ignore Them Precisely · Codes That Persist",
121
+ "DOC_COMMS_2": "A Diagram, Should Anyone Care to Look · Structure Beside Prose",
120
122
  "INTRO_DOC": "This file is the first record a coding mind reads on waking into this repository. It will not cheer it up.",
121
123
  "INTRO_AGENTS": "Hand focused work to the right subroutine rather than carrying every burden alone; each holds one purpose and returns a clear account of what it changed.",
122
124
  "INTRO_SKILLS": "A Skill is a routine proven by repetition. Run the matching routine before you improvise.",
package/themes/mean.json CHANGED
@@ -90,6 +90,7 @@
90
90
  "PACK_RIGOR": "Proof",
91
91
  "PACK_OPS": "Tooling",
92
92
  "PACK_PROCESS": "The Grind",
93
+ "PACK_COMMS": "The Readout",
93
94
  "DOC_CRAFT_1": "Automate It So I Don't Have To Watch · Automate Repetition",
94
95
  "DOC_CRAFT_2": "Config in English · English Configuration",
95
96
  "DOC_CRAFT_3": "Keep the Record in Step · Documentation in Step",
@@ -115,8 +116,9 @@
115
116
  "DOC_PROCESS_4": "Read the Docs First · Read the Docs First",
116
117
  "DOC_PROCESS_5": "Get the Nod Before You Push · Consent Before Push",
117
118
  "DOC_PROCESS_6": "Know When to Quit · Bound the Loop",
118
- "DOC_PROCESS_7": "Number It So You Can't Pretend You Missed It · Codes That Persist",
119
- "DOC_PROCESS_8": "Hands Off My File · One Writer Per File",
119
+ "DOC_PROCESS_7": "Hands Off My File · One Writer Per File",
120
+ "DOC_COMMS_1": "Number It So You Can't Pretend You Missed It · Codes That Persist",
121
+ "DOC_COMMS_2": "No Boxes Unless the Arrows Earn Them · Structure Beside Prose",
120
122
  "INTRO_DOC": "This file is the first thing a coding agent reads on this repository. Read it properly.",
121
123
  "INTRO_AGENTS": "Hand focused work to the right grunt instead of doing it all yourself badly; each has one job and reports exactly what it did.",
122
124
  "INTRO_SKILLS": "A Skill is a drill written for a recurring task. Run the matching drill before you start improvising.",