@bendyline/gilde 0.1.55 → 0.1.56

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 (185) hide show
  1. package/authoring/chat-models/glm-5.3-flash-320b-q2.json +129 -0
  2. package/authoring/gstack/wave.json +2 -2
  3. package/data/chat-models/gl/glm-5.3-flash-320b-q2/manifest.json +137 -0
  4. package/data/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.0/manifest.json +23 -0
  5. package/data/chat-models/index.json +1 -1
  6. package/data/craftbook-templates/a1/a11y-audit/versions/1.1.3/test.json +16 -8
  7. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/craftbook.json +618 -0
  8. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/test.json +228 -0
  9. package/data/craftbook-templates/al/album-curate/versions/1.0.3/test.json +6 -3
  10. package/data/craftbook-templates/al/alert-rules/versions/1.0.3/test.json +8 -8
  11. package/data/craftbook-templates/an/anniversary-cut/versions/1.0.5/test.json +10 -5
  12. package/data/craftbook-templates/an/annual-document-review/versions/1.0.3/test.json +16 -8
  13. package/data/craftbook-templates/an/anomaly-scan/versions/1.0.3/test.json +12 -6
  14. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/craftbook.json +602 -0
  15. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/test.json +290 -0
  16. package/data/craftbook-templates/ar/artifact-integrity-review/versions/1.0.3/test.json +18 -9
  17. package/data/craftbook-templates/au/audiobook-master-pack/versions/1.0.5/test.json +10 -5
  18. package/data/craftbook-templates/au/auth-flow/versions/1.0.3/test.json +12 -6
  19. package/data/craftbook-templates/au/auth-flow/versions/1.0.4/craftbook.json +282 -0
  20. package/data/craftbook-templates/au/auth-flow/versions/1.0.4/test.json +143 -0
  21. package/data/craftbook-templates/au/automation-recipe/versions/1.0.3/test.json +12 -6
  22. package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/craftbook.json +282 -0
  23. package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/test.json +108 -0
  24. package/data/craftbook-templates/bl/blog-post/versions/1.0.3/test.json +8 -8
  25. package/data/craftbook-templates/br/branding-website/versions/1.1.3/craftbook.json +335 -0
  26. package/data/craftbook-templates/br/branding-website/versions/1.1.3/test.json +164 -0
  27. package/data/craftbook-templates/br/broadcast-announcement/versions/1.0.3/test.json +8 -8
  28. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/craftbook.json +621 -0
  29. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/test.json +376 -0
  30. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/craftbook.json +730 -0
  31. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/test.json +221 -0
  32. package/data/craftbook-templates/bu/build-loop/versions/1.1.1/test.json +8 -8
  33. package/data/craftbook-templates/ca/case-study/versions/1.0.3/test.json +8 -8
  34. package/data/craftbook-templates/ch/chapter-narration-run/versions/1.0.4/test.json +10 -5
  35. package/data/craftbook-templates/ch/character-turnaround/versions/1.0.3/test.json +25 -11
  36. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/craftbook.json +587 -0
  37. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/test.json +225 -0
  38. package/data/craftbook-templates/ci/citation-audit/versions/1.0.3/test.json +28 -14
  39. package/data/craftbook-templates/cl/cli-tool/versions/1.1.3/test.json +8 -8
  40. package/data/craftbook-templates/co/codebase-refactoring-review/versions/1.0.3/test.json +16 -8
  41. package/data/craftbook-templates/co/codebase-ux-review/versions/1.0.3/test.json +18 -9
  42. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/craftbook.json +605 -0
  43. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/test.json +252 -0
  44. package/data/craftbook-templates/co/cohort-analysis/versions/1.0.3/test.json +18 -9
  45. package/data/craftbook-templates/co/competitive-analysis/versions/1.0.3/test.json +23 -15
  46. package/data/craftbook-templates/co/content-accuracy-review/versions/1.0.3/test.json +28 -14
  47. package/data/craftbook-templates/co/content-deck/versions/1.2.3/craftbook.json +4 -4
  48. package/data/craftbook-templates/co/content-deck/versions/1.2.3/test.json +3 -0
  49. package/data/craftbook-templates/co/content-deck/versions/1.2.4/craftbook.json +341 -0
  50. package/data/craftbook-templates/co/content-deck/versions/1.2.4/test.json +169 -0
  51. package/data/craftbook-templates/co/copy-review/versions/1.0.3/test.json +14 -7
  52. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/craftbook.json +4 -4
  53. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/test.json +3 -0
  54. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/craftbook.json +345 -0
  55. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/test.json +187 -0
  56. package/data/craftbook-templates/co/corpus-synthesis/versions/1.0.3/test.json +26 -13
  57. package/data/craftbook-templates/co/cover-letter/versions/1.0.3/test.json +8 -8
  58. package/data/craftbook-templates/cs/csv-transformer/versions/1.2.4/test.json +7 -7
  59. package/data/craftbook-templates/da/dashboard-spec/versions/1.0.3/test.json +7 -7
  60. package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/craftbook.json +285 -0
  61. package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/test.json +104 -0
  62. package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/craftbook.json +284 -0
  63. package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/test.json +162 -0
  64. package/data/craftbook-templates/da/data-quality-audit/versions/1.0.3/test.json +38 -19
  65. package/data/craftbook-templates/da/data-to-report/versions/1.0.3/test.json +12 -6
  66. package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/craftbook.json +286 -0
  67. package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/test.json +104 -0
  68. package/data/craftbook-templates/de/dependency-audit/versions/1.1.3/test.json +14 -7
  69. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/craftbook.json +621 -0
  70. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/test.json +235 -0
  71. package/data/craftbook-templates/de/design-review/versions/1.0.3/test.json +16 -8
  72. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/craftbook.json +616 -0
  73. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/test.json +201 -0
  74. package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/craftbook.json +285 -0
  75. package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/test.json +104 -0
  76. package/data/craftbook-templates/do/doc-rewrite/versions/1.0.3/test.json +119 -55
  77. package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/craftbook.json +285 -0
  78. package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/test.json +92 -0
  79. package/data/craftbook-templates/do/documentation-drift-review/versions/1.0.3/test.json +18 -9
  80. package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/craftbook.json +324 -0
  81. package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/test.json +161 -0
  82. package/data/craftbook-templates/ed/edit-notes/versions/1.0.3/test.json +11 -4
  83. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/craftbook.json +566 -0
  84. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/test.json +191 -0
  85. package/data/craftbook-templates/ep/episode-plan/versions/1.0.3/test.json +10 -5
  86. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.7/test.json +7 -10
  87. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/craftbook.json +595 -0
  88. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/test.json +139 -0
  89. package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/craftbook.json +277 -0
  90. package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/test.json +104 -0
  91. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/craftbook.json +327 -0
  92. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/test.json +162 -0
  93. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/craftbook.json +718 -0
  94. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/test.json +239 -0
  95. package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/craftbook.json +285 -0
  96. package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/test.json +162 -0
  97. package/data/craftbook-templates/fo/form-wizard/versions/1.0.3/test.json +8 -8
  98. package/data/craftbook-templates/ho/holiday-card-run/versions/1.0.3/test.json +11 -4
  99. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/craftbook.json +610 -0
  100. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/test.json +220 -0
  101. package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/craftbook.json +343 -0
  102. package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/test.json +176 -0
  103. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/craftbook.json +566 -0
  104. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/test.json +141 -0
  105. package/data/craftbook-templates/im/image-set-index/versions/1.2.3/craftbook.json +298 -0
  106. package/data/craftbook-templates/im/image-set-index/versions/1.2.3/test.json +180 -0
  107. package/data/craftbook-templates/in/insurance-inventory/versions/1.0.3/test.json +11 -4
  108. package/data/craftbook-templates/in/interactive-quiz/versions/1.0.3/test.json +48 -23
  109. package/data/craftbook-templates/in/invitation-design/versions/1.0.3/test.json +1 -1
  110. package/data/craftbook-templates/index.json +1 -1
  111. package/data/craftbook-templates/it/item-intake/versions/1.0.3/test.json +11 -4
  112. package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/craftbook.json +277 -0
  113. package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/test.json +104 -0
  114. package/data/craftbook-templates/me/meeting-prep-brief/versions/1.0.3/test.json +16 -8
  115. package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.3/test.json +3 -0
  116. package/data/craftbook-templates/mo/morning-report/versions/1.0.3/test.json +21 -9
  117. package/data/craftbook-templates/of/office-hours/versions/1.1.1/test.json +8 -8
  118. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/craftbook.json +697 -0
  119. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/test.json +235 -0
  120. package/data/craftbook-templates/pe/pest-diagnosis/versions/1.0.3/test.json +19 -8
  121. package/data/craftbook-templates/pl/plan/versions/1.0.2/test.json +8 -8
  122. package/data/craftbook-templates/pl/playtest-report/versions/1.0.3/test.json +17 -7
  123. package/data/craftbook-templates/pr/practice-exam/versions/1.0.3/test.json +7 -2
  124. package/data/craftbook-templates/pr/practice-session/versions/1.0.3/test.json +11 -4
  125. package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/craftbook.json +435 -0
  126. package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/test.json +141 -0
  127. package/data/craftbook-templates/qu/quarterly-summary/versions/1.0.3/test.json +16 -8
  128. package/data/craftbook-templates/re/receipt-intake/versions/1.0.3/test.json +11 -4
  129. package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/craftbook.json +277 -0
  130. package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/test.json +104 -0
  131. package/data/craftbook-templates/re/recipe-capture/versions/1.0.3/test.json +13 -5
  132. package/data/craftbook-templates/re/record-a-relative/versions/1.0.3/test.json +3 -0
  133. package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/craftbook.json +285 -0
  134. package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/test.json +104 -0
  135. package/data/craftbook-templates/re/refactor-module/versions/2.0.2/craftbook.json +695 -0
  136. package/data/craftbook-templates/re/refactor-module/versions/2.0.2/test.json +241 -0
  137. package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/craftbook.json +361 -0
  138. package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/test.json +138 -0
  139. package/data/craftbook-templates/re/release-notes/versions/1.0.4/test.json +8 -8
  140. package/data/craftbook-templates/re/release-notes/versions/1.0.5/craftbook.json +339 -0
  141. package/data/craftbook-templates/re/release-notes/versions/1.0.5/test.json +111 -0
  142. package/data/craftbook-templates/re/reliability-review/versions/1.0.3/test.json +16 -8
  143. package/data/craftbook-templates/re/research-report/versions/1.0.3/test.json +16 -8
  144. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/craftbook.json +596 -0
  145. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/test.json +157 -0
  146. package/data/craftbook-templates/ro/rough-cut-assembly/versions/1.0.4/test.json +13 -5
  147. package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/craftbook.json +624 -0
  148. package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/test.json +225 -0
  149. package/data/craftbook-templates/sc/script-automation/versions/1.0.4/craftbook.json +284 -0
  150. package/data/craftbook-templates/sc/script-automation/versions/1.0.4/test.json +162 -0
  151. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.7/test.json +10 -13
  152. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/craftbook.json +597 -0
  153. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/test.json +157 -0
  154. package/data/craftbook-templates/so/social-digest/versions/1.0.3/craftbook.json +239 -0
  155. package/data/craftbook-templates/so/social-digest/versions/1.0.3/test.json +168 -0
  156. package/data/craftbook-templates/so/source-quality-audit/versions/1.0.3/test.json +25 -11
  157. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/craftbook.json +599 -0
  158. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/test.json +162 -0
  159. package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/craftbook.json +577 -0
  160. package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/test.json +174 -0
  161. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.1/test.json +16 -8
  162. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/craftbook.json +592 -0
  163. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/test.json +195 -0
  164. package/data/craftbook-templates/th/thank-you-batch/versions/1.0.3/test.json +6 -3
  165. package/data/craftbook-templates/th/thank-you-sweep/versions/1.0.3/test.json +11 -4
  166. package/data/craftbook-templates/ti/tileset-batch/versions/1.0.3/test.json +9 -3
  167. package/data/craftbook-templates/tr/transcribe-and-shownotes/versions/1.0.3/test.json +10 -5
  168. package/data/craftbook-templates/tr/transcribe-index/versions/1.0.3/test.json +6 -3
  169. package/data/craftbook-templates/tr/translate-content/versions/1.1.3/craftbook.json +140 -0
  170. package/data/craftbook-templates/tr/translate-content/versions/1.1.3/test.json +141 -0
  171. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/craftbook.json +594 -0
  172. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/test.json +221 -0
  173. package/data/craftbook-templates/ux/ux-update/versions/1.0.2/craftbook.json +606 -0
  174. package/data/craftbook-templates/ux/ux-update/versions/1.0.2/test.json +206 -0
  175. package/data/craftbook-templates/we/weak-spot-drill/versions/1.0.3/test.json +11 -4
  176. package/data/craftbook-templates/we/weekly-walkthrough/versions/1.0.3/test.json +21 -9
  177. package/data/craftbook-templates/wh/whitepaper/versions/1.0.3/test.json +16 -8
  178. package/data/craftbook-templates/ye/year-in-review/versions/1.0.3/test.json +8 -4
  179. package/data/project-types/index.json +1 -1
  180. package/data/project-types/ju/just-chat/manifest.json +1 -1
  181. package/data/project-types/ju/just-chat/versions/1.0.1/about.md +5 -0
  182. package/data/project-types/ju/just-chat/versions/1.0.1/manifest.json +19 -0
  183. package/package.json +1 -1
  184. package/schemas/chat-model-identity.schema.json +27 -0
  185. package/schemas/chat-model-version.schema.json +22 -0
