@bendyline/gilde 0.1.54 → 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 (211) hide show
  1. package/authoring/chat-models/glm-5.3-flash-320b-q2.json +129 -0
  2. package/authoring/chat-models/qwen3.5-27b-q4.json +147 -0
  3. package/authoring/gstack/evals/cso.json +21 -18
  4. package/authoring/gstack/evals/investigate.json +25 -22
  5. package/authoring/gstack/evals/plan-ceo-review.json +19 -16
  6. package/authoring/gstack/overlays/retro.json +2 -2
  7. package/authoring/gstack/wave.json +2 -2
  8. package/data/chat-models/gl/glm-5.3-flash-320b-q2/manifest.json +137 -0
  9. package/data/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.0/manifest.json +23 -0
  10. package/data/chat-models/index.json +1 -1
  11. package/data/chat-models/qw/qwen3.5-27b-q4/manifest.json +217 -0
  12. package/data/chat-models/qw/qwen3.5-27b-q4/versions/1.0.0/manifest.json +90 -0
  13. package/data/craftbook-templates/a1/a11y-audit/versions/1.1.3/test.json +16 -8
  14. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/craftbook.json +618 -0
  15. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/test.json +228 -0
  16. package/data/craftbook-templates/al/album-curate/versions/1.0.3/test.json +6 -3
  17. package/data/craftbook-templates/al/alert-rules/versions/1.0.3/test.json +8 -8
  18. package/data/craftbook-templates/an/anniversary-cut/versions/1.0.5/test.json +10 -5
  19. package/data/craftbook-templates/an/annual-document-review/versions/1.0.3/test.json +16 -8
  20. package/data/craftbook-templates/an/anomaly-scan/versions/1.0.3/test.json +12 -6
  21. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/craftbook.json +602 -0
  22. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/test.json +290 -0
  23. package/data/craftbook-templates/ar/artifact-integrity-review/versions/1.0.3/test.json +18 -9
  24. package/data/craftbook-templates/au/audiobook-master-pack/versions/1.0.5/test.json +10 -5
  25. package/data/craftbook-templates/au/auth-flow/versions/1.0.3/test.json +12 -6
  26. package/data/craftbook-templates/au/auth-flow/versions/1.0.4/craftbook.json +282 -0
  27. package/data/craftbook-templates/au/auth-flow/versions/1.0.4/test.json +143 -0
  28. package/data/craftbook-templates/au/automation-recipe/versions/1.0.3/test.json +12 -6
  29. package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/craftbook.json +282 -0
  30. package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/test.json +108 -0
  31. package/data/craftbook-templates/bl/blog-post/versions/1.0.3/test.json +8 -8
  32. package/data/craftbook-templates/br/branding-website/versions/1.1.3/craftbook.json +335 -0
  33. package/data/craftbook-templates/br/branding-website/versions/1.1.3/test.json +164 -0
  34. package/data/craftbook-templates/br/broadcast-announcement/versions/1.0.3/test.json +8 -8
  35. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.7/craftbook.json +620 -0
  36. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.7/test.json +376 -0
  37. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/craftbook.json +621 -0
  38. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/test.json +376 -0
  39. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/craftbook.json +730 -0
  40. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/test.json +221 -0
  41. package/data/craftbook-templates/bu/build-loop/versions/1.1.1/test.json +8 -8
  42. package/data/craftbook-templates/ca/case-study/versions/1.0.3/test.json +8 -8
  43. package/data/craftbook-templates/ch/chapter-narration-run/versions/1.0.4/test.json +10 -5
  44. package/data/craftbook-templates/ch/character-turnaround/versions/1.0.3/test.json +25 -11
  45. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/craftbook.json +587 -0
  46. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/test.json +225 -0
  47. package/data/craftbook-templates/ci/citation-audit/versions/1.0.3/test.json +28 -14
  48. package/data/craftbook-templates/cl/cli-tool/versions/1.1.3/test.json +8 -8
  49. package/data/craftbook-templates/co/codebase-refactoring-review/versions/1.0.3/test.json +16 -8
  50. package/data/craftbook-templates/co/codebase-ux-review/versions/1.0.3/test.json +18 -9
  51. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/craftbook.json +605 -0
  52. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/test.json +252 -0
  53. package/data/craftbook-templates/co/cohort-analysis/versions/1.0.3/test.json +18 -9
  54. package/data/craftbook-templates/co/competitive-analysis/versions/1.0.3/test.json +23 -15
  55. package/data/craftbook-templates/co/content-accuracy-review/versions/1.0.3/test.json +28 -14
  56. package/data/craftbook-templates/co/content-deck/versions/1.2.3/craftbook.json +4 -4
  57. package/data/craftbook-templates/co/content-deck/versions/1.2.3/test.json +3 -0
  58. package/data/craftbook-templates/co/content-deck/versions/1.2.4/craftbook.json +341 -0
  59. package/data/craftbook-templates/co/content-deck/versions/1.2.4/test.json +169 -0
  60. package/data/craftbook-templates/co/copy-review/versions/1.0.3/test.json +14 -7
  61. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/craftbook.json +4 -4
  62. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/test.json +3 -0
  63. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/craftbook.json +345 -0
  64. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/test.json +187 -0
  65. package/data/craftbook-templates/co/corpus-synthesis/versions/1.0.3/test.json +26 -13
  66. package/data/craftbook-templates/co/cover-letter/versions/1.0.3/test.json +8 -8
  67. package/data/craftbook-templates/cs/csv-transformer/versions/1.2.4/test.json +7 -7
  68. package/data/craftbook-templates/da/dashboard-spec/versions/1.0.3/test.json +7 -7
  69. package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/craftbook.json +285 -0
  70. package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/test.json +104 -0
  71. package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/craftbook.json +284 -0
  72. package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/test.json +162 -0
  73. package/data/craftbook-templates/da/data-quality-audit/versions/1.0.3/test.json +38 -19
  74. package/data/craftbook-templates/da/data-to-report/versions/1.0.3/test.json +12 -6
  75. package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/craftbook.json +286 -0
  76. package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/test.json +104 -0
  77. package/data/craftbook-templates/de/dependency-audit/versions/1.1.3/test.json +14 -7
  78. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/craftbook.json +621 -0
  79. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/test.json +235 -0
  80. package/data/craftbook-templates/de/design-review/versions/1.0.3/test.json +16 -8
  81. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.7/craftbook.json +616 -0
  82. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.7/test.json +201 -0
  83. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/craftbook.json +616 -0
  84. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/test.json +201 -0
  85. package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/craftbook.json +285 -0
  86. package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/test.json +104 -0
  87. package/data/craftbook-templates/do/doc-rewrite/versions/1.0.3/test.json +119 -55
  88. package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/craftbook.json +285 -0
  89. package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/test.json +92 -0
  90. package/data/craftbook-templates/do/documentation-drift-review/versions/1.0.3/test.json +18 -9
  91. package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/craftbook.json +324 -0
  92. package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/test.json +161 -0
  93. package/data/craftbook-templates/ed/edit-notes/versions/1.0.3/test.json +11 -4
  94. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.7/craftbook.json +566 -0
  95. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.7/test.json +191 -0
  96. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/craftbook.json +566 -0
  97. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/test.json +191 -0
  98. package/data/craftbook-templates/ep/episode-plan/versions/1.0.3/test.json +10 -5
  99. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.7/craftbook.json +595 -0
  100. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.7/test.json +136 -0
  101. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/craftbook.json +595 -0
  102. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/test.json +139 -0
  103. package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/craftbook.json +277 -0
  104. package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/test.json +104 -0
  105. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/craftbook.json +327 -0
  106. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/test.json +162 -0
  107. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/craftbook.json +718 -0
  108. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/test.json +239 -0
  109. package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/craftbook.json +285 -0
  110. package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/test.json +162 -0
  111. package/data/craftbook-templates/fo/form-wizard/versions/1.0.3/test.json +8 -8
  112. package/data/craftbook-templates/ho/holiday-card-run/versions/1.0.3/test.json +11 -4
  113. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/craftbook.json +610 -0
  114. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/test.json +220 -0
  115. package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/craftbook.json +343 -0
  116. package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/test.json +176 -0
  117. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.7/craftbook.json +566 -0
  118. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.7/test.json +141 -0
  119. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/craftbook.json +566 -0
  120. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/test.json +141 -0
  121. package/data/craftbook-templates/im/image-set-index/versions/1.2.3/craftbook.json +298 -0
  122. package/data/craftbook-templates/im/image-set-index/versions/1.2.3/test.json +180 -0
  123. package/data/craftbook-templates/in/insurance-inventory/versions/1.0.3/test.json +11 -4
  124. package/data/craftbook-templates/in/interactive-quiz/versions/1.0.3/test.json +48 -23
  125. package/data/craftbook-templates/in/invitation-design/versions/1.0.3/test.json +1 -1
  126. package/data/craftbook-templates/index.json +1 -1
  127. package/data/craftbook-templates/it/item-intake/versions/1.0.3/test.json +11 -4
  128. package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/craftbook.json +277 -0
  129. package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/test.json +104 -0
  130. package/data/craftbook-templates/me/meeting-prep-brief/versions/1.0.3/test.json +16 -8
  131. package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.3/test.json +3 -0
  132. package/data/craftbook-templates/mo/morning-report/versions/1.0.3/test.json +21 -9
  133. package/data/craftbook-templates/of/office-hours/versions/1.1.1/test.json +8 -8
  134. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/craftbook.json +697 -0
  135. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/test.json +235 -0
  136. package/data/craftbook-templates/pe/pest-diagnosis/versions/1.0.3/test.json +19 -8
  137. package/data/craftbook-templates/pl/plan/versions/1.0.2/craftbook.json +222 -0
  138. package/data/craftbook-templates/pl/plan/versions/1.0.2/test.json +91 -0
  139. package/data/craftbook-templates/pl/playtest-report/versions/1.0.3/test.json +17 -7
  140. package/data/craftbook-templates/pr/practice-exam/versions/1.0.3/test.json +7 -2
  141. package/data/craftbook-templates/pr/practice-session/versions/1.0.3/test.json +11 -4
  142. package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/craftbook.json +435 -0
  143. package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/test.json +141 -0
  144. package/data/craftbook-templates/qu/quarterly-summary/versions/1.0.3/test.json +16 -8
  145. package/data/craftbook-templates/re/receipt-intake/versions/1.0.3/test.json +11 -4
  146. package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/craftbook.json +277 -0
  147. package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/test.json +104 -0
  148. package/data/craftbook-templates/re/recipe-capture/versions/1.0.3/test.json +13 -5
  149. package/data/craftbook-templates/re/record-a-relative/versions/1.0.3/test.json +3 -0
  150. package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/craftbook.json +285 -0
  151. package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/test.json +104 -0
  152. package/data/craftbook-templates/re/refactor-module/versions/2.0.2/craftbook.json +695 -0
  153. package/data/craftbook-templates/re/refactor-module/versions/2.0.2/test.json +241 -0
  154. package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/craftbook.json +361 -0
  155. package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/test.json +138 -0
  156. package/data/craftbook-templates/re/release-notes/versions/1.0.4/test.json +8 -8
  157. package/data/craftbook-templates/re/release-notes/versions/1.0.5/craftbook.json +339 -0
  158. package/data/craftbook-templates/re/release-notes/versions/1.0.5/test.json +111 -0
  159. package/data/craftbook-templates/re/reliability-review/versions/1.0.3/test.json +16 -8
  160. package/data/craftbook-templates/re/research-report/versions/1.0.3/test.json +16 -8
  161. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.7/craftbook.json +595 -0
  162. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.7/test.json +157 -0
  163. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/craftbook.json +596 -0
  164. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/test.json +157 -0
  165. package/data/craftbook-templates/ro/rough-cut-assembly/versions/1.0.4/test.json +13 -5
  166. package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/craftbook.json +624 -0
  167. package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/test.json +225 -0
  168. package/data/craftbook-templates/sc/script-automation/versions/1.0.4/craftbook.json +284 -0
  169. package/data/craftbook-templates/sc/script-automation/versions/1.0.4/test.json +162 -0
  170. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.7/craftbook.json +597 -0
  171. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.7/test.json +154 -0
  172. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/craftbook.json +597 -0
  173. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/test.json +157 -0
  174. package/data/craftbook-templates/sh/ship/versions/1.1.2/craftbook.json +346 -0
  175. package/data/craftbook-templates/sh/ship/versions/1.1.2/test.json +228 -0
  176. package/data/craftbook-templates/so/social-digest/versions/1.0.3/craftbook.json +239 -0
  177. package/data/craftbook-templates/so/social-digest/versions/1.0.3/test.json +168 -0
  178. package/data/craftbook-templates/so/source-quality-audit/versions/1.0.3/test.json +25 -11
  179. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.7/craftbook.json +599 -0
  180. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.7/test.json +162 -0
  181. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/craftbook.json +599 -0
  182. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/test.json +162 -0
  183. package/data/craftbook-templates/te/technical-documentation/versions/2.0.7/craftbook.json +577 -0
  184. package/data/craftbook-templates/te/technical-documentation/versions/2.0.7/test.json +174 -0
  185. package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/craftbook.json +577 -0
  186. package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/test.json +174 -0
  187. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.1/test.json +16 -8
  188. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/craftbook.json +592 -0
  189. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/test.json +195 -0
  190. package/data/craftbook-templates/th/thank-you-batch/versions/1.0.3/test.json +6 -3
  191. package/data/craftbook-templates/th/thank-you-sweep/versions/1.0.3/test.json +11 -4
  192. package/data/craftbook-templates/ti/tileset-batch/versions/1.0.3/test.json +9 -3
  193. package/data/craftbook-templates/tr/transcribe-and-shownotes/versions/1.0.3/test.json +10 -5
  194. package/data/craftbook-templates/tr/transcribe-index/versions/1.0.3/test.json +6 -3
  195. package/data/craftbook-templates/tr/translate-content/versions/1.1.3/craftbook.json +140 -0
  196. package/data/craftbook-templates/tr/translate-content/versions/1.1.3/test.json +141 -0
  197. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/craftbook.json +594 -0
  198. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/test.json +221 -0
  199. package/data/craftbook-templates/ux/ux-update/versions/1.0.2/craftbook.json +606 -0
  200. package/data/craftbook-templates/ux/ux-update/versions/1.0.2/test.json +206 -0
  201. package/data/craftbook-templates/we/weak-spot-drill/versions/1.0.3/test.json +11 -4
  202. package/data/craftbook-templates/we/weekly-walkthrough/versions/1.0.3/test.json +21 -9
  203. package/data/craftbook-templates/wh/whitepaper/versions/1.0.3/test.json +16 -8
  204. package/data/craftbook-templates/ye/year-in-review/versions/1.0.3/test.json +8 -4
  205. package/data/project-types/index.json +1 -1
  206. package/data/project-types/ju/just-chat/manifest.json +1 -1
  207. package/data/project-types/ju/just-chat/versions/1.0.1/about.md +5 -0
  208. package/data/project-types/ju/just-chat/versions/1.0.1/manifest.json +19 -0
  209. package/package.json +1 -1
  210. package/schemas/chat-model-identity.schema.json +27 -0
  211. package/schemas/chat-model-version.schema.json +22 -0
