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.
- package/CHANGELOG.md +43 -0
- package/README.md +4 -4
- package/SHIPPED.md +3 -3
- package/adapters/claude-code/README.md +0 -21
- package/adapters/opencode/plugins/geneseed-guard.js +31 -0
- package/docs/concepts/agents.md +1 -0
- package/docs/guides/uninstall.md +2 -0
- package/docs/guides/upgrade.md +2 -0
- package/docs/token-footprint.md +1 -1
- package/docs/understand/take-it-out.md +1 -1
- package/harness.config.json +1 -1
- package/js/README.md +6 -0
- package/js/build/driver.mjs +47 -11
- package/js/build/emit-claude.mjs +22 -10
- package/js/build/emit-common.mjs +9 -3
- package/js/build/emit-opencode.mjs +18 -11
- package/js/build/source.mjs +1 -0
- package/js/build/version.mjs +10 -3
- package/js/cli-table.json +15 -0
- package/js/hosts/hooks.mjs +4 -0
- package/js/hosts/installs.mjs +1 -1
- package/js/hosts/native.mjs +38 -6
- package/js/hosts/owned.mjs +159 -0
- package/js/hosts/settings.mjs +4 -0
- package/js/hosts/usage.mjs +62 -0
- package/js/inspect/checks-repo.mjs +76 -1
- package/js/inspect/cost.mjs +83 -0
- package/js/inspect/doctor.mjs +2 -1
- package/js/inspect/inventory.mjs +1 -1
- package/js/maintain/uninstall.mjs +77 -42
- package/js/web/api.mjs +66 -3
- package/js/web/gates-api.mjs +44 -0
- package/js/web/routes.mjs +8 -2
- package/js/web/update-check.mjs +61 -0
- package/js/web/usage-api.mjs +95 -0
- package/package.json +1 -1
- package/registry.json +25 -25
- package/src/AGENT.md.tmpl +1 -1
- package/src/agents/performance.md +72 -0
- package/src/laws/universal.md +7 -5
- package/src/skills/council.md +1 -1
- package/src/skills/develop.md +9 -0
- package/src/skills/geneseed-code-review.md +5 -1
- package/src/skills/security-audit.md +7 -1
- package/src/skills/wayfinder.md +25 -6
- package/src/skills/worktree.md +5 -5
- package/themes/_TEMPLATE.json +1 -1
- package/themes/biker.json +1 -1
- package/themes/commentator.json +1 -1
- package/themes/cyberpunk.json +1 -1
- package/themes/gamer.json +1 -1
- package/themes/imperial.json +1 -1
- package/themes/joker.json +1 -1
- package/themes/marvin.json +1 -1
- package/themes/mean.json +1 -1
- package/themes/military.json +1 -1
- package/themes/neutral.json +1 -1
- package/themes/pirate.json +1 -1
- package/themes/sports.json +1 -1
- package/themes/verstappen.json +1 -1
- package/themes/wizard.json +1 -1
- package/web/dist/assets/{Activity-CqVt2u9s.js → Activity-DDTRkc4M.js} +1 -1
- package/web/dist/assets/{ActivityDetail-Bui5Gomc.js → ActivityDetail-C41RsH-S.js} +1 -1
- package/web/dist/assets/Dashboard-B0DJ2oUk.js +2 -0
- package/web/dist/assets/Docs-DBj7-n9F.js +5 -0
- package/web/dist/assets/{GreenhouseView-DgNY8QKU.js → GreenhouseView-Bz-Q1Xl-.js} +1 -1
- package/web/dist/assets/{Installs-DZwZOUZJ.js → Installs-BNlWdJJE.js} +2 -2
- package/web/dist/assets/{JournalView-DXpFbKOG.js → JournalView-BkwmfkEy.js} +1 -1
- package/web/dist/assets/{Laws-Bh7ztekk.js → Laws-CzvMZCUL.js} +2 -2
- package/web/dist/assets/Library-BgIpOTHi.js +1 -0
- package/web/dist/assets/{Loops-CvFMZ7_P.js → Loops-s_NsuNaQ.js} +1 -1
- package/web/dist/assets/{OperatorHudView-FPTUH1CB.js → OperatorHudView-CgeWJnPI.js} +1 -1
- package/web/dist/assets/{Personal-DcVA502F.js → Personal-DMM6jfE0.js} +1 -1
- package/web/dist/assets/{Tabs-DtyR4h75.js → Tabs-CPpcsYDc.js} +1 -1
- package/web/dist/assets/api-Bp5eW_6m.js +1 -0
- package/web/dist/assets/{drawable-CNSPVZxX.js → drawable-D-fIT_ow.js} +1 -1
- package/web/dist/assets/{index-Ctp-4poP.css → index-CO-9wMJY.css} +1 -1
- package/web/dist/assets/index-DXIa0ZG_.js +2 -0
- package/web/dist/index.html +3 -3
- package/src/skills/herdr.md +0 -154
- package/web/dist/assets/Dashboard-VlIx1-At.js +0 -2
- package/web/dist/assets/Docs-6cYYkVeA.js +0 -5
- package/web/dist/assets/Library-DBLX-1SD.js +0 -1
- package/web/dist/assets/api-CRqWld2H.js +0 -1
- 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.
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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.
|
package/src/laws/universal.md
CHANGED
|
@@ -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
|
|
79
|
-
irreversible, financial, externally-visible, or
|
|
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
|
|
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
|
package/src/skills/council.md
CHANGED
|
@@ -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}}).
|
package/src/skills/develop.md
CHANGED
|
@@ -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. **
|
|
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)
|
package/src/skills/wayfinder.md
CHANGED
|
@@ -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 —
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
package/src/skills/worktree.md
CHANGED
|
@@ -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,
|
|
7
|
-
is uncommitted, another agent or session
|
|
8
|
-
or rewrite needs a disposable copy, or the user says "
|
|
9
|
-
|
|
10
|
-
|
|
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`
|
package/themes/_TEMPLATE.json
CHANGED
|
@@ -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.",
|
package/themes/commentator.json
CHANGED
|
@@ -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.",
|
package/themes/cyberpunk.json
CHANGED
|
@@ -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.",
|
package/themes/imperial.json
CHANGED
|
@@ -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.",
|