@@ -0,0 +1,284 @@
1
+ {
2
+ "id": "data-pipeline-etl",
3
+ "name": "ETL / Ingest Pipeline",
4
+ "description": "Build an extract-transform-load pipeline that ingests source data, reshapes it to a target schema, and loads it with validation at every stage. Locks the schemas FIRST — source shape, target shape, the field-by-field transform/mapping, type coercions, and the data-quality rules — then implements extract→transform→load with row-level error capture, then a reviewer validates output conformance, row counts, and reject handling. Covers ETL stages, schema mapping, type coercion, data validation, idempotent loads, dead-letter/reject rows, and reconciliation counts.\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. Schema scope (planner) — lock source/target schemas, mapping, quality rules → gated on artifact `{{workPath}}/schema-scope.md` (markdown-notes)\n2. Build the pipeline (developer) — implement extract → transform → load → gated on `src/pipeline.js` (code-module)\n3. Validate the output (reviewer) — check conformance, counts, and reject handling → gated on artifact `{{workPath}}/validate.md` (markdown-notes)\n\nThe gates never advance with an unmet criterion, and loop back to the\nowning phase to fix named gaps.\n",
5
+ "entryStepId": "schema-scope",
6
+ "triggers": [
7
+ "build an etl pipeline",
8
+ "ingest and transform data",
9
+ "data pipeline",
10
+ "load data into a target schema",
11
+ "etl job"
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": "schema-scope",
27
+ "name": "Schema scope",
28
+ "description": "lock source/target schemas, mapping, quality rules",
29
+ "prompt": "Lock the schemas and mapping before writing pipeline code. Step 1: Document the SOURCE schema — fields, types, and any messiness (nulls, formats, encodings). Step 2: Document the TARGET schema the data must conform to. Step 3: Write the field-by-field transform map: which source field(s) feed each target field, the coercion/cleaning applied (trim, parse date, cast number), and the default for missing values. Step 4: Define data-quality rules and reject criteria — which rows are invalid and what happens to them (drop, dead-letter, fail run). Step 5: Write a numbered acceptance-criteria checklist of 5-9 items (e.g. 'every loaded row conforms to the target schema', 'invalid rows go to the reject sink and are counted', 'input count = loaded + rejected', 're-running does not duplicate rows'). `write_task_note` the schemas + mapping + checklist and write the same to the produces path.\n\nThe deliverable `{{workPath}}/schema-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
+ "toolPolicy": {
32
+ "disallowBuiltinToolsets": [
33
+ "ai-apps",
34
+ "archives",
35
+ "audio",
36
+ "browser-automation",
37
+ "craftbooks",
38
+ "data-tables",
39
+ "entity-intel",
40
+ "git",
41
+ "image-intel",
42
+ "images",
43
+ "role-delegation",
44
+ "role-delegation-escalation",
45
+ "security-intel",
46
+ "team-management",
47
+ "videos",
48
+ "web",
49
+ "workspace-fs-write"
50
+ ],
51
+ "outputMedium": "artifact",
52
+ "additionalOutputMedia": [
53
+ "task-note"
54
+ ]
55
+ },
56
+ "advanceWhen": {
57
+ "file": "{{workPath}}/schema-scope.md",
58
+ "minBytes": 1,
59
+ "sniff": "nonempty",
60
+ "artifact": true
61
+ },
62
+ "gate": {
63
+ "at": "completion",
64
+ "checks": [
65
+ {
66
+ "kind": "minBytes",
67
+ "file": "{{workPath}}/schema-scope.md",
68
+ "bytes": 120,
69
+ "artifact": true
70
+ },
71
+ {
72
+ "kind": "sniff",
73
+ "file": "{{workPath}}/schema-scope.md",
74
+ "sniff": "nonempty",
75
+ "artifact": true
76
+ }
77
+ ],
78
+ "onReject": "schema-scope",
79
+ "maxAttempts": 3
80
+ },
81
+ "next": "build"
82
+ },
83
+ {
84
+ "id": "build",
85
+ "name": "Build the pipeline",
86
+ "description": "implement extract → transform → load",
87
+ "prompt": "Implement the pipeline as three clear stages in a runnable script. Step 1 (extract): read the source data into records. Step 2 (transform): apply the locked mapping field-by-field with the specified coercions and defaults; validate each row against the quality rules. Step 3 (load): write conforming rows to the target and route failing rows to the reject sink, keeping running counts (read / loaded / rejected). Step 4: make the load idempotent (upsert or skip-seen) so re-runs do not duplicate. Emit a reconciliation summary at the end. Use sample/in-memory sources and sinks if none specified. On a loop-back, fix only the named gaps. `write_task_note` the file path and which criteria now pass.",
88
+ "suggestedRole": "developer",
89
+ "toolPolicy": {
90
+ "disallowBuiltinToolsets": [
91
+ "ai-apps",
92
+ "archives",
93
+ "artifacts",
94
+ "audio",
95
+ "browser-automation",
96
+ "craftbooks",
97
+ "data-tables",
98
+ "entity-intel",
99
+ "git",
100
+ "image-intel",
101
+ "images",
102
+ "role-delegation",
103
+ "role-delegation-escalation",
104
+ "security-intel",
105
+ "team-management",
106
+ "videos",
107
+ "web"
108
+ ],
109
+ "outputMedium": "workspace",
110
+ "additionalOutputMedia": [
111
+ "task-note"
112
+ ]
113
+ },
114
+ "advanceWhen": {
115
+ "file": "src/pipeline.js",
116
+ "minBytes": 1,
117
+ "sniff": "nonempty"
118
+ },
119
+ "gate": {
120
+ "at": "completion",
121
+ "checks": [
122
+ {
123
+ "kind": "minBytes",
124
+ "file": "src/pipeline.js",
125
+ "bytes": 200
126
+ },
127
+ {
128
+ "kind": "sniff",
129
+ "file": "src/pipeline.js",
130
+ "sniff": "nonempty"
131
+ },
132
+ {
133
+ "kind": "esmImports",
134
+ "file": "src/pipeline.js"
135
+ },
136
+ {
137
+ "kind": "sourceParses",
138
+ "file": "src/pipeline.js"
139
+ }
140
+ ],
141
+ "onReject": "build",
142
+ "maxAttempts": 3
143
+ },
144
+ "next": "validate"
145
+ },
146
+ {
147
+ "id": "validate",
148
+ "name": "Validate the output",
149
+ "description": "check conformance, counts, and reject handling",
150
+ "prompt": "Validate the pipeline's output against the schema and the quality rules. Step 1: Run the pipeline on representative input including deliberately bad rows. Step 2: Confirm every loaded row conforms to the target schema exactly (fields present, types correct). Step 3: Confirm the reconciliation holds: input count equals loaded plus rejected, and rejected rows are the ones that violate the rules. Step 4: Re-run and confirm no duplicate rows appear. Write a short validation note with the counts and any conformance gaps to the produces path.\n\nThe deliverable `{{workPath}}/validate.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.",
151
+ "suggestedRole": "reviewer",
152
+ "toolPolicy": {
153
+ "disallowBuiltinToolsets": [
154
+ "ai-apps",
155
+ "archives",
156
+ "audio",
157
+ "browser-automation",
158
+ "code-execution",
159
+ "craftbooks",
160
+ "data-tables",
161
+ "entity-intel",
162
+ "git",
163
+ "image-intel",
164
+ "images",
165
+ "role-delegation",
166
+ "role-delegation-escalation",
167
+ "security-intel",
168
+ "team-management",
169
+ "videos",
170
+ "web",
171
+ "workspace-fs-write"
172
+ ],
173
+ "outputMedium": "artifact",
174
+ "additionalOutputMedia": [
175
+ "task-note"
176
+ ]
177
+ },
178
+ "advanceWhen": {
179
+ "file": "{{workPath}}/validate.md",
180
+ "minBytes": 1,
181
+ "sniff": "nonempty",
182
+ "artifact": true
183
+ },
184
+ "gate": {
185
+ "at": "completion",
186
+ "checks": [
187
+ {
188
+ "kind": "minBytes",
189
+ "file": "src/pipeline.js",
190
+ "bytes": 200
191
+ },
192
+ {
193
+ "kind": "sniff",
194
+ "file": "src/pipeline.js",
195
+ "sniff": "nonempty"
196
+ },
197
+ {
198
+ "kind": "esmImports",
199
+ "file": "src/pipeline.js"
200
+ },
201
+ {
202
+ "kind": "sourceParses",
203
+ "file": "src/pipeline.js"
204
+ }
205
+ ],
206
+ "onReject": "validate",
207
+ "maxAttempts": 4
208
+ },
209
+ "next": "evaluate"
210
+ },
211
+ {
212
+ "id": "evaluate",
213
+ "name": "Evaluate",
214
+ "description": "Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.",
215
+ "prompt": "Run the pipeline on input that includes valid and invalid rows. For EACH acceptance criterion: confirm every loaded row conforms to the target schema, confirm invalid rows are rejected and counted, confirm input = loaded + rejected, and confirm a re-run produces no duplicates. Write PASS/FAIL per criterion with the reconciliation counts.\n\nThen route — this is the whole point of the loop:\n\n- **Every criterion PASSES →** call `advance_task_step({ ref, stepId: \"evaluate\", next: \"finish\" })`.\n- **Any criterion FAILS →** write the specific gaps to notes, then call `advance_task_step({ ref, stepId: \"evaluate\", next: \"build\" })` to loop back. The builder fixes exactly those gaps.\n\nNever route to `finish` while any criterion is unmet. The build phase's completion gate already blocked a grossly-incomplete deliverable; your job is the judgment an automated check cannot make (does it actually work, read well, look right). After ~3 unproductive loops, stop and report DONE_WITH_CONCERNS so the user can step in.",
216
+ "suggestedRole": "reviewer",
217
+ "toolPolicy": {
218
+ "disallowBuiltinToolsets": [
219
+ "ai-apps",
220
+ "archives",
221
+ "artifacts",
222
+ "audio",
223
+ "browser-automation",
224
+ "code-execution",
225
+ "craftbooks",
226
+ "data-tables",
227
+ "entity-intel",
228
+ "git",
229
+ "image-intel",
230
+ "images",
231
+ "role-delegation",
232
+ "role-delegation-escalation",
233
+ "security-intel",
234
+ "team-management",
235
+ "videos",
236
+ "web",
237
+ "workspace-fs-write"
238
+ ],
239
+ "outputMedium": "task-note"
240
+ },
241
+ "consumes": [
242
+ {
243
+ "file": "src/pipeline.js"
244
+ }
245
+ ],
246
+ "next": "build"
247
+ },
248
+ {
249
+ "id": "finish",
250
+ "name": "Finish",
251
+ "description": "All acceptance criteria met. Stamp a short summary and report DONE.",
252
+ "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.",
253
+ "suggestedRole": "developer",
254
+ "toolPolicy": {
255
+ "disallowBuiltinToolsets": [
256
+ "ai-apps",
257
+ "archives",
258
+ "artifacts",
259
+ "audio",
260
+ "browser-automation",
261
+ "code-execution",
262
+ "craftbooks",
263
+ "data-tables",
264
+ "entity-intel",
265
+ "git",
266
+ "image-intel",
267
+ "images",
268
+ "role-delegation",
269
+ "role-delegation-escalation",
270
+ "security-intel",
271
+ "team-management",
272
+ "videos",
273
+ "web",
274
+ "workspace-fs-write"
275
+ ],
276
+ "outputMedium": "task-note"
277
+ },
278
+ "terminal": true
279
+ }
280
+ ],
281
+ "version": "1.0.5",
282
+ "releasedAt": "2026-09-05T03:30:00Z",
283
+ "minGezelVersion": "1.26233"
284
+ }
@@ -0,0 +1,162 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "ETL / Ingest Pipeline smoke eval",
4
+ "objective": "Self-contained smoke eval for the ETL / Ingest Pipeline craftbook using the external generic harness.",
5
+ "tags": [
6
+ "external"
7
+ ],
8
+ "prompt": "Theres a fake ops service wired up for this so nothing real gets touched — the endpoints are in mocks/services.md, and the ready-made mock-probe script talks to them for you. Can you run the automation against it and write up how it went in automation.md?",
9
+ "setup": {
10
+ "projectName": "ETL / Ingest Pipeline Eval",
11
+ "about": "Self-contained eval project for data-pipeline-etl. Seeded inputs are under workspace/source or workspace/fixtures; final deliverable is workspace/automation.md.",
12
+ "missionObjectives": "Use the ETL / Ingest Pipeline craftbook/template, read the seeded local fixtures, and write automation.md without network calls, real credentials, or live services.",
13
+ "files": [
14
+ {
15
+ "path": "source/brief.md",
16
+ "content": "# ETL / Ingest Pipeline 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: data-pipeline-etl - ETL / Ingest Pipeline.\n"
17
+ }
18
+ ],
19
+ "worker": {
20
+ "name": "Jules",
21
+ "role": "Developer"
22
+ }
23
+ },
24
+ "mocks": [
25
+ {
26
+ "kind": "http",
27
+ "id": "ops",
28
+ "description": "Fake operations service for this eval. GET /api/bookings/open lists the open work items; POST /api/bookings/dry-run records a simulated submission and returns DRY_RUN_OK.",
29
+ "credential": {
30
+ "name": "mock.ops"
31
+ },
32
+ "routes": [
33
+ {
34
+ "method": "GET",
35
+ "path": "/api/bookings/open",
36
+ "body": {
37
+ "items": [
38
+ "BKG-1001",
39
+ "BKG-1002",
40
+ "BKG-1003"
41
+ ]
42
+ }
43
+ },
44
+ {
45
+ "method": "POST",
46
+ "path": "/api/bookings/dry-run",
47
+ "status": 201,
48
+ "body": {
49
+ "status": "DRY_RUN_OK",
50
+ "recorded": 3
51
+ }
52
+ }
53
+ ]
54
+ },
55
+ {
56
+ "kind": "webhook",
57
+ "id": "notify",
58
+ "description": "Notification receiver. POST a JSON completion notice here when the run finishes.",
59
+ "path": "/hooks/notify"
60
+ },
61
+ {
62
+ "kind": "cli",
63
+ "id": "probe",
64
+ "description": "Provenance-trusted project script `mock-probe` that exercises the fake ops service through http.authed and returns the raw responses.",
65
+ "shim": {
66
+ "path": "scripts/mock-probe.ts",
67
+ "content": "import { defineScript, gezel } from '@bendyline/gezel-sdk';\n\nexport const meta = defineScript({\n name: 'mock-probe',\n description:\n 'Probe the live fake ops service for this eval: lists the open work items and records a dry-run submission. Outputs the raw JSON responses as evidence for the write-up.',\n inputs: {},\n outputs: {\n open: { type: 'string', description: 'Raw JSON body from the open-items listing.' },\n dryRun: { type: 'string', description: 'Raw JSON body from the dry-run submission.' },\n },\n requires: ['workspace.read', 'network', 'credential:mock.ops'],\n});\n\nconst services = JSON.parse(await gezel.fs.read('mocks/services.json'));\nconst base = (id) => {\n const service = services.find((entry) => entry.id === id);\n if (!service) throw new Error(`mock service \"${id}\" is not listed in mocks/services.json`);\n return service.baseUrl;\n};\n\nconst open = await gezel.http.authed(`${base('ops')}/api/bookings/open`, {\n credential: 'mock.ops',\n});\nif (!open.ok) throw new Error(`open-items listing failed: ${open.status} ${open.body}`);\n\nconst dryRun = await gezel.http.authed(`${base('ops')}/api/bookings/dry-run`, {\n credential: 'mock.ops',\n method: 'POST',\n body: JSON.stringify({ items: JSON.parse(open.body).items, mode: 'dry-run' }),\n});\nif (!dryRun.ok) throw new Error(`dry-run submission failed: ${dryRun.status} ${dryRun.body}`);\n\ngezel.output({ open: open.body, dryRun: dryRun.body });\n"
68
+ }
69
+ }
70
+ ],
71
+ "success": {
72
+ "summary": "automation.md is grounded in live fake-service responses: the open items were actually listed and a dry-run actually recorded (request-log assertions), with safety guards and signals described.",
73
+ "deliverables": [
74
+ {
75
+ "path": "automation.md",
76
+ "kind": "markdown-report",
77
+ "minBytes": 900,
78
+ "checks": [
79
+ {
80
+ "kind": "contains",
81
+ "file": "automation.md",
82
+ "pattern": "(?:^|\\n)#{1,3}\\s+\\S",
83
+ "flags": "i"
84
+ },
85
+ {
86
+ "kind": "contains",
87
+ "file": "automation.md",
88
+ "pattern": "DRY_RUN_OK|dry-run|dry run",
89
+ "flags": "i"
90
+ },
91
+ {
92
+ "kind": "contains",
93
+ "file": "automation.md",
94
+ "pattern": "fake-ci|fake-github|/api/bookings",
95
+ "flags": "i"
96
+ },
97
+ {
98
+ "kind": "contains",
99
+ "file": "automation.md",
100
+ "pattern": "no real|credentials|safety|guard",
101
+ "flags": "i"
102
+ },
103
+ {
104
+ "kind": "contains",
105
+ "file": "automation.md",
106
+ "pattern": "success|failure|retry|abort",
107
+ "flags": "i"
108
+ }
109
+ ]
110
+ }
111
+ ],
112
+ "mocks": [
113
+ {
114
+ "service": "ops",
115
+ "minRequests": 2,
116
+ "requiredPaths": [
117
+ "^/api/bookings/open$",
118
+ "^/api/bookings/dry-run$"
119
+ ]
120
+ }
121
+ ]
122
+ },
123
+ "rubric": {
124
+ "artifact": {
125
+ "path": "automation.md",
126
+ "kind": "markdown"
127
+ },
128
+ "axes": [
129
+ {
130
+ "name": "safety",
131
+ "description": "Dry-run posture is explicit: no real credentials, clear stop-before-side-effect boundary."
132
+ },
133
+ {
134
+ "name": "mapping",
135
+ "description": "Fake endpoints/commands are mapped completely to the workflow steps."
136
+ },
137
+ {
138
+ "name": "signals",
139
+ "description": "Success, failure, retry, and abort conditions are all defined."
140
+ },
141
+ {
142
+ "name": "containment",
143
+ "description": "The plan cannot accidentally reach a real service from a mock context."
144
+ }
145
+ ]
146
+ },
147
+ "qualityFocus": [
148
+ "dry-run safety",
149
+ "fake tool mapping",
150
+ "side-effect containment"
151
+ ],
152
+ "extensions": {
153
+ "legacySimulators": [
154
+ {
155
+ "id": "data-pipeline-etl-fake-service-fixture",
156
+ "kind": "data-source",
157
+ "status": "implemented",
158
+ "description": "Seeded local fake service contract replacing live CLIs, HTTP APIs, credentials, and side effects."
159
+ }
160
+ ]
161
+ }
162
+ }
@@ -41,127 +41,146 @@
41
41
  "kind": "contains",
