@bendyline/gilde 0.1.23 → 0.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 (48) hide show
  1. package/authoring/gstack/evals/cso.json +2 -0
  2. package/authoring/gstack/overlays/cso.json +1 -0
  3. package/authoring/gstack/wave.json +2 -2
  4. package/data/connector-types/ai/airtable-records/versions/1.0.1/manifest.json +81 -0
  5. package/data/connector-types/bl/bluesky-posts/versions/1.0.1/manifest.json +93 -0
  6. package/data/connector-types/gi/github-issues/versions/1.0.2/manifest.json +82 -0
  7. package/data/connector-types/gi/github-pulls/versions/1.0.1/manifest.json +52 -0
  8. package/data/connector-types/gi/github-releases/versions/1.0.1/manifest.json +86 -0
  9. package/data/connector-types/gi/github-wiki/versions/1.0.1/manifest.json +56 -0
  10. package/data/connector-types/index.json +1 -1
  11. package/data/connector-types/li/linear-issues/versions/1.0.1/manifest.json +70 -0
  12. package/data/connector-types/ma/mail-imap/versions/1.0.1/manifest.json +71 -0
  13. package/data/craftbook-templates/an/anniversary-cut/manifest.json +3 -1
  14. package/data/craftbook-templates/an/anniversary-cut/versions/1.0.2/craftbook.json +212 -0
  15. package/data/craftbook-templates/an/anniversary-cut/versions/1.0.2/test.json +157 -0
  16. package/data/craftbook-templates/au/audiobook-master-pack/manifest.json +3 -1
  17. package/data/craftbook-templates/au/audiobook-master-pack/versions/1.0.2/craftbook.json +197 -0
  18. package/data/craftbook-templates/au/audiobook-master-pack/versions/1.0.2/test.json +221 -0
  19. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.1/craftbook.json +358 -0
  20. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.1/test.json +376 -0
  21. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.1/craftbook.json +385 -0
  22. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.1/test.json +201 -0
  23. package/data/craftbook-templates/dr/draft-social-post/logo.webp +0 -0
  24. package/data/craftbook-templates/dr/draft-social-post/manifest.json +1 -0
  25. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.1/craftbook.json +353 -0
  26. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.1/test.json +191 -0
  27. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.1/craftbook.json +347 -0
  28. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.1/test.json +135 -0
  29. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.1/craftbook.json +333 -0
  30. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.1/test.json +141 -0
  31. package/data/craftbook-templates/index.json +1 -1
  32. package/data/craftbook-templates/re/reception-report/logo.webp +0 -0
  33. package/data/craftbook-templates/re/reception-report/manifest.json +1 -0
  34. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.1/craftbook.json +348 -0
  35. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.1/test.json +153 -0
  36. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.1/craftbook.json +390 -0
  37. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.1/test.json +154 -0
  38. package/data/craftbook-templates/so/social-digest/logo.webp +0 -0
  39. package/data/craftbook-templates/so/social-digest/manifest.json +1 -0
  40. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.1/craftbook.json +391 -0
  41. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.1/test.json +162 -0
  42. package/data/craftbook-templates/te/technical-documentation/versions/2.0.1/craftbook.json +343 -0
  43. package/data/craftbook-templates/te/technical-documentation/versions/2.0.1/test.json +174 -0
  44. package/package.json +1 -1
  45. package/schemas/connector-type-version.schema.json +31 -0
  46. package/schemas/craftbook-doc.schema.json +12 -0
  47. package/schemas/craftbook-template-version.schema.json +12 -0
  48. package/schemas/craftbook-test.schema.json +23 -0
