@zenera/cli 1.1.23 → 1.1.25

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 (184) hide show
  1. package/README.md +88 -2
  2. package/dist/ask.d.ts +51 -0
  3. package/dist/ask.js +166 -0
  4. package/dist/banner.js +2 -2
  5. package/dist/batch.d.ts +83 -0
  6. package/dist/batch.js +413 -0
  7. package/dist/catalog.d.ts +11 -1
  8. package/dist/catalog.js +80 -7
  9. package/dist/command.d.ts +6 -0
  10. package/dist/commands/inspect.d.ts +57 -0
  11. package/dist/commands/inspect.js +539 -91
  12. package/dist/commands/list.js +128 -19
  13. package/dist/commands/memory.js +461 -32
  14. package/dist/commands/meta.js +311 -21
  15. package/dist/commands/models.js +110 -14
  16. package/dist/commands/open.js +4 -4
  17. package/dist/commands/run.js +175 -36
  18. package/dist/commands/sandbox.js +148 -15
  19. package/dist/engine.d.ts +24 -0
  20. package/dist/engine.js +61 -8
  21. package/dist/eventlog.d.ts +59 -0
  22. package/dist/eventlog.js +146 -0
  23. package/dist/liveness.d.ts +7 -0
  24. package/dist/liveness.js +20 -3
  25. package/dist/main.js +5 -2
  26. package/dist/meta/editor.d.ts +9 -0
  27. package/dist/meta/editor.js +60 -0
  28. package/dist/meta/finetune/children.d.ts +8 -0
  29. package/dist/meta/finetune/children.js +76 -0
  30. package/dist/meta/finetune/command.d.ts +30 -0
  31. package/dist/meta/finetune/command.js +338 -0
  32. package/dist/meta/finetune/dataset/anchors.d.ts +41 -0
  33. package/dist/meta/finetune/dataset/anchors.js +239 -0
  34. package/dist/meta/finetune/dataset/changes.d.ts +36 -0
  35. package/dist/meta/finetune/dataset/changes.js +319 -0
  36. package/dist/meta/finetune/dataset/command.d.ts +17 -0
  37. package/dist/meta/finetune/dataset/command.js +1011 -0
  38. package/dist/meta/finetune/dataset/drift.d.ts +33 -0
  39. package/dist/meta/finetune/dataset/drift.js +71 -0
  40. package/dist/meta/finetune/dataset/export.d.ts +26 -0
  41. package/dist/meta/finetune/dataset/export.js +51 -0
  42. package/dist/meta/finetune/dataset/index.d.ts +2 -0
  43. package/dist/meta/finetune/dataset/index.js +2 -0
  44. package/dist/meta/finetune/dataset/sample.d.ts +50 -0
  45. package/dist/meta/finetune/dataset/sample.js +197 -0
  46. package/dist/meta/finetune/dataset/schema.d.ts +33 -0
  47. package/dist/meta/finetune/dataset/schema.js +216 -0
  48. package/dist/meta/finetune/dataset/store.d.ts +35 -0
  49. package/dist/meta/finetune/dataset/store.js +177 -0
  50. package/dist/meta/finetune/dataset/types.d.ts +125 -0
  51. package/dist/meta/finetune/dataset/types.js +39 -0
  52. package/dist/meta/finetune/failure.d.ts +15 -0
  53. package/dist/meta/finetune/failure.js +26 -0
  54. package/dist/meta/finetune/feedback.d.ts +45 -0
  55. package/dist/meta/finetune/feedback.js +85 -0
  56. package/dist/meta/finetune/improvements.d.ts +51 -0
  57. package/dist/meta/finetune/improvements.js +244 -0
  58. package/dist/meta/finetune/index.d.ts +2 -0
  59. package/dist/meta/finetune/index.js +2 -0
  60. package/dist/meta/finetune/journal.d.ts +35 -0
  61. package/dist/meta/finetune/journal.js +135 -0
  62. package/dist/meta/finetune/live.d.ts +74 -0
  63. package/dist/meta/finetune/live.js +226 -0
  64. package/dist/meta/finetune/loop.d.ts +3 -0
  65. package/dist/meta/finetune/loop.js +114 -0
  66. package/dist/meta/finetune/memories.d.ts +47 -0
  67. package/dist/meta/finetune/memories.js +154 -0
  68. package/dist/meta/finetune/report.d.ts +33 -0
  69. package/dist/meta/finetune/report.js +1284 -0
  70. package/dist/meta/finetune/retry.d.ts +24 -0
  71. package/dist/meta/finetune/retry.js +96 -0
  72. package/dist/meta/finetune/sampler.d.ts +18 -0
  73. package/dist/meta/finetune/sampler.js +41 -0
  74. package/dist/meta/finetune/system.d.ts +27 -0
  75. package/dist/meta/finetune/system.js +132 -0
  76. package/dist/meta/finetune/train.d.ts +39 -0
  77. package/dist/meta/finetune/train.js +391 -0
  78. package/dist/meta/finetune/tui.d.ts +16 -0
  79. package/dist/meta/finetune/tui.js +291 -0
  80. package/dist/meta/finetune/tuning.d.ts +167 -0
  81. package/dist/meta/finetune/tuning.js +289 -0
  82. package/dist/meta/finetune/usage.d.ts +62 -0
  83. package/dist/meta/finetune/usage.js +225 -0
  84. package/dist/meta/host.d.ts +14 -0
  85. package/dist/meta/host.js +20 -0
  86. package/dist/meta/index.d.ts +11 -0
  87. package/dist/meta/index.js +11 -0
  88. package/dist/meta/launch.d.ts +81 -0
  89. package/dist/meta/launch.js +286 -0
  90. package/dist/meta/model.d.ts +44 -0
  91. package/dist/meta/model.js +119 -0
  92. package/dist/meta/prompts.d.ts +18 -0
  93. package/dist/meta/prompts.js +61 -0
  94. package/dist/meta/relay.d.ts +20 -0
  95. package/dist/meta/relay.js +123 -0
  96. package/dist/meta/tokens.d.ts +52 -0
  97. package/dist/meta/tokens.js +226 -0
  98. package/dist/meta/window.d.ts +61 -0
  99. package/dist/meta/window.js +198 -0
  100. package/dist/meta/wire.d.ts +42 -0
  101. package/dist/meta/wire.js +129 -0
  102. package/dist/modelref.d.ts +16 -0
  103. package/dist/modelref.js +41 -0
  104. package/dist/narrate.js +5 -2
  105. package/dist/podman.d.ts +42 -0
  106. package/dist/podman.js +198 -5
  107. package/dist/progress.d.ts +33 -0
  108. package/dist/progress.js +402 -0
  109. package/dist/projects.d.ts +0 -5
  110. package/dist/projects.js +2 -15
  111. package/dist/request.d.ts +45 -0
  112. package/dist/request.js +300 -0
  113. package/dist/sandbox.d.ts +2 -0
  114. package/dist/sandbox.js +20 -3
  115. package/dist/scaffold.d.ts +15 -6
  116. package/dist/scaffold.js +5 -60
  117. package/dist/session.d.ts +26 -1
  118. package/dist/session.js +46 -32
  119. package/dist/term.d.ts +5 -0
  120. package/dist/term.js +28 -3
  121. package/dist/trace.d.ts +84 -0
  122. package/dist/trace.js +737 -0
  123. package/dist/tui/models.d.ts +33 -0
  124. package/dist/tui/models.js +389 -0
  125. package/dist/tui/wrap.d.ts +5 -0
  126. package/dist/tui/wrap.js +12 -0
  127. package/dist/usage.d.ts +78 -0
  128. package/dist/usage.js +51 -0
  129. package/dist/validate.js +25 -3
  130. package/package.json +3 -2
  131. package/templates/editor/.github/copilot-instructions.md +41 -107
  132. package/templates/editor/.github/prompts/analyze.prompt.md +31 -0
  133. package/templates/editor/.github/prompts/dataset.prompt.md +108 -0
  134. package/templates/editor/.github/prompts/finetune-apply.prompt.md +91 -0
  135. package/templates/editor/.github/prompts/finetune.prompt.md +744 -0
  136. package/templates/editor/.github/prompts/new-agent.prompt.md +3 -1
  137. package/templates/editor/.github/prompts/new-skill.prompt.md +2 -0
  138. package/templates/editor/.github/prompts/project-review.prompt.md +4 -3
  139. package/templates/editor/.github/skills/zen-analyze-run/SKILL.md +483 -0
  140. package/templates/editor/.github/skills/zen-cli/SKILL.md +18 -4
  141. package/templates/editor/.github/skills/zen-cli/references/check.md +7 -5
  142. package/templates/editor/.github/skills/zen-cli/references/dataset.md +34 -0
  143. package/templates/editor/.github/skills/zen-cli/references/finetune.md +77 -0
  144. package/templates/editor/.github/skills/zen-cli/references/inspect.md +300 -21
  145. package/templates/editor/.github/skills/zen-cli/references/memory.md +121 -28
  146. package/templates/editor/.github/skills/zen-cli/references/meta.md +61 -0
  147. package/templates/editor/.github/skills/zen-cli/references/models.md +6 -2
  148. package/templates/editor/.github/skills/zen-cli/references/projects.md +12 -5
  149. package/templates/editor/.github/skills/zen-cli/references/rag.md +24 -6
  150. package/templates/editor/.github/skills/zen-cli/references/run.md +201 -4
  151. package/templates/editor/.github/skills/zen-cli/references/sandbox.md +10 -1
  152. package/templates/editor/.github/skills/zen-code-python/SKILL.md +123 -0
  153. package/templates/editor/.github/skills/zen-code-python/references/code_python.md +48 -0
  154. package/templates/editor/.github/skills/zen-dataset/SKILL.md +253 -0
  155. package/templates/editor/.github/skills/zen-finetune/SKILL.md +1791 -0
  156. package/templates/editor/.github/skills/zen-finetune/references/readme-template.md +268 -0
  157. package/templates/editor/.github/skills/zen-finetune/scripts/batch.mjs +390 -0
  158. package/templates/editor/.github/skills/zen-finetune/scripts/difficult.mjs +243 -0
  159. package/templates/editor/.github/skills/zen-finetune/scripts/memory.mjs +280 -0
  160. package/templates/editor/.github/skills/zen-finetune/scripts/next.mjs +398 -0
  161. package/templates/editor/.github/skills/zen-finetune/scripts/report.mjs +797 -0
  162. package/templates/editor/.github/skills/zen-finetune/scripts/select.mjs +354 -0
  163. package/templates/editor/.github/skills/zen-finetune/scripts/usage.mjs +722 -0
  164. package/templates/editor/.github/skills/zen-inspect/SKILL.md +431 -0
  165. package/templates/editor/.github/skills/zen-inspect-ask/SKILL.md +270 -0
  166. package/templates/editor/.github/skills/zen-memory/SKILL.md +78 -29
  167. package/templates/editor/.github/skills/zen-memory-warmup/SKILL.md +363 -531
  168. package/templates/editor/.github/skills/zen-rag-docs/SKILL.md +20 -8
  169. package/templates/editor/.github/skills/zen-review/SKILL.md +5 -3
  170. package/templates/editor/.github/skills/zen-review/scripts/check-paths.sh +5 -4
  171. package/templates/editor/.github/skills/zen-sandbox/SKILL.md +25 -2
  172. package/templates/editor/.github/skills/zen-sandbox-capacity/SKILL.md +334 -0
  173. package/templates/editor/.github/skills/zen-sandbox-capacity/references/loadtest.md +181 -0
  174. package/templates/editor/.github/skills/zen-sandbox-capacity/scripts/preflight_sandbox.sh +457 -0
  175. package/templates/editor/.github/skills/zen-topology/SKILL.md +283 -0
  176. package/templates/editor/.vscode/agents.schema.json +1 -1
  177. package/templates/editor/.vscode/settings.json +2 -0
  178. package/templates/project/agents/files-instructions.md +35 -13
  179. package/templates/project/agents/fork-instructions.md +27 -0
  180. package/templates/project/agents/memory-instructions.md +106 -34
  181. package/templates/project/agents/tools-instructions.md +7 -4
  182. package/templates/project/gitignore +5 -0
  183. package/dist/meta.d.ts +0 -221
  184. package/dist/meta.js +0 -684