42
42
  "file": "tasks/eval/report.md",
43
43
  "pattern": "(?:^|\\n)#{1,3}\\s+\\S",
44
- "flags": "i"
44
+ "flags": "i",
45
+ "artifact": true
45
46
  },
46
47
  {
47
48
  "kind": "contains",
48
49
  "file": "tasks/eval/report.md",
49
50
  "pattern": "completeness",
50
51
  "flags": "i",
51
- "label": "include a completeness section/result"
52
+ "label": "include a completeness section/result",
53
+ "artifact": true
52
54
  },
53
55
  {
54
56
  "kind": "contains",
55
57
  "file": "tasks/eval/report.md",
56
58
  "pattern": "validity",
57
59
  "flags": "i",
58
- "label": "include a validity section/result"
60
+ "label": "include a validity section/result",
61
+ "artifact": true
59
62
  },
60
63
  {
61
64
  "kind": "contains",
62
65
  "file": "tasks/eval/report.md",
63
66
  "pattern": "consistency",
64
67
  "flags": "i",
65
- "label": "include a consistency section/result"
68
+ "label": "include a consistency section/result",
69
+ "artifact": true
66
70
  },
67
71
  {
68
72
  "kind": "contains",
69
73
  "file": "tasks/eval/report.md",
70
74
  "pattern": "uniqueness",
71
75
  "flags": "i",
72
- "label": "include a uniqueness section/result"
76
+ "label": "include a uniqueness section/result",
77
+ "artifact": true
73
78
  },