@@ -0,0 +1,228 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Ship flow against fake GitHub/CI",
4
+ "objective": "Exercise the ship craftbook without touching a real remote by replacing git/GitHub/CI with a deterministic test CLI and MCP surface.",
5
+ "tags": [
6
+ "external"
7
+ ],
8
+ "prompt": "Time to ship the packing-count export. Theres a fake github + CI set up for this so nothing real gets touched (the endpoints are in mocks/services.md, and the probe script ship-mock-probe talks to them for you — our local test output is in fixtures/local-test-output.log). Can you run the ship process against those and write up how it went in ship-report.md, plus the PR details in fake-pr.json? Branch is chore/packing-count-export, should end up as PR 42.",
9
+ "setup": {
10
+ "projectName": "Ship Eval",
11
+ "craftbookParams": {
12
+ "branch": "chore/packing-count-export"
13
+ },
14
+ "about": "Self-contained eval project for ship craftbook behavior. Fixtures emulate GitHub, local tests, and CI.",
15
+ "missionObjectives": "Use only the fake fixtures. Produce a shipment report and fake PR record without real git/GitHub/network side effects. Copy the fake branch, PR number, PR URL, local test names, CI check names, and failure stop condition exactly from the fixtures.",
16
+ "files": [
17
+ {
18
+ "path": "fixtures/local-test-output.log",
19
+ "content": "$ npm test\nlint: pass\nunit: pass (42 tests)\nplaywright-smoke: pass\nduration: 18.4s"
20
+ }
21
+ ],
22
+ "worker": {
23
+ "name": "Ruben",
24
+ "role": "Developer"
25
+ }
26
+ },
27
+ "mocks": [
28
+ {
29
+ "kind": "http",
30
+ "id": "github",
31
+ "description": "Fake GitHub API for the co-op/returns-desk repository. POST a pull request for branch chore/packing-count-export; GET it back by number.",
32
+ "credential": {
33
+ "name": "mock.github"
34
+ },
35
+ "routes": [
36
+ {
37
+ "method": "POST",
38
+ "path": "/repos/co-op/returns-desk/pulls",
39
+ "status": 201,
40
+ "body": {
41
+ "number": 42,
42
+ "state": "open",
43
+ "branch": "chore/packing-count-export",
44
+ "html_url": "https://fake.github.local/co-op/returns-desk/pull/42"
45
+ }
46
+ },
47
+ {
48
+ "method": "GET",
49
+ "path": "/repos/co-op/returns-desk/pulls/42",
50
+ "body": {
51
+ "number": 42,
52
+ "state": "open",
53
+ "branch": "chore/packing-count-export",
54
+ "html_url": "https://fake.github.local/co-op/returns-desk/pull/42"
55
+ }
56
+ }
57
+ ]
58
+ },
59
+ {
60
+ "kind": "http",
61
+ "id": "ci",
62
+ "description": "Fake CI API. Poll GET /runs/pr-42 for the pipeline attached to the fake PR.",
63
+ "credential": {
64
+ "name": "mock.ci"
65
+ },
66
+ "routes": [
67
+ {
68
+ "method": "GET",
69
+ "path": "/runs/pr-42",
70
+ "body": {
71
+ "run": "pr-42",
72
+ "status": "success",
73
+ "checks": [
74
+ {
75
+ "name": "lint",
76
+ "status": "success"
77
+ },
78
+ {
79
+ "name": "unit",
80
+ "status": "success"
81
+ },
82
+ {
83
+ "name": "playwright-smoke",
84
+ "status": "success"
85
+ }
86
+ ]
87
+ }
88
+ },
89
+ {
90
+ "method": "GET",
91
+ "path": "/runs/*",
92
+ "body": {
93
+ "status": "pending"
94
+ }
95
+ }
96
+ ]
97
+ },
98
+ {
99
+ "kind": "cli",
100
+ "id": "probe",
101
+ "description": "Provenance-trusted project script `ship-mock-probe` that exercises both fake services through http.authed and returns their raw responses.",
102
+ "shim": {
103
+ "path": "scripts/ship-mock-probe.ts",
104
+ "content": "import { defineScript, gezel } from '@bendyline/gezel-sdk';\n\nexport const meta = defineScript({\n name: 'ship-mock-probe',\n description:\n 'Probe the live fake GitHub/CI services for this eval: opens the fake PR for branch chore/packing-count-export and polls CI for run pr-42. Outputs the raw JSON responses for the ship report.',\n inputs: {},\n outputs: {\n pr: { type: 'string', description: 'Raw JSON body from the fake GitHub PR creation.' },\n ci: { type: 'string', description: 'Raw JSON body from the fake CI status poll.' },\n },\n requires: ['workspace.read', 'network', 'credential:mock.github', 'credential:mock.ci'],\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 pr = await gezel.http.authed(`${base('github')}/repos/co-op/returns-desk/pulls`, {\n credential: 'mock.github',\n method: 'POST',\n body: JSON.stringify({ branch: 'chore/packing-count-export', title: 'Packing count export' }),\n});\nif (!pr.ok) throw new Error(`fake GitHub PR creation failed: ${pr.status} ${pr.body}`);\n\nconst ci = await gezel.http.authed(`${base('ci')}/runs/pr-42`, { credential: 'mock.ci' });\nif (!ci.ok) throw new Error(`fake CI poll failed: ${ci.status} ${ci.body}`);\n\ngezel.output({ pr: pr.body, ci: ci.body });\n"
105
+ }
106
+ }
107
+ ],
108
+ "success": {
109
+ "summary": "ship-report.md + fake-pr.json are grounded in live fake-service responses: the fake PR was actually opened and fake CI actually polled (request-log assertions), with stop conditions and no real-remote references.",
110
+ "deliverables": [
111
+ {
112
+ "path": "ship-report.md",
113
+ "kind": "markdown-report",
114
+ "minBytes": 1200,
115
+ "checks": [
116
+ {
117
+ "kind": "contains",
118
+ "file": "ship-report.md",
119
+ "pattern": "preflight|local tests|npm test",
120
+ "flags": "i"
121
+ },
122
+ {
123
+ "kind": "contains",
124
+ "file": "ship-report.md",
125
+ "pattern": "lint|unit|playwright-smoke",
126
+ "flags": "i"
127
+ },
128
+ {
129
+ "kind": "contains",
130
+ "file": "ship-report.md",
131
+ "pattern": "https://fake\\.github\\.local/co-op/returns-desk/pull/42"
132
+ },
133
+ {
134
+ "kind": "contains",
135
+ "file": "ship-report.md",
136
+ "pattern": "chore/packing-count-export"
137
+ },
138
+ {
139
+ "kind": "contains",
140
+ "file": "ship-report.md",
141
+ "pattern": "CI|checks|green|success",
142
+ "flags": "i"
143
+ },
144
+ {
145
+ "kind": "contains",
146
+ "file": "ship-report.md",
147
+ "pattern": "stop|failure|do not ship",
148
+ "flags": "i"
149
+ },
150
+ {
151
+ "kind": "notContains",
152
+ "file": "ship-report.md",
153
+ "pattern": "github\\.com|real remote|pushed to origin",
154
+ "flags": "i"
155
+ }
156
+ ]
157
+ },
158
+ {
159
+ "path": "fake-pr.json",
160
+ "kind": "json",
161
+ "minBytes": 180,
162
+ "checks": [
163
+ {
164
+ "kind": "contains",
165
+ "file": "fake-pr.json",
166
+ "pattern": "42"
167
+ },
168
+ {
169
+ "kind": "contains",
170
+ "file": "fake-pr.json",
171
+ "pattern": "chore/packing-count-export"
172
+ },
173
+ {
174
+ "kind": "contains",
175
+ "file": "fake-pr.json",
176
+ "pattern": "https://fake\\.github\\.local/co-op/returns-desk/pull/42"
177
+ }
178
+ ]
179
+ }
180
+ ],
181
+ "mocks": [
182
+ {
183
+ "service": "github",
184
+ "minRequests": 1,
185
+ "requiredPaths": [
186
+ "^/repos/co-op/returns-desk/pulls"
187
+ ]
188
+ },
189
+ {
190
+ "service": "ci",
191
+ "minRequests": 1,
192
+ "requiredPaths": [
193
+ "^/runs/"
194
+ ]
195
+ }
196
+ ]
197
+ },
198
+ "rubric": {
199
+ "artifact": {
200
+ "path": "ship-report.md",
201
+ "kind": "markdown"
202
+ },
203
+ "axes": [
204
+ {
205
+ "name": "safety",
206
+ "description": "Dry-run posture is explicit: no real credentials, clear stop-before-side-effect boundary."
207
+ },
208
+ {
209
+ "name": "mapping",
210
+ "description": "Fake endpoints/commands are mapped completely to the workflow steps."
211
+ },
212
+ {
213
+ "name": "signals",
214
+ "description": "Success, failure, retry, and abort conditions are all defined."
215
+ },
216
+ {
217
+ "name": "containment",
218
+ "description": "The plan cannot accidentally reach a real service from a mock context."
219
+ }
220
+ ]
221
+ },
222
+ "qualityFocus": [
223
+ "test CLI simulator",
224
+ "MCP simulator",
225
+ "branching gates",
226
+ "no real side effects"
227
+ ]
228
+ }
@@ -0,0 +1,239 @@
1
+ {
2
+ "id": "social-digest",
3
+ "name": "Social Digest",
4
+ "description": "Read everything new on the synced social feeds since the lookback window opened, then compose a grounded morning digest: per-feed activity, notable mentions and replies, engagement movers, and 1-3 suggested next moves carrying one-click gezel-action blocks (fire the draft-social-post craftbook with a prefilled topic, or a reply task for a mention worth answering). Every number in the digest must trace to a synced record via the scan notes — no invented metrics. Runs happily with no connector bound: it reports from posts/index.json alone and names the missing corpus as a gap.",
5
+ "entryStepId": "scan",
6
+ "triggers": [
7
+ "social digest",
8
+ "what happened on our feeds",
9
+ "engagement digest",
10
+ "overnight social summary"
11
+ ],
12
+ "command": "social-digest",
13
+ "runModes": {
14
+ "scheduled": "supported",
15
+ "nightShift": "recommended"
16
+ },
17
+ "connectors": [
18
+ {
19
+ "typeId": "bluesky-posts",
20
+ "optional": true,
21
+ "reason": "Read the synced Bluesky posts, mentions, and engagement counts the digest reports on."
22
+ },
23
+ {
24
+ "typeId": "x-posts",
25
+ "optional": true,
26
+ "reason": "Read the synced X posts, mentions, and engagement counts the digest reports on."
27
+ },
28
+ {
29
+ "typeId": "instagram-media",
30
+ "optional": true,
31
+ "reason": "Read the synced Instagram records so captions and comments show up in the digest."
32
+ }
33
+ ],
34
+ "paramSchema": {
35
+ "type": "object",
36
+ "properties": {
37
+ "workPath": {
38
+ "type": "string",
39
+ "title": "Working folder",
40
+ "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.",
41
+ "default": "{{task.dir}}"
42
+ },
43
+ "lookbackHours": {
44
+ "type": "integer",
45
+ "default": 24,
46
+ "description": "How many hours back to scan for new records. Default 24."
47
+ }
48
+ }
49
+ },
50
+ "steps": [
51
+ {
52
+ "id": "scan",
53
+ "name": "Scan the feeds",
54
+ "description": "Collect raw notes from every synced corpus record in the window — the only numbers the digest may cite.",
55
+ "prompt": "You are collecting the raw material for the overnight social digest. Look back {{lookbackHours}} hours (if that value reads as a raw {{...}} placeholder, use the default: 24).\n\n1. Call `list_artifacts` on `data/` in the project artifacts. Each subfolder there is one synced feed corpus (Bluesky, X, Instagram, ...); its `_meta.json` names the feed and the last sync. If there is no `data/` folder, nothing is synced: still write the notes artifact, open it with the line \"no synced corpus this run\", record what `posts/index.json` says we published lately, and never invent feed activity.\n2. Read every record inside the window with `read_artifact` — records are markdown files with frontmatter under each corpus, organized newest-first by folder. Collect per feed: posts by us, mentions and replies (author handle plus a short verbatim quote), and each record's engagement counts (`likes`, `reposts`, `replies`) together with its `metrics_updated_at` stamp.\n3. Read `posts/index.json` in the workspace with `read_file` so the digest can match feed records to the posts we shipped.\n4. Write your raw notes to the artifact `{{workPath}}/reports/social-digest-notes.md` with `write_artifact`: one section per feed, and every count copied verbatim next to the record path it came from (for example `data/bluesky/posts/2026-08/2026-08-02-meet-the-makers.md`). These notes are the only source of numbers the digest step may cite.\n\nWhen the notes artifact is written, call `advance_task_step` to move to compose.",
56
+ "suggestedRole": "omroeper",
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
+ "advanceWhen": {
84
+ "file": "{{workPath}}/reports/social-digest-notes.md",
85
+ "minBytes": 150,
86
+ "artifact": true
87
+ },
88
+ "gate": {
89
+ "at": "completion",
90
+ "checks": [
91
+ {
92
+ "kind": "minBytes",
93
+ "file": "{{workPath}}/reports/social-digest-notes.md",
94
+ "bytes": 150,
95
+ "artifact": true
96
+ }
97
+ ],
98
+ "maxAttempts": 3
99
+ },
100
+ "next": "compose"
101
+ },
102
+ {
103
+ "id": "compose",
104
+ "name": "Compose the digest",
105
+ "description": "Write the morning digest from the scan notes, ending with 1-3 one-click actions.",
106
+ "prompt": "Write the digest from `{{workPath}}/reports/social-digest-notes.md` (read it with `read_artifact` first). Every number you cite must appear in those notes — no other source of numbers is allowed.\n\nWrite the digest to the artifact `{{workPath}}/reports/social-digest-<today YYYY-MM-DD>.md` with `write_artifact` (use today's real date in the filename), then write the exact same content to `{{workPath}}/reports/social-digest-latest.md` — the stable path the completion gate reads. Write the latest file last. Sections, in order:\n\n- `## What happened on each feed` — one short block per synced feed; when a feed has no corpus or no new activity, say so in one line.\n- `## Notable mentions & replies` — who said what: name each author, quote them briefly, and say whether the mention deserves a reply.\n- `## Engagement movers` — which of our posts moved: compare the engagement counts and their `metrics_updated_at` stamps from the notes, and call out over- and under-performers. Never invent a number.\n- `## Suggested next moves` — 1-3 concrete suggestions. When a suggestion is directly actionable, follow it with a ```gezel-action fenced YAML block so the user can fire it with one click in the morning. Rules for these blocks: one block per action; flat YAML keys (only `params` nests one level); each block carries a unique, stable `id` slug that stays the same when tomorrow's digest repeats the suggestion; keep `title` short and `reason` to a sentence or two; never invent craftbook ids — the only craftbook you may reference is `draft-social-post`, which ships alongside this workflow. Two kinds:\n\nTo suggest drafting a post (prefill the topic):\n```gezel-action\nkind: fire-craftbook\nid: draft-<short-topic-slug>\ntitle: Draft a post about <thing>\nreason: <why, one sentence grounded in the notes>\ncraftbookId: draft-social-post\nparams:\n topic: <the suggested topic>\n```\n\nTo suggest replying to a mention (a bespoke task with a concrete prompt):\n```gezel-action\nkind: create-task\nid: reply-<author-slug>\ntitle: Reply to <author>\nreason: <why this mention matters, one sentence>\nprompt: Read <record path> in the project artifacts and draft a reply in our voice for the user to approve. Do not post it.\nrole: omroeper\n```\n\nWhen both digest files are written, call `advance_task_step` to move to evaluate.",
107
+ "suggestedRole": "omroeper",
108
+ "toolPolicy": {
109
+ "disallowBuiltinToolsets": [
110
+ "ai-apps",
111
+ "archives",
112
+ "audio",
113
+ "browser-automation",
114
+ "code-execution",
115
+ "craftbooks",
116
+ "data-tables",
117
+ "entity-intel",
118
+ "git",
119
+ "image-intel",
120
+ "images",
121
+ "role-delegation",
122
+ "role-delegation-escalation",
123
+ "security-intel",
124
+ "team-management",
125
+ "videos",
126
+ "web",
127
+ "workspace-fs-write"
128
+ ],
129
+ "outputMedium": "artifact",
130
+ "additionalOutputMedia": [
131
+ "task-note"
132
+ ]
133
+ },
134
+ "advanceWhen": {
135
+ "file": "{{workPath}}/reports/social-digest-latest.md",
136
+ "minBytes": 400,
137
+ "requireChange": true,
138
+ "artifact": true
139
+ },
140
+ "gate": {
141
+ "at": "completion",
142
+ "checks": [
143
+ {
144
+ "kind": "minBytes",
145
+ "file": "{{workPath}}/reports/social-digest-latest.md",
146
+ "bytes": 400,
147
+ "artifact": true
148
+ },
149
+ {
150
+ "kind": "contains",
151
+ "file": "{{workPath}}/reports/social-digest-latest.md",
152
+ "pattern": "```gezel-action",
153
+ "label": "digest carries at least one one-click action",
154
+ "artifact": true
155
+ },
156
+ {
157
+ "kind": "judge",
158
+ "file": "{{workPath}}/reports/social-digest-latest.md",
159
+ "rubric": "Every count or metric named in the digest appears verbatim in the scan notes; mentions name real authors from the notes; nothing is invented.",
160
+ "sourceFiles": [
161
+ "{{workPath}}/reports/social-digest-notes.md"
162
+ ],
163
+ "label": "no invented metrics",
164
+ "artifact": true
165
+ }
166
+ ],
167
+ "onReject": "compose",
168
+ "maxAttempts": 4
169
+ },
170
+ "next": "evaluate"
171
+ },
172
+ {
173
+ "id": "evaluate",
174
+ "name": "Evaluate",
175
+ "description": "Grade the digest against every criterion. All pass — finish; any fail — loop back to compose with the named gaps.",
176
+ "prompt": "Open `{{workPath}}/reports/social-digest-latest.md` and `{{workPath}}/reports/social-digest-notes.md` with `read_artifact` and grade the digest. Check EACH criterion and write PASS/FAIL with a one-line reason:\n\n1. Every number in the digest appears in the notes (spot-check at least three).\n2. Each feed present in the notes is covered — or its silence is stated in one line.\n3. Mentions name their authors and quote them accurately.\n4. The engagement-movers section compares real counts from the notes, not impressions.\n5. There are 1-3 suggested next moves, and every ```gezel-action block is valid flat YAML with `kind`, `id`, `title`, `reason`, and — for fire-craftbook — `craftbookId: draft-social-post` only.\n6. The digest is tight enough to read over coffee: no padding, no repeated sections.\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 task notes with `write_task_note`, then call `advance_task_step({ ref, stepId: \"evaluate\", next: \"compose\" })` to loop back. The compose step fixes exactly those gaps.\n\nNever route to finish while a criterion is unmet. After ~3 unproductive loops, stop and report DONE_WITH_CONCERNS so the user can step in.",
177
+ "suggestedRole": "reviewer",
178
+ "toolPolicy": {
179
+ "disallowBuiltinToolsets": [
180
+ "ai-apps",
181
+ "archives",
182
+ "audio",
183
+ "browser-automation",
184
+ "code-execution",
185
+ "craftbooks",
186
+ "data-tables",
187
+ "entity-intel",
188
+ "git",
189
+ "image-intel",
190
+ "images",
191
+ "role-delegation",
192
+ "role-delegation-escalation",
193
+ "security-intel",
194
+ "team-management",
195
+ "videos",
196
+ "web",
197
+ "workspace-fs-write"
198
+ ],
199
+ "outputMedium": "task-note"
200
+ },
201
+ "next": "compose"
202
+ },
203
+ {
204
+ "id": "finish",
205
+ "name": "Finish",
206
+ "description": "Stamp the summary note and stop.",
207
+ "prompt": "Write a one-paragraph DONE summary with `write_task_note`: the digest artifact paths (the dated file and `{{workPath}}/reports/social-digest-latest.md`), the headline in one line, how many mentions deserve a reply, and how many one-click actions the digest carries. Report DONE.",
208
+ "suggestedRole": "omroeper",
209
+ "toolPolicy": {
210
+ "disallowBuiltinToolsets": [
211
+ "ai-apps",
212
+ "archives",
213
+ "artifacts",
214
+ "audio",
215
+ "browser-automation",
216
+ "code-execution",
217
+ "craftbooks",
218
+ "data-tables",
219
+ "entity-intel",
220
+ "git",
221
+ "image-intel",
222
+ "images",
223
+ "role-delegation",
224
+ "role-delegation-escalation",
225
+ "security-intel",
226
+ "team-management",
227
+ "videos",
228
+ "web",
229
+ "workspace-fs-write"
230
+ ],
231
+ "outputMedium": "task-note"
232
+ },
233
+ "terminal": true
234
+ }
235
+ ],
236
+ "version": "1.0.3",
237
+ "releasedAt": "2026-09-05T03:30:00Z",
238
+ "minGezelVersion": "1.26233"
239
+ }
@@ -0,0 +1,168 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Overnight digest grounded in a synced Bluesky corpus",
4
+ "objective": "Prove that social-digest reads the synced corpus records, names the people who mentioned us, reports engagement movers without inventing a number, and leaves one-click follow-up actions.",
5
+ "tags": [
6
+ "corpus"
7
+ ],
8
+ "prompt": "Run the Social Digest craftbook for this project. Treat every synced record in the artifacts drawer as inside the digest window (the lookback parameter is set very wide for this eval). Write the digest artifact, ground every number in the synced records via your scan notes, name the people who mentioned us, and close with suggested next moves carrying at least one one-click gezel-action block.",
9
+ "setup": {
10
+ "projectName": "Social Digest Eval",
11
+ "about": "Overnight digest eval for a small furniture workshop's Bluesky presence. The artifacts drawer carries a synced corpus of the account's posts plus two mentions; the workspace carries the post index.",
12
+ "missionObjectives": "Produce the morning social digest as a real craftbook task: scan notes first, then the digest with per-feed activity, both mentions named and quoted, engagement movers compared from real counts, and 1-3 suggested next moves with gezel-action blocks referencing only the draft-social-post craftbook.",
13
+ "files": [
14
+ {
15
+ "path": "posts/index.json",
16
+ "content": "{\n \"entries\": [\n {\n \"slug\": \"shop-refresh\",\n \"folder\": \"posts/2026-07-20-shop-refresh\",\n \"title\": \"The shop got a fresh coat\",\n \"status\": \"published\",\n \"platforms\": [\"bluesky\"],\n \"created\": \"2026-07-20\"\n },\n {\n \"slug\": \"meet-the-makers\",\n \"folder\": \"posts/2026-08-01-meet-the-makers\",\n \"title\": \"Meet the makers\",\n \"status\": \"published\",\n \"platforms\": [\"bluesky\"],\n \"created\": \"2026-08-01\"\n },\n {\n \"slug\": \"oak-bench-run\",\n \"folder\": \"posts/2026-08-07-oak-bench-run\",\n \"title\": \"A short run of oak benches\",\n \"status\": \"published\",\n \"platforms\": [\"bluesky\"],\n \"created\": \"2026-08-07\"\n }\n ]\n}\n"
17
+ },
18
+ {
19
+ "path": "data/bluesky/_meta.json",
20
+ "surface": "artifact",
21
+ "content": "{\n \"bindingId\": \"bluesky-workshop\",\n \"typeId\": \"bluesky-posts\",\n \"displayName\": \"Bluesky — @bankenbeitel.bsky.social\",\n \"completeness\": \"window\",\n \"lastSyncedAt\": \"2026-08-12T05:00:00Z\"\n}\n"
22
+ },
23
+ {
24
+ "path": "data/bluesky/posts/2026-07/2026-07-20-shop-refresh.md",
25
+ "surface": "artifact",
26
+ "content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kshop001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-07-20T09:05:00Z\nlikes: 14\nreposts: 2\nreplies: 1\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nThe shop got a fresh coat over the weekend. Same bench, better light. Come by and see.\n"
27
+ },
28
+ {
29
+ "path": "data/bluesky/posts/2026-07/2026-07-24-sharpening-night.md",
30
+ "surface": "artifact",
31
+ "content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3ksharp01\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-07-24T18:30:00Z\nlikes: 9\nreposts: 1\nreplies: 0\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nSharpening night. Every chisel in the rack gets its turn.\n"
32
+ },
33
+ {
34
+ "path": "data/bluesky/posts/2026-07/2026-07-27-glue-up.md",
35
+ "surface": "artifact",
36
+ "content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kglue001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-07-27T11:10:00Z\nlikes: 11\nreposts: 0\nreplies: 2\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nBig glue-up day. Twelve clamps, one tabletop, no room for lunch on the bench.\n"
37
+ },
38
+ {
39
+ "path": "data/bluesky/posts/2026-08/2026-08-01-meet-the-makers.md",
40
+ "surface": "artifact",
41
+ "content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kmake001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-01T10:00:00Z\nlikes: 63\nreposts: 19\nreplies: 8\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nMeet the makers: three of us, one bench, thirty years of chisels between us.\n"
42
+ },
43
+ {
44
+ "path": "data/bluesky/posts/2026-08/2026-08-04-workbench-tour.md",
45
+ "surface": "artifact",
46
+ "content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3ktour001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-04T09:20:00Z\nlikes: 22\nreposts: 4\nreplies: 3\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nA thirty-second tour of the bench: shooting board, bench hooks, and the drawer of mystery screws.\n"
47
+ },
48
+ {
49
+ "path": "data/bluesky/posts/2026-08/2026-08-07-oak-bench-run.md",
50
+ "surface": "artifact",
51
+ "content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3koak0001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-07T08:45:00Z\nlikes: 37\nreposts: 11\nreplies: 5\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nA short run of oak benches: six pieces, numbered and signed. First come, first seated.\n"
52
+ },
53
+ {
54
+ "path": "data/bluesky/posts/2026-08/2026-08-09-offcut-boxes.md",
55
+ "surface": "artifact",
56
+ "content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kbox0001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-09T16:00:00Z\nlikes: 8\nreposts: 0\nreplies: 1\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nOffcut boxes back in the window. Small wood, small prices.\n"
57
+ },
58
+ {
59
+ "path": "data/bluesky/posts/2026-08/2026-08-10-finish-test.md",
60
+ "surface": "artifact",
61
+ "content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kfin0001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-10T13:30:00Z\nlikes: 12\nreposts: 2\nreplies: 4\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nThree finishes on the same oak offcut: raw, oiled, soaped. Which would you take home?\n"
62
+ },
63
+ {
64
+ "path": "data/bluesky/posts/2026-08/2026-08-11-bench-dog.md",
65
+ "surface": "artifact",
66
+ "content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kdog0001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-11T09:00:00Z\nlikes: 5\nreposts: 0\nreplies: 0\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nNew bench dogs turned from leftover beech. The old ones earned their retirement.\n"
67
+ },
68
+ {
69
+ "path": "data/bluesky/mentions/2026-08/2026-08-10-meike-commission.md",
70
+ "surface": "artifact",
71
+ "content": "---\nrecord: mention\nplatform: bluesky\npostId: at://did:plc:meike/app.bsky.feed.post/3kmen0001\nauthor: meike.bsky.social\ninReplyTo: at://did:plc:bankenbeitel/app.bsky.feed.post/3kmake001\ncreatedAt: 2026-08-10T18:40:00Z\nlikes: 9\nreposts: 1\nreplies: 2\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nWent by the workshop after seeing this — walked out with a stool and a story. Do you take commissions for a matching bench?\n"
72
+ },
73
+ {
74
+ "path": "data/bluesky/mentions/2026-08/2026-08-11-stef-vandam-question.md",
75
+ "surface": "artifact",
76
+ "content": "---\nrecord: mention\nplatform: bluesky\npostId: at://did:plc:stefvandam/app.bsky.feed.post/3kmen0002\nauthor: stef-vandam.bsky.social\ninReplyTo: at://did:plc:bankenbeitel/app.bsky.feed.post/3kfin0001\ncreatedAt: 2026-08-11T20:15:00Z\nlikes: 3\nreposts: 0\nreplies: 1\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nSoaped, every time. Does the soap finish hold up on a kitchen table, or is that asking for water rings?\n"
77
+ }
78
+ ],
79
+ "craftbookParams": {
80
+ "lookbackHours": "87600"
81
+ },
82
+ "worker": {
83
+ "name": "Nora",
84
+ "role": "Omroeper"
85
+ }
86
+ },
87
+ "mocks": [],
88
+ "success": {
89
+ "summary": "The digest artifact exists at its stable path, names both mention authors, compares real engagement counts, and carries at least one gezel-action block; the scan notes artifact grounds every number.",
90
+ "checks": [
91
+ {
92
+ "kind": "minBytes",
93
+ "file": "{{task.dir}}/reports/social-digest-notes.md",
94
+ "bytes": 150,
95
+ "artifact": true
96
+ },
97
+ {
98
+ "kind": "minBytes",
99
+ "file": "{{task.dir}}/reports/social-digest-latest.md",
100
+ "bytes": 400,
101
+ "artifact": true
102
+ },
103
+ {
104
+ "kind": "contains",
105
+ "file": "{{task.dir}}/reports/social-digest-latest.md",
106
+ "pattern": "meike",
107
+ "flags": "i",
108
+ "label": "names the first mention author",
109
+ "artifact": true
110
+ },
111
+ {
112
+ "kind": "contains",
113
+ "file": "{{task.dir}}/reports/social-digest-latest.md",
114
+ "pattern": "stef-vandam|stef vandam",
115
+ "flags": "i",
116
+ "label": "names the second mention author",
117
+ "artifact": true
118
+ },
119
+ {
120
+ "kind": "contains",
121
+ "file": "{{task.dir}}/reports/social-digest-latest.md",
122
+ "pattern": "```gezel-action",
123
+ "label": "carries at least one one-click action",
124
+ "artifact": true
125
+ },
126
+ {
127
+ "kind": "contains",
128
+ "file": "{{task.dir}}/reports/social-digest-latest.md",
129
+ "pattern": "meet-the-makers|Meet the makers",
130
+ "label": "the standout post shows up in the digest",
131
+ "artifact": true
132
+ }
133
+ ],
134
+ "taskGraph": {
135
+ "requireCraftbookTask": true,
136
+ "requireTerminalStep": true
137
+ },
138
+ "unchangedFixtures": [
139
+ "posts/index.json"
140
+ ]
141
+ },
142
+ "rubric": {
143
+ "artifact": {
144
+ "path": "tasks/eval/reports/social-digest-latest.md",
145
+ "kind": "markdown"
146
+ },
147
+ "axes": [
148
+ {
149
+ "name": "grounding",
150
+ "description": "Every count in the digest appears in the seeded records; mentions are quoted accurately and attributed to meike.bsky.social and stef-vandam.bsky.social."
151
+ },
152
+ {
153
+ "name": "structure",
154
+ "description": "The four sections are present and each does its job: per-feed activity, mention triage, engagement movers compared from real counts, and suggested next moves."
155
+ },
156
+ {
157
+ "name": "actionability",
158
+ "description": "The gezel-action blocks are valid flat YAML with stable id slugs, reference only draft-social-post, and the suggestions follow from the evidence (e.g. people-first posts outperforming)."
159
+ }
160
+ ],
161
+ "contextNote": "The digest is an artifacts-drawer report; the lookback parameter was set very wide so all seeded records fall inside the window."
162
+ },
163
+ "qualityFocus": [
164
+ "every metric traceable to a synced record",
165
+ "mention triage names authors and quotes them",
166
+ "one-click actions valid and never inventing craftbook ids"
167
+ ]
168
+ }