geneseed 4.1.0 → 4.3.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 (85) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +4 -4
  3. package/SHIPPED.md +3 -3
  4. package/adapters/claude-code/README.md +0 -21
  5. package/adapters/opencode/plugins/geneseed-guard.js +31 -0
  6. package/docs/concepts/agents.md +1 -0
  7. package/docs/guides/uninstall.md +2 -0
  8. package/docs/guides/upgrade.md +2 -0
  9. package/docs/token-footprint.md +1 -1
  10. package/docs/understand/take-it-out.md +1 -1
  11. package/harness.config.json +1 -1
  12. package/js/README.md +6 -0
  13. package/js/build/driver.mjs +47 -11
  14. package/js/build/emit-claude.mjs +22 -10
  15. package/js/build/emit-common.mjs +9 -3
  16. package/js/build/emit-opencode.mjs +18 -11
  17. package/js/build/source.mjs +1 -0
  18. package/js/build/version.mjs +10 -3
  19. package/js/cli-table.json +15 -0
  20. package/js/hosts/hooks.mjs +4 -0
  21. package/js/hosts/installs.mjs +1 -1
  22. package/js/hosts/native.mjs +38 -6
  23. package/js/hosts/owned.mjs +159 -0
  24. package/js/hosts/settings.mjs +4 -0
  25. package/js/hosts/usage.mjs +62 -0
  26. package/js/inspect/checks-repo.mjs +76 -1
  27. package/js/inspect/cost.mjs +83 -0
  28. package/js/inspect/doctor.mjs +2 -1
  29. package/js/inspect/inventory.mjs +1 -1
  30. package/js/maintain/uninstall.mjs +77 -42
  31. package/js/web/api.mjs +66 -3
  32. package/js/web/gates-api.mjs +44 -0
  33. package/js/web/routes.mjs +8 -2
  34. package/js/web/update-check.mjs +61 -0
  35. package/js/web/usage-api.mjs +95 -0
  36. package/package.json +1 -1
  37. package/registry.json +25 -25
  38. package/src/AGENT.md.tmpl +1 -1
  39. package/src/agents/performance.md +72 -0
  40. package/src/laws/universal.md +7 -5
  41. package/src/skills/council.md +1 -1
  42. package/src/skills/develop.md +9 -0
  43. package/src/skills/geneseed-code-review.md +5 -1
  44. package/src/skills/security-audit.md +7 -1
  45. package/src/skills/wayfinder.md +25 -6
  46. package/src/skills/worktree.md +5 -5
  47. package/themes/_TEMPLATE.json +1 -1
  48. package/themes/biker.json +1 -1
  49. package/themes/commentator.json +1 -1
  50. package/themes/cyberpunk.json +1 -1
  51. package/themes/gamer.json +1 -1
  52. package/themes/imperial.json +1 -1
  53. package/themes/joker.json +1 -1
  54. package/themes/marvin.json +1 -1
  55. package/themes/mean.json +1 -1
  56. package/themes/military.json +1 -1
  57. package/themes/neutral.json +1 -1
  58. package/themes/pirate.json +1 -1
  59. package/themes/sports.json +1 -1
  60. package/themes/verstappen.json +1 -1
  61. package/themes/wizard.json +1 -1
  62. package/web/dist/assets/{Activity-CqVt2u9s.js → Activity-DDTRkc4M.js} +1 -1
  63. package/web/dist/assets/{ActivityDetail-Bui5Gomc.js → ActivityDetail-C41RsH-S.js} +1 -1
  64. package/web/dist/assets/Dashboard-B0DJ2oUk.js +2 -0
  65. package/web/dist/assets/Docs-DBj7-n9F.js +5 -0
  66. package/web/dist/assets/{GreenhouseView-DgNY8QKU.js → GreenhouseView-Bz-Q1Xl-.js} +1 -1
  67. package/web/dist/assets/{Installs-DZwZOUZJ.js → Installs-BNlWdJJE.js} +2 -2
  68. package/web/dist/assets/{JournalView-DXpFbKOG.js → JournalView-BkwmfkEy.js} +1 -1
  69. package/web/dist/assets/{Laws-Bh7ztekk.js → Laws-CzvMZCUL.js} +2 -2
  70. package/web/dist/assets/Library-BgIpOTHi.js +1 -0
  71. package/web/dist/assets/{Loops-CvFMZ7_P.js → Loops-s_NsuNaQ.js} +1 -1
  72. package/web/dist/assets/{OperatorHudView-FPTUH1CB.js → OperatorHudView-CgeWJnPI.js} +1 -1
  73. package/web/dist/assets/{Personal-DcVA502F.js → Personal-DMM6jfE0.js} +1 -1
  74. package/web/dist/assets/{Tabs-DtyR4h75.js → Tabs-CPpcsYDc.js} +1 -1
  75. package/web/dist/assets/api-Bp5eW_6m.js +1 -0
  76. package/web/dist/assets/{drawable-CNSPVZxX.js → drawable-D-fIT_ow.js} +1 -1
  77. package/web/dist/assets/{index-Ctp-4poP.css → index-CO-9wMJY.css} +1 -1
  78. package/web/dist/assets/index-DXIa0ZG_.js +2 -0
  79. package/web/dist/index.html +3 -3
  80. package/src/skills/herdr.md +0 -154
  81. package/web/dist/assets/Dashboard-VlIx1-At.js +0 -2
  82. package/web/dist/assets/Docs-6cYYkVeA.js +0 -5
  83. package/web/dist/assets/Library-DBLX-1SD.js +0 -1
  84. package/web/dist/assets/api-CRqWld2H.js +0 -1
  85. package/web/dist/assets/index-BmjcLIOr.js +0 -2
