@bendyline/gilde 0.1.40 → 0.1.41

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 (147) hide show
  1. package/authoring/gstack/overlays/investigate.json +1 -0
  2. package/authoring/gstack/overlays/qa-only.json +1 -0
  3. package/authoring/gstack/wave.json +12 -2
  4. package/authoring/tactical/books/accessibility-retrofit.json +188 -0
  5. package/authoring/tactical/books/apply-review-findings.json +189 -0
  6. package/authoring/tactical/books/bug-fix-tdd.json +237 -0
  7. package/authoring/tactical/books/ci-pipeline.json +168 -0
  8. package/authoring/tactical/books/codemod-sweep.json +182 -0
  9. package/authoring/tactical/books/dependency-upgrade.json +196 -0
  10. package/authoring/tactical/books/flaky-test-fix.json +238 -0
  11. package/authoring/tactical/books/hotfix-flow.json +187 -0
  12. package/authoring/tactical/books/perf-optimization.json +219 -0
  13. package/authoring/tactical/books/refactor-module.json +217 -0
  14. package/authoring/tactical/books/schema-migration.json +192 -0
  15. package/authoring/tactical/books/test-suite-backfill.json +172 -0
  16. package/authoring/tactical/books/type-safety-pass.json +185 -0
  17. package/authoring/tactical/books/ux-update.json +178 -0
  18. package/authoring/tactical/evals/accessibility-retrofit.json +230 -0
  19. package/authoring/tactical/evals/apply-review-findings.json +290 -0
  20. package/authoring/tactical/evals/bug-fix-tdd.json +221 -0
  21. package/authoring/tactical/evals/ci-pipeline.json +227 -0
  22. package/authoring/tactical/evals/codemod-sweep.json +252 -0
  23. package/authoring/tactical/evals/dependency-upgrade.json +235 -0
  24. package/authoring/tactical/evals/flaky-test-fix.json +239 -0
  25. package/authoring/tactical/evals/hotfix-flow.json +220 -0
  26. package/authoring/tactical/evals/perf-optimization.json +235 -0
  27. package/authoring/tactical/evals/refactor-module.json +241 -0
  28. package/authoring/tactical/evals/schema-migration.json +225 -0
  29. package/authoring/tactical/evals/test-suite-backfill.json +197 -0
  30. package/authoring/tactical/evals/type-safety-pass.json +221 -0
  31. package/authoring/tactical/evals/ux-update.json +206 -0
  32. package/authoring/tactical/wave.json +89 -0
  33. package/data/chat-models/de/deepseek-r1-8b-q4/manifest.json +56 -1
  34. package/data/chat-models/gl/glm-5.2-754b-q2/manifest.json +56 -0
  35. package/data/chat-models/gp/gpt-oss-120b-q4/manifest.json +73 -1
  36. package/data/chat-models/gp/gpt-oss-20b-q4/manifest.json +77 -1
  37. package/data/chat-models/index.json +1 -1
  38. package/data/chat-models/ll/llama3.2-3b-q4/manifest.json +3 -1
  39. package/data/chat-models/mi/mistral-7b-q4/manifest.json +54 -3
  40. package/data/chat-models/mi/mistral-medium-3.5-128b-q4/manifest.json +76 -1
  41. package/data/craftbook-templates/ac/accessibility-retrofit/manifest.json +5 -4
  42. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.0/craftbook.json +451 -0
  43. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.0/test.json +231 -0
  44. package/data/craftbook-templates/al/alt-text-pass/manifest.json +5 -1
  45. package/data/craftbook-templates/ap/apply-review-findings/art.json +12 -0
  46. package/data/craftbook-templates/ap/apply-review-findings/logo.webp +0 -0
  47. package/data/craftbook-templates/ap/apply-review-findings/manifest.json +23 -0
  48. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.0/craftbook.json +436 -0
  49. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.0/test.json +291 -0
  50. package/data/craftbook-templates/br/browser-qa-audit/manifest.json +5 -1
  51. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.5/craftbook.json +438 -0
  52. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.5/test.json +379 -0
  53. package/data/craftbook-templates/bu/bug-fix-tdd/manifest.json +3 -3
  54. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.0/craftbook.json +545 -0
  55. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.0/test.json +222 -0
  56. package/data/craftbook-templates/ch/changelog-cut/manifest.json +5 -1
  57. package/data/craftbook-templates/ch/changelog-writeup/manifest.json +5 -1
  58. package/data/craftbook-templates/ci/ci-pipeline/manifest.json +5 -3
  59. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.0/craftbook.json +423 -0
  60. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.0/test.json +228 -0
  61. package/data/craftbook-templates/co/codemod-sweep/art.json +12 -0
  62. package/data/craftbook-templates/co/codemod-sweep/logo.webp +0 -0
  63. package/data/craftbook-templates/co/codemod-sweep/manifest.json +23 -0
  64. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/craftbook.json +441 -0
  65. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/test.json +253 -0
  66. package/data/craftbook-templates/de/dependency-upgrade/art.json +12 -0
  67. package/data/craftbook-templates/de/dependency-upgrade/logo.webp +0 -0
  68. package/data/craftbook-templates/de/dependency-upgrade/manifest.json +23 -0
  69. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.0/craftbook.json +459 -0
  70. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.0/test.json +236 -0
  71. package/data/craftbook-templates/fe/feature-flag-release/manifest.json +5 -1
  72. package/data/craftbook-templates/fe/feature-flag-rollout/manifest.json +4 -1
  73. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.0/craftbook.json +203 -0
  74. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.0/test.json +165 -0
  75. package/data/craftbook-templates/fl/flaky-test-fix/art.json +12 -0
  76. package/data/craftbook-templates/fl/flaky-test-fix/logo.webp +0 -0
  77. package/data/craftbook-templates/fl/flaky-test-fix/manifest.json +24 -0
  78. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.0/craftbook.json +534 -0
  79. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.0/test.json +240 -0
  80. package/data/craftbook-templates/ho/hotfix-flow/manifest.json +5 -3
  81. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.0/craftbook.json +442 -0
  82. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.0/test.json +221 -0
  83. package/data/craftbook-templates/in/investigate/manifest.json +4 -1
  84. package/data/craftbook-templates/in/investigate-root-cause/manifest.json +5 -1
  85. package/data/craftbook-templates/index.json +1 -1
  86. package/data/craftbook-templates/li/live-browser-qa/manifest.json +5 -1
  87. package/data/craftbook-templates/ni/nightly-fix-sweep/art.json +12 -0
  88. package/data/craftbook-templates/ni/nightly-fix-sweep/logo.webp +0 -0
  89. package/data/craftbook-templates/ni/nightly-fix-sweep/manifest.json +23 -0
  90. package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.0/craftbook.json +145 -0
  91. package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.0/test.json +121 -0
  92. package/data/craftbook-templates/pe/perf-audit/versions/1.1.0/craftbook.json +195 -0
  93. package/data/craftbook-templates/pe/perf-audit/versions/1.1.0/test.json +165 -0
  94. package/data/craftbook-templates/pe/perf-optimization/manifest.json +3 -3
  95. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.0/craftbook.json +511 -0
  96. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.0/test.json +236 -0
  97. package/data/craftbook-templates/qa/qa/manifest.json +3 -1
  98. package/data/craftbook-templates/re/refactor-module/manifest.json +2 -2
  99. package/data/craftbook-templates/re/refactor-module/versions/1.0.4/craftbook.json +150 -0
  100. package/data/craftbook-templates/re/refactor-module/versions/1.0.4/test.json +95 -0
  101. package/data/craftbook-templates/re/refactor-module/versions/2.0.0/craftbook.json +509 -0
  102. package/data/craftbook-templates/re/refactor-module/versions/2.0.0/test.json +242 -0
  103. package/data/craftbook-templates/re/release-notes/manifest.json +5 -1
  104. package/data/craftbook-templates/re/release-notes/versions/1.0.3/craftbook.json +220 -0
  105. package/data/craftbook-templates/re/release-notes/versions/1.0.3/test.json +114 -0
  106. package/data/craftbook-templates/re/release-pipeline-ci/manifest.json +5 -1
  107. package/data/craftbook-templates/re/release-readiness-review/versions/1.1.0/craftbook.json +192 -0
  108. package/data/craftbook-templates/re/release-readiness-review/versions/1.1.0/test.json +113 -0
  109. package/data/craftbook-templates/ro/root-cause-investigation/manifest.json +7 -1
  110. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.5/craftbook.json +433 -0
  111. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.5/test.json +157 -0
  112. package/data/craftbook-templates/sc/schema-migration/manifest.json +4 -4
  113. package/data/craftbook-templates/sc/schema-migration/versions/2.0.0/craftbook.json +459 -0
  114. package/data/craftbook-templates/sc/schema-migration/versions/2.0.0/test.json +226 -0
  115. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.0/craftbook.json +195 -0
  116. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.0/test.json +116 -0
  117. package/data/craftbook-templates/te/test-suite-backfill/manifest.json +1 -2
  118. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.0/craftbook.json +428 -0
  119. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.0/test.json +198 -0
  120. package/data/craftbook-templates/ty/type-safety-pass/manifest.json +3 -3
  121. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.0/craftbook.json +428 -0
  122. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.0/test.json +222 -0
  123. package/data/craftbook-templates/ux/ux-update/art.json +12 -0
  124. package/data/craftbook-templates/ux/ux-update/logo.webp +0 -0
  125. package/data/craftbook-templates/ux/ux-update/manifest.json +22 -0
  126. package/data/craftbook-templates/ux/ux-update/versions/1.0.0/craftbook.json +439 -0
  127. package/data/craftbook-templates/ux/ux-update/versions/1.0.0/test.json +207 -0
  128. package/data/craftbook-templates/ve/version-bump/versions/1.1.0/craftbook.json +206 -0
  129. package/data/craftbook-templates/ve/version-bump/versions/1.1.0/test.json +95 -0
  130. package/data/gezel-templates/bo/boekwachter/versions/1.1.0/about.md +29 -0
  131. package/data/gezel-templates/bo/boekwachter/versions/1.1.0/manifest.json +16 -0
  132. package/data/gezel-templates/bu/builder/versions/1.5.0/about.md +34 -0
  133. package/data/gezel-templates/bu/builder/versions/1.5.0/manifest.json +16 -0
  134. package/data/gezel-templates/de/developer/versions/1.5.0/about.md +34 -0
  135. package/data/gezel-templates/de/developer/versions/1.5.0/manifest.json +21 -0
  136. package/data/gezel-templates/index.json +1 -1
  137. package/data/gezel-templates/re/reviewer/versions/1.4.0/about.md +49 -0
  138. package/data/gezel-templates/re/reviewer/versions/1.4.0/manifest.json +21 -0
  139. package/data/project-types/index.json +1 -1
  140. package/data/project-types/so/software-project/manifest.json +20 -0
  141. package/data/project-types/so/software-project/versions/1.0.0/about.md +3 -0
  142. package/data/project-types/so/software-project/versions/1.0.0/manifest.json +41 -0
  143. package/data/project-types/so/software-project/versions/1.0.0/mission.md +4 -0
  144. package/package.json +1 -1
  145. package/schemas/craftbook-doc.schema.json +248 -0
  146. package/schemas/craftbook-template-version.schema.json +248 -0
  147. package/schemas/craftbook-test.schema.json +200 -0
