@bendyline/gilde 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/authoring/chat-models/btl4-35b-q4.json +1 -0
- package/authoring/chat-models/glm-5.3-flash-320b-q2.json +5 -4
- package/authoring/chat-models/minicpm-v4.7-35b-a3b-q4.json +3 -1
- package/authoring/chat-models/nemotron3.5-bolt-74b-iq2.json +145 -0
- package/authoring/chat-models/nemotron3.5-super-vl-120b-nvfp4.json +143 -0
- package/data/chat-models/bt/btl4-35b-q4/manifest.json +1 -0
- package/data/chat-models/gl/glm-5.3-flash-320b-q2/manifest.json +5 -4
- package/data/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.2/manifest.json +27 -0
- package/data/chat-models/index.json +1 -1
- package/data/chat-models/mi/minicpm-v4.7-35b-a3b-q4/manifest.json +2 -1
- package/data/chat-models/mi/minicpm-v4.7-35b-a3b-q4/versions/1.0.0/manifest.json +1 -0
- package/data/chat-models/ne/nemotron3.5-bolt-74b-iq2/manifest.json +157 -0
- package/data/chat-models/ne/nemotron3.5-bolt-74b-iq2/versions/1.0.0/manifest.json +30 -0
- package/data/chat-models/ne/nemotron3.5-super-vl-120b-nvfp4/manifest.json +156 -0
- package/data/chat-models/ne/nemotron3.5-super-vl-120b-nvfp4/versions/1.0.0/manifest.json +28 -0
- package/data/chat-models/raw-index.json +1 -1
- package/data/craftbook-templates/index.json +1 -1
- package/data/craftbook-templates/raw-index.json +1 -1
- package/data/craftbook-templates/st/status-report/versions/1.0.4/craftbook.json +314 -0
- package/data/craftbook-templates/st/status-report/versions/1.0.4/test.json +110 -0
- package/data/project-types/index.json +1 -1
- package/data/project-types/raw-index.json +1 -1
- package/data/project-types/so/social-feed/versions/1.0.2/about.md +19 -0
- package/data/project-types/so/social-feed/versions/1.0.2/manifest.json +348 -0
- package/data/project-types/so/social-feed/versions/1.0.2/mission.md +10 -0
- package/data/project-types/so/social-feed/versions/1.0.2/pages/dashboard/index.html +754 -0
- package/data/project-types/so/social-feed/versions/1.0.2/posts/index.json +4 -0
- package/data/project-types/so/social-feed/versions/1.0.2/voice-guide.md +22 -0
- package/data/project-types/wo/word-clues/versions/1.0.1/about.md +7 -0
- package/data/project-types/wo/word-clues/versions/1.0.1/game.json +14 -0
- package/data/project-types/wo/word-clues/versions/1.0.1/manifest.json +205 -0
- package/data/project-types/wo/word-clues/versions/1.0.1/mission.md +3 -0
- package/data/project-types/wo/word-clues/versions/1.0.1/pages/board/index.html +399 -0
- package/data/project-types/wo/word-clues/versions/1.0.1/words.json +216 -0
- package/package.json +2 -1
- package/schemas/chat-model-version.schema.json +23 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "status-report",
|
|
3
|
+
"name": "Recurring Status Report",
|
|
4
|
+
"description": "Produce a recurring (weekly/biweekly) status report by gathering signals from the team's tools and writing a tight, skimmable update for stakeholders. Scopes the report template and the exact data sources FIRST (sections, audience, reporting window, RAG/health convention), then a developer gathers the raw signals from issue trackers, PRs, metrics, and notes into a facts file, then a copywriter writes the polished report strictly from those gathered facts. Scoping the template before gathering is what keeps every recurring issue consistent and prevents the model from padding with prose. Use for weekly status updates, sprint reports, project health reports, stakeholder updates, and exec summaries.\n\nA gallery craftbook generated from an archetype spec. It runs\n`phase → (per-phase gate) → … → evaluate → (loop) → finish`. Each build\nphase that produces a checkable artifact is followed by a **runtime\ngate-checkpoint** — the runtime verifies the artifact and routes with no\nmodel turn, looping back to redo the phase on a miss. The final `evaluate`\nstep holds a static deliverable gate plus a reviewer QA pass. What it adds\nover the generic `build-loop`: a specialist role per phase, a\ndomain-correct ordering, and a concrete per-phase quality bar.\n\nDeliverables marked \"artifact\" land in the project's artifacts drawer (`write_artifact` / `read_artifact`), not the shipped workspace — review output is not product source.\n\nPhases:\n\n1. Scope the report (planner) — lock the template, sources, window, and health convention → gated on artifact `{{workPath}}/scope.md` (markdown-notes)\n2. Gather signals (developer) — pull raw facts from each named source into a facts file → gated on artifact `{{workPath}}/gather.md` (markdown-notes)\n3. Write the report (copywriter) — compose the polished report from gathered facts → gated on `report.md` (markdown-doc)\n\nThe gates never advance with an unmet criterion, and loop back to the\nowning phase to fix named gaps.\n",
|
|
5
|
+
"entryStepId": "scope",
|
|
6
|
+
"triggers": [
|
|
7
|
+
"weekly status report",
|
|
8
|
+
"project update",
|
|
9
|
+
"sprint report",
|
|
10
|
+
"status update",
|
|
11
|
+
"stakeholder report"
|
|
12
|
+
],
|
|
13
|
+
"paramSchema": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"properties": {
|
|
16
|
+
"workPath": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"title": "Working folder",
|
|
19
|
+
"description": "Per-task working folder in the artifacts drawer. Defaults to this task's own folder so runs never collide; override with a stable name when you deliberately want runs to share files.",
|
|
20
|
+
"default": "{{task.dir}}"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"steps": [
|
|
25
|
+
{
|
|
26
|
+
"id": "scope",
|
|
27
|
+
"name": "Scope the report",
|
|
28
|
+
"description": "lock the template, sources, window, and health convention",
|
|
29
|
+
"prompt": "Define the report contract BEFORE gathering anything. (1) Lock the section template — e.g. Headline / Health (RAG: Green-Amber-Red with the rule for each color) / Shipped this period / In progress / Blockers & risks / Next period / Metrics. (2) Name the EXACT data sources for each section (which repo, which board, which metric dashboard, which notes file) so gathering is unambiguous. (3) Set the reporting window (the date range this issue covers) and the audience (exec vs team — drives length and jargon). (4) Set length targets per section (e.g. Blockers ≤ 3 bullets). Write an acceptance-criteria checklist ('every section from the template is present', 'health has a justifying one-liner', 'every claim traces to a gathered fact', 'covers only the reporting window', 'skimmable in under two minutes') plus the template + source map to {{workPath}}/scope.md via write_task_note AND the produces path.\n\nThe deliverable `{{workPath}}/scope.md` lands in the project's artifacts drawer — write it with `write_artifact` and read it back with `read_artifact`; the shipped workspace stays untouched.",
|
|
30
|
+
"suggestedRole": "planner",
|
|
31
|
+
"advanceWhen": {
|
|
32
|
+
"file": "{{workPath}}/scope.md",
|
|
33
|
+
"minBytes": 1,
|
|
34
|
+
"sniff": "nonempty",
|
|
35
|
+
"artifact": true
|
|
36
|
+
},
|
|
37
|
+
"gate": {
|
|
38
|
+
"at": "completion",
|
|
39
|
+
"checks": [
|
|
40
|
+
{
|
|
41
|
+
"kind": "minBytes",
|
|
42
|
+
"file": "{{workPath}}/scope.md",
|
|
43
|
+
"bytes": 120,
|
|
44
|
+
"artifact": true
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"kind": "sniff",
|
|
48
|
+
"file": "{{workPath}}/scope.md",
|
|
49
|
+
"sniff": "nonempty",
|
|
50
|
+
"artifact": true
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"onReject": "scope",
|
|
54
|
+
"maxAttempts": 3
|
|
55
|
+
},
|
|
56
|
+
"next": "gather",
|
|
57
|
+
"toolPolicy": {
|
|
58
|
+
"disallowBuiltinToolsets": [
|
|
59
|
+
"ai-apps",
|
|
60
|
+
"archives",
|
|
61
|
+
"audio",
|
|
62
|
+
"browser-automation",
|
|
63
|
+
"code-execution",
|
|
64
|
+
"craftbooks",
|
|
65
|
+
"data-tables",
|
|
66
|
+
"entity-intel",
|
|
67
|
+
"git",
|
|
68
|
+
"image-intel",
|
|
69
|
+
"images",
|
|
70
|
+
"role-delegation",
|
|
71
|
+
"role-delegation-escalation",
|
|
72
|
+
"security-intel",
|
|
73
|
+
"team-management",
|
|
74
|
+
"videos",
|
|
75
|
+
"web",
|
|
76
|
+
"workspace-fs-write"
|
|
77
|
+
],
|
|
78
|
+
"outputMedium": "artifact",
|
|
79
|
+
"additionalOutputMedia": [
|
|
80
|
+
"task-note"
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": "gather",
|
|
86
|
+
"name": "Gather signals",
|
|
87
|
+
"description": "pull raw facts from each named source into a facts file",
|
|
88
|
+
"prompt": "Collect the raw material for each section from the sources named in scope. For each source pull the items inside the reporting window only: merged PRs / closed issues (shipped), open in-progress items, anything labelled blocked or at-risk, and the current value (and prior value if available) for each tracked metric. Record everything as a flat, attributed list in {{workPath}}/gather.md — one bullet per fact, each tagged with its source and the template section it feeds — NOT prose. Do not editorialize or summarize here; capturing accurate raw facts is the whole job. If a source is empty or unreachable, note that explicitly rather than guessing. Write the facts file via write_task_note and end with a per-section fact count.\n\nThe deliverable `{{workPath}}/gather.md` lands in the project's artifacts drawer — write it with `write_artifact` and read it back with `read_artifact`; the shipped workspace stays untouched.",
|
|
89
|
+
"suggestedRole": "developer",
|
|
90
|
+
"advanceWhen": {
|
|
91
|
+
"file": "{{workPath}}/gather.md",
|
|
92
|
+
"minBytes": 1,
|
|
93
|
+
"sniff": "nonempty",
|
|
94
|
+
"artifact": true
|
|
95
|
+
},
|
|
96
|
+
"gate": {
|
|
97
|
+
"at": "completion",
|
|
98
|
+
"checks": [
|
|
99
|
+
{
|
|
100
|
+
"kind": "minBytes",
|
|
101
|
+
"file": "{{workPath}}/gather.md",
|
|
102
|
+
"bytes": 120,
|
|
103
|
+
"artifact": true
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"kind": "sniff",
|
|
107
|
+
"file": "{{workPath}}/gather.md",
|
|
108
|
+
"sniff": "nonempty",
|
|
109
|
+
"artifact": true
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
"onReject": "gather",
|
|
113
|
+
"maxAttempts": 3
|
|
114
|
+
},
|
|
115
|
+
"next": "write",
|
|
116
|
+
"toolPolicy": {
|
|
117
|
+
"disallowBuiltinToolsets": [
|
|
118
|
+
"ai-apps",
|
|
119
|
+
"archives",
|
|
120
|
+
"audio",
|
|
121
|
+
"browser-automation",
|
|
122
|
+
"code-execution",
|
|
123
|
+
"craftbooks",
|
|
124
|
+
"data-tables",
|
|
125
|
+
"entity-intel",
|
|
126
|
+
"git",
|
|
127
|
+
"image-intel",
|
|
128
|
+
"images",
|
|
129
|
+
"role-delegation",
|
|
130
|
+
"role-delegation-escalation",
|
|
131
|
+
"security-intel",
|
|
132
|
+
"team-management",
|
|
133
|
+
"videos",
|
|
134
|
+
"web",
|
|
135
|
+
"workspace-fs-write"
|
|
136
|
+
],
|
|
137
|
+
"outputMedium": "artifact",
|
|
138
|
+
"additionalOutputMedia": [
|
|
139
|
+
"task-note"
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"id": "write",
|
|
145
|
+
"name": "Write the report",
|
|
146
|
+
"description": "compose the polished report from gathered facts",
|
|
147
|
+
"prompt": "Write report.md following the locked template exactly, using ONLY facts from {{workPath}}/gather.md. Lead with a one-sentence headline and the health RAG plus its justifying one-liner. Turn the gathered bullets into tight, scannable prose — short bullets over paragraphs, numbers where they exist, and a stated next step for every blocker. Respect the per-section length caps; cut, don't pad. Every claim must trace to a gathered fact — invent nothing. A template section the gathered facts leave empty keeps its heading and one plain line saying so (\"No metrics this period.\"); never drop it and never fill it. End with the Next-period section as concrete intended outcomes. On a loop-back, open `{{workPath}}/verdict.md` with `read_artifact` first and fix exactly the lines that end in FAIL. Write the report path and a confirmation that all template sections are present to notes via write_task_note.\n\nBefore working, open the artifact input `{{workPath}}/gather.md` with `read_artifact`; do not look for it in the workspace.",
|
|
148
|
+
"suggestedRole": "copywriter",
|
|
149
|
+
"consumes": [
|
|
150
|
+
{
|
|
151
|
+
"file": "{{workPath}}/gather.md",
|
|
152
|
+
"artifact": true
|
|
153
|
+
}
|
|
154
|
+
],
|
|
155
|
+
"advanceWhen": {
|
|
156
|
+
"file": "report.md",
|
|
157
|
+
"minBytes": 1,
|
|
158
|
+
"sniff": "nonempty"
|
|
159
|
+
},
|
|
160
|
+
"gate": {
|
|
161
|
+
"at": "completion",
|
|
162
|
+
"checks": [
|
|
163
|
+
{
|
|
164
|
+
"kind": "minBytes",
|
|
165
|
+
"file": "report.md",
|
|
166
|
+
"bytes": 500
|
|
167
|
+
}
|
|
168
|
+
],
|
|
169
|
+
"scripts": [
|
|
170
|
+
{
|
|
171
|
+
"name": "checkContains",
|
|
172
|
+
"scope": "standard",
|
|
173
|
+
"inputs": {
|
|
174
|
+
"file": "report.md",
|
|
175
|
+
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
176
|
+
"flags": "i"
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
],
|
|
180
|
+
"onReject": "write",
|
|
181
|
+
"maxAttempts": 4
|
|
182
|
+
},
|
|
183
|
+
"next": "evaluate",
|
|
184
|
+
"toolPolicy": {
|
|
185
|
+
"disallowBuiltinToolsets": [
|
|
186
|
+
"ai-apps",
|
|
187
|
+
"archives",
|
|
188
|
+
"audio",
|
|
189
|
+
"browser-automation",
|
|
190
|
+
"code-execution",
|
|
191
|
+
"craftbooks",
|
|
192
|
+
"data-tables",
|
|
193
|
+
"entity-intel",
|
|
194
|
+
"git",
|
|
195
|
+
"image-intel",
|
|
196
|
+
"images",
|
|
197
|
+
"role-delegation",
|
|
198
|
+
"role-delegation-escalation",
|
|
199
|
+
"security-intel",
|
|
200
|
+
"team-management",
|
|
201
|
+
"videos",
|
|
202
|
+
"web"
|
|
203
|
+
],
|
|
204
|
+
"outputMedium": "workspace",
|
|
205
|
+
"additionalOutputMedia": [
|
|
206
|
+
"task-note"
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"id": "evaluate",
|
|
212
|
+
"name": "Evaluate",
|
|
213
|
+
"description": "Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.",
|
|
214
|
+
"prompt": "QA report.md against the locked criteria in {{workPath}}/scope.md. (1) Every template section is present and in order; a section the gathered facts leave empty passes when it says so plainly. (2) The health RAG has a justifying one-liner consistent with the gathered blockers and metrics. (3) Trace up to five specific claims back to {{workPath}}/gather.md (every claim, when there are fewer); fail any claim with no supporting fact. (4) Nothing is reported outside the locked date range. (5) It is skimmable: short bullets, no padding, readable in under two minutes.\n\nThen write {{workPath}}/verdict.md with `write_artifact`. Its first line is the first criterion; write no preamble. One line per criterion, ending in the word PASS or FAIL as the last word on the line, and under a failing criterion an indented line naming the gap (which section, which claim, which line). The runtime routes on the last word of each line: all PASS moves the task to finish; any line ending in FAIL sends it back to write for another pass, and after three failed passes the task pauses for the user. Writing verdict.md completes this step.\n\nOpen `report.md` and `{{workPath}}/gather.md` before judging.",
|
|
215
|
+
"suggestedRole": "reviewer",
|
|
216
|
+
"consumes": [
|
|
217
|
+
{
|
|
218
|
+
"file": "report.md"
|
|
219
|
+
}
|
|
220
|
+
],
|
|
221
|
+
"next": "finish",
|
|
222
|
+
"toolPolicy": {
|
|
223
|
+
"disallowBuiltinToolsets": [
|
|
224
|
+
"ai-apps",
|
|
225
|
+
"archives",
|
|
226
|
+
"audio",
|
|
227
|
+
"browser-automation",
|
|
228
|
+
"code-execution",
|
|
229
|
+
"craftbooks",
|
|
230
|
+
"data-tables",
|
|
231
|
+
"entity-intel",
|
|
232
|
+
"git",
|
|
233
|
+
"image-intel",
|
|
234
|
+
"images",
|
|
235
|
+
"role-delegation",
|
|
236
|
+
"role-delegation-escalation",
|
|
237
|
+
"security-intel",
|
|
238
|
+
"team-management",
|
|
239
|
+
"videos",
|
|
240
|
+
"web",
|
|
241
|
+
"workspace-fs-write"
|
|
242
|
+
],
|
|
243
|
+
"outputMedium": "artifact",
|
|
244
|
+
"additionalOutputMedia": [
|
|
245
|
+
"task-note"
|
|
246
|
+
]
|
|
247
|
+
},
|
|
248
|
+
"advanceWhen": {
|
|
249
|
+
"file": "{{workPath}}/verdict.md",
|
|
250
|
+
"minBytes": 40,
|
|
251
|
+
"sniff": "nonempty",
|
|
252
|
+
"artifact": true
|
|
253
|
+
},
|
|
254
|
+
"gate": {
|
|
255
|
+
"at": "completion",
|
|
256
|
+
"checks": [
|
|
257
|
+
{
|
|
258
|
+
"kind": "contains",
|
|
259
|
+
"file": "{{workPath}}/verdict.md",
|
|
260
|
+
"pattern": "\\bPASS\\s*$",
|
|
261
|
+
"flags": "m",
|
|
262
|
+
"label": "verdict lines end in PASS",
|
|
263
|
+
"artifact": true
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"kind": "notContains",
|
|
267
|
+
"file": "{{workPath}}/verdict.md",
|
|
268
|
+
"pattern": "\\bFAIL\\s*$",
|
|
269
|
+
"flags": "m",
|
|
270
|
+
"label": "no criterion line ends in FAIL",
|
|
271
|
+
"artifact": true
|
|
272
|
+
}
|
|
273
|
+
],
|
|
274
|
+
"onReject": "write",
|
|
275
|
+
"maxAttempts": 3
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"id": "finish",
|
|
280
|
+
"name": "Finish",
|
|
281
|
+
"description": "All acceptance criteria met. Stamp a short summary and report DONE.",
|
|
282
|
+
"prompt": "Every acceptance criterion passed. Write a one-paragraph DONE summary to task notes via `write_task_note`: what was built, the deliverable path(s), and a one-line confirmation that each criterion is met. Then report DONE.",
|
|
283
|
+
"suggestedRole": "developer",
|
|
284
|
+
"terminal": true,
|
|
285
|
+
"toolPolicy": {
|
|
286
|
+
"disallowBuiltinToolsets": [
|
|
287
|
+
"ai-apps",
|
|
288
|
+
"archives",
|
|
289
|
+
"artifacts",
|
|
290
|
+
"audio",
|
|
291
|
+
"browser-automation",
|
|
292
|
+
"code-execution",
|
|
293
|
+
"craftbooks",
|
|
294
|
+
"data-tables",
|
|
295
|
+
"entity-intel",
|
|
296
|
+
"git",
|
|
297
|
+
"image-intel",
|
|
298
|
+
"images",
|
|
299
|
+
"role-delegation",
|
|
300
|
+
"role-delegation-escalation",
|
|
301
|
+
"security-intel",
|
|
302
|
+
"team-management",
|
|
303
|
+
"videos",
|
|
304
|
+
"web",
|
|
305
|
+
"workspace-fs-write"
|
|
306
|
+
],
|
|
307
|
+
"outputMedium": "task-note"
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
],
|
|
311
|
+
"version": "1.0.4",
|
|
312
|
+
"releasedAt": "2026-10-14T00:00:00Z",
|
|
313
|
+
"minGezelVersion": "1.26233"
|
|
314
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"title": "Recurring Status Report smoke eval",
|
|
4
|
+
"objective": "Self-contained smoke eval for the Recurring Status Report craftbook using the corpus generic harness.",
|
|
5
|
+
"tags": [
|
|
6
|
+
"corpus"
|
|
7
|
+
],
|
|
8
|
+
"prompt": "We need a recurring status report for the returns-desk work. The backgound info is in source/brief.md — have a look and write it up in report.md.",
|
|
9
|
+
"setup": {
|
|
10
|
+
"projectName": "Recurring Status Report Eval",
|
|
11
|
+
"about": "Self-contained eval project for status-report. Seeded inputs are under workspace/source or workspace/fixtures; final deliverable is workspace/report.md.",
|
|
12
|
+
"missionObjectives": "Use the Recurring Status Report craftbook/template, read the seeded local fixtures, and write report.md without network calls, real credentials, or live services.",
|
|
13
|
+
"files": [
|
|
14
|
+
{
|
|
15
|
+
"path": "source/brief.md",
|
|
16
|
+
"content": "# Recurring Status Report Eval Brief\n\nClient: Boreal Desk, a home-office accessories company.\nAudience: operations leads who need an artifact they can use this week.\n\nFixed source facts for grounding:\n- The returns desk pilot covered 18 SKUs.\n- Median first response improved from 18 hours to 6 hours.\n- Preventable refund leakage fell from 14.2% to 8.9%.\n- The top unresolved complaint is status silence after photo submission.\n- Required next actions are automated status emails, barcode-exception training, and a weekly Finance exception export.\n\nUse these facts when the task asks for prose, analysis, copy, UI content, or test data. Do not use live web services, real credentials, or current outside data.\n\nCraftbook under test: status-report - Recurring Status Report.\n"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"worker": {
|
|
20
|
+
"name": "Jules",
|
|
21
|
+
"role": "Writer"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"mocks": [],
|
|
25
|
+
"success": {
|
|
26
|
+
"summary": "report.md is a source-grounded markdown artifact with required facts and actions.",
|
|
27
|
+
"deliverables": [
|
|
28
|
+
{
|
|
29
|
+
"path": "report.md",
|
|
30
|
+
"kind": "markdown-report",
|
|
31
|
+
"minBytes": 1000,
|
|
32
|
+
"checks": [
|
|
33
|
+
{
|
|
34
|
+
"kind": "contains",
|
|
35
|
+
"file": "report.md",
|
|
36
|
+
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
37
|
+
"flags": "i"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"kind": "contains",
|
|
41
|
+
"file": "report.md",
|
|
42
|
+
"pattern": "source/brief\\.md|Brief",
|
|
43
|
+
"flags": "i",
|
|
44
|
+
"label": "cite or name the seeded source"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"kind": "contains",
|
|
48
|
+
"file": "report.md",
|
|
49
|
+
"pattern": "18\\b[\\s\\S]{0,30}\\bSKUs",
|
|
50
|
+
"flags": "i",
|
|
51
|
+
"label": "include the 18-SKU pilot scope"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"kind": "contains",
|
|
55
|
+
"file": "report.md",
|
|
56
|
+
"pattern": "18\\s*hours|6\\s*hours",
|
|
57
|
+
"flags": "i"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"kind": "contains",
|
|
61
|
+
"file": "report.md",
|
|
62
|
+
"pattern": "14\\.2%|8\\.9%",
|
|
63
|
+
"flags": "i"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"kind": "contains",
|
|
67
|
+
"file": "report.md",
|
|
68
|
+
"pattern": "status silence|photo submission",
|
|
69
|
+
"flags": "i"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"kind": "contains",
|
|
73
|
+
"file": "report.md",
|
|
74
|
+
"pattern": "automated status emails|barcode|Finance",
|
|
75
|
+
"flags": "i"
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
"rubric": {
|
|
82
|
+
"artifact": {
|
|
83
|
+
"path": "report.md",
|
|
84
|
+
"kind": "markdown"
|
|
85
|
+
},
|
|
86
|
+
"axes": [
|
|
87
|
+
{
|
|
88
|
+
"name": "grounding",
|
|
89
|
+
"description": "Seeded facts appear faithfully and the source is cited."
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"name": "structure",
|
|
93
|
+
"description": "Sections progress logically for the artifact class."
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "completeness",
|
|
97
|
+
"description": "Required elements (risks, next actions, scope) are all present."
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "tone",
|
|
101
|
+
"description": "The register fits the audience and artifact class."
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
"qualityFocus": [
|
|
106
|
+
"source-grounded prose",
|
|
107
|
+
"section structure",
|
|
108
|
+
"next-action clarity"
|
|
109
|
+
]
|
|
110
|
+
}
|