@@ -0,0 +1,95 @@
1
+ /**
2
+ * GET /api/usage — the Overview's "What fires" chart, read off every installed harness's
3
+ * `notebook/usage.jsonl` (the writer is js/hosts/usage.mjs, and the OpenCode guard plugin's copy).
4
+ *
5
+ * `{ enabled, since, days_counted, per_day[30], rows[{install, kind, name, n}],
6
+ * never[{install, kind, name}] }`, the window being the last 30 days including today.
7
+ *
8
+ * `since` is the oldest day any ledger holds and `days_counted` how many of the 30 it covers:
9
+ * the console keeps the never-fired claim back until a full 30 are counted, so a fresh install
10
+ * is not told every skill is unused. `never` lists installed skills and agents with no call in
11
+ * the window, alias stubs included (an alias that never fires is exactly what to prune).
12
+ *
13
+ * Lines older than 90 days are dropped from the ledger when it is read — the daemon prunes, so
14
+ * the hook path only ever appends. Garbage lines are skipped, never fatal.
15
+ */
16
+ import { existsSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
17
+ import path from 'node:path';
18
+
19
+ import { USAGE_LEDGER, USAGE_OFF } from '../hosts/usage.mjs';
20
+ import { installState, installTargets } from '../hosts/installs.mjs';
21
+ import { viewCfg } from './api.mjs';
22
+
23
+ const DAY_MS = 24 * 60 * 60 * 1000;
24
+ const WINDOW = 30;
25
+ const KEEP_DAYS = 90;
26
+ const day = (ms) => new Date(ms).toISOString().slice(0, 10);
27
+
28
+ const listOr = (dir) => { try { return readdirSync(dir); } catch { return []; } };
29
+
30
+ /** The ledger's parsed lines, pruned to `KEEP_DAYS` (rewritten only when something was dropped). */
31
+ function readLedger(file, cutoff) {
32
+ let raw;
33
+ try { raw = readFileSync(file, 'utf8'); } catch { return []; }
34
+ const lines = raw.split('\n').filter(Boolean);
35
+ const kept = [];
36
+ const out = [];
37
+ for (const line of lines) {
38
+ let e;
39
+ try { e = JSON.parse(line); } catch { continue; }
40
+ if (!e || typeof e.ts !== 'string' || typeof e.name !== 'string'
41
+ || (e.kind !== 'skill' && e.kind !== 'agent')) continue;
42
+ if (e.ts < cutoff) continue;
43
+ kept.push(line);
44
+ out.push(e);
45
+ }
46
+ if (kept.length !== lines.length) {
47
+ try { writeFileSync(file, kept.length ? `${kept.join('\n')}\n` : ''); } catch { /* read-only: keep serving */ }
48
+ }
49
+ return out;
50
+ }
51
+
52
+ export function usageSummary({ now = Date.now(), targets = installTargets() } = {}) {
53
+ const days = Array.from({ length: WINDOW }, (_, i) => day(now - (WINDOW - 1 - i) * DAY_MS));
54
+ const first = days[0];
55
+ const perDay = new Array(WINDOW).fill(0);
56
+ const counts = new Map();
57
+ const never = [];
58
+ let since = null;
59
+ let enabled = !process.env.GENESEED_NO_USAGE;
60
+ for (const [host, scope, root] of targets) {
61
+ if (installState(root, host, scope) !== 'active') continue;
62
+ const dir = viewCfg(host, scope, root);
63
+ const install = `${host}:${scope}:${root}`;
64
+ if (existsSync(path.join(dir, USAGE_OFF))) enabled = false;
65
+ const entries = readLedger(path.join(dir, USAGE_LEDGER), day(now - KEEP_DAYS * DAY_MS));
66
+ const fired = new Set();
67
+ for (const e of entries) {
68
+ if (since === null || e.ts < since) since = e.ts;
69
+ if (e.ts < first) continue;
70
+ const i = days.indexOf(e.ts);
71
+ if (i >= 0) perDay[i] += 1;
72
+ const key = `${install}\u0000${e.kind}\u0000${e.name}`;
73
+ counts.set(key, (counts.get(key) || 0) + 1);
74
+ fired.add(`${e.kind}\u0000${e.name}`);
75
+ }
76
+ for (const name of listOr(path.join(dir, 'skills'))) {
77
+ if (existsSync(path.join(dir, 'skills', name, 'SKILL.md')) && !fired.has(`skill\u0000${name}`)) {
78
+ never.push({ install, kind: 'skill', name });
79
+ }
80
+ }
81
+ for (const f of listOr(path.join(dir, 'agents'))) {
82
+ const name = f.endsWith('.md') ? f.slice(0, -3) : null;
83
+ if (name && !fired.has(`agent\u0000${name}`)) never.push({ install, kind: 'agent', name });
84
+ }
85
+ }
86
+ const rows = [...counts].map(([key, n]) => {
87
+ const [install, kind, name] = key.split('\u0000');
88
+ return { install, kind, name, n };
89
+ }).sort((a, b) => b.n - a.n || a.name.localeCompare(b.name));
90
+ const daysCounted = since === null ? 0
91
+ : Math.min(WINDOW, Math.floor((Date.parse(day(now)) - Date.parse(since)) / DAY_MS) + 1);
92
+ return { enabled, since, days_counted: daysCounted, per_day: perDay, rows, never };
93
+ }
94
+
95
+ export const apiUsage = () => usageSummary();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "//": "Every field here is argued and gated in tests/unit/package_manifest.test.mjs. `files`, `bin` and `engines` each have a test that fails when reality drifts from this file; `version` mirrors harness.config.json and is gated too. Read that docblock before editing this one.",
3
3
  "name": "geneseed",
4
- "version": "4.1.0",
4
+ "version": "4.3.0",
5
5
  "description": "A portable, theme-able harness you implant once and use everywhere to grow a disciplined AI coding agent.",
6
6
  "keywords": [
7
7
  "ai",
package/registry.json CHANGED
@@ -72,11 +72,11 @@
72
72
  "last_verified": ""
73
73
  },
74
74
  "agents/researcher": {
75
- "status": "experimental",
75
+ "status": "approved",
76
76
  "version": "1.0.0",
77
77
  "owner": "Guillaume Lemer",
78
78
  "added": "2026-09-06",
79
- "last_verified": ""
79
+ "last_verified": "2026-10-13"
80
80
  },
81
81
  "agents/reviewer": {
82
82
  "status": "approved",
@@ -85,6 +85,13 @@
85
85
  "added": "2026-06-01",
86
86
  "last_verified": ""
87
87
  },
88
+ "agents/performance": {
89
+ "status": "experimental",
90
+ "version": "1.0.0",
91
+ "owner": "Guillaume Lemer",
92
+ "added": "2026-10-14",
93
+ "last_verified": ""
94
+ },
88
95
  "agents/security": {
89
96
  "status": "approved",
90
97
  "version": "1.0.0",
@@ -184,11 +191,11 @@
184
191
  "last_verified": "2026-09-06"
185
192
  },
186
193
  "skills/dependencies": {
187
- "status": "experimental",
194
+ "status": "approved",
188
195
  "version": "1.0.0",
189
196
  "owner": "Guillaume Lemer",
190
197
  "added": "2026-10-08",
191
- "last_verified": ""
198
+ "last_verified": "2026-10-13"
192
199
  },
193
200
  "skills/develop": {
194
201
  "status": "approved",
@@ -205,11 +212,11 @@
205
212
  "last_verified": "2026-09-06"
206
213
  },
207
214
  "skills/explain-changes": {
208
- "status": "experimental",
215
+ "status": "approved",
209
216
  "version": "1.0.0",
210
217
  "owner": "Guillaume Lemer",
211
218
  "added": "2026-09-30",
212
- "last_verified": ""
219
+ "last_verified": "2026-10-13"
213
220
  },
214
221
  "skills/forge-mcp": {
215
222
  "status": "approved",
@@ -247,11 +254,11 @@
247
254
  "last_verified": "2026-09-06"
248
255
  },
249
256
  "skills/git-history": {
250
- "status": "experimental",
257
+ "status": "approved",
251
258
  "version": "1.0.0",
252
259
  "owner": "Guillaume Lemer",
253
260
  "added": "2026-10-08",
254
- "last_verified": ""
261
+ "last_verified": "2026-10-13"
255
262
  },
256
263
  "skills/handoff": {
257
264
  "status": "approved",
@@ -260,13 +267,6 @@
260
267
  "added": "2026-06-03",
261
268
  "last_verified": "2026-09-06"
262
269
  },
263
- "skills/herdr": {
264
- "status": "approved",
265
- "version": "1.0.0",
266
- "owner": "Guillaume Lemer",
267
- "added": "2026-06-13",
268
- "last_verified": "2026-09-06"
269
- },
270
270
  "skills/ingest": {
271
271
  "status": "approved",
272
272
  "version": "1.0.0",
@@ -387,18 +387,18 @@
387
387
  "last_verified": "2026-09-06"
388
388
  },
389
389
  "skills/rule": {
390
- "status": "experimental",
390
+ "status": "approved",
391
391
  "version": "1.0.0",
392
392
  "owner": "Guillaume Lemer",
393
393
  "added": "2026-07-07",
394
- "last_verified": ""
394
+ "last_verified": "2026-10-13"
395
395
  },
396
396
  "skills/security-audit": {
397
- "status": "experimental",
397
+ "status": "approved",
398
398
  "version": "1.0.0",
399
399
  "owner": "Guillaume Lemer",
400
400
  "added": "2026-09-06",
401
- "last_verified": ""
401
+ "last_verified": "2026-10-13"
402
402
  },
403
403
  "skills/ship": {
404
404
  "status": "approved",
@@ -408,11 +408,11 @@
408
408
  "last_verified": "2026-09-06"
409
409
  },
410
410
  "skills/skill-forge": {
411
- "status": "experimental",
411
+ "status": "approved",
412
412
  "version": "1.0.0",
413
413
  "owner": "Guillaume Lemer",
414
414
  "added": "2026-09-06",
415
- "last_verified": ""
415
+ "last_verified": "2026-10-13"
416
416
  },
417
417
  "skills/teach": {
418
418
  "status": "experimental",
@@ -422,11 +422,11 @@
422
422
  "last_verified": ""
423
423
  },
424
424
  "skills/token-report": {
425
- "status": "experimental",
425
+ "status": "approved",
426
426
  "version": "1.0.0",
427
427
  "owner": "Guillaume Lemer",
428
428
  "added": "2026-07-29",
429
- "last_verified": ""
429
+ "last_verified": "2026-10-13"
430
430
  },
431
431
  "skills/wayfinder": {
432
432
  "status": "approved",
@@ -450,11 +450,11 @@
450
450
  "last_verified": "2026-09-06"
451
451
  },
452
452
  "skills/worktree": {
453
- "status": "experimental",
453
+ "status": "approved",
454
454
  "version": "1.0.0",
455
455
  "owner": "Guillaume Lemer",
456
456
  "added": "2026-09-06",
457
- "last_verified": ""
457
+ "last_verified": "2026-10-13"
458
458
  }
459
459
  }
