spexcode 0.4.0 → 0.4.3

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 (111) hide show
  1. package/README.md +37 -17
  2. package/package.json +9 -5
  3. package/spec-cli/README.md +23 -14
  4. package/spec-cli/hooks/dispatch.sh +7 -5
  5. package/spec-cli/hooks/harness.sh +19 -8
  6. package/spec-cli/src/anchors.ts +163 -30
  7. package/spec-cli/src/cli.ts +97 -42
  8. package/spec-cli/src/client.ts +34 -11
  9. package/spec-cli/src/doctor.ts +174 -36
  10. package/spec-cli/src/gateway-auth.ts +194 -0
  11. package/spec-cli/src/gateway-hub.ts +360 -0
  12. package/spec-cli/src/gateway.ts +31 -16
  13. package/spec-cli/src/git.ts +12 -5
  14. package/spec-cli/src/graph.ts +53 -36
  15. package/spec-cli/src/graphStream.ts +265 -34
  16. package/spec-cli/src/guide.ts +157 -76
  17. package/spec-cli/src/harness-select.ts +20 -6
  18. package/spec-cli/src/harness.ts +266 -67
  19. package/spec-cli/src/help.ts +84 -41
  20. package/spec-cli/src/host.ts +610 -0
  21. package/spec-cli/src/identity-presets.d.ts +13 -0
  22. package/spec-cli/src/identity-presets.js +128 -0
  23. package/spec-cli/src/index.ts +163 -86
  24. package/spec-cli/src/init.ts +53 -25
  25. package/spec-cli/src/layout.ts +5 -5
  26. package/spec-cli/src/lint.ts +115 -169
  27. package/spec-cli/src/login-page.ts +12 -5
  28. package/spec-cli/src/materialize.ts +39 -13
  29. package/spec-cli/src/mentions.ts +16 -11
  30. package/spec-cli/src/opencode.ts +145 -0
  31. package/spec-cli/src/pi-harness.ts +124 -0
  32. package/spec-cli/src/project-identity.ts +73 -0
  33. package/spec-cli/src/pty-bridge.ts +321 -521
  34. package/spec-cli/src/pty-helper.mjs +86 -0
  35. package/spec-cli/src/reaper.ts +16 -8
  36. package/spec-cli/src/reviewSnapshot.ts +23 -0
  37. package/spec-cli/src/reviews.ts +347 -0
  38. package/spec-cli/src/session-timeline.ts +162 -0
  39. package/spec-cli/src/sessions.ts +210 -63
  40. package/spec-cli/src/shim-runtime.ts +169 -0
  41. package/spec-cli/src/slash-commands.ts +76 -0
  42. package/spec-cli/src/source-files.ts +79 -0
  43. package/spec-cli/src/specs.ts +47 -24
  44. package/spec-cli/src/supervise.ts +37 -15
  45. package/spec-cli/src/tree.ts +8 -8
  46. package/spec-cli/src/uninstall.ts +56 -23
  47. package/spec-cli/templates/hooks/prepare-commit-msg +32 -13
  48. package/spec-cli/templates/spec/project/.plugins/{extract → commands/extract}/spec.md +24 -18
  49. package/spec-cli/templates/spec/project/.plugins/{regroup → commands/regroup}/spec.md +3 -3
  50. package/spec-cli/templates/spec/project/.plugins/commands/rename/spec.md +11 -0
  51. package/spec-cli/templates/spec/project/.plugins/commands/spec.md +30 -0
  52. package/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +8 -0
  53. package/spec-cli/templates/spec/project/.plugins/commands/tidy/spec.md +43 -0
  54. package/spec-cli/templates/spec/project/.plugins/core/idle/spec.md +1 -1
  55. package/spec-cli/templates/spec/project/.plugins/core/mark-active/spec.md +2 -0
  56. package/spec-cli/templates/spec/project/.plugins/core/session-fail/spec.md +1 -1
  57. package/spec-cli/templates/spec/project/.plugins/core/spec-first/spec-first.sh +28 -39
  58. package/spec-cli/templates/spec/project/.plugins/core/spec-first/spec.md +5 -3
  59. package/spec-cli/templates/spec/project/.plugins/core/spec-of-file/spec.md +1 -1
  60. package/spec-cli/templates/spec/project/.plugins/core/spec.md +2 -2
  61. package/spec-cli/templates/spec/project/.plugins/core/stop-gate/spec.md +7 -1
  62. package/spec-cli/templates/spec/project/.plugins/prompts/forge-link/spec.md +2 -2
  63. package/spec-cli/templates/spec/project/.plugins/prompts/reproduce-before-fix/spec.md +5 -5
  64. package/spec-cli/templates/spec/project/.plugins/prompts/spec.md +10 -6
  65. package/spec-cli/templates/spec/project/.plugins/skills/distill/spec.md +62 -0
  66. package/spec-cli/templates/spec/project/.plugins/skills/spec.md +19 -0
  67. package/spec-cli/templates/spec/project/.plugins/spec.md +17 -12
  68. package/spec-cli/templates/spec/project/spec.md +6 -5
  69. package/spec-cli/templates/spexcode.json +4 -2
  70. package/spec-dashboard/dist/assets/Dashboard-CiHh-gLD.js +27 -0
  71. package/spec-dashboard/dist/assets/EvalsPage-DmiX3rdU.js +2 -0
  72. package/spec-dashboard/dist/assets/IssuesPage-CIbVGRUJ.js +1 -0
  73. package/spec-dashboard/dist/assets/MobileApp-D-N9_eh0.js +2 -0
  74. package/spec-dashboard/dist/assets/Modal-DHMzSFJ4.js +1 -0
  75. package/spec-dashboard/dist/assets/PageScroll-C15adEYI.js +1 -0
  76. package/spec-dashboard/dist/assets/ProjectsPage-sQpzglp5.js +1 -0
  77. package/spec-dashboard/dist/assets/SessionInterface-6GBZ9nXN.css +32 -0
  78. package/spec-dashboard/dist/assets/SessionInterface-B8pGU7Rg.js +39 -0
  79. package/spec-dashboard/dist/assets/SessionWindow-CuDO_67z.js +13 -0
  80. package/spec-dashboard/dist/assets/Settings-C_N1wX1f.js +1 -0
  81. package/spec-dashboard/dist/assets/bindings-BC9vqpYU.js +1 -0
  82. package/spec-dashboard/dist/assets/index-DmWbmvCq.js +41 -0
  83. package/spec-dashboard/dist/assets/index-GGIVdKwH.css +1 -0
  84. package/spec-dashboard/dist/assets/terminalFont-DmTPNdbU.js +1 -0
  85. package/spec-dashboard/dist/index.html +10 -10
  86. package/spec-dashboard/src/reviewFilters.js +279 -0
  87. package/spec-dashboard/src/reviewQuery.js +174 -0
  88. package/spec-dashboard/src/session.js +167 -0
  89. package/spec-eval/src/cli.ts +80 -45
  90. package/spec-eval/src/evaltab.ts +4 -3
  91. package/spec-eval/src/humanok.ts +1 -1
  92. package/spec-eval/src/matrix.ts +693 -0
  93. package/spec-eval/src/scenarios.ts +116 -4
  94. package/spec-eval/src/sessioneval.ts +726 -66
  95. package/spec-cli/src/migrate-table.ts +0 -398
  96. package/spec-cli/src/migrate.ts +0 -386
  97. package/spec-cli/templates/spec/project/.plugins/distill/spec.md +0 -74
  98. package/spec-cli/templates/spec/project/.plugins/supervisor/spec.md +0 -8
  99. package/spec-cli/templates/spec/project/.plugins/tidy/spec.md +0 -25
  100. package/spec-dashboard/dist/assets/Dashboard-CTcH2eW9.js +0 -27
  101. package/spec-dashboard/dist/assets/EvalsPage-CJNKwHLN.js +0 -2
  102. package/spec-dashboard/dist/assets/FoldToggle-CVFbBpyW.js +0 -1
  103. package/spec-dashboard/dist/assets/IssuesPage-kULjonqj.js +0 -1
  104. package/spec-dashboard/dist/assets/MobileApp-B0ZJju8K.js +0 -1
  105. package/spec-dashboard/dist/assets/SessionInterface-BRKJqU2U.js +0 -71
  106. package/spec-dashboard/dist/assets/SessionInterface-DYP7pi_n.css +0 -32
  107. package/spec-dashboard/dist/assets/SessionWindow-CDhEL7wO.js +0 -9
  108. package/spec-dashboard/dist/assets/Settings-BL6FV_8S.js +0 -1
  109. package/spec-dashboard/dist/assets/index-DmQsNYKK.css +0 -1
  110. package/spec-dashboard/dist/assets/index-DulGPk6A.js +0 -41
  111. /package/spec-cli/templates/spec/project/.plugins/{distill → skills/distill}/digest.mjs +0 -0