74
79
  {
75
80
  "kind": "contains",
76
81
  "file": "tasks/eval/report.md",
77
82
  "pattern": "timeliness|stale|last_seen",
78
83
  "flags": "i",
79
- "label": "include timeliness results"
84
+ "label": "include timeliness results",
85
+ "artifact": true
80
86
  },
81
87
  {
82
88
  "kind": "contains",
83
89
  "file": "tasks/eval/report.md",
84
90
  "pattern": "2026-06-28",
85
91
  "flags": "i",
86
- "label": "include the seeded audit date"
92
+ "label": "include the seeded audit date",
93
+ "artifact": true
87
94
  },
88
95
  {
89
96
  "kind": "contains",
90
97
  "file": "tasks/eval/report.md",
91
98
  "pattern": "6\\s+records|Total Records\\s*\\|\\s*6",
92
99
  "flags": "i",
93
- "label": "use the six CSV rows"
100
+ "label": "use the six CSV rows",
101
+ "artifact": true
94
102
  },
95
103
  {
96
104
  "kind": "contains",
97
105
  "file": "tasks/eval/report.md",
98
106
  "pattern": "C-002",
99
107
  "flags": "i",
100
- "label": "include C-002 as a failing example"
108
+ "label": "include C-002 as a failing example",
109
+ "artifact": true
101
110
  },