@@ -0,0 +1,253 @@
1
+ ---
2
+ name: zen-dataset
3
+ description: Keep a project's evaluation dataset in `dataset/` with `zen meta dataset` - every case read from its sources with a class, a complexity, tags, a verbatim rubric and an anchor to the section it came from. Covers extracting a training set of any shape into a proposal, applying it as a revision, finding which cases their sources moved under (drift) and re-reading only those sections, settling gone and uncovered sections, overriding a field by hand, leaving notes and verdicts on a case, reading a case's history and the sessions that touched it, and drawing samples by criteria (class, complexity, tag, rubric, revision, verdict, note kind, source, text) stratified, weighted and seeded. Load before building or refreshing a dataset, before running /dataset, before choosing which cases to run, and before writing a note or verdict on a case.
4
+ ---
5
+
6
+ # The dataset
7
+
8
+ A dataset is the project's set of real queries, each with what it should be
9
+ judged by. It lives in `dataset/` at the project root, it is committed, and it
10
+ outlives any one tuning. **Only `zen meta dataset` writes to it.** A hand edit
11
+ skips the history, the revision, the session stamp and the lock, and the next
12
+ drift check will not see it.
13
+
14
+ Reading a source and deciding what is a case is your work. Everything after
15
+ that - what changed, which revision, which cases restart, what to run next - is
16
+ the command's.
17
+
18
+ ## What is stored
19
+
20
+ ```
21
+ dataset/
22
+ manifest.json revision, a hash per source file, the ignored sections
23
+ revisions.jsonl one line per revision: added, updated, retired, restarted
24
+ cases/<id>.json each case as it is now
25
+ log/<id>.jsonl each case's history: every change, every note, who made it
26
+ ```
27
+
28
+ A case:
29
+
30
+ ```json
31
+ {
32
+ "id": "planning-organize-day",
33
+ "rev": 3,
34
+ "status": "active",
35
+ "class": "planning",
36
+ "complexity": "complex",
37
+ "tags": ["calendar", "mail"],
38
+ "input": "organize my day",
39
+ "rubric": [
40
+ { "id": "r1", "text": "calls api /mail/list" },
41
+ { "id": "r2", "text": "proposes a schedule, does not just list both" }
42
+ ],
43
+ "expected": "A time-ordered plan naming the two conflicting meetings.",
44
+ "source": {
45
+ "file": "SPECIFICATION.md",
46
+ "anchor": { "heading": ["Examples", "Query: organize my day"] }
47
+ }
48
+ }
49
+ ```
50
+
51
+ - **`rev`** is the dataset revision that last changed the case. A run that
52
+ records `{id, rev}` can always be read back against the rubric it ran under:
53
+ `zen meta dataset show <id>@<rev>`.
54
+ - **Rubric ids** stay with their line. An unchanged line keeps its `r<n>`; a
55
+ new line gets a new one; a note that says `r2 failed` keeps meaning the same
56
+ line.
57
+ - **Nothing is deleted.** A removed case is `retired`: out of every sample,
58
+ still readable, its id never reused.
59
+
60
+ ## Extracting cases
61
+
62
+ Read the source yourself and write the structure out; do not write a parser.
63
+ Large sources are read in parts, and the count is checked against the source at
64
+ the end.
65
+
66
+ | In the source | In the case |
67
+ | ---------------------------------------------------------------- | -------------------------------------------------------------------- |
68
+ | A heading like `## Query:` and a quoted string | One case, `input` is the string |
69
+ | A bullet list under `### Rubric:` | `rubric` - **verbatim**, one entry per bullet |
70
+ | An embedded image, a `![](...)` link, an audio or PDF attachment | A media part in `input`, path relative to the proposal file |
71
+ | A paragraph of context before the query | `notes`, not `input` - unless the agent is meant to see it |
72
+ | The expected answer | `expected`, one string; it is context for grading, not a diff target |
73
+ | Nothing but a query | A case with no `rubric` |
74
+
75
+ - **The rubric is the source's words.** A paraphrased rubric grades the
76
+ paraphrase. A wrong rubric is fixed in the source and re-read; when the
77
+ source is not yours to edit, `update --rubric-edit ... --override` and say why.
78
+ - **Class** is a distinction the source already makes - a section, an agent,
79
+ an API, a task type. Do not invent a taxonomy.
80
+ - **Complexity** rates the trajectory the query demands, not the sentence:
81
+
82
+ | Level | What it means |
83
+ | --------- | --------------------------------------------------------------------------- |
84
+ | `simple` | One tool call or none; one agent; the answer is a lookup or a restatement |
85
+ | `medium` | Several calls that depend on each other, or one delegation, or one artefact |
86
+ | `complex` | Fan-out, multi-agent, ambiguity to resolve, or a plan that can go wrong |
87
+
88
+ - **Tags** are free words for what cuts across classes - `mail`, `pagination`,
89
+ `impossible`. Use the source's own words; a tag on one case is noise.
90
+ - **Ids** are letters, digits, dot, dash and underscore, `class-short-slug`,
91
+ and **stable**: a case read again from the same section keeps its id. A new
92
+ id for an old case restarts it and orphans its history.
93
+ - **`input` is exactly what `zen run batch` accepts**: a string, or a list of
94
+ parts - a string, `{ "text": "…" }`, or `{ "image" | "audio" | "video" | "file": "<path or url>" }`.
95
+
96
+ ### Anchors
97
+
98
+ Every case read from a file names the section it came from, so the command can
99
+ find that section again with no model involved:
100
+
101
+ | Source | Anchor | The section |
102
+ | ---------------------- | ---------------------------------------- | ------------------------------------------------- |
103
+ | Markdown | `{ "heading": "Examples > Query: one" }` | from the heading to the next one at its level |
104
+ | JSON or YAML | `{ "pointer": "/cases/3" }` | that value; key order and formatting do not count |
105
+ | Anything else, or none | no `anchor` | the whole file |
106
+
107
+ A heading path needs only its last name while that is unique in the file; add
108
+ a parent to tell two apart. Headings inside code fences are not headings. An
109
+ anchor that does not resolve to exactly one section is refused at apply.
110
+
111
+ ### The proposal
112
+
113
+ Write the cases to a scratch file - `.tmp/dataset/proposal.json` - as
114
+ `{ "cases": [ … ] }`. Media paths in it resolve against that file. Then:
115
+
116
+ ```sh
117
+ zen meta dataset apply .tmp/dataset/proposal.json --dry-run
118
+ zen meta dataset apply .tmp/dataset/proposal.json --why "first extraction of SPECIFICATION.md"
119
+ ```
120
+
121
+ A whole proposal **retires every active case it does not name**. A refresh of
122
+ a few sections is `--partial`: only the cases it names are touched. Read the
123
+ dry run before writing - an unexpected `retired` or an id you did not mean to
124
+ change is caught there and nowhere else.
125
+
126
+ The old `finetune/dataset.json` (`cases` or `samples`) applies as it stands.
127
+
128
+ ## When the sources move
129
+
130
+ ```sh
131
+ zen meta dataset drift
132
+ ```
133
+
134
+ A source file whose hash is unchanged is not opened. In a file that moved, each
135
+ case's own section is compared, so a typo three sections away restarts nothing.
136
+
137
+ | State | Means | Do |
138
+ | ----------- | ----------------------------------------------------- | --------------------------------------------------------------------- |
139
+ | `changed` | the case's section text differs | re-read that section; put the case in a `--partial` proposal |
140
+ | `gone` | its anchor no longer finds exactly one section | `retire` it, or `reanchor` it if the section was only renamed |
141
+ | `uncovered` | a section at the cases' level that no case comes from | new cases in the proposal, or `ignore <file> --heading "…" --why "…"` |
142
+ | `unsettled` | a file never recorded, because a section is uncovered | settle its uncovered sections |
143
+
144
+ Re-reading a `changed` section and proposing the same case is fine: if what it
145
+ asks, expects and is judged by did not change, nothing is revised - only its
146
+ stored hash moves.
147
+
148
+ **What restarts a case.** A change to `input`, `rubric` or `expected` - the
149
+ question or how it is judged - lists the case under `restarted` in that
150
+ revision; results from its earlier revision are about a different question. A
151
+ change to `class`, `complexity`, `tags`, `notes` or `source` revises the case
152
+ without restarting it.
153
+
154
+ ## By hand
155
+
156
+ ```sh
157
+ zen meta dataset update <id> --set class=search --set complexity=medium --why "…"
158
+ zen meta dataset update <id> --rubric-edit r2="proposes a schedule" --override --why "…"
159
+ zen meta dataset update <id> --rubric-add "says when it is impossible" --rubric-drop r3 --why "…"
160
+ zen meta dataset update <id> --tag-add impossible --why "…"
161
+ zen meta dataset retire <id>... --why "…" # restore <id>... to undo
162
+ zen meta dataset reanchor <id> --heading "Examples > Query: plan" --why "section renamed"
163
+ ```
164
+
165
+ `--set <field>=` with nothing after the `=` clears that field. `--override` keeps the
166
+ change through every later re-extraction; without it the next apply of that
167
+ section writes the source's version back.
168
+
169
+ ## Notes, verdicts, history
170
+
171
+ ```sh
172
+ zen meta dataset note <id>... -m "…" [--kind graded|analyze|difficult|rubric-suspect|observation] \
173
+ [--run <run>] [--verdict right|wrong|void] [--rubric r1=pass,r2=fail]
174
+ zen meta dataset log [id...]
175
+ ```
176
+
177
+ A note is about the case's **current** revision and is recorded with it; after
178
+ the case is revised, the note stays in its history but stops counting. A note
179
+ with a verdict defaults to `graded`. Leave a `rubric-suspect` note when a case
180
+ fails for a reason the rubric cannot be right about - the dataset prompt lists
181
+ them until someone fixes the source.
182
+
183
+ Every change and note records who made it: the `zen meta` session, the prompt
184
+ it ran (`/dataset`, `/analyze`, …) and the host. `log` prints
185
+ `resume: zen meta resume <project> <session>` for every session this machine
186
+ still holds.
187
+
188
+ ## Drawing a sample
189
+
190
+ ```sh
191
+ zen meta dataset sample [filters] [-n <count>] [--seed <n>] [--by <fields>] \
192
+ [--weight <stratum>=<w>] [--order <keys>] [--format ids|batch|cases|json] [-o <file>]
193
+ ```
194
+
195
+ **Filters** - all must hold; a repeated flag means any of its values:
196
+
197
+ | Flag | Keeps |
198
+ | ---------------------------------------- | ----------------------------------------------------------- |
199
+ | `--class`, `--complexity`, `--tag` | those values (`unclassified`, `unrated` for none) |
200
+ | `--status active\|retired\|all` | default `active` |
201
+ | `--rubric yes\|no`, `--expected yes\|no` | cases with or without one |
202
+ | `--id <glob>`, `--exclude <glob>` | ids matching, ids not matching |
203
+ | `--ids-from <file>` | ids listed - plain, or json with `ids`, `batch`, `cases` |
204
+ | `--changed-since <rev>` | revised after that revision |
205
+ | `--restarted` | restarted by the latest revision (or the `--at` one) |
206
+ | `--at <rev>` | the dataset as it stood then |
207
+ | `--verdict right\|wrong\|void` | the latest verdict on the current revision |
208
+ | `--never-graded` | no verdict on the current revision |
209
+ | `--note <kind>`, `--graded-in <run>` | has a note of that kind, or one from that run |
210
+ | `--source <glob>`, `--anchor <glob>` | read from that file, or that section |
211
+ | `--grep <text>` | input or rubric contains it (`--regex`, `--case-sensitive`) |
212
+
213
+ A value the dataset does not have - a misspelt class - is an error that lists
214
+ the real ones, never an empty sample.
215
+
216
+ **The draw.** Cases are grouped into strata by `--by` (default `class`; also
217
+ `complexity`, `tag`, `source`, `rubric`, `verdict`, several joined by commas,
218
+ or `none`). Inside a stratum they are ordered by `--order` (default
219
+ `rubric,complexity`: graded first, then complex, medium, simple; also
220
+ `verdict` - wrong first, `rev` - newest first, `id`), ties broken by `--seed`.
221
+ Strata take turns, `--weight alpha=2` giving one twice the turns. The whole
222
+ order is laid out before `-n` cuts it, so **a larger `-n` keeps every case a
223
+ smaller one chose**, and the same filters, seed and revision draw the same cases
224
+ on any machine.
225
+
226
+ **Output.** `ids` (default) one per line; `batch` - `{ "batch": [{ id, input }] }`
227
+ for `zen run batch`, **never a rubric**; `cases` - whole cases with rubrics, for
228
+ a grader; `json` - the ids with the criteria, seed, revision and per-stratum
229
+ counts, which is the record that reproduces the sample. Media paths are written
230
+ relative to the `-o` file. The per-stratum table goes to stderr.
231
+
232
+ ```sh
233
+ # a cross-section of 12 graded cases
234
+ zen meta dataset sample --rubric yes -n 12 --format batch -o runs/r1/cases.json
235
+ # everything the latest revision restarted
236
+ zen meta dataset sample --restarted --by none --format batch -o runs/r2/cases.json
237
+ # what is still wrong, worst classes first
238
+ zen meta dataset sample --verdict wrong --order complexity --weight search=2
239
+ # the whole dataset, rubrics included, for another machine
240
+ zen meta dataset export -o dataset.json
241
+ ```
242
+
243
+ `export [id...]` is the same filters with no strata, in id order, as `cases`
244
+ by default.
245
+
246
+ ## Rules
247
+
248
+ - Only `zen meta dataset` writes `dataset/`.
249
+ - Every write says `--why`, in terms of the source: what changed in it, or why
250
+ it is being overridden.
251
+ - Rubrics leave the dataset only through `--format cases` or `export`. Never
252
+ put one in a batch input, a prompt, a skill or the workspace an agent reads.
253
+ - Moving a rubric to match what an agent did is not a fix; it deletes the test.