@@ -14,7 +14,8 @@
14
14
  type Entry = { line: string; body: string; see?: string }
15
15
 
16
16
  const SEL_NOTE = `SEL = session id (or unique id-prefix) | node id | branch — every session read/control verb
17
- accepts any of the three; on the list verbs (ls/watch), none (or @all) means every session.`
17
+ accepts any of the four; inside a session worktree, . means that worktree's session. On the list verbs (ls/watch),
18
+ none (or @all) means every session.`
18
19
 
19
20
  const ROUTING_NOTE = `Backend routing: every backend-touching verb accepts --api <url> (--port <n> = localhost sugar) to name
20
21
  its backend explicitly — the flag always wins. Bare, it resolves: worker env / the cwd project's live
@@ -24,9 +25,9 @@ const DOT_NOTE = `\`.\` as a node argument means the node THIS worktree works on
24
25
  node/<id> branch). One-shot payload reads (graph · spec search · session ls/show/review · eval ls ·
25
26
  scenario ls · issue ls/show/links) take --json.`
26
27
 
27
- const MENTION_NOTE = `Mentions: @session · [[node]] · @new work in ANY prompt, issue, or remark body — text passed as a CLI
28
- arg included. [[node]] names the topic node; @session hands the text to that live agent; @new spawns a
29
- fresh worker on the thread's node.`
28
+ const MENTION_NOTE = `Mentions: @session · [[node]] · @new / @new:<launcher> work in ANY prompt, issue, or remark body —
29
+ text passed as a CLI arg included. [[node]] names the topic node; @session hands the text to that live agent;
30
+ @new spawns a fresh worker on the thread's node (bare = configured default; :<launcher> = that named profile).`
30
31
 