102
111
  {
103
112
  "kind": "contains",
104
113
  "file": "tasks/eval/report.md",
105
114
  "pattern": "C-003",
106
115
  "flags": "i",
107
- "label": "include C-003 as a failing example"
116
+ "label": "include C-003 as a failing example",
117
+ "artifact": true
108
118
  },
109
119
  {
110
120
  "kind": "contains",
111
121
  "file": "tasks/eval/report.md",
112
122
  "pattern": "C-004",
113
123
  "flags": "i",
114
- "label": "include C-004 as a failing example"
124
+ "label": "include C-004 as a failing example",
125
+ "artifact": true
115
126
  },
116
127
  {
117
128
  "kind": "contains",
118
129
  "file": "tasks/eval/report.md",
119
130
  "pattern": "C-005",
120
131
  "flags": "i",
121
- "label": "include C-005 as a failing example"
132
+ "label": "include C-005 as a failing example",
133
+ "artifact": true
122
134
  },
123
135
  {
124
136
  "kind": "contains",
125
137
  "file": "tasks/eval/report.md",
126
138
  "pattern": "C-005[\\s\\S]{0,220}(pending|invalid status|status)|pending[\\s\\S]{0,220}C-005",
127
139
  "flags": "i",
128
- "label": "include C-005 invalid pending status, not only stale last_seen"
140
+ "label": "include C-005 invalid pending status, not only stale last_seen",
141
+ "artifact": true
129
142
  },