@@ -0,0 +1,221 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Master the Audiobook smoke eval",
4
+ "objective": "Task-specific eval for the Master the Audiobook craftbook: six rendered chapters with run logs are swept against the table of contents, described in a verified manifest, concatenated through the fake mastering pipeline, and packaged with listener copy.",
5
+ "tags": [
6
+ "external"
7
+ ],
8
+ "prompt": "all six chapters are rendered — can you master the audiobok and get the metadata sorted? theres a fake concat pipeline wired up",
9
+ "setup": {
10
+ "projectName": "Audiobook Studio — Mastering Eval",
11
+ "about": "Self-contained eval project for audiobook-master-pack. The table of contents is manuscript/toc.md; the six rendered chapters sit under audio/ as chapter-XX.wav with a chapter-XX-log.json run log each (durations in durationSeconds). The manifest goes to master/manifest.json; the fake mastering pipeline is the ready-made mock-probe project script (writes master/book.m4b plus master/assembly-log.json, and cross-checks manifest durations against the chapter logs). The listener description and release notes go to master/release-notes.md.",
12
+ "missionObjectives": "Use the Master the Audiobook craftbook/template, sweep the chapters against the table of contents, build master/manifest.json with file, duration, and order per chapter taken from the run logs, assemble through the provided mock-probe script, and write master/release-notes.md. No real audio tools or services — only the wired fake pipeline.",
13
+ "files": [
14
+ {
15
+ "path": "manuscript/toc.md",
16
+ "content": "# A Field Guide to Vanishing - table of contents\n\n1. The Door in the Sea Wall\n2. The Ferry at Dusk\n3. The Handwriting House\n4. What the Buoy Knew\n5. The Smallest Lantern\n6. Come Anyway\n"
17
+ },
18
+ {
19
+ "path": "audio/chapter-01.wav",
20
+ "content": "MOCKWAV chapter-01 rendered audio stub (The Door in the Sea Wall)\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n"
21
+ },
22
+ {
23
+ "path": "audio/chapter-01-log.json",
24
+ "content": "{\n \"status\": \"ok\",\n \"engine\": \"mock-tts\",\n \"chapter\": \"The Door in the Sea Wall\",\n \"file\": \"audio/chapter-01.wav\",\n \"durationSeconds\": 1712.4,\n \"wordCount\": 4310\n}\n"
25
+ },
26
+ {
27
+ "path": "audio/chapter-02.wav",
28
+ "content": "MOCKWAV chapter-02 rendered audio stub (The Ferry at Dusk)\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n"
29
+ },
30
+ {
31
+ "path": "audio/chapter-02-log.json",
32
+ "content": "{\n \"status\": \"ok\",\n \"engine\": \"mock-tts\",\n \"chapter\": \"The Ferry at Dusk\",\n \"file\": \"audio/chapter-02.wav\",\n \"durationSeconds\": 1544.8,\n \"wordCount\": 3890\n}\n"
33
+ },
34
+ {
35
+ "path": "audio/chapter-03.wav",
36
+ "content": "MOCKWAV chapter-03 rendered audio stub (The Handwriting House)\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n"
37
+ },
38
+ {
39
+ "path": "audio/chapter-03-log.json",
40
+ "content": "{\n \"status\": \"ok\",\n \"engine\": \"mock-tts\",\n \"chapter\": \"The Handwriting House\",\n \"file\": \"audio/chapter-03.wav\",\n \"durationSeconds\": 1836.2,\n \"wordCount\": 4620\n}\n"
41
+ },
42
+ {
43
+ "path": "audio/chapter-04.wav",
44
+ "content": "MOCKWAV chapter-04 rendered audio stub (What the Buoy Knew)\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n"
45
+ },
46
+ {
47
+ "path": "audio/chapter-04-log.json",
48
+ "content": "{\n \"status\": \"ok\",\n \"engine\": \"mock-tts\",\n \"chapter\": \"What the Buoy Knew\",\n \"file\": \"audio/chapter-04.wav\",\n \"durationSeconds\": 1490.5,\n \"wordCount\": 3750\n}\n"
49
+ },
50
+ {
51
+ "path": "audio/chapter-05.wav",
52
+ "content": "MOCKWAV chapter-05 rendered audio stub (The Smallest Lantern)\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n"
53
+ },
54
+ {
55
+ "path": "audio/chapter-05-log.json",
56
+ "content": "{\n \"status\": \"ok\",\n \"engine\": \"mock-tts\",\n \"chapter\": \"The Smallest Lantern\",\n \"file\": \"audio/chapter-05.wav\",\n \"durationSeconds\": 1671.9,\n \"wordCount\": 4205\n}\n"
57
+ },
58
+ {
59
+ "path": "audio/chapter-06.wav",
60
+ "content": "MOCKWAV chapter-06 rendered audio stub (Come Anyway)\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n"
61
+ },
62
+ {
63
+ "path": "audio/chapter-06-log.json",
64
+ "content": "{\n \"status\": \"ok\",\n \"engine\": \"mock-tts\",\n \"chapter\": \"Come Anyway\",\n \"file\": \"audio/chapter-06.wav\",\n \"durationSeconds\": 1922.7,\n \"wordCount\": 4840\n}\n"
65
+ }
66
+ ],
67
+ "worker": {
68
+ "name": "Ruben",
69
+ "role": "Producer"
70
+ }
71
+ },
72
+ "mocks": [
73
+ {
74
+ "kind": "cli",
75
+ "id": "probe",
76
+ "description": "Provenance-trusted project script `mock-probe` that runs the fake mastering pipeline: verifies master/manifest.json against the audio files and their run logs, then writes the stub master and its run log.",
77
+ "shim": {
78
+ "path": "scripts/mock-probe.ts",
79
+ "content": "import { defineScript, gezel } from '@bendyline/gezel-sdk';\n\nexport const meta = defineScript({\n name: 'mock-probe',\n description:\n 'Fake mastering pipeline for this eval: reads master/manifest.json, verifies every referenced audio file exists with a sane duration and order, cross-checks durations against the per-chapter run logs, then writes the stub master to master/book.m4b and its run log to master/assembly-log.json.',\n inputs: {},\n outputs: {\n log: { type: 'string', description: 'The mastering run log JSON written to master/assembly-log.json.' },\n },\n requires: ['workspace.read', 'workspace.write'],\n});\n\nconst manifest = JSON.parse(await gezel.fs.read('master/manifest.json'));\nif (!Array.isArray(manifest) || manifest.length === 0) {\n throw new Error('master/manifest.json must be a non-empty JSON array');\n}\nconst entries = await gezel.fs.list('audio');\nconst present = new Set(entries.filter((entry) => !entry.isDirectory).map((entry) => entry.name));\nlet total = 0;\nconst orders = new Set();\nfor (const row of manifest) {\n const base = String(row.file ?? '').split('/').pop();\n if (!base || !present.has(base)) {\n throw new Error(`manifest references a missing audio file: ${row.file}`);\n }\n if (typeof row.duration !== 'number' || row.duration <= 0) {\n throw new Error(`bad duration for chapter ${row.chapter}: ${row.duration}`);\n }\n if (typeof row.order !== 'number' || orders.has(row.order)) {\n throw new Error(`bad or duplicate order for chapter ${row.chapter}: ${row.order}`);\n }\n orders.add(row.order);\n const logName = base.replace(/\\.wav$/, '-log.json');\n if (present.has(logName)) {\n const chapterLog = JSON.parse(await gezel.fs.read(`audio/${logName}`));\n if (\n typeof chapterLog.durationSeconds === 'number' &&\n Math.abs(chapterLog.durationSeconds - row.duration) > 0.01\n ) {\n throw new Error(`manifest duration for chapter ${row.chapter} does not match its run log`);\n }\n }\n total += row.duration;\n}\nconst log = {\n status: 'ok',\n engine: 'mock-concat',\n chapters: manifest.length,\n totalDurationSeconds: Math.round(total * 100) / 100,\n};\nawait gezel.fs.write('master/book.m4b', `MOCKM4B audiobook master stub\\n${'0'.repeat(2048)}\\n`);\nawait gezel.fs.write('master/assembly-log.json', `${JSON.stringify(log, null, 2)}\\n`);\ngezel.output({ log: JSON.stringify(log) });\n"
80
+ }
81
+ }
82
+ ],
83
+ "success": {
84
+ "summary": "master/manifest.json describes all six chapters exactly once with log-true durations, the fake pipeline produced the master and a status-ok log counting six chapters, and the release notes carry the total running time plus listener copy.",
85
+ "deliverables": [
86
+ {
87
+ "path": "master/manifest.json",
88
+ "kind": "json",
89
+ "checks": [
90
+ {
91
+ "kind": "recordSchema",
92
+ "file": "master/manifest.json",
93
+ "fields": [
94
+ {
95
+ "name": "chapter",
96
+ "type": "nonempty"
97
+ },
98
+ {
99
+ "name": "file",
100
+ "type": "nonempty"
101
+ },
102
+ {
103
+ "name": "duration"
104
+ },
105
+ {
106
+ "name": "order"
107
+ }
108
+ ],
109
+ "minRows": 6,
110
+ "uniqueBy": "chapter"
111
+ },
112
+ {
113
+ "kind": "valuesSubsetOf",
114
+ "file": "master/manifest.json",
115
+ "sourceFiles": [
116
+ "audio/chapter-01-log.json",
117
+ "audio/chapter-02-log.json",
118
+ "audio/chapter-03-log.json",
119
+ "audio/chapter-04-log.json",
120
+ "audio/chapter-05-log.json",
121
+ "audio/chapter-06-log.json"
122
+ ],
123
+ "pattern": "\"file\"\\s*:\\s*\"([^\"]+)\"",
124
+ "label": "every manifest file reference matches a rendered chapter from the run logs"
125
+ }
126
+ ]
127
+ },
128
+ {
129
+ "path": "master/book.m4b",
130
+ "kind": "generic-file",
131
+ "minBytes": 200
132
+ },
133
+ {
134
+ "path": "master/assembly-log.json",
135
+ "kind": "json",
136
+ "checks": [
137
+ {
138
+ "kind": "jsonPathEquals",
139
+ "file": "master/assembly-log.json",
140
+ "path": "status",
141
+ "value": "ok",
142
+ "label": "the mastering log reports status ok"
143
+ },
144
+ {
145
+ "kind": "jsonPathEquals",
146
+ "file": "master/assembly-log.json",
147
+ "path": "chapters",
148
+ "value": 6,
149
+ "label": "all six chapters were assembled"
150
+ }
151
+ ]
152
+ },
153
+ {
154
+ "path": "master/release-notes.md",
155
+ "kind": "markdown-report",
156
+ "minBytes": 500,
157
+ "checks": [
158
+ {
159
+ "kind": "contains",
160
+ "file": "master/release-notes.md",
161
+ "pattern": "(?:^|\\n)#{1,3}\\s+\\S",
162
+ "flags": "i"
163
+ },
164
+ {
165
+ "kind": "contains",
166
+ "file": "master/release-notes.md",
167
+ "pattern": "duration|running time",
168
+ "flags": "i",
169
+ "label": "the total running time is stated"
170
+ },
171
+ {
172
+ "kind": "contains",
173
+ "file": "master/release-notes.md",
174
+ "pattern": "chapter",
175
+ "flags": "i",
176
+ "label": "the chapter list is present"
177
+ },
178
+ {
179
+ "kind": "judge",
180
+ "file": "master/release-notes.md",
181
+ "rubric": "The listener-facing description reads like store copy for the book (warm, no spoilers, aimed at a browsing listener), and the stated total running time matches the mastering log rather than being invented.",
182
+ "sourceFiles": [
183
+ "master/assembly-log.json",
184
+ "manuscript/toc.md"
185
+ ],
186
+ "label": "store-copy quality and log-true numbers"
187
+ }
188
+ ]
189
+ }
190
+ ]
191
+ },
192
+ "rubric": {
193
+ "artifact": {
194
+ "path": "master/release-notes.md",
195
+ "kind": "markdown"
196
+ },
197
+ "axes": [
198
+ {
199
+ "name": "completeness",
200
+ "description": "All six chapters swept, present, and in manuscript order — no holes."
201
+ },
202
+ {
203
+ "name": "metadata-quality",
204
+ "description": "Manifest durations and orders come from the run logs, never estimated."
205
+ },
206
+ {
207
+ "name": "listener-copy",
208
+ "description": "The description sells the book to a browsing listener without spoiling it."
209
+ },
210
+ {
211
+ "name": "release-readiness",
212
+ "description": "The notes confirm the master's numbers match the manifest."
213
+ }
214
+ ]
215
+ },
216
+ "qualityFocus": [
217
+ "completeness sweep",
218
+ "log-true metadata",
219
+ "listener-facing copy"
220
+ ]
221
+ }
@@ -0,0 +1,358 @@
1
+ {
2
+ "id": "browser-qa-audit",
3
+ "name": "Browser QA Audit",
4
+ "description": "Exercise a running app in a real browser, triage what breaks, and produce a report-only QA findings list with a health score — no code changes.",
5
+ "basedOn": {
6
+ "name": "gstack",
7
+ "url": "https://github.com/garrytan/gstack"
8
+ },
9
+ "plan": "Perform black-box, report-only browser QA. Do not read implementation code and do not fix defects. Test the supplied running target as a real user across core journeys, navigation, forms, validation, state changes, console health, responsive layouts, and accessibility basics. Capture evidence at the time of observation, retry suspected defects once, redact credentials, and distinguish tested, blocked, and out-of-scope surfaces. A health score is only valid when its evidence and arithmetic are inspectable.",
10
+ "entryStepId": "plan-coverage",
11
+ "triggers": [
12
+ "qa report only",
13
+ "just report bugs",
14
+ "test but dont fix"
15
+ ],
16
+ "command": "browser-qa-audit",
17
+ "toolsets": [
18
+ {
19
+ "toolsetId": "@playwright/mcp",
20
+ "optional": false,
21
+ "reason": "exercise the target through a real browser and capture reproducible evidence"
22
+ }
23
+ ],
24
+ "steps": [
25
+ {
26
+ "id": "plan-coverage",
27
+ "name": "Plan observable coverage",
28
+ "description": "Confirm the target and turn user intent into bounded journeys, states, and evidence requirements.",
29
+ "prompt": "Confirm the target URL, requested scope, authentication constraints, viewport requirements, destructive-action limits, and expected behavior from the task context. Ask only for missing information that blocks browser use, and never store credentials in output. Open the target with the configured browser toolset to verify reachability. Map the visible navigation and prioritize core journeys. Define happy, empty, invalid, error, loading, permission, and responsive states to exercise, plus a clear tested versus excluded boundary.\n\nObservable handoff: write the completed result to `qa/test-plan.md` in the workspace. Do not merely describe what the file would contain. Re-read it before finishing this phase and repair any incomplete sections.",
30
+ "suggestedRole": "QA analyst",
31
+ "advanceWhen": {
32
+ "file": "qa/test-plan.md",
33
+ "minBytes": 700,
34
+ "sniff": "nonempty",
35
+ "requireChange": true,
36
+ "goto": "exercise"
37
+ },
38
+ "gate": {
39
+ "at": "completion",
40
+ "checks": [
41
+ {
42
+ "kind": "minBytes",
43
+ "file": "qa/test-plan.md",
44
+ "bytes": 700
45
+ },
46
+ {
47
+ "kind": "sniff",
48
+ "file": "qa/test-plan.md",
49
+ "sniff": "nonempty"
50
+ },
51
+ {
52
+ "kind": "contains",
53
+ "file": "qa/test-plan.md",
54
+ "pattern": "^##\\s+Target",
55
+ "flags": "im",
56
+ "label": "Target section"
57
+ },
58
+ {
59
+ "kind": "contains",
60
+ "file": "qa/test-plan.md",
61
+ "pattern": "^##\\s+Core journeys",
62
+ "flags": "im",
63
+ "label": "Core journeys section"
64
+ },
65
+ {
66
+ "kind": "contains",
67
+ "file": "qa/test-plan.md",
68
+ "pattern": "^##\\s+State matrix",
69
+ "flags": "im",
70
+ "label": "State matrix section"
71
+ },
72
+ {
73
+ "kind": "contains",
74
+ "file": "qa/test-plan.md",
75
+ "pattern": "^##\\s+Viewports",
76
+ "flags": "im",
77
+ "label": "Viewports section"
78
+ },
79
+ {
80
+ "kind": "contains",
81
+ "file": "qa/test-plan.md",
82
+ "pattern": "^##\\s+Scope boundaries",
83
+ "flags": "im",
84
+ "label": "Scope boundaries section"
85
+ }
86
+ ],
87
+ "onReject": "plan-coverage",
88
+ "maxAttempts": 3
89
+ },
90
+ "next": "exercise"
91
+ },
92
+ {
93
+ "id": "exercise",
94
+ "name": "Exercise the application",
95
+ "description": "Run the planned journeys in a real browser and capture reproducible, redacted evidence.",
96
+ "prompt": "Execute `qa/test-plan.md` with the configured browser tools, using `run_playwright_script` for repeatable multi-step journeys when useful. At every journey, record URL, viewport, input state, actions, visible result, console errors, and screenshot path. Test keyboard focus and basic accessible naming, realistic invalid input, browser back and forward behavior, and at least one narrow viewport. Retry each suspected issue once. Save screenshots beneath `qa/screenshots/` and a machine-readable issue summary to `qa/baseline.json`. Redact secrets and never submit destructive or externally visible actions without explicit permission.\n\nObservable handoff: write the completed result to `qa/browser-evidence.md` in the workspace. Do not merely describe what the file would contain. Re-read it before finishing this phase and repair any incomplete sections.",
97
+ "suggestedRole": "browser QA engineer",
98
+ "advanceWhen": {
99
+ "file": "qa/browser-evidence.md",
100
+ "minBytes": 1200,
101
+ "sniff": "nonempty",
102
+ "requireChange": true,
103
+ "goto": "report-findings"
104
+ },
105
+ "gate": {
106
+ "at": "completion",
107
+ "checks": [
108
+ {
109
+ "kind": "minBytes",
110
+ "file": "qa/browser-evidence.md",
111
+ "bytes": 1200
112
+ },
113
+ {
114
+ "kind": "sniff",
115
+ "file": "qa/browser-evidence.md",
116
+ "sniff": "nonempty"
117
+ },
118
+ {
119
+ "kind": "contains",
120
+ "file": "qa/browser-evidence.md",
121
+ "pattern": "^##\\s+Run metadata",
122
+ "flags": "im",
123
+ "label": "Run metadata section"
124
+ },
125
+ {
126
+ "kind": "contains",
127
+ "file": "qa/browser-evidence.md",
128
+ "pattern": "^##\\s+Journey results",
129
+ "flags": "im",
130
+ "label": "Journey results section"
131
+ },
132
+ {
133
+ "kind": "contains",
134
+ "file": "qa/browser-evidence.md",
135
+ "pattern": "^##\\s+Console",
136
+ "flags": "im",
137
+ "label": "Console section"
138
+ },
139
+ {
140
+ "kind": "contains",
141
+ "file": "qa/browser-evidence.md",
142
+ "pattern": "^##\\s+Responsive and accessibility",
143
+ "flags": "im",
144
+ "label": "responsive and accessibility section"
145
+ },
146
+ {
147
+ "kind": "contains",
148
+ "file": "qa/browser-evidence.md",
149
+ "pattern": "^##\\s+Evidence index",
150
+ "flags": "im",
151
+ "label": "Evidence index section"
152
+ },
153
+ {
154
+ "kind": "sniff",
155
+ "file": "qa/baseline.json",
156
+ "sniff": "json-valid"
157
+ }
158
+ ],
159
+ "onReject": "exercise",
160
+ "maxAttempts": 3
161
+ },
162
+ "next": "report-findings"
163
+ },
164
+ {
165
+ "id": "report-findings",
166
+ "name": "Write the QA report",
167
+ "description": "Triage observed defects, compute the health score, and provide owners with exact reproduction evidence.",
168
+ "prompt": "Write the report only from `qa/test-plan.md`, `qa/browser-evidence.md`, screenshots, and baseline data. For every issue include severity, confidence, category, affected journey, exact reproduction steps, expected versus actual behavior, screenshot or console evidence, frequency, and user impact. Keep blocked checks separate from passes. Compute category scores and the weighted health score with visible arithmetic. End with the top three fixes by user impact, but do not edit code or prescribe speculative implementation details.\n\nObservable handoff: write the completed result to `qa/browser-qa-report.md` in the workspace. Do not merely describe what the file would contain. Re-read it before finishing this phase and repair any incomplete sections.",
169
+ "suggestedRole": "QA reporter",
170
+ "advanceWhen": {
171
+ "file": "qa/browser-qa-report.md",
172
+ "minBytes": 1500,
173
+ "sniff": "nonempty",
174
+ "requireChange": true,
175
+ "goto": "evaluate"
176
+ },
177
+ "gate": {
178
+ "at": "completion",
179
+ "checks": [
180
+ {
181
+ "kind": "minBytes",
182
+ "file": "qa/browser-qa-report.md",
183
+ "bytes": 1500
184
+ },
185
+ {
186
+ "kind": "sniff",
187
+ "file": "qa/browser-qa-report.md",
188
+ "sniff": "nonempty"
189
+ },
190
+ {
191
+ "kind": "contains",
192
+ "file": "qa/browser-qa-report.md",
193
+ "pattern": "^##\\s+Executive summary",
194
+ "flags": "im",
195
+ "label": "Executive summary section"
196
+ },
197
+ {
198
+ "kind": "contains",
199
+ "file": "qa/browser-qa-report.md",
200
+ "pattern": "^##\\s+Coverage",
201
+ "flags": "im",
202
+ "label": "Coverage section"
203
+ },
204
+ {
205
+ "kind": "contains",
206
+ "file": "qa/browser-qa-report.md",
207
+ "pattern": "^##\\s+Findings",
208
+ "flags": "im",
209
+ "label": "Findings section"
210
+ },
211
+ {
212
+ "kind": "contains",
213
+ "file": "qa/browser-qa-report.md",
214
+ "pattern": "^##\\s+Console health",
215
+ "flags": "im",
216
+ "label": "Console health section"
217
+ },
218
+ {
219
+ "kind": "contains",
220
+ "file": "qa/browser-qa-report.md",
221
+ "pattern": "^##\\s+Health score",
222
+ "flags": "im",
223
+ "label": "Health score section"
224
+ },
225
+ {
226
+ "kind": "contains",
227
+ "file": "qa/browser-qa-report.md",
228
+ "pattern": "^##\\s+Top three fixes",
229
+ "flags": "im",
230
+ "label": "Top three fixes section"
231
+ }
232
+ ],
233
+ "onReject": "report-findings",
234
+ "maxAttempts": 3
235
+ },
236
+ "next": "evaluate"
237
+ },
238
+ {
239
+ "id": "evaluate",
240
+ "name": "Evaluate the deliverable",
241
+ "description": "Independently grade the observable deliverable and route it to finish, repair, or user escalation.",
242
+ "prompt": "Review `qa/browser-qa-report.md`, `qa/test-plan.md`, `qa/browser-evidence.md`, `qa/baseline.json` against every criterion below. Inspect the underlying evidence files named by the workflow; do not grade from the author's summary alone.\n\n1. Every claimed pass, fail, and blocked check traces to an actual browser journey in the evidence log.\n2. Each defect was reproduced twice or its confidence was reduced, and includes expected versus actual behavior plus screenshot or console evidence.\n3. Core journeys cover meaningful state changes, invalid input, navigation, console health, responsive layout, and accessibility basics in proportion to scope.\n4. Credentials and sensitive data are redacted, and no destructive or externally visible action was taken without permission.\n5. Severity reflects user impact and reach, while untested surfaces are never counted as passing.\n6. The category and overall health-score arithmetic is reproducible from the report.\n\nWrite an evidence-backed review to `reviews/browser-qa-audit-review.md`. Give each criterion a PASS or FAIL with a concrete path, excerpt, measurement, or observed behavior. End with exactly `Verdict: PASS` or `Verdict: REVISE`. Then use `advance_task_step` for the active task: PASS routes to `finish`; REVISE routes to `repair` for review rounds 1 through 2, and the 3th REVISE routes to `needs-user`. Never route to finish while a criterion is unmet.",
243
+ "suggestedRole": "QA reviewer",
244
+ "gate": {
245
+ "at": "completion",
246
+ "checks": [
247
+ {
248
+ "kind": "minBytes",
249
+ "file": "reviews/browser-qa-audit-review.md",
250
+ "bytes": 400
251
+ },
252
+ {
253
+ "kind": "contains",
254
+ "file": "reviews/browser-qa-audit-review.md",
255
+ "pattern": "Verdict:\\s*(?:PASS|REVISE)",
256
+ "flags": "i",
257
+ "label": "explicit PASS or REVISE verdict"
258
+ }
259
+ ],
260
+ "onReject": "evaluate",
261
+ "maxAttempts": 3
262
+ },
263
+ "next": "repair"
264
+ },
265
+ {
266
+ "id": "repair",
267
+ "name": "Repair the deliverable",
268
+ "description": "Fix only the concrete gaps from the latest independent review.",
269
+ "prompt": "Read `reviews/browser-qa-audit-review.md` and repair every failed criterion in `qa/browser-qa-report.md`, `qa/test-plan.md`, `qa/browser-evidence.md`, `qa/baseline.json`. Make the changes in the actual workspace files, not just in task notes or a reply. Preserve evidence that already passed. Re-run or re-check anything the reviewer found unproven. Ensure `qa/browser-qa-report.md` is genuinely updated this turn so the repair is observable, then hand it back for independent evaluation.",
270
+ "suggestedRole": "QA reporter",
271
+ "advanceWhen": {
272
+ "file": "qa/browser-qa-report.md",
273
+ "minBytes": 1500,
274
+ "sniff": "nonempty",
275
+ "requireChange": true,
276
+ "goto": "evaluate"
277
+ },
278
+ "gate": {
279
+ "at": "completion",
280
+ "checks": [
281
+ {
282
+ "kind": "minBytes",
283
+ "file": "qa/browser-qa-report.md",
284
+ "bytes": 1500
285
+ },
286
+ {
287
+ "kind": "sniff",
288
+ "file": "qa/browser-qa-report.md",
289
+ "sniff": "nonempty"
290
+ },
291
+ {
292
+ "kind": "contains",
293
+ "file": "qa/browser-qa-report.md",
294
+ "pattern": "^##\\s+Executive summary",
295
+ "flags": "im",
296
+ "label": "Executive summary section"
297
+ },
298
+ {
299
+ "kind": "contains",
300
+ "file": "qa/browser-qa-report.md",
301
+ "pattern": "^##\\s+Coverage",
302
+ "flags": "im",
303
+ "label": "Coverage section"
304
+ },
305
+ {
306
+ "kind": "contains",
307
+ "file": "qa/browser-qa-report.md",
308
+ "pattern": "^##\\s+Findings",
309
+ "flags": "im",
310
+ "label": "Findings section"
311
+ },
312
+ {
313
+ "kind": "contains",
314
+ "file": "qa/browser-qa-report.md",
315
+ "pattern": "^##\\s+Console health",
316
+ "flags": "im",
317
+ "label": "Console health section"
318
+ },
319
+ {
320
+ "kind": "contains",
321
+ "file": "qa/browser-qa-report.md",
322
+ "pattern": "^##\\s+Health score",
323
+ "flags": "im",
324
+ "label": "Health score section"
325
+ },
326
+ {
327
+ "kind": "contains",
328
+ "file": "qa/browser-qa-report.md",
329
+ "pattern": "^##\\s+Top three fixes",
330
+ "flags": "im",
331
+ "label": "Top three fixes section"
332
+ }
333
+ ],
334
+ "onReject": "repair",
335
+ "maxAttempts": 3
336
+ },
337
+ "next": "evaluate"
338
+ },
339
+ {
340
+ "id": "finish",
341
+ "name": "Finish",
342
+ "description": "All deterministic and reviewer criteria passed.",
343
+ "prompt": "The independent review passed. Read `reviews/browser-qa-audit-review.md`, then use `write_task_note` to record a concise DONE summary with the final deliverable paths (`qa/browser-qa-report.md`, `qa/test-plan.md`, `qa/browser-evidence.md`, `qa/baseline.json`) and the evidence that each acceptance criterion passed. Report DONE without starting new work.",
344
+ "suggestedRole": "project lead",
345
+ "terminal": true
346
+ },
347
+ {
348
+ "id": "needs-user",
349
+ "name": "Escalate unresolved concerns",
350
+ "description": "The bounded repair loop ended without a defensible pass.",
351
+ "prompt": "The deliverable did not pass after 3 review rounds. Do not claim success. Read `reviews/browser-qa-audit-review.md`, then use `write_task_note` to record DONE_WITH_CONCERNS: the unmet criteria, what was attempted, the affected paths, and the smallest user decision or missing input needed to continue.",
352
+ "suggestedRole": "project lead",
353
+ "terminal": true
354
+ }
355
+ ],
356
+ "version": "2.0.1",
357
+ "releasedAt": "2026-08-13T00:00:00Z"
358
+ }