31
32
  const ENTRIES: Record<string, Entry> = {
32
33
  // ── project verbs (implicit object = this project) ────────────────────────
@@ -44,47 +45,53 @@ derived status, title, and attention badges (drift:N · stale:N · issues:N · g
44
45
  see: 'spex spec search (find one node by intent) · spex session ls (just the sessions, as a table)',
45
46
  },
46
47
  init: {
47
- line: 'init [dir] adopt SpexCode on a repo: seed .spec + hooks + materialize [--preset name]',
48
- body: `Usage: spex init [dir=cwd] [--preset default]
48
+ line: 'init [dir] adopt SpexCode on a repo: seed .spec + hooks + materialize --harness <ids> [--preset name]',
49
+ body: `Usage: spex init [dir=cwd] --harness <id[,id]|plugin:<folder>> [--preset default]
49
50
 
50
51
  Scaffolds adoption in one shot: seeds a starter .spec tree (project root + .plugins plugins), plants
51
52
  spexcode.json, installs the git hooks, and materializes the harness artifacts (contract block +
52
- shims). Additive never overwrites your files. --preset picks the .plugins plugin tier (cumulative).
53
+ shims). --harness is REQUIRED the explicit choice of which harnesses materialize delivers into
54
+ (stamped as spexcode.json "harnesses"; only their launchers are seeded); a pre-existing "harnesses"
55
+ field satisfies it. Additive — never overwrites your files. --preset picks the .plugins plugin tier (cumulative).
53
56
  Footprint is fixed: materialized artifacts are never tracked — hidden via the per-clone .git/info/exclude, with
54
57
  a tracked/mixed CLAUDE.md/AGENTS.md covered by the clean/smudge filter (see spex guide footprint).`,
55
58
  see: 'spex guide (the full setup workflow) · spex uninstall (the inverse) · spex spec lint (adoption TODO)',
56
59
  },
57
60
  materialize: {
58
- line: 'materialize re-materialize the harness artifacts (contract block · shims) for cwd’s project',
61
+ line: 'materialize the base pass of harness adaptation: render .spec/.plugins into your harness’s artifacts',
59
62
  body: `Usage: spex materialize
60
63
 
61
- Materializes the surface:system plugin nodes into the managed <!-- spexcode --> block of
62
- CLAUDE.md/AGENTS.md plus the .claude/.codex shims, and prints the content hash. The materialize anchors on
63
- git-native events only (init · this verb · session-worktree creation · the pre-commit/post-checkout/
64
- post-merge hooks) run it by hand after a toolchain update, or in the setup step of any clone that
65
- has no spex-planted hooks yet (CI, a cloud agent): the artifacts are generated and excluded, so they
66
- never arrive via git.`,
64
+ The base operation of HARNESS ADAPTATION: one pass renders the spec tree's surface nodes into the
65
+ artifacts each selected harness auto-discovers the managed <!-- spexcode --> block of
66
+ CLAUDE.md/AGENTS.md, the .claude/.codex shims, the skills/agents and prints the content hash.
67
+ The outputs are derived and never tracked: to change one, edit its source (.plugins, spexcode.json)
68
+ and re-materialize never the artifact. Not a one-time setup: it anchors on git-native events
69
+ (init · this verb · session-worktree creation · the pre-commit/post-checkout/post-merge hooks) —
70
+ run it by hand after a toolchain update, or in the setup step of any clone that has no spex-planted
71
+ hooks yet (CI, a cloud agent): generated and excluded, the artifacts never arrive via git.`,
67
72
  see: 'spex doctor (verify the materialized artifacts actually reach an agent)',
68
73
  },