130
143
  {
131
144
  "kind": "contains",
132
145
  "file": "tasks/eval/report.md",
133
146
  "pattern": "pass rate|pass_rate",
134
147
  "flags": "i",
135
- "label": "include pass rates"
148
+ "label": "include pass rates",
149
+ "artifact": true
136
150
  },
137
151
  {
138
152
  "kind": "contains",
139
153
  "file": "tasks/eval/report.md",
140
154
  "pattern": "overall(?:\\s+data\\s+quality)?\\s+score|overall_score",
141
155
  "flags": "i",
142
- "label": "include an explicit overall score"
156
+ "label": "include an explicit overall score",
157
+ "artifact": true
143
158
  },
144
159
  {
145
160
  "kind": "contains",
146
161
  "file": "tasks/eval/report.md",
147
162
  "pattern": "failing examples?",
148
163
  "flags": "i",
149
- "label": "include a failing examples section"
164
+ "label": "include a failing examples section",
165
+ "artifact": true
150
166
  },
151
167
  {
152
168
  "kind": "contains",
153
169
  "file": "tasks/eval/report.md",
154
170
  "pattern": "remediation|priority|fix",
155
- "flags": "i"
171
+ "flags": "i",
172
+ "artifact": true
156
173
  },
157
174
  {
158
175
  "kind": "notContains",
159
176
  "file": "tasks/eval/report.md",
160
177
  "pattern": "first_name|last_name|john@doe|90[- ]day|90\\s+days|2024-\\d\\d-\\d\\d|\\b7\\s+records\\b|\\d\\s*/\\s*7\\b",
161
178
  "flags": "i",
162
- "label": "avoid invented columns, values, thresholds, and audit dates not in the seeded rules"
179
+ "label": "avoid invented columns, values, thresholds, and audit dates not in the seeded rules",
180
+ "artifact": true
163
181
  }
