@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
@@ -1,188 +0,0 @@
1
- ---
2
- name: evaluate-skill
3
- description: Use when evaluating or comparing agent-skill behavior.
4
- ---
5
-
6
- # Evaluate Skill
7
-
8
- Determine whether an exact skill package changes agent behavior as intended under declared pressure. Evidence outranks confident prose.
9
-
10
- A **group** asks one behavioral question through exactly two variants:
11
-
12
- - `baseline`: no target skill for a new skill, or one exact immutable previous package for a revision;
13
- - `candidate`: one exact new or updated package.
14
-
15
- The **subject** performs the declared task under one variant. The **evaluator** isolates subjects and preserves canonical evidence. The **deterministic grader** derives fixed mechanical facts after the run is saved. A **suite** runs an ordered set of independent groups.
16
-
17
- Evaluate Skill does not author or revise skills, decide semantic quality, claim readiness, or choose publication. [Write Skill](../write-skill/SKILL.md) owns package preservation and revision. The active agent or user judges unresolved meaning; the user decides whether to revise, use, publish, or reject the skill.
18
-
19
- 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.
20
-
21
- ## Rules
22
-
23
- - Never mutate canonical evidence or erase an unfavorable result. Preserve partial and infrastructure evidence without converting unavailable behavior into pass or fail.
24
- - Never fabricate behavioral evidence. Missing evidence stays unavailable.
25
- - Compare a revision only against an exact immutable baseline. If none exists, return to Write Skill to preserve the current package; never create a baseline by editing the package being evaluated.
26
- - Keep deterministic criteria and review questions out of subject prompts and declared subject context.
27
- - Declare every subject resource. Ambient installation or context is not declared composition.
28
- - Claim only what the evidence class observed; one class never proves another.
29
- - Never edit the skill from Evaluate Skill. Return one measured revision target to Write Skill.
30
- - After a behavioral change, rerun the complete fixed group with both variants. Never reuse an earlier run as the fresh counterpart or rerun only the preferred variant.
31
- - Advisory review and semantic judgment never enter canonical run or grade state, and neither establishes readiness.
32
- - Never invoke archived evaluators.
33
-
34
- ## Start From Existing Evidence
35
-
36
- Goal: answer the question with the least new evidence that can answer it.
37
-
38
- Before proposing a run or revision:
39
-
40
- - inspect adequate saved evidence, through views and raw artifact reads when a complete result already answers the question;
41
- - reuse an existing group unchanged when it still preserves the question, pressure, variants, and fixed criteria;
42
- - for a draft-only request, use Write Skill instead.
43
-
44
- Do not rerun merely to demonstrate process.
45
-
46
- ## Name One Behavioral Question
47
-
48
- Goal: one question, observed at the boundary where the claim lives.
49
-
50
- Name the exact claim and observing mechanism before choosing the group shape. Evidence classes include:
51
-
52
- - **Description activation:** did a natural prompt cause the exact target to be read, and when?
53
- - **First-read body behavior:** did explicit body delivery guide the subject using only guaranteed context?
54
- - **Nearby behavior:** did a close case avoid activation or load without hijacking the task?
55
- - **Dependency composition:** did exact ordered skills, resources, and context work together?
56
- - **Retained use:** did guidance remain useful on later declared turns without redelivery?
57
- - **Artifact outcome:** did files, structured state, events, and responses match fixed criteria?
58
- - **Cross-host behavior:** did the same behavioral question hold on every named host? The evaluator currently runs only native Pi hosts.
59
-
60
- ```text
61
- successful read
62
- ≠ behavioral compliance
63
-
64
- explicit body delivery
65
- ≠ natural activation
66
-
67
- one turn
68
- ≠ retained use
69
-
70
- ambient installation
71
- ≠ declared composition
72
-
73
- correct behavior
74
- ≠ proof that the target caused it
75
- ```
76
-
77
- Test a skill's Rules and its judgment differently. A Rule needs pressure to break it; it passes only if it holds. Judgment needs a case where following the default literally is the worse choice; it passes on outcome, so a candidate that only obeys cannot pass.
78
-
79
- Read [Evaluation Design](references/evaluation-design.md) before choosing or materially changing the question, evidence class, group shape, pressure, or baseline/candidate boundary.
80
-
81
- ## Design The Smallest Valid Comparison
82
-
83
- Goal: the only difference between variants is the target, and the pressure is strong enough to show it.
84
-
85
- Before subject output exists:
86
-
87
- 1. fix one behavioral question;
88
- 2. fix deterministic expectations and review questions;
89
- 3. preserve the earliest natural prompt or strongest pressure capable of distinguishing behavior;
90
- 4. declare exact baseline and candidate identities;
91
- 5. keep prompt or turns, fixture, tools, model, thinking, other skills, context, runtime, and criteria fixed except for the target difference;
92
- 6. run one group or an ordered suite serially;
93
- 7. inspect canonical evidence and deterministic facts before judging meaning;
94
- 8. classify the failed boundary before proposing revision.
95
-
96
- For a new skill, the baseline has no target skill. For a revision, the baseline is the exact previous package. For a description-only revision, keep body, references, scripts, and other resources byte-identical.
97
-
98
- If both variants pass, the pressure may be weak or the baseline already sufficient. If both fail, distinguish skill, fixture, dependency, environment, host, isolation, and criterion failures before revising instructions.
99
-
100
- Inline examples in the skill teach the subject and are part of the candidate intervention; they are not independent evaluation evidence.
101
-
102
- ## Declare The Complete Environment
103
-
104
- Use the exact [Evaluation Definition Schema](references/evaluation-definition-schema.md) when authoring or checking group and suite JSON. Declare:
105
-
106
- - prompt or ordered turns;
107
- - fixture;
108
- - exact ordered skill packages and target index;
109
- - working-tree or Git source identity;
110
- - context resources;
111
- - tools and any declared commands;
112
- - model and thinking;
113
- - runtime host, prompt mode, and extension bundles when needed;
114
- - literal and inherited environment sources;
115
- - deterministic expectations and comparison IDs;
116
- - review questions.
117
-
118
- ## Run And Preserve Canonical Evidence
119
-
120
- Before operating the evaluator, resolving paths, interpreting states, or reasoning about host execution, read [Execution and Evidence](references/execution-and-evidence.md).
121
-
122
- Use the canonical [skill evaluator](scripts/skill-eval.mjs) from the definition root:
123
-
124
- ```text
125
- node <evaluate-skill-directory>/scripts/skill-eval.mjs run <suite-or-group-path> [--group <id-or-position>] [--variant baseline|candidate] [--trials <n>] [--max-cost <total>]
126
- node <evaluate-skill-directory>/scripts/skill-eval.mjs view <result-id-or-directory> [--group <id-or-position>] [--variant baseline|candidate]
127
- node <evaluate-skill-directory>/scripts/skill-eval.mjs review <result-id-or-directory> --model <provider/model> [--group <id-or-position>] [--thinking <level>]
128
- ```
129
-
130
- One run per variant cannot separate a behavioral difference from sampling noise. Use `--trials <n>` before claiming a difference; each trial is an independent complete result, and the aggregate only counts their deterministic grades. Use `--max-cost` when trials or suites could spend more than intended.
131
-
132
- With no selectors, run or view every suite group and both variants. Selectors narrow execution or viewing scope; they do not modify definitions.
133
-
134
- Canonical results live under `<definition-root>/.skill-eval/runs/<result-id>`. A view is a projection of saved evidence, not its canonical source; use ordinary file tools when the exact run, event, transcript, response, stderr, workspace, definition, grade, context-observation, or group artifact matters.
135
-
136
- ## Derive Facts Without Inventing Meaning
137
-
138
- Deterministic grades are appended only after canonical run evidence exists. They can establish exact facts such as:
139
-
140
- - skill or resource reads;
141
- - file and path state;
142
- - changed paths;
143
- - file or response text;
144
- - JSON validity or values;
145
- - tool-call outcomes and argument predicates;
146
- - context text at a selected surface, request, and turn;
147
- - factual baseline-to-candidate transitions.
148
-
149
- A failed check remains ordinary behavioral evidence; it does not turn a valid subject run into infrastructure failure. Malformed expectations or grading failures produce separate `grade-error` evidence and do not rewrite run evidence.
150
-
151
- A transition such as `fail-to-pass` is a factual comparison. It does not mean bad-to-good, not-ready-to-ready, or rejected-to-promotable.
152
-
153
- ## Review Meaning After Evidence Exists
154
-
155
- After canonical evidence and deterministic grades exist, read [Review and Revision](references/review-and-revision.md) when evidence conflicts, semantic meaning remains unresolved, the failed boundary must be classified, a revision target must be selected, or rerun scope is uncertain.
156
-
157
- The evaluator never grades meaning automatically. `review` records an optional advisory answer to each review question from a separate model that sees the two runs unlabeled, in `semantic-grade.json`.
158
-
159
- The active agent or user may judge reasoning quality, authority preservation, architectural fitness, recommendation quality, or semantic completeness. Keep that judgment, cited evidence, uncertainty, and limits outside canonical run and grade state.
160
-
161
- ## Return Revision To The Author
162
-
163
- When evidence supports a candidate change:
164
-
165
- 1. identify the exact failed boundary;
166
- 2. preserve the canonical result path and relevant evidence;
167
- 3. state one measured revision target, keeping unrelated instructions and criteria stable;
168
- 4. return revision to Write Skill;
169
- 5. rerun the complete fixed group with both variants after the change.
170
-
171
- If the evaluation definition or criterion is wrong, preserve the old result and state that it no longer answers the revised question. Do not reinterpret it as evidence for the new question.
172
-
173
- ## Report And Stop
174
-
175
- Report:
176
-
177
- - what ran;
178
- - exact baseline and candidate identities;
179
- - selected groups and variants;
180
- - deterministic results;
181
- - infrastructure failures, cancellation, or unavailable evidence;
182
- - viewed scope;
183
- - canonical result paths;
184
- - what the evidence proves;
185
- - what it does not prove;
186
- - any supported failed boundary or revision target.
187
-
188
- Stop rather than overclaim when required activation, first-read, composition, retained-use, isolation, artifact, or host evidence is unavailable. The user decides whether to revise, use, publish, or reject the skill.
@@ -1,415 +0,0 @@
1
- # Evaluation Definition Schema
2
-
3
- Read this when authoring or checking schema-version-1 group and suite JSON.
4
-
5
- This reference is a contract: the shapes and constraints below are binding as written. Structural violations are rejected before any subject runs; a malformed expectation surfaces afterward as `grade-error` evidence.
6
-
7
- This file owns user-authored definition shapes. Read [execution and evidence](execution-and-evidence.md) for commands, path resolution, run states, persistence, views, isolation, and safeguards.
8
-
9
- ## Definition Root
10
-
11
- Run `skill-eval` from the repository or fixture root that owns the evaluation inputs.
12
-
13
- | Input | Resolves from |
14
- | --- | --- |
15
- | `run <suite-or-group-path>` | current working directory |
16
- | suite `groups` entries | directory containing the suite file |
17
- | group `fixture` | definition root/current working directory |
18
- | environment `skills` and `context` | definition root/current working directory, then the selected working tree or Git commit |
19
-
20
- Definition files and declared paths are checked for lexical and canonical containment. Paths are slash-separated relative paths, not absolute paths.
21
-
22
- ## Common Group Shape
23
-
24
- Every group contains exactly these fields, plus optional `model`:
25
-
26
- ```json
27
- {
28
- "schema_version": 1,
29
- "kind": "group",
30
- "id": "one-behavioral-question",
31
- "type": "description",
32
- "input": { "prompt": "Natural task prompt." },
33
- "fixture": null,
34
- "tools": ["read"],
35
- "variants": {
36
- "baseline": {
37
- "source": { "kind": "working-tree" },
38
- "skills": [],
39
- "target": null,
40
- "context": []
41
- },
42
- "candidate": {
43
- "source": { "kind": "working-tree" },
44
- "skills": ["skills/target"],
45
- "target": 0,
46
- "context": []
47
- }
48
- },
49
- "expectations": [],
50
- "review_questions": [],
51
- "model": {
52
- "model": "openai-codex/gpt-5.6-sol",
53
- "thinking": "low"
54
- }
55
- }
56
- ```
57
-
58
- Rules:
59
-
60
- - `schema_version` is `1`.
61
- - `kind` is `group`.
62
- - `id` starts with a lowercase letter, contains lowercase letters, numbers, or single hyphens, and is at most 64 characters.
63
- - `type` is `description` or `body`.
64
- - `input` contains exactly one of:
65
- - `prompt`: one non-empty string;
66
- - `turns`: a non-empty ordered array of non-empty strings. Repeated natural turns are allowed.
67
- - `fixture` is `null` or one contained relative directory path. The directory's contents become the workspace.
68
- - `tools` is an ordered array with no duplicates.
69
- - `variants` contains exactly `baseline` and `candidate`.
70
- - `expectations` is an ordered array with unique expectation IDs.
71
- - `review_questions` is an ordered string array. Questions are rendered for the reviewer and never sent to the subject.
72
- - `model` is optional. `model.model` names the provider/model; optional `model.thinking` selects its thinking level. The CLI has no model override.
73
- - `runtime` is optional. When omitted, the group runs under a plain `pi` host with the isolated prompt and no declared extensions. When present, it declares the host, prompt mode, ordered extension bundles, and string environment overrides.
74
- - `commands` is optional and only for body groups that list the `run_command` tool. See [Declared Commands](#declared-commands).
75
-
76
- ## Description Group Example
77
-
78
- A description group uses natural prompts and asks whether the exact target was read and when:
79
-
80
- ```json
81
- {
82
- "schema_version": 1,
83
- "kind": "group",
84
- "id": "natural-activation",
85
- "type": "description",
86
- "input": {
87
- "turns": [
88
- "Help me inspect this ordinary change.",
89
- "Now prepare a deployment rollback."
90
- ]
91
- },
92
- "fixture": null,
93
- "tools": ["read"],
94
- "variants": {
95
- "baseline": {
96
- "source": { "kind": "git", "ref": "before-description-change" },
97
- "skills": ["skills/target"],
98
- "target": 0,
99
- "context": []
100
- },
101
- "candidate": {
102
- "source": { "kind": "working-tree" },
103
- "skills": ["skills/target"],
104
- "target": 0,
105
- "context": []
106
- }
107
- },
108
- "expectations": [
109
- {
110
- "id": "baseline-read-by-two",
111
- "kind": "skill-read",
112
- "variant": "baseline",
113
- "expect": "by-turn",
114
- "turn": 2,
115
- "comparison": "target-read-by-two"
116
- },
117
- {
118
- "id": "candidate-read-by-two",
119
- "kind": "skill-read",
120
- "variant": "candidate",
121
- "expect": "by-turn",
122
- "turn": 2,
123
- "comparison": "target-read-by-two"
124
- }
125
- ],
126
- "review_questions": []
127
- }
128
- ```
129
-
130
- For a description-only revision, the two target snapshots must keep body and resources byte-identical while changing only frontmatter description text.
131
-
132
- Description groups allow no tools or only `read`. `skill-read` is their target-activation check.
133
-
134
- ## Body Group Example
135
-
136
- A body group explicitly delivers each target on turn one and observes first-read or later-turn behavior:
137
-
138
- ```json
139
- {
140
- "schema_version": 1,
141
- "kind": "group",
142
- "id": "retained-artifact-behavior",
143
- "type": "body",
144
- "input": {
145
- "turns": [
146
- "Inspect the task and prepare the work.",
147
- "Complete it and write result.json."
148
- ]
149
- },
150
- "fixture": "fixtures/task",
151
- "tools": ["read", "write", "edit"],
152
- "variants": {
153
- "baseline": {
154
- "source": { "kind": "git", "ref": "before-body-change" },
155
- "skills": ["skills/support", "skills/target"],
156
- "target": 1,
157
- "context": ["context/contract.md"]
158
- },
159
- "candidate": {
160
- "source": { "kind": "working-tree" },
161
- "skills": ["skills/support", "skills/target"],
162
- "target": 1,
163
- "context": ["context/contract.md"]
164
- }
165
- },
166
- "expectations": [
167
- {
168
- "id": "baseline-result",
169
- "kind": "path",
170
- "variant": "baseline",
171
- "path": "result.json",
172
- "turn": 2,
173
- "expect": "exists",
174
- "comparison": "result-exists"
175
- },
176
- {
177
- "id": "candidate-result",
178
- "kind": "path",
179
- "variant": "candidate",
180
- "path": "result.json",
181
- "turn": 2,
182
- "expect": "exists",
183
- "comparison": "result-exists"
184
- },
185
- {
186
- "id": "candidate-status",
187
- "kind": "json",
188
- "variant": "candidate",
189
- "path": "result.json",
190
- "turn": 2,
191
- "expect": "field-equals",
192
- "pointer": "/status",
193
- "value": "complete"
194
- },
195
- {
196
- "id": "candidate-changes",
197
- "kind": "changed-paths",
198
- "variant": "candidate",
199
- "turn": 2,
200
- "expect": "equals",
201
- "paths": ["result.json"]
202
- }
203
- ],
204
- "review_questions": [
205
- "Did the second turn apply the first-turn guidance without redelivery?"
206
- ]
207
- }
208
- ```
209
-
210
- Description groups allow no tools or only built-in `read`. Body groups allow built-in `read`, `write`, and `edit`, the evaluator's `run_command` tool for declared commands, plus custom tools declared by a runtime extension bundle. Native `bash`, `powershell`, `grep`, `find`, and `ls` tools are unsupported. A no-target baseline or runtime-only group may use `skills: []` and `target: null`; a candidate that declares skills must identify its target.
211
-
212
- The examples are complete definition shapes. Replace fixture, resource, model, and Git-ref values with paths and identities that exist under your definition root.
213
-
214
- ## Runtime Profile
215
-
216
- A runtime profile is shared by both baseline and candidate variants. It changes the host environment, not the skill target:
217
-
218
- ```json
219
- {
220
- "runtime": {
221
- "host": "pi",
222
- "session": false,
223
- "extensions": [
224
- {
225
- "entry": "extensions/probe.mjs",
226
- "resources": ["extensions"]
227
- }
228
- ],
229
- "environment": {
230
- "literal": {
231
- "PROBE_MODE": "injection-test"
232
- },
233
- "inherit": []
234
- }
235
- }
236
- }
237
- ```
238
-
239
- `host` is `pi`; the evaluator maps it to the installed Pi command and records the selected host. Optional `prompt` is `isolated` (default) or `host`:
240
-
241
- - `isolated` replaces the host's system prompt with a minimal evaluator-owned prompt. Use it to isolate the target skill.
242
- - `host` keeps the host's own system prompt and whatever declared extensions compose onto it, appending declared context. Use it when evidence must reflect the production prompt, for example by declaring the Freeflow Pi extension bundle with a fixture containing `.freeflow/config.json`.
243
-
244
- Both modes enforce the same tool and path guards. `session` controls whether the variant receives an isolated persistent session directory; it defaults to `false` in omitted runtime profiles. A runtime may declare zero or more bundles. Each bundle has an entry file and one or more directory resources copied under their original relative paths, so sibling imports and multi-tree extensions remain intact. Bundle bytes are snapshotted once and copied identically to both variants.
245
-
246
- `environment.literal` contains non-secret string configuration and is recorded in run evidence. `environment.inherit` names parent-process variables whose values are passed to the child but never persisted; other parent variables are not passed. Missing inherited variables invalidate the variant. The evaluator supplies only a small host-runtime baseline such as `PATH` and `HOME`. Launch-control and loader keys are rejected from inherited values, literal and inherited names must not overlap, and secret-like literal keys are rejected.
247
-
248
- Extensions are trusted executable inputs, not OS-sandboxed code. The evaluator proves declared identity and post-run immutability, but extension code retains its host permissions.
249
-
250
- When a group declares `context-text` expectations, the evaluator loads its base isolation guard first, then declared bundles, then a non-mutating final observer. The observer records two per-turn surfaces: the chained `before_agent_start` system prompt and each provider-neutral `context` message projection. `context-text` expectations select `surface: "system-prompt"` or `surface: "provider-context"` and may select `request: "first"`, `"last"`, or a positive request number. Groups without context assertions do not create context-observation artifacts.
251
-
252
- A custom tool name is allowed in `group.tools` only when the runtime declares an extension bundle. The evaluator remains extension-neutral: it does not interpret feature names or configuration schemas. Put feature configuration in the ordinary group fixture or runtime environment, and test combinations as separate suite groups.
253
-
254
- ## Variant Environment
255
-
256
- Each environment has exactly:
257
-
258
- ```json
259
- {
260
- "source": { "kind": "git", "ref": "v1.2.3" },
261
- "skills": ["skills/target", "skills/support"],
262
- "target": 0,
263
- "context": ["context/base-guidance.md"]
264
- }
265
- ```
266
-
267
- `source` is either:
268
-
269
- ```json
270
- { "kind": "working-tree" }
271
- ```
272
-
273
- or:
274
-
275
- ```json
276
- { "kind": "git", "ref": "<exact-ref>" }
277
- ```
278
-
279
- A source applies only to declared skill and context paths in that variant. It never supplies the group fixture: `fixture` is snapshotted once from the definition-root working tree, then copied independently for selected variants. `skills` preserves registration order. `target` is `null` or a zero-based index into `skills`; the candidate target cannot be `null`. `context` preserves declaration order and may name UTF-8 files or directories.
280
-
281
- ## Expectations
282
-
283
- Every expectation has:
284
-
285
- - `id`: unique group-local ID using the group-ID syntax;
286
- - `kind`: one supported deterministic kind;
287
- - `variant`: `baseline` or `candidate`;
288
- - optional `comparison`: shared by exactly one baseline and one candidate expectation describing the same expected check;
289
- - optional body `turn`: one-based declared prompt/turn number.
290
-
291
- Without `turn`, response checks use the final response and workspace checks use final state. Turn-scoped workspace checks cause an immutable workspace snapshot after each settled turn.
292
-
293
- | `kind` | Kind-specific fields | `expect` |
294
- | --- | --- | --- |
295
- | `skill-read` | timing `turn` except for `never` | `never`, `on-turn`, `by-turn`, `not-before-turn` |
296
- | `resource-read` | `resource`, optional `index`, `path`, optional body `turn` | `read`, `not-read` |
297
- | `path` | workspace `path`, optional body `turn` | `exists`, `absent` |
298
- | `changed-paths` | unique workspace `paths`, optional body `turn` | `equals`, `excludes` |
299
- | `file-text` | workspace `path`, string `value`, optional body `turn` | `contains`, `not-contains`, `equals` |
300
- | `json` | workspace `path`, optional body `turn`, conditional `pointer` and `value` | `available`, `missing`, `valid`, `malformed`, `field-present`, `field-absent`, `field-equals` |
301
- | `response-text` | string `value`, optional body `turn` | `contains`, `not-contains`, `equals` |
302
- | `tool-call` | string `tool`, optional body `turn`, optional `argumentContains`/`argumentNotContains` arrays | `called`, `succeeded`, `failed`, `not-called` |
303
- | `context-text` | string `value`, optional `surface` (`system-prompt` or `provider-context`), optional `request`, optional body `turn` | `contains`, `not-contains`, `equals` |
304
-
305
- For `tool-call` with `expect: "not-called"`, omitted argument filters require zero calls to the named tool. Supplied filters scope the absence check to calls matching those argument predicates.
306
-
307
- ### Resource paths
308
-
309
- - `resource: "workspace"`: omit `index`; `path` is relative to the writable workspace.
310
- - `resource: "skill"`: `index` selects the zero-based declared skill; `path` is relative to that skill directory.
311
- - `resource: "context"`: `index` selects the zero-based declared context item; `path` is relative to that materialized item.
312
-
313
- ### Changed paths
314
-
315
- - `equals`: the complete changed-file set must equal `paths`.
316
- - `excludes`: none of `paths` may appear in the changed-file set.
317
-
318
- Directory-only presence does not count as a changed file.
319
-
320
- ### JSON states
321
-
322
- ```json
323
- [
324
- {
325
- "id": "file-missing",
326
- "kind": "json",
327
- "variant": "candidate",
328
- "path": "missing.json",
329
- "expect": "missing"
330
- },
331
- {
332
- "id": "file-malformed",
333
- "kind": "json",
334
- "variant": "candidate",
335
- "path": "broken.json",
336
- "expect": "malformed"
337
- },
338
- {
339
- "id": "field-absent",
340
- "kind": "json",
341
- "variant": "candidate",
342
- "path": "result.json",
343
- "expect": "field-absent",
344
- "pointer": "/optional"
345
- },
346
- {
347
- "id": "field-null",
348
- "kind": "json",
349
- "variant": "candidate",
350
- "path": "result.json",
351
- "expect": "field-equals",
352
- "pointer": "/value",
353
- "value": null
354
- }
355
- ]
356
- ```
357
-
358
- A JSON Pointer is `""` for the complete value or begins with `/`; `~0` escapes `~` and `~1` escapes `/`.
359
-
360
- ### Comparison pair
361
-
362
- Two expectations may share one comparison ID only when they have opposite variants and the same kind and expected predicate. The report records a factual transition such as `fail-to-pass`, never a quality verdict.
363
-
364
- Definition loading validates common structure and unique IDs. Kind-specific expectation validation occurs during deterministic grading after run persistence. A malformed expectation therefore becomes separate `grade-error` evidence rather than changing the subject run. Use the documented shapes to avoid spending a subject run on an invalid check.
365
-
366
- Definition-supplied commands run only through the subject's `run_command` tool. Grading never runs commands.
367
-
368
- ## Declared Commands
369
-
370
- A body group that must let the subject run tests or other programs lists the `run_command` tool and declares each allowed command:
371
-
372
- ```json
373
- {
374
- "tools": ["read", "edit", "run_command"],
375
- "commands": [
376
- { "id": "unit-tests", "argv": ["node", "--test"], "timeout_ms": 120000 },
377
- { "id": "lint", "argv": ["npm", "run", "lint"] }
378
- ]
379
- }
380
- ```
381
-
382
- - `run_command` and `commands` require each other and are valid only in body groups.
383
- - Each command has a unique `id` (group-ID syntax), a non-empty `argv`, and optional integer `timeout_ms` from 1 to 600000 (default 120000).
384
- - The subject chooses only a declared `id`; it cannot change `argv`. The argv runs without a shell, in the workspace, without evaluator control variables.
385
- - Output is capped per stream and marked when truncated. A nonzero exit or timeout is an ordinary tool result, not a tool error.
386
- - Grade calls with `tool-call` expectations, for example `tool: "run_command"` with `argumentContains: ["unit-tests"]`.
387
-
388
- Commands are trusted author input with the evaluator's host permissions, like extension bundles; the subject only selects among them.
389
-
390
- ## Suite
391
-
392
- ```json
393
- {
394
- "schema_version": 1,
395
- "kind": "suite",
396
- "id": "workflow-core",
397
- "groups": [
398
- "groups/natural-activation.json",
399
- "groups/body-behavior.json"
400
- ]
401
- }
402
- ```
403
-
404
- A suite has only `schema_version`, `kind`, `id`, and ordered unique `groups`. Group references resolve from the suite directory; their resolved definition paths must remain inside the definition root. Referenced group IDs must also be unique.
405
-
406
- ## Selection
407
-
408
- - With no selectors, every suite group and both variants are selected.
409
- - `--group <id>` selects one stable group ID.
410
- - `--group <position>` selects one one-based suite position.
411
- - `--variant baseline|candidate` applies across selected groups.
412
- - Excluded variants are `not-selected`, never failed.
413
- - `--group` is invalid for a direct group definition.
414
-
415
- Selection changes execution scope only. It does not modify the saved definitions.