69
74
  doctor: {
70
- line: 'doctor diagnose whether the workflow actually reaches this agent [--contract|--conflicts]',
71
- body: `Usage: spex doctor per-layer coverage report: preconditions · git-hook floor · contract ·
72
- hooks + handler existence · backend for every harness materialize delivers to
75
+ line: 'doctor diagnose spec health and whether the workflow reaches this agent [--contract|--conflicts]',
76
+ body: `Usage: spex doctor spec-health findings + delivery report: preconditions · git-hook floor ·
77
+ contract · hooks + handler existence · backend · footprint
73
78
  spex doctor --contract print the composed surface:system text any agent here reads
74
79
  spex doctor --conflicts detect double-delivery (loose artifacts beside the managed ones)
75
80
 
76
- Run it when a worker seems to be missing its contract or hooks — it names the broken layer and the
77
- repair, instead of you diffing materialized files by hand.`,
78
- see: 'spex materialize (re-materialize the artifacts doctor checks)',
81
+ Bare doctor is the opt-in, read-only health surface: it reports altitude and breadth findings without
82
+ putting them in the lint gate, then audits workflow delivery. Run it directly or let the tidy workflow
83
+ consume the same visible diagnosis.`,
84
+ see: 'spex spec lint (deterministic graph/contract gate) · spex materialize (repair delivery artifacts)',
79
85
  },