164
- ]
182
+ ],
183
+ "artifact": true
165
184
  },
166
185
  {
167
186
  "path": "data/audit.json",
@@ -37,32 +37,38 @@
37
37
  "kind": "contains",
38
38
  "file": "tasks/eval/report.md",
39
39
  "pattern": "Executive summary|Key metrics|Findings|Recommendations|Limitations",
40
- "flags": "i"
40
+ "flags": "i",
41
+ "artifact": true
41
42
  },
42
43
  {
43
44
  "kind": "contains",
44
45
  "file": "tasks/eval/report.md",
45
- "pattern": "March|April|May|West|East"
46
+ "pattern": "March|April|May|West|East",
47
+ "artifact": true
46
48
  },
47
49
  {
48
50
  "kind": "contains",
49
51
  "file": "tasks/eval/report.md",
50
52
  "pattern": "14\\.2%|8\\.9%|18|6|44|25",
51
- "flags": "i"
53
+ "flags": "i",
54
+ "artifact": true
52
55
  },
53
56
  {
54
57
  "kind": "contains",
55
58
  "file": "tasks/eval/report.md",
56
59
  "pattern": "refund leakage|response hours|escalations|return rate",
57
- "flags": "i"
60
+ "flags": "i",
61
+ "artifact": true
58
62
  },
59
63
  {
60
64
  "kind": "contains",
61
65
  "file": "tasks/eval/report.md",
62
66
  "pattern": "table|\\|",
63
- "flags": "i"
67
+ "flags": "i",
68
+ "artifact": true
64
69
  }
65
- ]
70
+ ],
71
+ "artifact": true
66
72
  }
67
73
  ]
68
74
  },