@hassangameryt/freeflow 0.8.0 → 0.9.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 (290) hide show
  1. package/.agents/plugins/marketplace.json +2 -2
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/.claude-plugin/plugin.json +2 -2
  4. package/.codex-plugin/plugin.json +3 -3
  5. package/.cursor-plugin/plugin.json +1 -1
  6. package/README.md +96 -149
  7. package/capabilities/cognitive-routing/SKILL.md +21 -129
  8. package/capabilities/cognitive-routing/references/coordinator.md +163 -0
  9. package/capabilities/cognitive-routing/references/worker.md +38 -0
  10. package/capabilities/compaction/SKILL.md +3 -3
  11. package/capabilities/compaction/references/summary-format.md +26 -15
  12. package/capabilities/messaging/SKILL.md +49 -0
  13. package/capabilities/task-memory/SKILL.md +87 -0
  14. package/command-surface.json +6 -54
  15. package/gemini-extension.json +1 -1
  16. package/hooks/claude/hooks.json +13 -3
  17. package/hooks/codex/hooks.json +2 -1
  18. package/hooks/shared/runtime-context.mjs +69 -77
  19. package/package.json +25 -8
  20. package/pi-extension/dist/ask-user/ask.js +108 -0
  21. package/pi-extension/dist/ask-user/form.js +250 -0
  22. package/pi-extension/dist/ask-user/questions.js +66 -0
  23. package/pi-extension/dist/ask-user/tool.js +124 -0
  24. package/pi-extension/dist/cognitive-routing/assembler.js +35 -11
  25. package/pi-extension/dist/cognitive-routing/bootstrap.js +90 -0
  26. package/pi-extension/dist/cognitive-routing/config.js +3 -4
  27. package/pi-extension/dist/cognitive-routing/event-store.js +4 -1
  28. package/pi-extension/dist/cognitive-routing/gate.js +20 -5
  29. package/pi-extension/dist/cognitive-routing/handlers.js +15 -13
  30. package/pi-extension/dist/cognitive-routing/model-control.js +17 -8
  31. package/pi-extension/dist/cognitive-routing/projection.js +23 -6
  32. package/pi-extension/dist/cognitive-routing/provenance.js +3 -1
  33. package/pi-extension/dist/cognitive-routing/render.js +15 -15
  34. package/pi-extension/dist/cognitive-routing/runtime.js +4 -2
  35. package/pi-extension/dist/cognitive-routing/schemas.js +4 -4
  36. package/pi-extension/dist/cognitive-routing/session.js +3 -1
  37. package/pi-extension/dist/cognitive-routing/sources.js +29 -4
  38. package/pi-extension/dist/cognitive-routing/state.js +18 -8
  39. package/pi-extension/dist/cognitive-routing/status.js +4 -3
  40. package/pi-extension/dist/cognitive-routing/tools.js +29 -15
  41. package/pi-extension/dist/cognitive-routing/types.js +10 -1
  42. package/pi-extension/dist/compaction/carry.js +36 -22
  43. package/pi-extension/dist/compaction/config.js +4 -2
  44. package/pi-extension/dist/compaction/controller.js +52 -29
  45. package/pi-extension/dist/compaction/harness.js +19 -3
  46. package/pi-extension/dist/compaction/results.js +14 -13
  47. package/pi-extension/dist/compaction/tool.js +6 -6
  48. package/pi-extension/dist/host/catalog.js +20 -35
  49. package/pi-extension/dist/host/config-validation.js +233 -0
  50. package/pi-extension/dist/host/config.js +78 -91
  51. package/pi-extension/dist/host/inbound.js +142 -0
  52. package/pi-extension/dist/host/projection-tags.js +1 -1
  53. package/pi-extension/dist/host/prompts.js +24 -13
  54. package/pi-extension/dist/host/read-only-session.js +6 -1
  55. package/pi-extension/dist/host/request-history.js +7 -3
  56. package/pi-extension/dist/host/rows.js +25 -0
  57. package/pi-extension/dist/host/runtime-state.js +17 -2
  58. package/pi-extension/dist/host/section-keeper.js +85 -0
  59. package/pi-extension/dist/host/settings/freeflow-command.js +846 -93
  60. package/pi-extension/dist/host/settings/settings-view.js +27 -8
  61. package/pi-extension/dist/host/status.js +19 -5
  62. package/pi-extension/dist/index.js +638 -72
  63. package/pi-extension/dist/messaging/config.js +27 -0
  64. package/pi-extension/dist/messaging/messaging.js +398 -0
  65. package/pi-extension/dist/messaging/registry.js +57 -0
  66. package/pi-extension/dist/messaging/render.js +90 -0
  67. package/pi-extension/dist/messaging/tools.js +109 -0
  68. package/pi-extension/dist/messaging/transport.js +101 -0
  69. package/pi-extension/dist/provider-support/cache/keepalive.js +16 -4
  70. package/pi-extension/dist/task-memory/config.js +49 -0
  71. package/pi-extension/dist/task-memory/registry.js +119 -0
  72. package/pi-extension/dist/task-memory/render.js +107 -0
  73. package/pi-extension/dist/task-memory/runtime.js +994 -0
  74. package/pi-extension/dist/task-memory/tool.js +233 -0
  75. package/pi-extension/dist/tool-execution/apply-patch/tool.js +1 -1
  76. package/pi-extension/dist/tool-execution/background.js +220 -28
  77. package/pi-extension/dist/tool-execution/config.js +14 -3
  78. package/pi-extension/dist/tool-execution/file-tracking.js +24 -4
  79. package/pi-extension/dist/tool-execution/guidance-notices.js +124 -0
  80. package/pi-extension/dist/tool-execution/skill-reads.js +143 -0
  81. package/pi-extension/dist/tool-execution/tools.js +2 -2
  82. package/runtime/prompts/cognitive-routing.md +4 -4
  83. package/runtime/prompts/core.md +24 -14
  84. package/runtime/prompts/interaction-contract.md +7 -4
  85. package/runtime/prompts/tool-execution.md +3 -16
  86. package/runtime/prompts/working-method.md +16 -99
  87. package/skills/deliver-work/SKILL.md +76 -0
  88. package/skills/deliver-work/references/branch-closeout.md +134 -0
  89. package/skills/deliver-work/references/commit.md +83 -0
  90. package/skills/deliver-work/references/launch.md +94 -0
  91. package/skills/deliver-work/references/release.md +85 -0
  92. package/skills/deliver-work/scripts/commit-state.mjs +139 -0
  93. package/skills/deliver-work/scripts/delivery-state.mjs +107 -0
  94. package/skills/deliver-work/scripts/lib/git-state.mjs +178 -0
  95. package/skills/deliver-work/scripts/push-route.mjs +122 -0
  96. package/skills/deliver-work/scripts/release-preflight.mjs +177 -0
  97. package/skills/discuss-work/SKILL.md +148 -0
  98. package/skills/{discuss → discuss-work}/references/discussion-continuity.md +10 -27
  99. package/skills/discuss-work/references/learning-action.md +36 -0
  100. package/skills/discuss-work/scripts/choices.mjs +101 -0
  101. package/skills/discuss-work/scripts/lib/choices.mjs +159 -0
  102. package/skills/evaluate-behavior/SKILL.md +107 -0
  103. package/skills/evaluate-behavior/references/authoring.md +381 -0
  104. package/skills/evaluate-behavior/references/coding-tasks.md +145 -0
  105. package/skills/evaluate-behavior/references/conversations-pipelines-judges.md +177 -0
  106. package/skills/evaluate-behavior/references/design-and-measurement.md +273 -0
  107. package/skills/evaluate-behavior/references/running-and-evidence.md +245 -0
  108. package/skills/evaluate-behavior/scripts/claude-guard.mjs +76 -0
  109. package/skills/evaluate-behavior/scripts/guard-rules.mjs +309 -0
  110. package/skills/evaluate-behavior/scripts/lib/agreement.mjs +90 -0
  111. package/skills/evaluate-behavior/scripts/lib/arms.mjs +55 -0
  112. package/skills/evaluate-behavior/scripts/lib/budget.mjs +87 -0
  113. package/skills/evaluate-behavior/scripts/lib/build-source.mjs +287 -0
  114. package/skills/evaluate-behavior/scripts/lib/clear.mjs +74 -0
  115. package/skills/evaluate-behavior/scripts/lib/container.mjs +395 -0
  116. package/skills/evaluate-behavior/scripts/lib/decision.mjs +418 -0
  117. package/skills/evaluate-behavior/scripts/lib/definitions.mjs +1072 -0
  118. package/skills/evaluate-behavior/scripts/lib/freeflow.mjs +103 -0
  119. package/skills/evaluate-behavior/scripts/lib/grade-command.mjs +591 -0
  120. package/skills/evaluate-behavior/scripts/lib/grade-comparison.mjs +90 -0
  121. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-interaction.mjs +19 -18
  122. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-support.mjs +32 -5
  123. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-workspace.mjs +28 -12
  124. package/skills/evaluate-behavior/scripts/lib/grade.mjs +101 -0
  125. package/skills/evaluate-behavior/scripts/lib/hooks.mjs +98 -0
  126. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/confinement.mjs +196 -0
  127. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/constraints.mjs +111 -0
  128. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/index.mjs +48 -0
  129. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/isolation.mjs +74 -0
  130. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/launch.mjs +123 -0
  131. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/model-call.mjs +73 -0
  132. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/recorder.mjs +178 -0
  133. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/session.mjs +494 -0
  134. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/skills.mjs +81 -0
  135. package/skills/evaluate-behavior/scripts/lib/hosts/index.mjs +31 -0
  136. package/skills/evaluate-behavior/scripts/lib/hosts/names.mjs +3 -0
  137. package/skills/evaluate-behavior/scripts/lib/hosts/pi/confinement.mjs +173 -0
  138. package/skills/evaluate-behavior/scripts/lib/hosts/pi/host.mjs +148 -0
  139. package/skills/evaluate-behavior/scripts/lib/hosts/pi/index.mjs +70 -0
  140. package/skills/evaluate-behavior/scripts/lib/hosts/pi/isolation.mjs +81 -0
  141. package/skills/evaluate-behavior/scripts/lib/hosts/pi/model-call.mjs +79 -0
  142. package/skills/evaluate-behavior/scripts/lib/hosts/pi/process.mjs +241 -0
  143. package/skills/{evaluate-skill/scripts/lib → evaluate-behavior/scripts/lib/hosts/pi}/rpc.mjs +144 -26
  144. package/skills/evaluate-behavior/scripts/lib/identity.mjs +82 -0
  145. package/skills/evaluate-behavior/scripts/lib/judge.mjs +688 -0
  146. package/skills/evaluate-behavior/scripts/lib/metrics.mjs +332 -0
  147. package/skills/evaluate-behavior/scripts/lib/model-call.mjs +17 -0
  148. package/skills/evaluate-behavior/scripts/lib/participants.mjs +616 -0
  149. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/process.mjs +22 -0
  150. package/skills/evaluate-behavior/scripts/lib/queue.mjs +54 -0
  151. package/skills/evaluate-behavior/scripts/lib/reference.mjs +343 -0
  152. package/skills/evaluate-behavior/scripts/lib/reuse.mjs +277 -0
  153. package/skills/evaluate-behavior/scripts/lib/review.mjs +933 -0
  154. package/skills/evaluate-behavior/scripts/lib/runner.mjs +732 -0
  155. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/sandbox.mjs +119 -14
  156. package/skills/evaluate-behavior/scripts/lib/scan-shell.mjs +457 -0
  157. package/skills/evaluate-behavior/scripts/lib/scan.mjs +479 -0
  158. package/skills/evaluate-behavior/scripts/lib/seal.mjs +91 -0
  159. package/skills/evaluate-behavior/scripts/lib/shell.mjs +560 -0
  160. package/skills/evaluate-behavior/scripts/lib/source-override.mjs +64 -0
  161. package/skills/evaluate-behavior/scripts/lib/subject-file.mjs +88 -0
  162. package/skills/{evaluate-skill/scripts/lib/pi.mjs → evaluate-behavior/scripts/lib/subject.mjs} +235 -265
  163. package/skills/evaluate-behavior/scripts/lib/task-copy.mjs +124 -0
  164. package/skills/evaluate-behavior/scripts/lib/trials.mjs +524 -0
  165. package/skills/evaluate-behavior/scripts/lib/validity.mjs +68 -0
  166. package/skills/evaluate-behavior/scripts/lib/view-html.mjs +454 -0
  167. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/view.mjs +159 -18
  168. package/skills/{evaluate-skill → evaluate-behavior}/scripts/pi-command-tool.mjs +21 -6
  169. package/skills/evaluate-behavior/scripts/pi-container-route.mjs +23 -0
  170. package/skills/evaluate-behavior/scripts/pi-guard.mjs +77 -0
  171. package/skills/evaluate-behavior/scripts/pi-login-refresh.mjs +31 -0
  172. package/skills/evaluate-behavior/scripts/skill-eval.mjs +586 -0
  173. package/skills/execute-work/SKILL.md +96 -104
  174. package/skills/execute-work/references/code-practices.md +27 -51
  175. package/skills/execute-work/references/design.md +271 -0
  176. package/skills/execute-work/references/diagnose.md +117 -0
  177. package/skills/execute-work/references/migration.md +108 -0
  178. package/skills/execute-work/references/simplify.md +65 -0
  179. package/skills/execute-work/scripts/self-review.mjs +422 -0
  180. package/skills/execute-work/scripts/touch-map.mjs +290 -0
  181. package/skills/review-work/SKILL.md +89 -65
  182. package/skills/review-work/references/adjudication.md +94 -0
  183. package/skills/review-work/references/artifact.md +198 -0
  184. package/skills/review-work/references/evals-and-judges.md +66 -0
  185. package/skills/review-work/references/work.md +177 -0
  186. package/skills/review-work/scripts/check-brief.mjs +128 -0
  187. package/skills/review-work/scripts/review-packet.mjs +233 -0
  188. package/skills/setup-freeflow/SKILL.md +68 -17
  189. package/skills/track-work/SKILL.md +52 -20
  190. package/skills/track-work/references/handoff.md +190 -0
  191. package/skills/track-work/references/projects.md +51 -0
  192. package/skills/track-work/references/working-record-format.md +36 -18
  193. package/skills/track-work/scripts/lib/document.mjs +17 -13
  194. package/skills/track-work/scripts/lib/format.mjs +2 -0
  195. package/skills/track-work/scripts/lib/recover.mjs +254 -0
  196. package/skills/track-work/scripts/lib/registry.mjs +656 -0
  197. package/skills/track-work/scripts/lib/search.mjs +40 -0
  198. package/skills/track-work/scripts/lib/store.mjs +46 -15
  199. package/skills/track-work/scripts/lib/views.mjs +50 -1
  200. package/skills/track-work/scripts/working-record.mjs +232 -13
  201. package/skills/verify-work/SKILL.md +45 -37
  202. package/skills/verify-work/references/feature-map.md +120 -0
  203. package/skills/verify-work/references/runtime-evidence.md +203 -0
  204. package/skills/verify-work/references/test-design.md +25 -6
  205. package/skills/verify-work/scripts/test-changes.mjs +246 -0
  206. package/skills/write-docs/SKILL.md +113 -25
  207. package/skills/write-docs/references/documentation-shapes.md +68 -3
  208. package/skills/write-docs/references/spec-and-plan-shapes.md +308 -0
  209. package/skills/write-docs/scripts/artifact-check.mjs +148 -0
  210. package/skills/write-docs/scripts/docs-check.mjs +96 -6
  211. package/skills/write-docs/scripts/plan-lint.mjs +123 -0
  212. package/skills/write-skill/SKILL.md +92 -52
  213. package/skills/write-skill/references/activation-and-wording.md +143 -0
  214. package/skills/write-skill/references/placement-and-dependencies.md +154 -0
  215. package/skills/write-skill/scripts/lib/compare.mjs +701 -0
  216. package/skills/write-skill/scripts/lib/skill-author.mjs +197 -3
  217. package/skills/write-skill/scripts/skill-author.mjs +51 -8
  218. package/capabilities/cognitive-routing/references/both-mode.md +0 -36
  219. package/capabilities/cognitive-routing/references/executor-mode.md +0 -48
  220. package/capabilities/cognitive-routing/references/helper-mode.md +0 -47
  221. package/plugin.json +0 -33
  222. package/skills/action-selection/SKILL.md +0 -92
  223. package/skills/action-selection/references/trajectory-stalls.md +0 -73
  224. package/skills/bypass/SKILL.md +0 -153
  225. package/skills/commit-work/SKILL.md +0 -93
  226. package/skills/commit-work/references/git-state-edges.md +0 -94
  227. package/skills/commit-work/references/simple-push.md +0 -94
  228. package/skills/commit-work/references/staging-decisions.md +0 -106
  229. package/skills/decision-gate/SKILL.md +0 -87
  230. package/skills/design-for-depth/SKILL.md +0 -108
  231. package/skills/design-for-depth/references/design-pressure-signals.md +0 -84
  232. package/skills/design-for-depth/references/implementation-decisions.md +0 -76
  233. package/skills/design-for-depth/references/interface-design-loop.md +0 -105
  234. package/skills/design-for-depth/references/module-and-dependency-design.md +0 -117
  235. package/skills/design-for-depth/references/state-and-failure-boundaries.md +0 -125
  236. package/skills/diagnose-failure/SKILL.md +0 -140
  237. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +0 -50
  238. package/skills/diagnose-failure/references/flaky-and-performance-diagnosis.md +0 -51
  239. package/skills/discuss/SKILL.md +0 -140
  240. package/skills/evaluate-skill/SKILL.md +0 -188
  241. package/skills/evaluate-skill/references/evaluation-definition-schema.md +0 -415
  242. package/skills/evaluate-skill/references/evaluation-design.md +0 -112
  243. package/skills/evaluate-skill/references/execution-and-evidence.md +0 -111
  244. package/skills/evaluate-skill/references/review-and-revision.md +0 -94
  245. package/skills/evaluate-skill/scripts/lib/definitions.mjs +0 -448
  246. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +0 -60
  247. package/skills/evaluate-skill/scripts/lib/grade.mjs +0 -64
  248. package/skills/evaluate-skill/scripts/lib/review.mjs +0 -196
  249. package/skills/evaluate-skill/scripts/lib/runner.mjs +0 -405
  250. package/skills/evaluate-skill/scripts/lib/trials.mjs +0 -103
  251. package/skills/evaluate-skill/scripts/pi-guard.mjs +0 -181
  252. package/skills/evaluate-skill/scripts/skill-eval.mjs +0 -182
  253. package/skills/execute-work/references/execute-work-edges.md +0 -78
  254. package/skills/finish-branch/SKILL.md +0 -117
  255. package/skills/finish-branch/references/integration-options.md +0 -80
  256. package/skills/handoff/SKILL.md +0 -82
  257. package/skills/handoff/references/handoff-templates.md +0 -150
  258. package/skills/launch-work/SKILL.md +0 -116
  259. package/skills/launch-work/references/launch-readiness.md +0 -85
  260. package/skills/migration-work/SKILL.md +0 -115
  261. package/skills/migration-work/references/migration-lifecycle.md +0 -82
  262. package/skills/release-work/SKILL.md +0 -118
  263. package/skills/release-work/references/release-evidence.md +0 -78
  264. package/skills/review-artifact/SKILL.md +0 -143
  265. package/skills/review-artifact/references/adjudicate-artifact-review.md +0 -101
  266. package/skills/review-artifact/references/independent-artifact-reviewer-contract.md +0 -159
  267. package/skills/review-work/references/adjudicate-work-review.md +0 -97
  268. package/skills/review-work/references/independent-work-reviewer-contract.md +0 -139
  269. package/skills/review-work/references/security-risk-lens.md +0 -67
  270. package/skills/setup-freeflow/references/activation-contract.md +0 -103
  271. package/skills/setup-freeflow/references/host-setup.md +0 -67
  272. package/skills/simplify-code/SKILL.md +0 -85
  273. package/skills/simplify-code/references/simplification-patterns.md +0 -70
  274. package/skills/verify-work/references/browser-runtime-evidence.md +0 -51
  275. package/skills/verify-work/references/integration-evidence.md +0 -49
  276. package/skills/verify-work/references/performance-evidence.md +0 -59
  277. package/skills/workflow/SKILL.md +0 -171
  278. package/skills/workflow/references/domain-skill-composition.md +0 -45
  279. package/skills/write-plan/SKILL.md +0 -92
  280. package/skills/write-plan/references/plan-shapes.md +0 -156
  281. package/skills/write-skill/references/activation-boundaries.md +0 -106
  282. package/skills/write-skill/references/agent-first-instructions.md +0 -133
  283. package/skills/write-skill/references/progressive-disclosure.md +0 -129
  284. package/skills/write-skill/references/skill-dependency-graphs.md +0 -192
  285. package/skills/write-spec/SKILL.md +0 -85
  286. package/skills/write-spec/references/artifact-standards.md +0 -86
  287. package/skills/write-spec/references/decision-records.md +0 -80
  288. package/skills/write-spec/references/spec-shapes.md +0 -143
  289. /package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/evidence.mjs +0 -0
  290. /package/skills/{evaluate-skill → evaluate-behavior}/scripts/pi-observer.mjs +0 -0