80
86
  uninstall: {
81
- line: 'uninstall [dir] surgical inverse of init removes generated artifacts, keeps your .spec [--hooks]',
87
+ line: 'uninstall [dir] remove all derived artifacts + local state; preserve tracked intent [--hooks]',
82
88
  body: `Usage: spex uninstall [dir=cwd] [--hooks]
83
89
 
84
- Removes every SpexCode-GENERATED artifact (harness shims · contract blocks · trust entries ·
85
- exclude/ignore blocks · global store · plugin bundle) and never your .spec/.plugins data or your own
86
- prose. Git hooks are preserved unless --hooks.`,
87
- see: 'spex init (re-adopt later your .spec survives)',
90
+ Removes all SpexCode-derived wiring and project-local state: contract blocks, harness shims,
91
+ generated skills/agents, plugin bundles, trust/filter/exclude entries, and the global per-project
92
+ store. Your tracked intent (.spec including .plugins, plus spexcode.json) and surrounding user prose
93
+ are preserved. Git hooks remain unless --hooks; that flag removes only unmodified canonical copies.`,
94
+ see: 'spex init (re-adopt later — your tracked intent survives)',
88
95
  },
89
96
  serve: {
90
97
  line: 'serve [api|ui] api (default) = the backend :8787 · ui = the dashboard :5173 on top of it',
@@ -104,6 +111,30 @@ projects coexist on one host). Loopback-only by default; --host 0.0.0.0 opens it
104
111
  still plain HTTP with no gate, so bind wide only on a network you trust.`,
105
112
  see: 'GET /health (backend liveness probe)',
106
113
  },
114
+ dashboard: {
115
+ line: 'dashboard ONE dashboard for every project you serve — no --api-port pairing [--port N=5173]',
116
+ body: `Usage: spex dashboard [--port N=5173] [--host H=127.0.0.1]
117
+
118
+ The HOST gateway: serves the built dashboard once and routes to EVERY backend the current user runs —
119
+ the multi-project hub engine plus the host registry on top. It continuously reconciles the per-project
120
+ endpoint records each \`spex serve\` publishes (validating each against the live backend's /api/instance
121
+ identity), keeps a durable known-project catalog, and proxies each project's API + SSE + terminal
122
+ socket under /p/<projectId>/* — the project is named in the path, so nothing is "current" and no
123
+ pairing flag exists.
124
+
125
+ Admin surface (hub-authorized: implicit from loopback until an admin password is set, then cookie
126
+ sessions): GET /projects (the validated list + gating state) · GET /projects/stream (SSE) ·
127
+ GET /projects/browse?path=… (read-only host folder picker) · POST /projects {root, initGit?, init?}
128
+ (explicit setup, then register) · GET|PUT /projects/<id>/config (raw portable
129
+ spexcode.json, revision-guarded) · POST /projects/<id>/init|doctor|serve
130
+ (run the real \`spex init\`/\`spex doctor\`, or start an offline project's backend, detached — a
131
+ backend never depends on this gateway staying up) · PUT|DELETE /projects/admin-password and
132
+ /projects/<id>/password (the gates). A gated project answers /p/<id>/login with the designed page.
133
+
134
+ Loopback-only by default; --host widens the bind — the admin surface stays locked to loopback until
135
+ an admin password exists, and ungated projects serve open.`,
136
+ see: 'spex serve (each project\'s backend) · spex serve ui (explicit one-backend pairing)',
137
+ },
107
138
 
108
139
  // ── the noun drawers ──────────────────────────────────────────────────────
109
140
  spec: {
@@ -122,14 +153,18 @@ owner — the reverse edge: a file's GOVERNORS (code: — drives drift + eval fr
122
153
  over-owned → split the file). --actionable prints NOTHING unless action is needed (hook use).
123
154
 