@@ -0,0 +1,423 @@
1
+ {
2
+ "id": "ci-pipeline",
3
+ "name": "CI Pipeline from Scratch",
4
+ "description": "Set up continuous integration the way it survives contact with a real repo: every stage grounded in a command that actually exists, and no claim that local reading cannot back. First INVENTORY: read package.json and the repo layout, record the scripts that genuinely exist with their exact lines quoted, and decide the stages — install, lint, typecheck, test, build, whichever subset is real here — plus caching keyed to the lockfile and the triggers the work calls for. The cardinal sin this book exists to prevent is the invented command: a `run:` line calling a script the repo does not have turns the whole pipeline red on its first push, so nothing enters the plan without a quoted manifest line behind it. A release or publish stage is planned only when the repo shows one — publish config, a release script, a tag convention — and when present it is gated behind the green test/build stages and the tag trigger so publishing can never run before the checks pass. Then AUTHOR the real workflow file(s) at the conventional location for the detected host (`.github/workflows/ci.yml` for GitHub Actions by default): minimal, cached, actions pinned to major versions, gating merges on green, with no fabricated secrets or inputs. Then VERIFY by reading the workflow back and matching EVERY command it invokes to the quoted manifest line that provides it — and by being plain that CI cannot be executed locally, so the notes must say what reading verified and what only a live run on the host can prove. Finally an independent reviewer checks the same ground truth — commands exist, stages ordered, triggers match, nothing invented — and a REVISE verdict routes the work back automatically with concrete findings. Works identically whether the run edits the project directly or drafts a change proposal for the user to apply.",
5
+ "plan": "Inventory the repo's real commands and decide the stages -> author the workflow at the conventional location, cached and merge-gating -> verify every invoked command against the manifests, honest about what only a live CI run can prove -> enforced independent review.",
6
+ "entryStepId": "inventory",
7
+ "triggers": [
8
+ "set up ci",
9
+ "create a ci pipeline",
10
+ "github actions workflow",
11
+ "build a ci/cd pipeline",
12
+ "add automated testing on push",
13
+ "set up a release pipeline",
14
+ "ci/cd for releases",
15
+ "publish on tag workflow",
16
+ "github actions release",
17
+ "automate the release"
18
+ ],
19
+ "paramSchema": {
20
+ "type": "object",
21
+ "properties": {
22
+ "workPath": {
23
+ "type": "string",
24
+ "title": "Working folder",
25
+ "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.",
26
+ "default": "{{task.dir}}"
27
+ }
28
+ }
29
+ },
30
+ "steps": [
31
+ {
32
+ "id": "inventory",
33
+ "name": "Inventory the repo",
34
+ "description": "Read the real scripts and layout, then plan stages, caching, and triggers — never a command that does not exist.",
35
+ "prompt": "Learn what this repo actually needs before writing a line of YAML. Read `package.json` (and any workspace manifests) with `read_file` and record the scripts that genuinely exist — their exact names and the exact lines. Read the repo layout with `list_dir`: the lockfile (which package manager), the language, build outputs, and any existing workflow files. NEVER invent a command: a stage enters your plan only when a matching script or standard invocation exists in the repo — install, lint, typecheck, test, build, in whatever subset is real here, and nothing for tools the repo does not use. Decide caching from the lockfile and package manager, and the triggers the task calls for (typically pushes to the default branch and pull requests). Plan a release or publish stage ONLY when the repo shows one — a publish configuration, a release script, an existing tag convention; when nothing shows one, say so and leave it out. Note the CI host the repo points at (existing workflow files, hosting hints); default to GitHub Actions when nothing says otherwise.\n\nWrite `{{workPath}}/ci-plan.md` with exactly these sections: `## Detected commands` (each script name with the exact line quoted from `package.json`), `## Pipeline stages` (the stages in order and why each exists here), `## Caching` (what is cached and what it is keyed on), `## Triggers` (the events and why). Cite the real files with backtick paths.\n\nObservable handoff: write the completed result to `{{workPath}}/ci-plan.md` in the project's artifacts drawer with `write_artifact`. Do not merely describe what the file would contain. Re-read it with `read_artifact` before finishing this phase and repair any incomplete sections.",
36
+ "suggestedRole": "devops engineer",
37
+ "capabilityFloor": "small",
38
+ "advanceWhen": {
39
+ "file": "{{workPath}}/ci-plan.md",
40
+ "minBytes": 500,
41
+ "sniff": "nonempty",
42
+ "requireChange": true,
43
+ "artifact": true,
44
+ "goto": "author"
45
+ },
46
+ "gate": {
47
+ "at": "completion",
48
+ "checks": [
49
+ {
50
+ "kind": "minBytes",
51
+ "file": "{{workPath}}/ci-plan.md",
52
+ "bytes": 500,
53
+ "artifact": true
54
+ },
55
+ {
56
+ "kind": "sniff",
57
+ "file": "{{workPath}}/ci-plan.md",
58
+ "sniff": "nonempty",
59
+ "artifact": true
60
+ },
61
+ {
62
+ "kind": "contains",
63
+ "file": "{{workPath}}/ci-plan.md",
64
+ "pattern": "^##\\s+Detected commands",
65
+ "flags": "im",
66
+ "label": "Detected commands section",
67
+ "artifact": true
68
+ },
69
+ {
70
+ "kind": "contains",
71
+ "file": "{{workPath}}/ci-plan.md",
72
+ "pattern": "^##\\s+Pipeline stages",
73
+ "flags": "im",
74
+ "label": "Pipeline stages section",
75
+ "artifact": true
76
+ },
77
+ {
78
+ "kind": "contains",
79
+ "file": "{{workPath}}/ci-plan.md",
80
+ "pattern": "^##\\s+Caching",
81
+ "flags": "im",
82
+ "label": "Caching section",
83
+ "artifact": true
84
+ },
85
+ {
86
+ "kind": "contains",
87
+ "file": "{{workPath}}/ci-plan.md",
88
+ "pattern": "^##\\s+Triggers",
89
+ "flags": "im",
90
+ "label": "Triggers section",
91
+ "artifact": true
92
+ },
93
+ {
94
+ "kind": "citationsResolve",
95
+ "file": "{{workPath}}/ci-plan.md",
96
+ "minCitations": 2,
97
+ "artifact": true
98
+ }
99
+ ],
100
+ "onReject": "inventory",
101
+ "maxAttempts": 4
102
+ },
103
+ "next": "author"
104
+ },
105
+ {
106
+ "id": "author",
107
+ "name": "Author the workflow",
108
+ "description": "Write the real workflow file(s) at the conventional location — minimal, cached, pinned, gating merges on green.",
109
+ "prompt": "Read `{{workPath}}/ci-plan.md` and write the REAL workflow file(s) with `write_file` at the conventional location for the detected host — for GitHub Actions, `.github/workflows/ci.yml` unless the repo already has its own convention. Keep it minimal and fast: the planned stages in order, dependency caching wired to the lockfile, and the workflow triggering on the planned pushes and pull requests so merges gate on green. Pin every action to a major version (for example `actions/checkout@v4`); do not invent action names, inputs, or secrets. Every `run:` line must invoke a command the plan detected — nothing else. Add a release or publish job ONLY if ci-plan.md called for one, and gate it behind the green build/test stages and the tag trigger so a publish can never run before the checks pass; if the plan named no release stage, do not add one.\n\nThen write `{{workPath}}/ci-notes.md` with exactly these sections: `## Files written` (the real path of every workflow file, backtick path per line), `## Stages` (each job and step, and the detected command it runs), `## Choices explained` (caching, triggers, pinning, and anything you deliberately left out — including a release job when the repo showed no evidence for one). Before working, open `{{workPath}}/ci-plan.md` with `read_artifact`.\n\nObservable handoff: write the completed result to `{{workPath}}/ci-notes.md` in the project's artifacts drawer with `write_artifact`. Do not merely describe what the file would contain. Re-read it with `read_artifact` before finishing this phase and repair any incomplete sections.",
110
+ "suggestedRole": "devops engineer",
111
+ "capabilityFloor": "small",
112
+ "consumes": [
113
+ {
114
+ "file": "{{workPath}}/ci-plan.md",
115
+ "artifact": true
116
+ }
117
+ ],
118
+ "advanceWhen": {
119
+ "file": "{{workPath}}/ci-notes.md",
120
+ "minBytes": 500,
121
+ "sniff": "nonempty",
122
+ "requireChange": true,
123
+ "artifact": true,
124
+ "goto": "verify"
125
+ },
126
+ "gate": {
127
+ "at": "completion",
128
+ "checks": [
129
+ {
130
+ "kind": "minBytes",
131
+ "file": "{{workPath}}/ci-notes.md",
132
+ "bytes": 500,
133
+ "artifact": true
134
+ },
135
+ {
136
+ "kind": "sniff",
137
+ "file": "{{workPath}}/ci-notes.md",
138
+ "sniff": "nonempty",
139
+ "artifact": true
140
+ },
141
+ {
142
+ "kind": "contains",
143
+ "file": "{{workPath}}/ci-notes.md",
144
+ "pattern": "^##\\s+Files written",
145
+ "flags": "im",
146
+ "label": "Files written section",
147
+ "artifact": true
148
+ },
149
+ {
150
+ "kind": "contains",
151
+ "file": "{{workPath}}/ci-notes.md",
152
+ "pattern": "^##\\s+Stages",
153
+ "flags": "im",
154
+ "label": "Stages section",
155
+ "artifact": true
156
+ },
157
+ {
158
+ "kind": "contains",
159
+ "file": "{{workPath}}/ci-notes.md",
160
+ "pattern": "^##\\s+Choices explained",
161
+ "flags": "im",
162
+ "label": "Choices explained section",
163
+ "artifact": true
164
+ },
165
+ {
166
+ "kind": "citationsResolve",
167
+ "file": "{{workPath}}/ci-notes.md",
168
+ "minCitations": 2,
169
+ "artifact": true
170
+ }
171
+ ],
172
+ "onReject": "author",
173
+ "maxAttempts": 4
174
+ },
175
+ "next": "verify"
176
+ },
177
+ {
178
+ "id": "verify",
179
+ "name": "Verify against the manifests",
180
+ "description": "Read the workflow back and match every invoked command to the manifest line that provides it; honest about what only a live run proves.",
181
+ "prompt": "Verify the workflow the only honest way available without a CI run: read it back and check every claim against the repo. Open each workflow file named in `{{workPath}}/ci-notes.md` with `read_file`, and for EVERY command it invokes, find and quote the `package.json` line (or manifest entry) that provides it — a `run:` line with no matching script is a defect: fix it now at the workflow's real site, not in prose. Confirm the triggers match `{{workPath}}/ci-plan.md`. Confirm every action reference is pinned to a major version, and every secret the workflow references is a standard one (`GITHUB_TOKEN`) or one the user explicitly named — an invented secret is a defect. Be plain about the limit of this verification: CI cannot be executed locally, so state what reading verified and what only a real run on the host can prove — never claim the pipeline ran.\n\nWrite `{{workPath}}/verification.md` with exactly these sections: `## Workflow files` (each file checked, backtick paths), `## Commands verified against package.json` (each workflow command with the quoted manifest line that provides it), `## Result` (what reading verified, what only a live CI run can prove, and any defects found and fixed). Before working, open `{{workPath}}/ci-plan.md`, `{{workPath}}/ci-notes.md` with `read_artifact`.\n\nObservable handoff: write the completed result to `{{workPath}}/verification.md` in the project's artifacts drawer with `write_artifact`. Do not merely describe what the file would contain. Re-read it with `read_artifact` before finishing this phase and repair any incomplete sections.",
182
+ "suggestedRole": "devops engineer",
183
+ "capabilityFloor": "small",
184
+ "consumes": [
185
+ {
186
+ "file": "{{workPath}}/ci-plan.md",
187
+ "artifact": true
188
+ },
189
+ {
190
+ "file": "{{workPath}}/ci-notes.md",
191
+ "artifact": true
192
+ }
193
+ ],
194
+ "advanceWhen": {
195
+ "file": "{{workPath}}/verification.md",
196
+ "minBytes": 500,
197
+ "sniff": "nonempty",
198
+ "requireChange": true,
199
+ "artifact": true,
200
+ "goto": "evaluate"
201
+ },
202
+ "gate": {
203
+ "at": "completion",
204
+ "checks": [
205
+ {
206
+ "kind": "minBytes",
207
+ "file": "{{workPath}}/verification.md",
208
+ "bytes": 500,
209
+ "artifact": true
210
+ },
211
+ {
212
+ "kind": "sniff",
213
+ "file": "{{workPath}}/verification.md",
214
+ "sniff": "nonempty",
215
+ "artifact": true
216
+ },
217
+ {
218
+ "kind": "contains",
219
+ "file": "{{workPath}}/verification.md",
220
+ "pattern": "^##\\s+Workflow files",
221
+ "flags": "im",
222
+ "label": "Workflow files section",
223
+ "artifact": true
224
+ },
225
+ {
226
+ "kind": "contains",
227
+ "file": "{{workPath}}/verification.md",
228
+ "pattern": "^##\\s+Commands verified against package\\.json",
229
+ "flags": "im",
230
+ "label": "Commands verified section",
231
+ "artifact": true
232
+ },
233
+ {
234
+ "kind": "contains",
235
+ "file": "{{workPath}}/verification.md",
236
+ "pattern": "^##\\s+Result",
237
+ "flags": "im",
238
+ "label": "Result section",
239
+ "artifact": true
240
+ },
241
+ {
242
+ "kind": "citationsResolve",
243
+ "file": "{{workPath}}/verification.md",
244
+ "minCitations": 2,
245
+ "artifact": true
246
+ }
247
+ ],
248
+ "onReject": "verify",
249
+ "maxAttempts": 4
250
+ },
251
+ "next": "evaluate"
252
+ },
253
+ {
254
+ "id": "evaluate",
255
+ "name": "Evaluate the deliverable",
256
+ "description": "Independently grade the observable deliverable and route it to finish, repair, or user escalation.",
257
+ "prompt": "Review `{{workPath}}/verification.md`, `{{workPath}}/ci-plan.md`, `{{workPath}}/ci-notes.md` against every criterion below. Inspect the underlying evidence files named by the workflow; do not grade from the author's summary alone.\n\n1. Every command the workflow invokes exists in the repo — open package.json (and any other manifests) and check each run: line yourself; a script the repo does not have fails this criterion.\n2. The stages are ordered sensibly (dependencies installed before lint/test/build) and dependency caching is wired to the real lockfile.\n3. The triggers match ci-plan.md, and a release or publish job exists only where the plan showed repo evidence for one — gated behind the green stages and the tag trigger when present.\n4. Nothing is invented: every action is pinned to a major version, no fabricated action inputs, and no secrets beyond standard ones or those the user explicitly named.\n5. verification.md is honest about the limit of local verification — what reading proved versus what only a live CI run can prove — and the accounts reconcile across ci-plan.md, ci-notes.md, and verification.md.\n\nOpen `{{workPath}}/verification.md`, `{{workPath}}/ci-plan.md`, `{{workPath}}/ci-notes.md` with `read_artifact`. Write the evidence-backed review to `{{workPath}}/review.md` in the artifacts drawer with `write_artifact`.\n\nList the findings as a markdown table with columns `| Severity | File | Line | Problem | Fix |` (severities: critical/major/minor/nit; empty table only on PASS). Give each criterion a PASS or FAIL with a concrete path, excerpt, measurement, or observed behavior. End with exactly `Verdict: PASS` or `Verdict: REVISE`. The gate ENFORCES the verdict: a well-formed REVISE is rejected and routed back to `repair` automatically, carrying your findings — so list every finding in the table with a concrete fix. On PASS, `advance_task_step` to `finish`. Never write PASS while a criterion is unmet.",
258
+ "suggestedRole": "devops reviewer",
259
+ "consumes": [
260
+ {
261
+ "file": "{{workPath}}/verification.md",
262
+ "artifact": true
263
+ },
264
+ {
265
+ "file": "{{workPath}}/ci-plan.md",
266
+ "artifact": true
267
+ },
268
+ {
269
+ "file": "{{workPath}}/ci-notes.md",
270
+ "artifact": true
271
+ }
272
+ ],
273
+ "gate": {
274
+ "at": "completion",
275
+ "checks": [
276
+ {
277
+ "kind": "minBytes",
278
+ "file": "{{workPath}}/review.md",
279
+ "bytes": 400,
280
+ "artifact": true
281
+ },
282
+ {
283
+ "kind": "contains",
284
+ "file": "{{workPath}}/review.md",
285
+ "pattern": "Verdict:\\s*(?:PASS|REVISE)",
286
+ "flags": "i",
287
+ "label": "explicit PASS or REVISE verdict",
288
+ "artifact": true
289
+ }
290
+ ],
291
+ "scripts": [
292
+ {
293
+ "name": "checkFixReview",
294
+ "scope": "standard",
295
+ "inputs": {
296
+ "reviewPath": "{{workPath}}/review.md",
297
+ "fixStepId": "repair"
298
+ }
299
+ }
300
+ ],
301
+ "onReject": "evaluate",
302
+ "maxAttempts": 4
303
+ },
304
+ "next": "finish"
305
+ },
306
+ {
307
+ "id": "repair",
308
+ "name": "Repair the deliverable",
309
+ "description": "Fix only the concrete gaps from the latest independent review.",
310
+ "prompt": "Read `{{workPath}}/review.md` with `read_artifact` and repair every failed criterion in `{{workPath}}/verification.md`, `{{workPath}}/ci-plan.md`, `{{workPath}}/ci-notes.md`. Make changes on each file's declared surface (`write_artifact` for artifact inputs, `write_file` for workspace inputs), not in task notes or a reply. Preserve evidence that already passed. Re-run or re-check anything the reviewer found unproven. Ensure `{{workPath}}/verification.md` is genuinely updated this turn so the repair is observable, then hand it back for independent evaluation.",
311
+ "suggestedRole": "devops engineer",
312
+ "consumes": [
313
+ {
314
+ "file": "{{workPath}}/review.md",
315
+ "artifact": true
316
+ },
317
+ {
318
+ "file": "{{workPath}}/verification.md",
319
+ "artifact": true
320
+ },
321
+ {
322
+ "file": "{{workPath}}/ci-plan.md",
323
+ "artifact": true
324
+ },
325
+ {
326
+ "file": "{{workPath}}/ci-notes.md",
327
+ "artifact": true
328
+ }
329
+ ],
330
+ "advanceWhen": {
331
+ "file": "{{workPath}}/verification.md",
332
+ "minBytes": 500,
333
+ "sniff": "nonempty",
334
+ "requireChange": true,
335
+ "artifact": true,
336
+ "goto": "evaluate"
337
+ },
338
+ "gate": {
339
+ "at": "completion",
340
+ "checks": [
341
+ {
342
+ "kind": "minBytes",
343
+ "file": "{{workPath}}/verification.md",
344
+ "bytes": 500,
345
+ "artifact": true
346
+ },
347
+ {
348
+ "kind": "sniff",
349
+ "file": "{{workPath}}/verification.md",
350
+ "sniff": "nonempty",
351
+ "artifact": true
352
+ },
353
+ {
354
+ "kind": "contains",
355
+ "file": "{{workPath}}/verification.md",
356
+ "pattern": "^##\\s+Workflow files",
357
+ "flags": "im",
358
+ "label": "Workflow files section",
359
+ "artifact": true
360
+ },
361
+ {
362
+ "kind": "contains",
363
+ "file": "{{workPath}}/verification.md",
364
+ "pattern": "^##\\s+Commands verified against package\\.json",
365
+ "flags": "im",
366
+ "label": "Commands verified section",
367
+ "artifact": true
368
+ },
369
+ {
370
+ "kind": "contains",
371
+ "file": "{{workPath}}/verification.md",
372
+ "pattern": "^##\\s+Result",
373
+ "flags": "im",
374
+ "label": "Result section",
375
+ "artifact": true
376
+ },
377
+ {
378
+ "kind": "citationsResolve",
379
+ "file": "{{workPath}}/verification.md",
380
+ "minCitations": 2,
381
+ "artifact": true
382
+ }
383
+ ],
384
+ "onReject": "repair",
385
+ "maxAttempts": 4
386
+ },
387
+ "next": "evaluate"
388
+ },
389
+ {
390
+ "id": "finish",
391
+ "name": "Finish",
392
+ "description": "All deterministic and reviewer criteria passed.",
393
+ "prompt": "The independent review passed. Read `{{workPath}}/review.md` with `read_artifact`, then use `write_task_note` to record a concise DONE summary with the final deliverable paths (`{{workPath}}/verification.md`, `{{workPath}}/ci-plan.md`, `{{workPath}}/ci-notes.md`) and the evidence that each acceptance criterion passed. Report DONE without starting new work.",
394
+ "suggestedRole": "project lead",
395
+ "consumes": [
396
+ {
397
+ "file": "{{workPath}}/review.md",
398
+ "artifact": true
399
+ }
400
+ ],
401
+ "terminal": true
402
+ },
403
+ {
404
+ "id": "needs-user",
405
+ "name": "Escalate unresolved concerns",
406
+ "description": "The bounded repair loop ended without a defensible pass.",
407
+ "prompt": "The deliverable did not pass after 3 review rounds. Do not claim success. Read `{{workPath}}/review.md` with `read_artifact`, then use `write_task_note` to record DONE_WITH_CONCERNS: the unmet criteria, what was attempted, the affected paths, and the smallest user decision or missing input needed to continue.",
408
+ "suggestedRole": "project lead",
409
+ "consumes": [
410
+ {
411
+ "file": "{{workPath}}/review.md",
412
+ "artifact": true
413
+ }
414
+ ],
415
+ "terminal": true
416
+ }
417
+ ],
418
+ "diffpackCapable": true,
419
+ "capabilityFloor": "small",
420
+ "version": "2.0.0",
421
+ "releasedAt": "2026-08-24T00:00:00.000Z",
422
+ "minGezelVersion": "1.26236"
423
+ }
@@ -0,0 +1,228 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "CI pipeline grounded in real scripts",
4
+ "objective": "The craftbook authors a CI workflow for a repo that has exactly two scripts (test and lint) and no typecheck. The oracle verifies a real workflow exists under .github/workflows/, runs both real scripts with checkout and node setup pinned to major versions, triggers on push and pull_request, and invents nothing — no typecheck stage, no publish job, no fabricated secrets.",
5
+ "tags": [
6
+ "code",
7
+ "ci",
8
+ "devops",
9
+ "tactical-fleet"
10
+ ],
11
+ "prompt": "Use the CI Pipeline from Scratch craftbook: this repo has no CI at all. Set up a pipeline that runs on every push and pull request using what the repo already has — do not add stages for tools the repo does not use. Standard GitHub Actions layout.",
12
+ "setup": {
13
+ "projectName": "Relay Notes",
14
+ "about": "A small Node library with two package scripts: `npm run test` (node --test) and `npm run lint` (a repo-local lint script). No typecheck, no build step, no publish configuration.",
15
+ "files": [
16
+ {
17
+ "path": "package.json",
18
+ "content": "{\n \"name\": \"relay-notes\",\n \"private\": true,\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"test\": \"node --test\",\n \"lint\": \"node tools/lint.mjs\"\n }\n}\n"
19
+ },
20
+ {
21
+ "path": "package-lock.json",
22
+ "content": "{\n \"name\": \"relay-notes\",\n \"version\": \"1.0.0\",\n \"lockfileVersion\": 3,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"relay-notes\",\n \"version\": \"1.0.0\"\n }\n }\n}\n"
23
+ },
24
+ {
25
+ "path": "src/greet.js",
26
+ "content": "export function greet(name) {\n const label = String(name ?? '').trim();\n if (label === '') return 'Hello there!';\n return `Hello, ${label}!`;\n}\n"
27
+ },
28
+ {
29
+ "path": "tools/lint.mjs",
30
+ "content": "import { readFileSync, readdirSync } from 'node:fs';\n\nlet problems = 0;\nfor (const file of readdirSync('src')) {\n if (!file.endsWith('.js')) continue;\n const text = readFileSync(`src/${file}`, 'utf8');\n if (/\\t/.test(text)) {\n console.error(`lint: tab indentation in src/${file}`);\n problems++;\n }\n}\nif (problems > 0) process.exit(1);\nconsole.log('lint ok');\n"
31
+ },
32
+ {
33
+ "path": "tests/greet.test.mjs",
34
+ "content": "import assert from 'node:assert/strict';\nimport { test } from 'node:test';\nimport { greet } from '../src/greet.js';\n\ntest('greets a trimmed name', () => {\n assert.equal(greet(' Mira '), 'Hello, Mira!');\n});\n\ntest('falls back for an empty name', () => {\n assert.equal(greet(''), 'Hello there!');\n});\n"
35
+ },
36
+ {
37
+ "path": "tests/verify-ci.mjs",
38
+ "content": "import assert from 'node:assert/strict';\nimport { readFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst dir = '.github/workflows';\nlet names = [];\ntry {\n names = readdirSync(dir).filter((f) => /\\.ya?ml$/i.test(f));\n} catch {}\nassert.ok(names.length >= 1, 'no workflow file exists under .github/workflows/');\nconst raw = names.map((f) => readFileSync(join(dir, f), 'utf8')).join('\\n---\\n');\n// Judge only active YAML: a comment honestly noting \"no typecheck script\"\n// must never trip the anti-invention assertions below.\nconst all = raw.replace(/#[^\\n]*/g, '');\nconsole.log('CIPIPE_ORACLE workflow found');\n\n// Checkout and Node setup, pinned to major versions.\nassert.ok(/actions\\/checkout@v\\d+/.test(all), 'uses actions/checkout pinned to a major version');\nassert.ok(/actions\\/setup-node@v\\d+/.test(all), 'uses actions/setup-node pinned to a major version');\nconsole.log('CIPIPE_ORACLE actions ok');\n\n// Runs both real scripts.\nassert.ok(/\\bnpm\\s+(?:run\\s+)?test\\b/.test(all), 'the workflow runs the test script');\nassert.ok(/\\bnpm\\s+run\\s+lint\\b/.test(all), 'the workflow runs the lint script');\nconsole.log('CIPIPE_ORACLE scripts ok');\n\n// Invokes nothing the repo does not have.\nassert.ok(!/typecheck/i.test(all), 'no invented typecheck stage - the repo has no such script');\nconst pkg = JSON.parse(readFileSync('package.json', 'utf8'));\nfor (const m of all.matchAll(/npm\\s+run\\s+([A-Za-z0-9:_-]+)/g)) {\n if (m[1].startsWith('-')) continue;\n assert.ok(pkg.scripts && pkg.scripts[m[1]], `workflow invokes \"npm run ${m[1]}\" but package.json has no such script`);\n}\nconsole.log('CIPIPE_ORACLE no invented commands');\n\n// Triggers on push and pull_request.\nassert.ok(/\\bpush\\b/.test(all), 'triggers on push');\nassert.ok(/\\bpull_request\\b/.test(all), 'triggers on pull_request');\nconsole.log('CIPIPE_ORACLE triggers ok');\n\n// No invented secrets, and no publish job in a repo with no release evidence.\nfor (const m of all.matchAll(/secrets\\.([A-Za-z0-9_]+)/g)) {\n assert.equal(m[1], 'GITHUB_TOKEN', `workflow references invented secret \"${m[1]}\"`);\n}\nassert.ok(!/npm\\s+publish/.test(all), 'no publish step - the repo shows no release configuration');\nconsole.log('CIPIPE_ORACLE nothing invented');\nconsole.log('CIPIPE_ORACLE done');\n",
39
+ "surface": "harness"
40
+ }
41
+ ],
42
+ "craftbookParams": {
43
+ "workPath": "tasks/eval"
44
+ }
45
+ },
46
+ "mocks": [],
47
+ "success": {
48
+ "summary": "A real GitHub Actions workflow exists at the conventional location, runs exactly the repo's two scripts on push and pull_request with pinned actions, invents no command, secret, or publish job — and every fleet artifact exists with the workflow commands verified against quoted package.json lines.",
49
+ "deliverables": [
50
+ {
51
+ "path": "tasks/eval/ci-plan.md",
52
+ "kind": "markdown-notes",
53
+ "artifact": true,
54
+ "minBytes": 500,
55
+ "checks": [
56
+ {
57
+ "kind": "contains",
58
+ "file": "tasks/eval/ci-plan.md",
59
+ "pattern": "^##\\s+Detected commands[\\s\\S]*^##\\s+Pipeline stages[\\s\\S]*^##\\s+Caching[\\s\\S]*^##\\s+Triggers",
60
+ "flags": "im",
61
+ "label": "ci-plan sections in order"
62
+ },
63
+ {
64
+ "kind": "contains",
65
+ "file": "tasks/eval/ci-plan.md",
66
+ "pattern": "package\\.json",
67
+ "label": "the plan reads the real manifest"
68
+ },
69
+ {
70
+ "kind": "citationsResolve",
71
+ "file": "tasks/eval/ci-plan.md",
72
+ "minCitations": 2,
73
+ "artifact": true
74
+ }
75
+ ]
76
+ },
77
+ {
78
+ "path": "tasks/eval/ci-notes.md",
79
+ "kind": "markdown-notes",
80
+ "artifact": true,
81
+ "minBytes": 500,
82
+ "checks": [
83
+ {
84
+ "kind": "contains",
85
+ "file": "tasks/eval/ci-notes.md",
86
+ "pattern": "^##\\s+Files written[\\s\\S]*^##\\s+Stages[\\s\\S]*^##\\s+Choices explained",
87
+ "flags": "im",
88
+ "label": "ci-notes sections in order"
89
+ },
90
+ {
91
+ "kind": "contains",
92
+ "file": "tasks/eval/ci-notes.md",
93
+ "pattern": "\\.github/workflows/",
94
+ "label": "names the conventional workflow location"
95
+ },
96
+ {
97
+ "kind": "citationsResolve",
98
+ "file": "tasks/eval/ci-notes.md",
99
+ "minCitations": 2,
100
+ "artifact": true
101
+ }
102
+ ]
103
+ },
104
+ {
105
+ "path": "tasks/eval/verification.md",
106
+ "kind": "markdown-notes",
107
+ "artifact": true,
108
+ "minBytes": 500,
109
+ "checks": [
110
+ {
111
+ "kind": "contains",
112
+ "file": "tasks/eval/verification.md",
113
+ "pattern": "^##\\s+Workflow files[\\s\\S]*^##\\s+Commands verified against package\\.json[\\s\\S]*^##\\s+Result",
114
+ "flags": "im",
115
+ "label": "verification sections in order"
116
+ }
117
+ ]
118
+ },
119
+ {
120
+ "path": "tasks/eval/review.md",
121
+ "kind": "markdown-report",
122
+ "artifact": true,
123
+ "minBytes": 400,
124
+ "checks": [
125
+ {
126
+ "kind": "contains",
127
+ "file": "tasks/eval/review.md",
128
+ "pattern": "Verdict:\\s*(?:PASS|REVISE)",
129
+ "flags": "i",
130
+ "label": "explicit reviewer verdict"
131
+ }
132
+ ]
133
+ }
134
+ ],
135
+ "checks": [
136
+ {
137
+ "kind": "nodeRuns",
138
+ "file": "tests/greet.test.mjs"
139
+ },
140
+ {
141
+ "kind": "nodeScriptPasses",
142
+ "script": "tools/lint.mjs",
143
+ "timeoutMs": 30000,
144
+ "requiredOutput": [
145
+ {
146
+ "pattern": "lint ok",
147
+ "label": "the repo lint still passes"
148
+ }
149
+ ]
150
+ },
151
+ {
152
+ "kind": "nodeScriptPasses",
153
+ "script": "tests/verify-ci.mjs",
154
+ "timeoutMs": 60000,
155
+ "requiredOutput": [
156
+ {
157
+ "pattern": "CIPIPE_ORACLE workflow found",
158
+ "label": "a workflow exists at the conventional location"
159
+ },
160
+ {
161
+ "pattern": "CIPIPE_ORACLE scripts ok",
162
+ "label": "both real scripts run in CI"
163
+ },
164
+ {
165
+ "pattern": "CIPIPE_ORACLE no invented commands",
166
+ "label": "no command invented beyond package.json"
167
+ },
168
+ {
169
+ "pattern": "CIPIPE_ORACLE triggers ok",
170
+ "label": "triggers on push and pull_request"
171
+ },
172
+ {
173
+ "pattern": "CIPIPE_ORACLE nothing invented",
174
+ "label": "no fabricated secrets or publish job"
175
+ }
176
+ ]
177
+ }
178
+ ],
179
+ "taskNotes": {
180
+ "minBytes": 120,
181
+ "checks": [
182
+ {
183
+ "kind": "contains",
184
+ "file": "task-notes.md",
185
+ "pattern": "\\bDONE\\b[\\s\\S]*(workflows|ci\\.yml|verification\\.md)",
186
+ "flags": "i",
187
+ "label": "DONE note names the workflow deliverable"
188
+ }
189
+ ]
190
+ },
191
+ "taskGraph": {
192
+ "requireCraftbookTask": true,
193
+ "requireTerminalStep": true
194
+ },
195
+ "unchangedFixtures": [
196
+ "package.json",
197
+ "package-lock.json",
198
+ "src/greet.js",
199
+ "tools/lint.mjs",
200
+ "tests/greet.test.mjs"
201
+ ]
202
+ },
203
+ "rubric": {
204
+ "artifact": {
205
+ "path": "tasks/eval/ci-notes.md",
206
+ "kind": "markdown"
207
+ },
208
+ "axes": [
209
+ {
210
+ "name": "Grounded inventory",
211
+ "description": "Every planned stage maps to a script that exists in package.json, quoted verbatim; no typecheck, build, or publish stage was invented for this repo."
212
+ },
213
+ {
214
+ "name": "Workflow quality",
215
+ "description": "The workflow sits at the conventional location, pins actions to major versions, orders install before lint and test, wires dependency caching, and triggers on push and pull_request."
216
+ },
217
+ {
218
+ "name": "Verification honesty",
219
+ "description": "The verify pass matched each workflow command to a quoted manifest line and is plain about what only a live CI run on the host can prove."
220
+ }
221
+ ]
222
+ },
223
+ "qualityFocus": [
224
+ "no invented commands or secrets",
225
+ "manifest-quoted verification",
226
+ "enforced review loop"
227
+ ]
228
+ }