@@ -0,0 +1,159 @@
1
+ // Discuss Work's decision list as a record file: the task's sources/decisions.md, or a list given on stdin or as a file
2
+ // when there is no Working Record. One line per item, "- P1 [state] choice -> default ...", other lines ignored
3
+ // (Discuss Work, "Build The Decision List").
4
+ // validate IDs, states, T -> P links, a default on every plain item, the user's words on agreed items, a reason on
5
+ // changed ones;
6
+ // agreement the reply sent before building: What I'll do / Where I stop / Your decisions / Technical: N;
7
+ // handover the items a hand-over shows: new, changed and default;
8
+ // catch-up after an unattended run: defaults taken, choices waiting, changes, and what ran (the record's current
9
+ // Slice Material updates).
10
+
11
+ export const CHOICE_STATES = new Set(["proposed", "agreed", "default", "changed", "new", "dropped"]);
12
+ const ITEM = /^\s*[-*]\s+([A-Za-z]+\d+)\s+\[([^\]]*)\]\s+(.*)$/;
13
+
14
+ export function parseChoices(text) {
15
+ const items = [];
16
+ const errors = [];
17
+ const warnings = [];
18
+ text.split(/\r?\n/).forEach((raw, index) => {
19
+ const match = ITEM.exec(raw);
20
+ if (!match) return;
21
+ const [, id, state, rest] = match;
22
+ const arrow = rest.indexOf("->");
23
+ const choice = (arrow === -1 ? rest : rest.slice(0, arrow)).trim();
24
+ const tail = arrow === -1 ? "" : rest.slice(arrow + 2).trim();
25
+ // A technical item states its choice and the plain item it serves: "T1 [default] FIFO array -> serves P1".
26
+ const serves = /^(?:serves\s+)?(P\d+)\b/i.exec(tail);
27
+ items.push({
28
+ line: index + 1,
29
+ id,
30
+ kind: id[0] === "P" ? "plain" : id[0] === "T" ? "technical" : "unknown",
31
+ state,
32
+ choice,
33
+ default: serves ? choice : tail,
34
+ serves: serves?.[1] ?? null,
35
+ quote: /\bYou:\s*["“]/.test(rest),
36
+ reason: /\b(because|why|was|since|instead|reason)\b/i.test(tail),
37
+ text: rest.trim(),
38
+ });
39
+ });
40
+
41
+ const seen = new Map();
42
+ for (const item of items) {
43
+ const where = `line ${item.line} ${item.id}`;
44
+ if (!/^[PT][1-9]\d*$/.test(item.id)) errors.push(`${where}: ID must be P<n> or T<n>`);
45
+ if (seen.has(item.id)) errors.push(`${where}: duplicate ID (first at line ${seen.get(item.id)})`);
46
+ else seen.set(item.id, item.line);
47
+ if (!CHOICE_STATES.has(item.state))
48
+ errors.push(`${where}: state "${item.state}" is not one of ${[...CHOICE_STATES].join(", ")}`);
49
+ if (!item.choice) errors.push(`${where}: names no choice`);
50
+ if (item.kind === "plain" && !item.default)
51
+ errors.push(`${where}: has no default after "->" (what matches existing behavior and is easiest to reverse)`);
52
+ if (item.kind === "technical" && !item.serves)
53
+ errors.push(`${where}: a technical item names the plain item it serves ("-> serves P1")`);
54
+ if (item.state === "agreed" && !item.quote) warnings.push(`${where}: agreed without the user's words (You: "...")`);
55
+ if (item.state === "changed" && !item.reason) warnings.push(`${where}: changed without saying why`);
56
+ }
57
+ for (const item of items.filter((each) => each.serves)) {
58
+ const target = items.find((each) => each.id === item.serves);
59
+ if (!target) errors.push(`line ${item.line} ${item.id}: serves ${item.serves}, which is not in the list`);
60
+ else if (target.state === "dropped" && item.state !== "dropped")
61
+ warnings.push(`line ${item.line} ${item.id}: serves ${item.serves}, which is dropped`);
62
+ }
63
+ if (!items.length) errors.push('no items found: each item is a line "- P1 [state] choice -> default"');
64
+ const firstTechnical = items.findIndex((item) => item.kind === "technical");
65
+ if (firstTechnical !== -1 && items.slice(firstTechnical).some((item) => item.kind === "plain"))
66
+ warnings.push("plain items come first; a P item follows a T item");
67
+ return { items, errors, warnings, ok: errors.length === 0 };
68
+ }
69
+
70
+ const itemLine = (item) => `- ${item.id} [${item.state}] ${item.text}`;
71
+ const byState = (items, states) => items.filter((item) => states.includes(item.state));
72
+
73
+ // The current Slice's Material updates: what ran or changed while no one was answering.
74
+ function currentSliceUpdates(recordText) {
75
+ const lines = recordText.split(/\r?\n/);
76
+ const start = lines.findIndex((each) => /^### Current Slice\s*$/.test(each));
77
+ if (start === -1) return { slice: "no Current Slice", updates: [] };
78
+ const end = lines.findIndex((each, index) => index > start && /^#{2,3} /.test(each));
79
+ const slice = lines.slice(start, end === -1 ? undefined : end);
80
+ const title = slice.find((each) => /^#### S-\d+/.test(each));
81
+ const at = slice.findIndex((each) => /^##### Material updates\s*$/.test(each));
82
+ const updates = at === -1 ? [] : slice.slice(at + 1).filter((each) => /^\s*-\s+\S/.test(each));
83
+ return {
84
+ slice: title ? title.replace(/^####\s+/, "") : "no Current Slice",
85
+ updates: updates.map((each) => each.trim().replace(/^-\s+/, "")),
86
+ };
87
+ }
88
+
89
+ // Renders one view; returns { text, data }. The caller validates first.
90
+ export function renderChoices(view, parsed, { outcome, stop, showTechnical = false, recordText = null } = {}) {
91
+ const { items } = parsed;
92
+ const plain = items.filter((item) => item.kind === "plain" && item.state !== "dropped");
93
+ const technical = items.filter((item) => item.kind === "technical" && item.state !== "dropped");
94
+ if (view === "validate")
95
+ return { text: `Decision list valid: ${items.length} item(s).`, data: { items: items.length } };
96
+ if (view === "agreement") {
97
+ const open = plain.filter((item) => item.state !== "agreed");
98
+ const pad = " ";
99
+ const decisions = open.length
100
+ ? open.map(
101
+ (item, index) =>
102
+ `${index ? pad : ""}${index + 1}. ${item.choice}${/[?.!]$/.test(item.choice) ? "" : "?"} I'd go with ${item.default}`,
103
+ )
104
+ : ["none: the request and the repository settle every choice the user would see."];
105
+ const technicalLine = showTechnical
106
+ ? [
107
+ `Technical: ${technical.map((item, index) => `${index ? pad : ""}${item.id} ${item.choice} (serves ${item.serves})`).join("\n") || "none"}`,
108
+ ]
109
+ : technical.length
110
+ ? [
111
+ `Technical: ${technical.length} more choice${technical.length === 1 ? "" : "s"}; say "show technical" to see them.`,
112
+ ]
113
+ : [];
114
+ const text = [
115
+ `What I'll do: ${outcome}`,
116
+ `Where I stop: ${stop}`,
117
+ `Your decisions: ${decisions.join("\n")}`,
118
+ ...technicalLine,
119
+ ].join("\n");
120
+ return { text, data: { decisions: open.map((item) => item.id), technical: technical.length } };
121
+ }
122
+ if (view === "handover") {
123
+ const shown = byState(items, ["new", "changed", "default"]);
124
+ return {
125
+ text: shown.length
126
+ ? `Choices you have not seen (${shown.length}):\n${shown.map(itemLine).join("\n")}`
127
+ : "No new, changed or default choices: every item was agreed or dropped.",
128
+ data: { shown: shown.map((item) => item.id) },
129
+ };
130
+ }
131
+ // catch-up
132
+ const defaults = byState(items, ["default"]);
133
+ const waiting = byState(items, ["proposed", "new"]);
134
+ const changed = byState(items, ["changed"]);
135
+ const out = [`Defaults taken (${defaults.length}):`, ...(defaults.length ? defaults.map(itemLine) : ["- none"])];
136
+ out.push(
137
+ "",
138
+ `Choices waiting for you (${waiting.length}):`,
139
+ ...(waiting.length ? waiting.map(itemLine) : ["- none"]),
140
+ );
141
+ if (changed.length) out.push("", `Changed while you were away (${changed.length}):`, ...changed.map(itemLine));
142
+ const ran = recordText === null ? null : currentSliceUpdates(recordText);
143
+ if (ran)
144
+ out.push(
145
+ "",
146
+ `What ran (${ran.slice}, Material updates: ${ran.updates.length}):`,
147
+ ...(ran.updates.length ? ran.updates.map((each) => `- ${each}`) : ["- nothing recorded"]),
148
+ );
149
+ else out.push("", "What ran: no Working Record; account for it from the conversation.");
150
+ return {
151
+ text: out.join("\n"),
152
+ data: {
153
+ defaults: defaults.map((item) => item.id),
154
+ waiting: waiting.map((item) => item.id),
155
+ changed: changed.map((item) => item.id),
156
+ ...(ran ? { slice: ran.slice, ran: ran.updates } : {}),
157
+ },
158
+ };
159
+ }
@@ -0,0 +1,107 @@
1
+ ---
2
+ name: evaluate-behavior
3
+ description: "Use when testing, evaluating or comparing how an agent behaves: whether a skill triggers, whether a change to a prompt, skill, model, setting or extension changes outcomes, measuring a reviewer or checker, or benchmarking agents on coding tasks, conversations or pipelines. Also use when writing or checking an eval's JSON files, running an eval and reading its results, and deciding what a result can claim, how many cases and trials it needs and what it costs."
4
+ ---
5
+
6
+ # Evaluate Behavior
7
+
8
+ Determine whether a declared change to an agent's setup changes its behavior as intended under declared pressure. Evidence outranks confident prose.
9
+
10
+ A **configuration** is everything that can shape the agent's behavior: host, model, skills, instruction files, and host extensions and settings. A **group** asks one behavioral question by running named **arms** of one configuration on the same task, usually `baseline` (the **reference**: the setup without the change, such as no target skill, the previous commit, or the setting off) and `candidate` (the same setup with exactly the declared change, its **component**); a single arm measures one setup alone. The **subject** is the agent performing the task in one arm. The **evaluator** isolates subjects and preserves canonical evidence; the **deterministic grader** derives fixed facts after the run is saved; a **judge** is a separate model whose answers are **judged evidence**. A **suite** runs ordered groups and may declare a **decision** rule that turns their results into a verdict.
11
+
12
+ Evaluate Behavior does not change what it evaluates, claim readiness, or choose adoption. The component's owner revises it: [Write Skill](../write-skill/SKILL.md) for a skill or other instruction text; extension code goes to its owner, and a model, setting or extension choice to the user.
13
+
14
+ The **Rules** below are binding; if one cannot be met, stop and say why. Everything else is **judgment**: follow its stated goal, and adapt when a different choice serves that goal better.
15
+
16
+ ## Routes
17
+
18
+ | Situation | Go to |
19
+ | --- | --- |
20
+ | The question, evidence class, arms, pressure or component; what the result can claim, the decision rule, cases and trials, noise, judge counts, cost | [design and measurement](references/design-and-measurement.md) |
21
+ | Measuring a reviewer, checker, or other detector | its [Defect Suites](references/design-and-measurement.md#defect-suites) |
22
+ | Writing or checking group, suite, or configuration JSON | [authoring](references/authoring.md) |
23
+ | A coding task (hidden tests, declared commands, a shell, a container, network), or the Claude Code host | [coding tasks](references/coding-tasks.md) |
24
+ | A conversation, a pipeline, a rubric and judges, or a runtime profile | [conversations, pipelines and judges](references/conversations-pipelines-judges.md) |
25
+ | Running the evaluator and reading its results; evidence that conflicts, the failed boundary, a revision target, or rerun scope | [running and evidence](references/running-and-evidence.md), and `skill-eval --help` |
26
+ | Reviewing a definition before paying for its runs | Review Work's [Eval Definition Review](../review-work/references/evals-and-judges.md#eval-definition-review) |
27
+ | Choosing a judge or relying on its answers | Review Work's [Judge Contract](../review-work/references/evals-and-judges.md#judge-contract) |
28
+
29
+ ## Rules
30
+
31
+ - Never mutate canonical evidence or erase an unfavorable result. Preserve partial and infrastructure evidence without converting unavailable behavior into pass or fail.
32
+ - Never fabricate behavioral evidence. Missing evidence stays unavailable.
33
+ - Compare a change only against an exact immutable baseline, such as a commit. If none exists, preserve the current state first (for a skill or instruction text, through Write Skill); never create a baseline by editing what is being evaluated.
34
+ - Keep deterministic criteria, grader files, review questions and rubric references out of subject prompts, the fixture and declared subject context.
35
+ - Declare every part of the configuration that can change behavior. Ambient installation, settings, or context are not declared composition.
36
+ - Claim only what the evidence class observed; one class never proves another.
37
+ - Never write that one arm beats another without paired runs on the same cases and a suite `decision` declared before the run; the evaluator reports "beats" only from that rule. Below that, report counts.
38
+ - Never cite a dry run as evidence. When a run is refused for uncommitted inputs, commit the candidate and the definition, or keep the run as a dry run for your own checking only.
39
+ - Never change the component under test while evaluating it. Return one measured revision target to its owner.
40
+ - After a behavioral change, rerun the complete fixed group with every arm. Never hand-pick an earlier run as the fresh counterpart or rerun only the preferred arm; an earlier run may stand in only through `--reuse`, which matches the arm's exact inputs, and the report names it as reused.
41
+ - Judged evidence is its own class. Judge answers are stored apart from run and deterministic grade files, with each judge's identity and calibration status, and count toward a claim only through a decision rule declared before the run. They never change run or grade files and never establish readiness.
42
+ - Installing anything an eval needs, such as the VM runtime behind a confined shell, is the user's decision. Relay the evaluator's exact refusal and ask before installing; never install silently.
43
+ - Never invoke archived evaluators.
44
+ - Never clear a run's transcript-scan flag on your own judgment. Show the user the flag and its evidence, and run `skill-eval clear` only with their decision and their reason.
45
+
46
+ ## Design The Smallest Valid Comparison
47
+
48
+ Goal: the arms differ only in the component, under pressure strong enough to show it, in a run no larger than the claim needs.
49
+
50
+ Answer from saved evidence or an existing group when they still fit (the same question, pressure, arms and fixed criteria); for a draft-only request, use Write Skill. Do not rerun merely to demonstrate process. Name one behavioral question, its evidence class, and the strongest claim the result must support: can do X, a rate on this suite, or A beats B; readiness is beyond Evaluate Behavior. Activation, first-read body and nearby behavior are questions about skills; for other components, check delivery, behavior and artifact outcome first.
51
+
52
+ Choose the component:
53
+
54
+ | Change under test | Component | Baseline |
55
+ | --- | --- | --- |
56
+ | A new or revised skill | `subject.skills`, `subject.target`, `subject.source` | no target, or the previous commit |
57
+ | An instruction or context file | `subject.context` | without the file, or its previous commit |
58
+ | A model or thinking level | `model.model`, `model.thinking` | the model in use |
59
+ | An extension or plugin, or a host setting | `host.extensions`, `host.settings` | without it, or its current version or value |
60
+
61
+ The task's fixture and the runtime are shared by every arm and cannot be the component.
62
+
63
+ Choose the mode by where the behavior happens; modes combine:
64
+
65
+ - **Compare:** arms run the same task once per trial; the default.
66
+ - **Noise check:** `component: []` with identical arms; their gap is the floor a real difference must clear.
67
+ - **Measure:** one arm; a rate on this suite, never a comparison.
68
+ - **Conversation:** a simulated user who knows only its card answers back.
69
+ - **Pipeline:** ordered stages, each a subject that sees only what it declares.
70
+ - **Coding task:** hidden tests or other commands grade the changed repository.
71
+ - **Judged evaluation:** judges answer a rubric for each run alone, blind to its arm.
72
+
73
+ Before subject output exists:
74
+
75
+ 1. fix one behavioral question;
76
+ 2. fix deterministic expectations, rubric and review questions;
77
+ 3. preserve the earliest natural prompt or strongest pressure capable of distinguishing behavior;
78
+ 4. declare each arm's exact identity, and the suite's decision rule when the claim is a comparison;
79
+ 5. keep prompt or turns, fixture, tools, and every configuration part other than the component fixed, along with the criteria;
80
+ 6. run one group or an ordered suite;
81
+ 7. inspect canonical evidence and deterministic facts before judging meaning;
82
+ 8. classify the failed boundary before proposing revision.
83
+
84
+ If every arm passes, the pressure may be weak or the baseline already sufficient. If every arm fails, distinguish component, fixture, dependency, environment, host, isolation, and criterion failures before revising anything.
85
+
86
+ ## Run And Read The Evidence
87
+
88
+ Run the canonical [skill evaluator](scripts/skill-eval.mjs) from the definition root: `node <evaluate-behavior-directory>/scripts/skill-eval.mjs <run|check-tasks|view|review|clear> ...`. Run `check-tasks`, which calls no model, before spending on a coding task; use `--trials <n>` before claiming a difference, and `--max-cost` when a batch could spend more than intended. Canonical results live under `<definition-root>/.skill-eval/runs/<result-id>`; a view is a projection of them. A failed check is behavioral evidence; a transition such as `fail-to-pass` is a fact, not a verdict.
89
+
90
+ ## Report And Stop
91
+
92
+ Report:
93
+
94
+ - what ran;
95
+ - each arm's exact identity, and which is the reference;
96
+ - selected groups and arms, and any run reused from an earlier result;
97
+ - deterministic results, with case and trial counts and pass^k;
98
+ - metrics that bear on the question, such as cost, turns or duration per arm;
99
+ - the decision's verdict, with its split, p and rule, when the suite declares one, and otherwise the claim class reached;
100
+ - judged evidence apart from deterministic results, with each judge's identity and calibration status;
101
+ - infrastructure failures, invalid runs with their reasons, runs held for uncleared transcript flags, cancellation, or unavailable evidence;
102
+ - viewed scope and canonical result paths;
103
+ - what the evidence proves;
104
+ - what it does not prove;
105
+ - any supported failed boundary or revision target.
106
+
107
+ Stop rather than overclaim when required delivery, activation, first-read, composition, retained-use, isolation, artifact, or host evidence is unavailable. The user decides whether to revise, adopt, or reject the change.