124
155
  lint — checks the whole spec↔code graph and exits non-zero on errors. Errors: integrity (a
125
- code:/related: file does not exist; a dead/ambiguous/unverifiable \`path#symbol\` anchor; an anchor
126
- whose language has no designated extractor or whose extractor can't run here) · anchor-drift (a
127
- commit since the spec's version touched the ANCHORED unit's lines, unacked the blocking tier of
128
- drift) · one-govern (a node governs >1 file) · living (a "## vN" changelog heading) · id-format (an
156
+ code:/related: file does not exist; a dead/ambiguous/unverifiable \`path#symbol\` selector; a selector
157
+ whose language has no designated extractor or whose extractor can't run here; a duplicate entry, a
158
+ base path both bare and scoped, or a selector on a glob/directory) · anchor-drift (a
159
+ commit since the spec's version touched an ANCHORED unit's lines, unacked the blocking tier of
160
+ drift; same-file selectors OR'd, one error naming the hit selectors) · one-govern (a node
161
+ governs >1 DISTINCT file) · living (a "## vN" changelog heading) · id-format (an
129
162
  id char outside the whitelist — ascii [a-z0-9-] or a non-ascii unicode letter/number, CJK ok — or a
130
- leaf id reused) · mention (a [[id]] naming no node). Warns: altitude · breadth · coverage · drift
131
- (UNANCHORED drift — always advisory, never blocks) · anchor (anchoring a type) · related-drift ·
132
- owners · confusable-id (two leaf ids one edit apart). spec lint's errors BLOCK commits (the pre-commit shim; bypass SPEXCODE_SKIP_LINT=1);
163
+ leaf id reused) · mention (a [[id]] naming no node). Warns: coverage · drift
164
+ (UNANCHORED drift — always advisory, never blocks; on a scoped file's MISS, \`lint.scopedCodeMiss:
165
+ "ignore"\` may silence it) · anchor (anchoring a type) · related-drift (a scoped related row warns
166
+ per selector HIT, misses silent) · owners (whole-file governors only; scoped don't count) ·
167
+ confusable-id (two leaf ids one edit apart). spec lint's errors BLOCK commits (the pre-commit shim; bypass SPEXCODE_SKIP_LINT=1);
133
168
  contrast \`spex eval lint\`, which is pure advisory and never blocks anyone.
134
169
 
135
170
  ack — stamp Spec-OK on HEAD (an empty stamp commit): the drift remedy when only MECHANICS changed
@@ -141,10 +176,10 @@ edit the spec instead — same commit as the code.`,
141
176
  session: {
142
177
  line: 'session <verb> the worktree state machine: new · ls · watch · wait · review · merge · send · …',
143
178
  body: `Manager verbs (dispatch, monitor, land):
144
- spex session new "<prompt>" [--prompt-file <path>|-] [--node <id>] [--launcher <name>]
179
+ spex session new "<prompt>" [--prompt-file <path>|-] [--launcher <name>]
145
180
  Launch a worker in its own node worktree. Give it ONLY its task — the dev-flow contract
146
- reaches it through the materialized system prompt. --node (or the prompt's first [[id]],
147
- same effect) binds the session to that node. --prompt-file <path>|- carries a long prompt
181
+ reaches it through the materialized system prompt. The prompt's first [[id]] mention binds
182
+ the session to that node. --prompt-file <path>|- carries a long prompt
148
183
  without shell quoting (exclusive with the inline prompt). Then MONITOR it (wait/watch below).
149
184
  spex session ls [SEL…] [--status a,b] [--json] one-shot table of living sessions
150
185
  spex session watch [SEL…] [--as NAME] [--idle] [--interval N=5]
@@ -196,15 +231,16 @@ ${MENTION_NOTE}`,
196
231
  see: 'spex eval ls --session <SEL> (the session’s measured loss) · spex help eval',
197
232
  },
198
233
  eval: {
199
- line: 'eval <verb> the measurement system: add · ls · scenario ls · lint · ok · retract · clean',
234
+ line: 'eval <verb> the measurement system: add · ls · scenario ls · matrix · lint · ok · retract · clean',
200
235
  body: `Usage: spex eval add [<node>|.] [--scenario <name>] (--pass|--fail) [--note <text>]
201
236
  [--image <png> …repeatable] [--result <path|->] [--video <webm|mp4>] [--timeline <json>]
202
237
  spex eval ls [<node>|.] [--json] a node's eval timeline, newest first
203
238
  spex eval ls --session <SEL> [--json] a session's aggregate: its changed nodes' scores
204
239
  spex eval ls --session <SEL> --export [--open | --out <path>]
205
240
  spex eval scenario ls [<node>|.] [--unmeasured] [--json] declared scenarios; bare = every node
241
+ spex eval matrix <launcher> [--node <id>] [--rows k1,k2] the harness live-behavior matrix
206
242
  spex eval lint [--changed] measurement-layer findings (advisory, always exit 0)
207
- spex eval ok <node> [--scenario <name>] the HUMAN sign-off on the scenario's latest reading
243
+ spex eval ok <node> [--scenario <name>] the HUMAN sign-off on the scenario's latest measurement
208
244
  spex eval retract [<node>|.] [--scenario <name>] [--last | --ts <iso>] [--note <why>]
209
245
  spex eval clean [--keep-latest | --all] GC the content-addressed evidence cache
210
246
 
@@ -218,19 +254,25 @@ ls — node-scoped bare (its per-scenario eval history); session-scoped with an
218
254
  ✦-marked ahead of the inherited baseline. --export writes that evaluation as ONE self-contained
219
255
  HTML artifact (diff · evidence inlined · gates) for CI/sharing.
220
256
 
221
- scenario ls — the DECLARED contracts (name · tags · latest verdict), no evals: bare lists every
257
+ scenario ls — the DECLARED contracts (name · tags · normalized test reference · latest verdict), no evals: bare lists every
222
258
  measurable node's scenarios; --unmeasured keeps only the never-measured — the blind-spot worklist.
223
259
 
260
+ matrix — run the eight-row harness live-behavior matrix against a REAL dispatched session of the named
261
+ launcher (the harness-adapter acceptance rule, defined once in spec-eval/src/matrix.ts): it syncs the
262
+ rows into the \`<harness>-harness\` node's eval.md scenarios, drives one worker through undeclared-stop ·
263
+ pretooluse-block · ask-note · deliver-steer · resume · liveness · commit-gate · close-residue, and files
264
+ a per-row measurement with its evidence transcript. A new harness needs only its launcher + spec node.
265
+
224
266
  lint — the measurement layer's findings: malformed eval.md (eval-schema) · unmeasured (eval-missing) ·
225
267
  stale (eval-drift) · orphaned remark tracks (eval-dangling) · governed source with no eval.md
226
268
  (eval-coverage — the same name and shape as spec lint's coverage, one rule per layer) · over-owned
227
269
  files (eval-owners). --changed scopes to the nodes THIS branch touched. spec lint's errors block
228
270
  commits; eval lint is PURE ADVISORY, always exit 0 — a measurement gap never blocks anyone.
229
271
 
230
- ok — the human's reviewed-and-agreed mark on the scenario's LATEST reading: an appended, monotonic
231
- sign-off bound to that one immutable reading (a newer reading or staleness releases it on its own —
272
+ ok — the human's reviewed-and-agreed mark on the scenario's LATEST measurement: an appended, monotonic
273
+ sign-off bound to that one immutable measurement (a newer measurement or staleness releases it on its own —
232
274
  no un-ok exists). The evals feed default-hides a fresh, ok'd scenario; a governed session is refused
233
- (an agent's judgment on a reading is a remark, never a self-blessing).
275
+ (an agent's judgment on a measurement is a remark, never a self-blessing).
234
276
 
235
277
  retract — the sanctioned undo for a botched filing: APPENDS a retraction event (traceable, never
236
278
  deletes a line); the previous eval becomes latest again, or the scenario honestly returns to
@@ -357,6 +399,7 @@ Project verbs (implicit object = this project)
357
399
  ${ENTRIES.doctor.line}
358
400
  ${ENTRIES.uninstall.line}
359
401
  ${ENTRIES.serve.line}
402
+ ${ENTRIES.dashboard.line}
360
403
 
361
404
  Noun drawers
362
405
  ${ENTRIES.spec.line}