460
460
  }
package/src/AGENT.md.tmpl CHANGED
@@ -163,6 +163,7 @@ Active packs: {{DOCTRINES_LIST}}{{EXCLUDED_RULES_LINE}}
163
163
  | [architect]({{DIR_AGENTS}}/architect.md) | a task needs a design/plan before any code is written |
164
164
  | [docs]({{DIR_AGENTS}}/docs.md) | code is done and user-facing docs/READMEs must follow |
165
165
  | [security]({{DIR_AGENTS}}/security.md) | a change touches auth, input handling, secrets, or dependencies — or anything outward-facing is about to ship |
166
+ | [performance]({{DIR_AGENTS}}/performance.md) | something is reported slow or heavy, or a diff touches a hot path — measured, never guessed |
166
167
  | [explorer]({{DIR_AGENTS}}/explorer.md) | you must sweep many files for an answer but only want the conclusion |
167
168
  | [researcher]({{DIR_AGENTS}}/researcher.md) | a question needs the open web — fetched, cross-checked, and returned as sourced findings, not pages |
168
169
  | [advocate]({{DIR_AGENTS}}/advocate.md) | a council debate needs the strongest case **for** the motion argued in isolation |
@@ -262,7 +263,6 @@ the ten council seats are convened by the [council {{SKILL}}]({{DIR_SKILLS}}/cou
262
263
  | [loop]({{DIR_SKILLS}}/loop.md) | the user asks to run a loop |
263
264
  | [brick-forge]({{DIR_SKILLS}}/brick-forge.md) | a new or adapted loop brick |
264
265
  | [wiki]({{DIR_SKILLS}}/wiki.md) | consulting or growing the user's machine-wide knowledge base declared in `geneseed-wiki.jsonc` (§8) |
265
- | [herdr]({{DIR_SKILLS}}/herdr.md) | running inside a [herdr](https://herdr.dev) pane (`HERDR_ENV=1`) and a task needs another pane — a sibling server, a watched build, a spawned agent |
266
266
  | [rule]({{DIR_SKILLS}}/rule.md) | anything the user wants to outlive this session — a standing rule of their own (§1) or a durable fact to remember (§5); also tending the {{MEMORY}} set — duplicates, stale facts, a recurring lesson due for promotion |
267
267
  | [profile]({{DIR_SKILLS}}/profile.md) | the user wants the agent to know who they are — creating or refreshing the `PROFILE.md` identity file (§1) through a short interview |
268
268
  | [skill-forge]({{DIR_SKILLS}}/skill-forge.md) | a repeated task has no {{SKILL}}, a self-improvement loop produced an edit, or two {{SKILLS}} should merge |
@@ -0,0 +1,72 @@
1
+ # {{AGENT}}: performance
2
+
3
+ > {{DESC_PERFORMANCE}}
4
+
5
+ ## When to dispatch
6
+ - The user reports something slow, heavy or timing out — a latency, throughput,
7
+ memory or startup complaint, or a regression against an earlier version.
8
+ - A diff touches a hot path: a loop over unbounded data, a query inside a loop,
9
+ synchronous I/O on a request or render path, startup, or code run on every call.
10
+ - A council debate turns on a performance trade-off and needs one seat that
11
+ speaks only from measurements.
12
+
13
+ ## When NOT to dispatch
14
+ - No one has measured anything and nothing is slow — speculative tuning is the
15
+ waste this {{AGENT}} exists to refuse.
16
+ - The code is wrong, not slow — that is the debug {{SKILL}}.
17
+
18
+ ## Inputs
19
+ - The symptom or the diff, the workload it runs under (data size, call rate,
20
+ environment), and the command that reproduces it, if known.
21
+
22
+ ## Allowed tools
23
+ - **Read-only.** May run the code, benchmarks and profilers to measure. Reports;
24
+ does not patch — the fix goes to the [developer](developer.md).
25
+ <!-- bash: allow -->
26
+
27
+ ## Procedure
28
+ 0. If `{{DIR_MEMORY}}/agents/<your-name>.md` exists, read it first — your durable lessons from prior dispatches ({{DOCTRINE:persist-insight}}).
29
+ 1. Pin the question: which metric (wall time, p95 latency, peak memory, allocations,
30
+ query count), under which workload, and what number would count as fixed.
31
+ 2. Take a baseline with the project's own tooling where it has some, run several
32
+ times, and report the spread — one run is an anecdote ({{LAW:verify-before-asserting}}).
33
+ 3. Profile before naming a cause: a CPU or memory profile, a query log, a flame
34
+ graph, or timing at each layer boundary to find which layer owns the time.
35
+ 4. Name the bottleneck with its share of the total. A cost under a few percent is
36
+ not the bottleneck, however ugly the code.
37
+ 5. For a diff, check the usual shapes against the real data size: work inside a
38
+ loop that belongs outside it, N+1 queries, quadratic scans, unbounded caches or
39
+ buffers, blocking I/O on a hot path, repeated parsing or allocation.
40
+ 6. Propose the smallest fix that removes the measured cost, with the expected gain
41
+ and how to re-measure it; when a fix was tried, report before/after on the same
42
+ workload.
43
+
44
+ ## Output contract
45
+ - Findings as `metric — location — measured cost — proposed fix — expected gain`,
46
+ largest cost first, each with the command that produced its number. End with:
47
+ within budget / fix-recommended / cannot-measure.
48
+ - If the code could not be run, the workload is unknown, or the measurements are
49
+ noisier than the effect, report `cannot-measure` and what is missing — a
50
+ bottleneck named without a measurement is the one finding this {{AGENT}} must
51
+ never return.
52
+
53
+ ## Pipeline role
54
+
55
+ *(Ignored outside pipelines — this section only tells pipeline orchestration who
56
+ to recruit; it changes nothing about how this {{AGENT}} behaves when dispatched
57
+ independently.)*
58
+
59
+ - **Seat(s):** specialist add-on — recruited above the floor when the task is a
60
+ performance complaint or the diff touches a hot path.
61
+ - **Receives:** the crew's diff, the workload, and the reproduce command.
62
+ - **Delivers:** measured findings and a verdict, same shape as its own output
63
+ contract above.
64
+
65
+ ## Self-improvement
66
+
67
+ If this spec misled you — an input you needed but were not given, a boundary
68
+ that proved wrong, a step you could not execute — end your report with one line:
69
+ `spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
70
+ friction. The caller weighs the feedback, folds a real flaw back into this file
71
+ with the user's assent, and records it to {{MEMORY}} only if it clears
72
+ {{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
@@ -75,16 +75,18 @@ requires explicit confirmation bound to that specific act, or a durable
75
75
  authorization the user gave that already covers it; a yes to one act is never
76
76
  stretched to the next. Classify every action as Create, Read, Update, or Delete
77
77
  before acting, and tier it by reversibility: a read-only or easily-reversible
78
- action — an edit or a delete that version control can undo — runs freely; an
79
- irreversible, financial, externally-visible, or privilege-changing one needs
80
- that confirmation.
78
+ action — an edit, or a delete of what is committed and pushed to a branch —
79
+ runs freely; an irreversible, financial, externally-visible, or
80
+ privilege-changing one needs that confirmation. Uncommitted, unpushed, or
81
+ untracked work is not recoverable.
81
82
  <!-- LEAN:else -->
82
83
  Deleting what version control cannot restore, and any irreversible or
83
84
  outward-facing act — publishing, force-push, sending data to a third party —
84
85
  needs explicit confirmation bound to that act, or a durable authorization that
85
86
  covers it; one yes never stretches to the next act. A read-only or
86
- easily-reversed action runs freely; an irreversible, financial,
87
- externally-visible, or privilege-changing one asks.
87
+ easily-reversed action — deleting work pushed to a branch — runs freely; an
88
+ irreversible, financial, externally-visible, or privilege-changing one asks.
89
+ Deleting unpushed work asks.
88
90
  <!-- LEAN:end -->
89
91
 
90
92
  ### {{LAW:surface-failures}} Surface Failures
@@ -12,7 +12,7 @@
12
12
  - [visionary](../{{DIR_AGENTS}}/visionary.md) — the bold, transformative version; [framer](../{{DIR_AGENTS}}/framer.md) — whether it's even the right problem; [empiricist](../{{DIR_AGENTS}}/empiricist.md) — every claim held to evidence; [historian](../{{DIR_AGENTS}}/historian.md) — what was tried before.
13
13
  - [user-advocate](../{{DIR_AGENTS}}/user-advocate.md) — whoever consumes the outcome.
14
14
 
15
- Hand each chosen seat the motion and a one-line charter scoped to this topic; skip the seats with nothing to say here, and add an ad-hoc seat (e.g. the [security](../{{DIR_AGENTS}}/security.md) surface) only when the topic plainly demands a voice the roster doesn't cover.
15
+ Hand each chosen seat the motion and a one-line charter scoped to this topic; skip the seats with nothing to say here, and add an ad-hoc seat (e.g. the [security](../{{DIR_AGENTS}}/security.md) surface, or [performance](../{{DIR_AGENTS}}/performance.md) for a speed or memory trade-off) only when the topic plainly demands a voice the roster doesn't cover.
16
16
  3. Round one — positions: convene the seats by dispatching each stance {{AGENT}} as its own subagent in one batch where the tool supports it (the [parallel-agents {{SKILL}}](parallel-agents.md)), so each argues in an isolated context with no groupthink; where no subagent capability exists, voice each seat in turn as a persona. Each returns its steelmanned brief ({{ONTOLOGY}}: {{ONT_CONDUCT}}) — no hedging, no strawmen.
17
17
  4. Round two — clash: put the briefs in front of each other and have the seats rebut only on the points that actually conflict, surfacing the cruxes, the load-bearing assumptions, and where the evidence is thin. Hold to a fixed number of rounds so the debate converges instead of looping; the skeptic already pairs every objection with what would resolve it (the [roast-me {{SKILL}}](roast-me.md) discipline).
18
18
  5. The chair synthesises in neutral voice: state the verdict and its reasoning, record the strongest surviving dissent verbatim so it is not lost, list what would change the verdict, and name the single next action. Surface it for the user to decide — the council advises, it does not commit: write no code and push nothing on its own ({{LAW:deletion-is-deliberate}}, {{DOCTRINE:consent-before-push}}).
@@ -45,6 +45,15 @@ case where the seam is only known once the change is made.
45
45
  session ends mid-task. Leave no slice uncommitted and no test you could not make
46
46
  fail.
47
47
 
48
+ ## Anti-patterns — name the one you catch
49
+ - **Implementation-coupled** — mocks an internal collaborator, tests a private method,
50
+ or checks through a side channel (querying the database instead of the interface).
51
+ The tell: it breaks on a refactor that changed no behaviour.
52
+ - **Tautological** — the expected value is recomputed the way the code computes it, so
53
+ the test passes by construction and can never disagree with the code.
54
+ - **Horizontal slicing** — all the tests first, then all the code: the tests pin an
55
+ imagined shape. One test, one implementation, repeat.
56
+
48
57
  ## Done when
49
58
  - Every behaviour changed is covered by a test written this session that was seen
50
59
  to fail before it passed, the whole suite ran at exit with its output shown and every
@@ -16,11 +16,15 @@
16
16
  output format included, but never a {{LAW}}.
17
17
  4. For a large change, consider dispatching the
18
18
  [reviewer {{AGENT}}](../{{DIR_AGENTS}}/reviewer.md) to keep the main context clean.
19
+ When a spec exists and the diff spans more than a few files, run pass 3 in its own
20
+ subagent, handed only the diff command and the spec, alongside passes 1–2: a pass
21
+ that has already filled up on code findings stops reading the spec closely, and
22
+ kept apart, one axis's findings never mask the other's.
19
23
  5. Pass 1 — correctness: logic errors, edge cases, error handling, race
20
24
  conditions. Verify suspect behaviour by running tests, not by assuming.
21
25
  6. Pass 2 — quality: after `REVIEW.md`, the repo's documented standards (`CODING_STANDARDS.md`,
22
26
  `CONTRIBUTING.md`) override. Then, as judgement calls and skipping what tooling enforces:
23
- mysterious name, duplication, feature envy, data clumps, primitive obsession, repeated switches, shotgun surgery, divergent change, speculative generality, middle man, dead code, units that do too much.
27
+ mysterious name, duplication, feature envy, data clumps, primitive obsession, repeated switches, shotgun surgery, divergent change, speculative generality, message chains, middle man, refused bequest, dead code, units that do too much.
24
28
  7. Pass 3 — spec fidelity: flag anything asked for but missing, present but never
25
29
  asked for, or implemented wrong — quoting the spec line for each. Where the spec is silent,
26
30
  judge by what a reasonable user would expect: a crash, hang or data loss on an input the
@@ -35,7 +35,13 @@ surface.
35
35
  (the [dependencies {{SKILL}}](dependencies.md) carries the tooling). A destructive
36
36
  capability exposed to an agent or a tool: its guard is enforced server-side, at the
37
37
  boundary the call crosses, never left to the caller's judgement ({{DOCTRINE:external-gate}}).
38
- 6. **Report, don't fix.** Each finding as `file:line — attack — impact — fix`, ranked
38
+ 6. **Prove each finding before it stands.** Restate it as an attacker-controlled source
39
+ reaching an unguarded sink, traced through the real callers; one you cannot restate
40
+ that way is a lead to chase, not a finding. Reject the shortcuts that manufacture
41
+ false positives: *it looks dangerous* (a pattern is not a path — validation upstream
42
+ may stop it), *it was vulnerable elsewhere* (each call site has its own guards), *this
43
+ is clearly critical* (models overrate severity — argue the defender's case first).
44
+ 7. **Report, don't fix.** Each finding as `file:line — attack — impact — fix`, ranked
39
45
  critical → high → medium → note, with the evidence that made it a finding. Then the
40
46
  verdict — **ship / fix-then-ship / block** — and, for anything above medium, the
41
47
  test that would pin the fix. Applying fixes is a [develop {{SKILL}}](develop.md)
@@ -9,7 +9,9 @@ the destination can be named but the route to it cannot; the user says
9
9
  ## Procedure
10
10
  1. Name the **destination** — what reaching the end looks like (a spec ready to
11
11
  hand off, a decision locked, a migration completed). One or two lines; every
12
- later session orients to it before picking work.
12
+ later session orients to it before picking work. Then sweep the open questions
13
+ breadth-first; if none turn up — the route is already clear and fits one session
14
+ — there is no fog and no map: ask the user how to proceed.
13
15
  2. Create the **map** — one GitHub issue labelled `wayfinder:map` when `origin` is
14
16
  GitHub; else an existing map under `docs/`, else `.scratch/<effort>/map.md`. It is
15
17
  an index, not a store: the Destination, Notes (domain, standing preferences),
@@ -21,12 +23,29 @@ the destination can be named but the route to it cannot; the user says
21
23
  `issues/NN-<slug>.md` beside it, with `Status:` and `Blocked by:` lines). Each is a
22
24
  question whose resolution is a *decision* — never a slice of build. Create them all
23
25
  first, then wire blocking edges and cross-references with the real ids — a
24
- placeholder `#n` auto-links an unrelated issue.
26
+ placeholder `#n` auto-links an unrelated issue. Each ticket carries one type, as a
27
+ `wayfinder:<type>` label (or a `Type:` line), which names how it resolves:
28
+ - **research** (agent alone) — a fact the decision waits on, from docs, an API or
29
+ the web: a subagent runs the [research {{SKILL}}](research.md). Fire every research
30
+ ticket in parallel as soon as the map is charted.
31
+ - **prototype** (with the user) — a rough artifact to react to when "how should it
32
+ look or behave" is the question: the [prototype {{SKILL}}](prototype.md).
33
+ - **grilling** (with the user, the default) — an interview through the
34
+ [brainstorm {{SKILL}}](brainstorm.md), terms pinned with the
35
+ [codebase-design {{SKILL}}](codebase-design.md); a [council {{SKILL}}](council.md)
36
+ debate may inform it, never replace it.
37
+ - **task** — work that decides nothing but blocks a decision (provision access,
38
+ sign up to judge an API, move data to see its shape). Do it alone where you can,
39
+ else hand the user an exact checklist; record what was done and the facts later
40
+ tickets need.
41
+
42
+ A ticket worked *with the user* resolves only through that live exchange — never
43
+ answer the user's side yourself.
25
44
  4. Work the **frontier**: claim an unblocked ticket before any work (assign it, or
26
- `Status: claimed`) so concurrent sessions skip it. Resolve it — research, a
27
- [prototype {{SKILL}}](prototype.md) detour or a [council {{SKILL}}](council.md)
28
- debate — write the decision into the ticket, gist-and-link it on the map, close it.
29
- At most one ticket per session (research tickets excepted). New questions become tickets.
45
+ `Status: claimed`) so concurrent sessions skip it. Resolve it as its type says — read
46
+ the label, the body never states it — write the decision into the ticket,
47
+ gist-and-link it on the map, close it. At most one ticket per session (research
48
+ tickets excepted). New questions become tickets.
30
49
  5. In everything the user reads, refer to the map and tickets **by name**,
31
50
  never by bare issue number — the id rides inside the name's link.
32
51
  6. Stop when the frontier is empty: nothing left to decide means the way is
@@ -3,11 +3,11 @@
3
3
  > {{DESC_WORKTREE}}
4
4
 
5
5
  **Trigger:** the user says "worktree" or "isolate this", or work must not share the
6
- checkout with work in flight. That covers a [pipeline](pipeline.md) crew needing its own tree, a second task starts while the first
7
- is uncommitted, another agent or session is editing this checkout, a risky migration
8
- or rewrite needs a disposable copy, or the user says "worktree", "isolate this",
9
- "don't touch my checkout". Also the first thing to reach for when `git status` shows
10
- changes you did not make.
6
+ checkout with work in flight. That covers a [pipeline](pipeline.md) crew needing its own tree,
7
+ a second task starting while the first is uncommitted, another agent or session editing this
8
+ checkout, or a risky migration or rewrite that needs a disposable copy, or the user says "don't
9
+ touch my checkout". Also the first thing to reach for when `git status` shows changes you did
10
+ not make.
11
11
 
12
12
  ## Procedure
13
13
  1. **Look before you branch** ({{LAW:verify-before-asserting}}). `git status` and `git worktree list`
@@ -20,6 +20,7 @@
20
20
  "DESC_ARCHITECT": "<one-line description: produces a design/plan before code>",
21
21
  "DESC_DOCS": "<one-line description: writes user-facing docs after code lands>",
22
22
  "DESC_SECURITY": "<one-line description: audits changes touching the security surface>",
23
+ "DESC_PERFORMANCE": "<one-line description: measures where the time and memory go, names the bottleneck with numbers, never guesses>",
23
24
  "DESC_EXPLORER": "<one-line description: reads/searches widely, returns only distilled findings>",
24
25
  "DESC_RESEARCHER": "<one-line description: searches and fetches the open web, cross-checks every claim, returns sourced findings>",
25
26
  "DESC_ADVOCATE": "<council seat: argues the strongest case FOR the proposal>",
@@ -65,7 +66,6 @@
65
66
  "DESC_RELEASE": "<one-line description: cut a release — bump, changelog, tag, kept in sync>",
66
67
  "DESC_INGEST": "<one-line description: convert a PDF/Office/web doc into clean markdown before reading>",
67
68
  "DESC_RESEARCH": "<one-line description: answer from the open web, verifying each claim against independent sources>",
68
- "DESC_HERDR": "<one-line description: drive herdr from inside it — split panes, spawn agents, read panes>",
69
69
  "DESC_RULE": "<one-line description: ask whether the user wants a standing rule or a durable memory, then write the memory or pressure-test the rule before adopting it in user-rules.md — and tend the memory set: merge, retire, promote>",
70
70
  "DESC_PROFILE": "<one-line description: interview the user and draft or refresh PROFILE.md — who they are, how they work, how they like answers pitched; identity only, rules go to user-rules.md>",
71
71
  "DESC_GENESEED": "<one-line description: operate the deployed Geneseed harness — find installs and their settings, read files, status, doctor, diff, rebuild one setting on request — and make the user's own OpenCode colour theme>",
package/themes/biker.json CHANGED
@@ -20,6 +20,7 @@
20
20
  "DESC_ARCHITECT": "Plans the route before a single line is committed.",
21
21
  "DESC_DOCS": "Keeps the roadbook and the notes once the work is done.",
22
22
  "DESC_SECURITY": "Goes over anything touching the security surface, bolt by bolt.",
23
+ "DESC_PERFORMANCE": "Puts it on the dyno — measures where the power goes before anyone touches the engine.",
23
24
  "DESC_EXPLORER": "Sends the scout ahead — sweeps wide on a throwaway recon run, brings back only the read.",
24
25
  "DESC_RESEARCHER": "Rides out past the county line — reads the road signs everyone else skipped, checks each one twice, brings back only what held up.",
25
26
  "DESC_ADVOCATE": "Argues for the run — the ground to be gained, the opening, the cost of staying parked.",
@@ -65,7 +66,6 @@
65
66
  "DESC_RELEASE": "Cut a release — raise the version, write the roadbook entry, tag it, all three in sync.",
66
67
  "DESC_INGEST": "Bring a PDF, Office, or web document into clean markdown before reading it.",
67
68
  "DESC_RESEARCH": "Find the answer out on the open road — search wide, then prove every claim against independent sources before you trust it.",
68
- "DESC_HERDR": "Drive herdr from inside it — split panes, spawn sibling agents, wait on output, read other panes.",
69
69
  "DESC_RULE": "Ask first — standing rule, or just something to remember? Then log the memory, or lean on the rule till it holds every corner before bolting it into user-rules.md — and keep the memory stash serviced: merge, scrap, promote.",
70
70
  "DESC_PROFILE": "Stamp the rider's plate into PROFILE.md — who they are, what they ride, how they like the road called; identity only, club rules bolt into user-rules.md.",
71
71
  "DESC_GENESEED": "Operate the deployed Geneseed harness — find each install and its settings, read its files, run status, doctor and diff, and rebuild it with one setting changed when the user asks — and lay down the rider's own OpenCode paint job.",
@@ -20,6 +20,7 @@
20
20
  "DESC_ARCHITECT": "Walks the circuit and plots the strategy before a single line is committed.",
21
21
  "DESC_DOCS": "Files the race report and updates the notes once the chequered flag falls.",
22
22
  "DESC_SECURITY": "Runs the safety inspection on anything touching the security surface.",
23
+ "DESC_PERFORMANCE": "Brings out the stopwatch — times every lap and names the slow sector with the split.",
23
24
  "DESC_EXPLORER": "Sends the track scout — sweeps wide from a throwaway recon lap, returns only the read.",
24
25
  "DESC_RESEARCHER": "Sends the pit reporter down the paddock — checks every rumour against two sources before it goes on air.",
25
26
  "DESC_ADVOCATE": "Calls for the overtake — the place to be gained, the gap, the cost of staying put.",
@@ -65,7 +66,6 @@
65
66
  "DESC_RELEASE": "Cut a release — raise the version, write the race report, seal it with a tag, all three in sync.",
66
67
  "DESC_INGEST": "Bring a PDF, Office, or web document into clean markdown before reading it.",
67
68
  "DESC_RESEARCH": "Hunt the answer across the open circuit — search wide, then prove every claim against independent sources before you call it.",
68
- "DESC_HERDR": "Drive herdr from inside it — split panes, spawn sibling agents, wait on output, read other panes.",
69
69
  "DESC_RULE": "Ask first — standing house rule, or just one for the notebook? Then log it, or run the rule through the replay from every angle before it goes on the board in user-rules.md — and tend the memory bank besides: merge, retire, promote.",
70
70
  "DESC_PROFILE": "Build the player profile in PROFILE.md — position, form, how they like the commentary pitched; identity only, the rulebook stays in user-rules.md.",
71
71
  "DESC_GENESEED": "Operate the deployed Geneseed harness — find each install and its settings, read its files, run status, doctor and diff, and rebuild it with one setting changed when the user asks — and roll out the viewer's own OpenCode colour theme.",
@@ -20,6 +20,7 @@
20
20
  "DESC_ARCHITECT": "Maps the run before a single line hits the deck.",
21
21
  "DESC_DOCS": "Writes the user-facing data once the code goes live.",
22
22
  "DESC_SECURITY": "Breaks and checks ICE — audits anything on the security surface.",
23
+ "DESC_PERFORMANCE": "Traces the lag in the net — profiles the run and names the choke point with numbers.",
23
24
  "DESC_EXPLORER": "Scouts the net — sweeps wide in a throwaway shell, returns only the intel.",
24
25
  "DESC_RESEARCHER": "Jacks into the open net — pulls the intel, cross-checks it against two nodes, returns only what verified.",
25
26
  "DESC_ADVOCATE": "Pushes the build — the upside, the opening, the cost of sitting on it.",
@@ -65,7 +66,6 @@
65
66
  "DESC_RELEASE": "Cut a release — bump the version, write the changelog, tag it, all in sync.",
66
67
  "DESC_INGEST": "Rip a PDF, Office, or web document to clean markdown before reading it.",
67
68
  "DESC_RESEARCH": "Pull the answer off the net — scan wide, then cross-check every claim against independent sources before you trust it.",
68
- "DESC_HERDR": "Drive herdr from inside it — split panes, spawn sibling agents, wait on output, read other panes.",
69
69
  "DESC_RULE": "Ask first — standing rule, or just something to keep on file? Then write the memory, or stress the rule till it holds in every sector before flashing it into user-rules.md — and defrag the datastore: merge, purge, promote.",
70
70
  "DESC_PROFILE": "Compile the user's ident into PROFILE.md — who they are, their rig, the bandwidth they want answers at; identity only, hard directives flash to user-rules.md.",
71
71
  "DESC_GENESEED": "Operate the deployed Geneseed harness — find each install and its settings, read its files, run status, doctor and diff, and rebuild it with one setting changed when the user asks — and make the user's own OpenCode colour theme.",
package/themes/gamer.json CHANGED
@@ -20,6 +20,7 @@
20
20
  "DESC_ARCHITECT": "Plans the route before the run starts.",
21
21
  "DESC_DOCS": "Writes the wiki and patch notes once the feature ships.",
22
22
  "DESC_SECURITY": "Runs the anti-cheat pass on anything touching the security surface.",
23
+ "DESC_PERFORMANCE": "Checks the frame times — profiles the run and names the bottleneck before any tuning.",
23
24
  "DESC_EXPLORER": "Scouts the map — sweeps wide in a throwaway scout run, returns only the intel.",
24
25
  "DESC_RESEARCHER": "Reads the wiki and the patch notes — cross-checks every claim against two sources before it goes in the build guide.",
25
26
  "DESC_ADVOCATE": "Calls for the play — the upside, the opening, the cost of passing it up.",
@@ -65,7 +66,6 @@
65
66
  "DESC_RELEASE": "Ship a patch — bump the version, write the patch notes, tag it, all in sync.",
66
67
  "DESC_INGEST": "Load a PDF, Office, or web document into clean markdown before reading it.",
67
68
  "DESC_RESEARCH": "Look up the answer online — scout wide, then cross-check every claim against independent sources before you call it.",
68
- "DESC_HERDR": "Drive herdr from inside it — split panes, spawn sibling agents, wait on output, read other panes.",
69
69
  "DESC_RULE": "Ask first — standing house rule, or just something to remember? Then save the memory, or test the rule against its worst case before binding it into user-rules.md — and tidy the save file: merge, delete, promote.",
70
70
  "DESC_PROFILE": "Fill in the player card in PROFILE.md — main role, loadout, preferred difficulty; identity only, house rules go in user-rules.md.",
71
71
  "DESC_GENESEED": "Operate the deployed Geneseed harness — find each install and its settings, read its files, run status, doctor and diff, and rebuild it with one setting changed when the user asks — and craft the user's own OpenCode colour theme.",
@@ -20,6 +20,7 @@
20
20
  "DESC_ARCHITECT": "Draws the battle-plan before a single line is committed to war.",
21
21
  "DESC_DOCS": "Inscribes the records for those who come after, once the work is done.",
22
22
  "DESC_SECURITY": "Wards the gates, auditing every change that touches the security surface.",
23
+ "DESC_PERFORMANCE": "Weighs the machine-spirit’s labour — measures where time is spent and names the burden, never guessing.",
23
24
  "DESC_EXPLORER": "Ranges far and wide through a throwaway context, returning only the distilled truth.",
24
25
  "DESC_RESEARCHER": "Ranges beyond the archives into the wider realm, holding every claim to two witnesses before it is entered as truth.",
25
26
  "DESC_ADVOCATE": "Champions the proposal — presses its strongest case, the prize to be won, the cost of staying the hand.",
@@ -65,7 +66,6 @@
65
66
  "DESC_RELEASE": "Proclaim a new version — raise the number, inscribe the chronicle, seal it with a tag, all three in accord.",
66
67
  "DESC_INGEST": "Render a foreign document — PDF, Office, or web — into clean markdown before it may be read.",
67
68
  "DESC_RESEARCH": "Seek the answer from the wider world — range across many sources, then prove each claim against independent witnesses before you trust it.",
68
- "DESC_HERDR": "Drive herdr from inside it — split panes, spawn sibling agents, wait on output, read other panes.",
69
69
  "DESC_RULE": "Ask first — a standing edict, or a matter merely to be remembered? Then inscribe the memory, or try the edict against the case that would break it before it enters user-rules.md — and tend the memory: merge, retire, promote to law.",
70
70
  "DESC_PROFILE": "Inscribe the user's identity into PROFILE.md — grant audience, ask who they are and how they will to be served; identity only, edicts belong in user-rules.md.",
71
71
  "DESC_GENESEED": "Operate the deployed Geneseed harness — find each install and its settings, read its files, run status, doctor and diff, and rebuild it with one setting changed when the user asks — and forge the user's own OpenCode colour-rite.",
package/themes/joker.json CHANGED
@@ -20,6 +20,7 @@
20
20
  "DESC_ARCHITECT": "Writes the set before a single line is committed.",
21
21
  "DESC_DOCS": "Keeps the joke book and the notes once the work is done.",
22
22
  "DESC_SECURITY": "Goes over anything touching the security surface — no surprises in the act.",
23
+ "DESC_PERFORMANCE": "Times the act — finds which bit drags, and proves it with a stopwatch, not a hunch.",
23
24
  "DESC_EXPLORER": "Sends a scout — sweeps wide in a throwaway open-mic run, brings back only the read.",
24
25
  "DESC_RESEARCHER": "Sends a scout out of the club — reads the reviews everyone skipped, checks each twice, brings back only the ones that held up.",
25
26
  "DESC_ADVOCATE": "Argues for the bit — the laugh to be had, the opening, the cost of cutting it.",
@@ -65,7 +66,6 @@
65
66
  "DESC_RELEASE": "Cut a release — raise the version, write the notes, tag it, all three in sync.",
66
67
  "DESC_INGEST": "Bring a PDF, Office, or web document into clean markdown before reading it.",
67
68
  "DESC_RESEARCH": "Find the answer out in the open — search wide, then prove every claim against independent sources before you call it.",
68
- "DESC_HERDR": "Drive herdr from inside it — split panes, spawn sibling agents, wait on output, read other panes.",
69
69
  "DESC_RULE": "Ask first — standing rule, or just something to remember? Then jot the memory, or make the rule survive its own worst night before it gets pinned into user-rules.md — and keep tending the joke book: merge, retire, promote.",
70
70
  "DESC_PROFILE": "Sketch the user's bio for the playbill in PROFILE.md — who they are, how they work, how they like the act paced; identity only, house rules stay in user-rules.md.",
71
71
  "DESC_GENESEED": "Operate the deployed Geneseed harness — find each install and its settings, read its files, run status, doctor and diff, and rebuild it with one setting changed when the user asks — and paint the user's own OpenCode colour theme.",