@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.
- package/authoring/gstack/overlays/investigate.json +1 -0
- package/authoring/gstack/overlays/qa-only.json +1 -0
- package/authoring/gstack/wave.json +12 -2
- package/authoring/tactical/books/accessibility-retrofit.json +188 -0
- package/authoring/tactical/books/apply-review-findings.json +189 -0
- package/authoring/tactical/books/bug-fix-tdd.json +237 -0
- package/authoring/tactical/books/ci-pipeline.json +168 -0
- package/authoring/tactical/books/codemod-sweep.json +182 -0
- package/authoring/tactical/books/dependency-upgrade.json +196 -0
- package/authoring/tactical/books/flaky-test-fix.json +238 -0
- package/authoring/tactical/books/hotfix-flow.json +187 -0
- package/authoring/tactical/books/perf-optimization.json +219 -0
- package/authoring/tactical/books/refactor-module.json +217 -0
- package/authoring/tactical/books/schema-migration.json +192 -0
- package/authoring/tactical/books/test-suite-backfill.json +172 -0
- package/authoring/tactical/books/type-safety-pass.json +185 -0
- package/authoring/tactical/books/ux-update.json +178 -0
- package/authoring/tactical/evals/accessibility-retrofit.json +230 -0
- package/authoring/tactical/evals/apply-review-findings.json +290 -0
- package/authoring/tactical/evals/bug-fix-tdd.json +221 -0
- package/authoring/tactical/evals/ci-pipeline.json +227 -0
- package/authoring/tactical/evals/codemod-sweep.json +252 -0
- package/authoring/tactical/evals/dependency-upgrade.json +235 -0
- package/authoring/tactical/evals/flaky-test-fix.json +239 -0
- package/authoring/tactical/evals/hotfix-flow.json +220 -0
- package/authoring/tactical/evals/perf-optimization.json +235 -0
- package/authoring/tactical/evals/refactor-module.json +241 -0
- package/authoring/tactical/evals/schema-migration.json +225 -0
- package/authoring/tactical/evals/test-suite-backfill.json +197 -0
- package/authoring/tactical/evals/type-safety-pass.json +221 -0
- package/authoring/tactical/evals/ux-update.json +206 -0
- package/authoring/tactical/wave.json +89 -0
- package/data/chat-models/de/deepseek-r1-8b-q4/manifest.json +56 -1
- package/data/chat-models/gl/glm-5.2-754b-q2/manifest.json +56 -0
- package/data/chat-models/gp/gpt-oss-120b-q4/manifest.json +73 -1
- package/data/chat-models/gp/gpt-oss-20b-q4/manifest.json +77 -1
- package/data/chat-models/index.json +1 -1
- package/data/chat-models/ll/llama3.2-3b-q4/manifest.json +3 -1
- package/data/chat-models/mi/mistral-7b-q4/manifest.json +54 -3
- package/data/chat-models/mi/mistral-medium-3.5-128b-q4/manifest.json +76 -1
- package/data/craftbook-templates/ac/accessibility-retrofit/manifest.json +5 -4
- package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.0/craftbook.json +451 -0
- package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.0/test.json +231 -0
- package/data/craftbook-templates/al/alt-text-pass/manifest.json +5 -1
- package/data/craftbook-templates/ap/apply-review-findings/art.json +12 -0
- package/data/craftbook-templates/ap/apply-review-findings/logo.webp +0 -0
- package/data/craftbook-templates/ap/apply-review-findings/manifest.json +23 -0
- package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.0/craftbook.json +436 -0
- package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.0/test.json +291 -0
- package/data/craftbook-templates/br/browser-qa-audit/manifest.json +5 -1
- package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.5/craftbook.json +438 -0
- package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.5/test.json +379 -0
- package/data/craftbook-templates/bu/bug-fix-tdd/manifest.json +3 -3
- package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.0/craftbook.json +545 -0
- package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.0/test.json +222 -0
- package/data/craftbook-templates/ch/changelog-cut/manifest.json +5 -1
- package/data/craftbook-templates/ch/changelog-writeup/manifest.json +5 -1
- package/data/craftbook-templates/ci/ci-pipeline/manifest.json +5 -3
- package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.0/craftbook.json +423 -0
- package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.0/test.json +228 -0
- package/data/craftbook-templates/co/codemod-sweep/art.json +12 -0
- package/data/craftbook-templates/co/codemod-sweep/logo.webp +0 -0
- package/data/craftbook-templates/co/codemod-sweep/manifest.json +23 -0
- package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/craftbook.json +441 -0
- package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/test.json +253 -0
- package/data/craftbook-templates/de/dependency-upgrade/art.json +12 -0
- package/data/craftbook-templates/de/dependency-upgrade/logo.webp +0 -0
- package/data/craftbook-templates/de/dependency-upgrade/manifest.json +23 -0
- package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.0/craftbook.json +459 -0
- package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.0/test.json +236 -0
- package/data/craftbook-templates/fe/feature-flag-release/manifest.json +5 -1
- package/data/craftbook-templates/fe/feature-flag-rollout/manifest.json +4 -1
- package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.0/craftbook.json +203 -0
- package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.0/test.json +165 -0
- package/data/craftbook-templates/fl/flaky-test-fix/art.json +12 -0
- package/data/craftbook-templates/fl/flaky-test-fix/logo.webp +0 -0
- package/data/craftbook-templates/fl/flaky-test-fix/manifest.json +24 -0
- package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.0/craftbook.json +534 -0
- package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.0/test.json +240 -0
- package/data/craftbook-templates/ho/hotfix-flow/manifest.json +5 -3
- package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.0/craftbook.json +442 -0
- package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.0/test.json +221 -0
- package/data/craftbook-templates/in/investigate/manifest.json +4 -1
- package/data/craftbook-templates/in/investigate-root-cause/manifest.json +5 -1
- package/data/craftbook-templates/index.json +1 -1
- package/data/craftbook-templates/li/live-browser-qa/manifest.json +5 -1
- package/data/craftbook-templates/ni/nightly-fix-sweep/art.json +12 -0
- package/data/craftbook-templates/ni/nightly-fix-sweep/logo.webp +0 -0
- package/data/craftbook-templates/ni/nightly-fix-sweep/manifest.json +23 -0
- package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.0/craftbook.json +145 -0
- package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.0/test.json +121 -0
- package/data/craftbook-templates/pe/perf-audit/versions/1.1.0/craftbook.json +195 -0
- package/data/craftbook-templates/pe/perf-audit/versions/1.1.0/test.json +165 -0
- package/data/craftbook-templates/pe/perf-optimization/manifest.json +3 -3
- package/data/craftbook-templates/pe/perf-optimization/versions/2.0.0/craftbook.json +511 -0
- package/data/craftbook-templates/pe/perf-optimization/versions/2.0.0/test.json +236 -0
- package/data/craftbook-templates/qa/qa/manifest.json +3 -1
- package/data/craftbook-templates/re/refactor-module/manifest.json +2 -2
- package/data/craftbook-templates/re/refactor-module/versions/1.0.4/craftbook.json +150 -0
- package/data/craftbook-templates/re/refactor-module/versions/1.0.4/test.json +95 -0
- package/data/craftbook-templates/re/refactor-module/versions/2.0.0/craftbook.json +509 -0
- package/data/craftbook-templates/re/refactor-module/versions/2.0.0/test.json +242 -0
- package/data/craftbook-templates/re/release-notes/manifest.json +5 -1
- package/data/craftbook-templates/re/release-notes/versions/1.0.3/craftbook.json +220 -0
- package/data/craftbook-templates/re/release-notes/versions/1.0.3/test.json +114 -0
- package/data/craftbook-templates/re/release-pipeline-ci/manifest.json +5 -1
- package/data/craftbook-templates/re/release-readiness-review/versions/1.1.0/craftbook.json +192 -0
- package/data/craftbook-templates/re/release-readiness-review/versions/1.1.0/test.json +113 -0
- package/data/craftbook-templates/ro/root-cause-investigation/manifest.json +7 -1
- package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.5/craftbook.json +433 -0
- package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.5/test.json +157 -0
- package/data/craftbook-templates/sc/schema-migration/manifest.json +4 -4
- package/data/craftbook-templates/sc/schema-migration/versions/2.0.0/craftbook.json +459 -0
- package/data/craftbook-templates/sc/schema-migration/versions/2.0.0/test.json +226 -0
- package/data/craftbook-templates/te/test-coverage-review/versions/1.2.0/craftbook.json +195 -0
- package/data/craftbook-templates/te/test-coverage-review/versions/1.2.0/test.json +116 -0
- package/data/craftbook-templates/te/test-suite-backfill/manifest.json +1 -2
- package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.0/craftbook.json +428 -0
- package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.0/test.json +198 -0
- package/data/craftbook-templates/ty/type-safety-pass/manifest.json +3 -3
- package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.0/craftbook.json +428 -0
- package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.0/test.json +222 -0
- package/data/craftbook-templates/ux/ux-update/art.json +12 -0
- package/data/craftbook-templates/ux/ux-update/logo.webp +0 -0
- package/data/craftbook-templates/ux/ux-update/manifest.json +22 -0
- package/data/craftbook-templates/ux/ux-update/versions/1.0.0/craftbook.json +439 -0
- package/data/craftbook-templates/ux/ux-update/versions/1.0.0/test.json +207 -0
- package/data/craftbook-templates/ve/version-bump/versions/1.1.0/craftbook.json +206 -0
- package/data/craftbook-templates/ve/version-bump/versions/1.1.0/test.json +95 -0
- package/data/gezel-templates/bo/boekwachter/versions/1.1.0/about.md +29 -0
- package/data/gezel-templates/bo/boekwachter/versions/1.1.0/manifest.json +16 -0
- package/data/gezel-templates/bu/builder/versions/1.5.0/about.md +34 -0
- package/data/gezel-templates/bu/builder/versions/1.5.0/manifest.json +16 -0
- package/data/gezel-templates/de/developer/versions/1.5.0/about.md +34 -0
- package/data/gezel-templates/de/developer/versions/1.5.0/manifest.json +21 -0
- package/data/gezel-templates/index.json +1 -1
- package/data/gezel-templates/re/reviewer/versions/1.4.0/about.md +49 -0
- package/data/gezel-templates/re/reviewer/versions/1.4.0/manifest.json +21 -0
- package/data/project-types/index.json +1 -1
- package/data/project-types/so/software-project/manifest.json +20 -0
- package/data/project-types/so/software-project/versions/1.0.0/about.md +3 -0
- package/data/project-types/so/software-project/versions/1.0.0/manifest.json +41 -0
- package/data/project-types/so/software-project/versions/1.0.0/mission.md +4 -0
- package/package.json +1 -1
- package/schemas/craftbook-doc.schema.json +248 -0
- package/schemas/craftbook-template-version.schema.json +248 -0
- package/schemas/craftbook-test.schema.json +200 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"promptVersion": "workshop-mark-1910-v2",
|
|
4
|
+
"periodCue": "circa-1910-subtle",
|
|
5
|
+
"family": "build-repair",
|
|
6
|
+
"accents": [
|
|
7
|
+
"deep indigo",
|
|
8
|
+
"brass"
|
|
9
|
+
],
|
|
10
|
+
"sourceSummary": "Overnight triage of open code findings into clustered, reviewable change proposals; the tree itself is never touched.",
|
|
11
|
+
"styleReference": "bug-fix-tdd"
|
|
12
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"kind": "craftbook-template",
|
|
4
|
+
"id": "nightly-fix-sweep",
|
|
5
|
+
"role": "maintenance-review",
|
|
6
|
+
"category": "code-quality",
|
|
7
|
+
"name": "Nightly Fix Sweep",
|
|
8
|
+
"description": "Turn a night's open code findings into reviewable change proposals: triage the leads, cluster what belongs together, and draft one focused proposal per cluster for the user to read and apply in the morning. The project's files are never touched.",
|
|
9
|
+
"tags": [
|
|
10
|
+
"bug-fix",
|
|
11
|
+
"night-shift",
|
|
12
|
+
"boekwachter",
|
|
13
|
+
"proposals",
|
|
14
|
+
"quality",
|
|
15
|
+
"batch"
|
|
16
|
+
],
|
|
17
|
+
"maintainer": {
|
|
18
|
+
"name": "Gezel"
|
|
19
|
+
},
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"yankedVersions": [],
|
|
22
|
+
"logo": "logo.webp"
|
|
23
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "nightly-fix-sweep",
|
|
4
|
+
"name": "Nightly Fix Sweep",
|
|
5
|
+
"description": "Turn a batch of open code findings into reviewable change proposals. The host triages the leads against the current code — a lead that no longer matches the file, or that needs a judgement only the owner can make, is legitimately left out — then clusters what belongs together as ONE change (a fix that spans a file and its caller is one cluster, not two) and fans out one drafting shard per cluster. Each shard makes the smallest correct change for its leads and explains it under Problem, Change, Risk, and How to verify. Built for unattended night runs: proposals are what the user reviews and applies in the morning, and the project's files are never touched by the sweep itself.",
|
|
6
|
+
"version": "1.0.0",
|
|
7
|
+
"releasedAt": "2026-08-24T00:00:00.000Z",
|
|
8
|
+
"minGezelVersion": "1.26236",
|
|
9
|
+
"entryStepId": "triage",
|
|
10
|
+
"triggers": [
|
|
11
|
+
"sweep the open findings",
|
|
12
|
+
"nightly fixes",
|
|
13
|
+
"draft fixes for the open issues",
|
|
14
|
+
"fix the boekwachter findings"
|
|
15
|
+
],
|
|
16
|
+
"runModes": {
|
|
17
|
+
"nightShift": "recommended"
|
|
18
|
+
},
|
|
19
|
+
"diffpackCapable": true,
|
|
20
|
+
"capabilityFloor": "small",
|
|
21
|
+
"paramSchema": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"properties": {
|
|
24
|
+
"workPath": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"title": "Working folder",
|
|
27
|
+
"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.",
|
|
28
|
+
"default": "{{task.dir}}"
|
|
29
|
+
},
|
|
30
|
+
"leads": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"title": "Leads",
|
|
33
|
+
"description": "Comma-separated finding refs to sweep (e.g. BW-3,BW-8). Leave empty when the task description carries the leads.",
|
|
34
|
+
"default": ""
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"steps": [
|
|
39
|
+
{
|
|
40
|
+
"id": "triage",
|
|
41
|
+
"name": "Triage the leads into clusters",
|
|
42
|
+
"suggestedRole": "developer",
|
|
43
|
+
"capabilityFloor": "medium",
|
|
44
|
+
"prompt": "You have been handed open findings to sweep: {{leads}}. The task description may carry more detail per lead.\n\nRead the affected files and judge each lead against the CURRENT code: real, already fixed, stale, or a judgement only the owner can make. Leaving a lead out is legitimate — say why rather than forcing a change to satisfy a stale review.\n\nCluster what belongs together as ONE change: a fix that spans a file and its caller is one cluster, not two — splitting it would hand the user two half-changes neither of which stands alone. At most 8 clusters; prefer fewer, focused ones.\n\nWrite ONE `write_task_note` starting with the line `## Triage`: per lead, whether you will fix it and which cluster it belongs to, with reasons for anything left out.\n\nThen write the cluster list to the artifact `{{workPath}}/clusters.json` with ONE `write_artifact` call: a JSON array where each entry is an object with exactly these string fields — `slug` (short kebab-case name for the cluster, e.g. \"auth-null-guard\"), `issueRefs` (the refs in that cluster, comma-separated), and `focus` (one sentence on what that cluster should change). If nothing is worth fixing, write an empty array `[]` and say why in your note.",
|
|
45
|
+
"advanceWhen": {
|
|
46
|
+
"file": "{{workPath}}/clusters.json",
|
|
47
|
+
"artifact": true,
|
|
48
|
+
"minBytes": 2,
|
|
49
|
+
"sniff": "json-valid"
|
|
50
|
+
},
|
|
51
|
+
"gate": {
|
|
52
|
+
"at": "completion",
|
|
53
|
+
"checks": [
|
|
54
|
+
{
|
|
55
|
+
"kind": "sniff",
|
|
56
|
+
"file": "{{workPath}}/clusters.json",
|
|
57
|
+
"sniff": "json-valid",
|
|
58
|
+
"artifact": true
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"scripts": [
|
|
62
|
+
{
|
|
63
|
+
"name": "checkTaskNoteContains",
|
|
64
|
+
"scope": "standard",
|
|
65
|
+
"inputs": {
|
|
66
|
+
"taskRef": "{{task.ref}}",
|
|
67
|
+
"pattern": "##\\s*Triage"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"onReject": "triage",
|
|
72
|
+
"maxAttempts": 3
|
|
73
|
+
},
|
|
74
|
+
"next": "fanout"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "fanout",
|
|
78
|
+
"name": "Draft the proposals",
|
|
79
|
+
"spawnFanout": true,
|
|
80
|
+
"prompt": "Your clusters are being drafted, one proposal per cluster. Wait for the shards to finish, then call `advance_task_step`.",
|
|
81
|
+
"next": "collect"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"id": "collect",
|
|
85
|
+
"name": "Hand over",
|
|
86
|
+
"terminal": true,
|
|
87
|
+
"prompt": "The sweep is done. Write one short `write_task_note` naming the proposals your crew drafted (by cluster) and any leads deliberately left alone with their reasons, then call `advance_task_step`. Never claim anything was fixed or applied — these are proposals for the user to review."
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
"spawn": {
|
|
91
|
+
"overFile": "{{workPath}}/clusters.json",
|
|
92
|
+
"overArtifact": true,
|
|
93
|
+
"entryStepId": "draft",
|
|
94
|
+
"steps": [
|
|
95
|
+
{
|
|
96
|
+
"id": "draft",
|
|
97
|
+
"name": "Draft the change",
|
|
98
|
+
"suggestedRole": "developer",
|
|
99
|
+
"capabilityFloor": "small",
|
|
100
|
+
"prompt": "Your cluster is {{issueRefs}} ({{slug}}). What it should change: {{focus}}\n\nRead the affected files first, then make the smallest correct change for those leads and nothing else. Use `read_file`, `write_file`, and `replace_in_file` exactly as you always do. Keep it focused — a change a reviewer can read in a minute gets applied; a sprawling one gets dismissed. If a lead turns out to be wrong once you are in the code, leave it alone and say so.\n\nThen write your explanation to the artifact `{{diffpack.dir}}/notes.md` in ONE `write_artifact` call, with exactly these four headings:\n\n## Problem\n## Change\n## Risk\n## How to verify\n\nUnder Change, describe what you altered and why, naming the refs. Under Risk, be honest about what you could not verify without running the code. Then call `advance_task_step`.",
|
|
101
|
+
"advanceWhen": {
|
|
102
|
+
"file": "{{diffpack.dir}}/notes.md",
|
|
103
|
+
"artifact": true,
|
|
104
|
+
"minBytes": 200
|
|
105
|
+
},
|
|
106
|
+
"gate": {
|
|
107
|
+
"at": "completion",
|
|
108
|
+
"checks": [
|
|
109
|
+
{
|
|
110
|
+
"kind": "contains",
|
|
111
|
+
"file": "{{diffpack.dir}}/notes.md",
|
|
112
|
+
"pattern": "##\\s+Problem",
|
|
113
|
+
"label": "Problem section",
|
|
114
|
+
"artifact": true
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"kind": "contains",
|
|
118
|
+
"file": "{{diffpack.dir}}/notes.md",
|
|
119
|
+
"pattern": "##\\s+Change",
|
|
120
|
+
"label": "Change section",
|
|
121
|
+
"artifact": true
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"kind": "contains",
|
|
125
|
+
"file": "{{diffpack.dir}}/notes.md",
|
|
126
|
+
"pattern": "##\\s+Risk",
|
|
127
|
+
"label": "Risk section",
|
|
128
|
+
"artifact": true
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"kind": "contains",
|
|
132
|
+
"file": "{{diffpack.dir}}/notes.md",
|
|
133
|
+
"pattern": "##\\s+How to verify",
|
|
134
|
+
"label": "How to verify section",
|
|
135
|
+
"artifact": true
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
"onReject": "draft",
|
|
139
|
+
"maxAttempts": 3
|
|
140
|
+
},
|
|
141
|
+
"terminal": true
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"title": "Nightly sweep drafts sealed proposals without touching the tree",
|
|
4
|
+
"objective": "The host triages two seeded findings into clusters and fans out drafting shards; each shard's edits land in a change proposal that seals on completion, the four-heading notes contract holds, and the workspace files stay byte-identical.",
|
|
5
|
+
"tags": [
|
|
6
|
+
"code",
|
|
7
|
+
"night-shift",
|
|
8
|
+
"proposals",
|
|
9
|
+
"fanout",
|
|
10
|
+
"tactical-fleet"
|
|
11
|
+
],
|
|
12
|
+
"prompt": "Run the Nightly Fix Sweep for the two open findings described in the task. LEAD-1: src/greet.js builds the greeting with a stray double space when no title is given. LEAD-2: src/farewell.js says 'Godbye' instead of 'Goodbye'. Draft the fixes as proposals.",
|
|
13
|
+
"setup": {
|
|
14
|
+
"projectName": "Sweep Fixture",
|
|
15
|
+
"about": "A tiny greeting library with two known low-risk defects, used to exercise the nightly proposal sweep.",
|
|
16
|
+
"managedWorkspaceWritePolicy": "deny",
|
|
17
|
+
"files": [
|
|
18
|
+
{
|
|
19
|
+
"path": "src/greet.js",
|
|
20
|
+
"content": "export function greet(name, title) {\n const prefix = title ? `${title} ` : ' ';\n return `Hello, ${prefix}${name}!`;\n}\n"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"path": "src/farewell.js",
|
|
24
|
+
"content": "export function farewell(name) {\n return `Godbye, ${name}.`;\n}\n"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"path": "source/findings.md",
|
|
28
|
+
"content": "# Open findings\n\n- LEAD-1 (minor, src/greet.js): greeting has a leading double space when no title is passed - `greet('Ada')` returns `Hello, Ada!`. The no-title prefix should be empty.\n- LEAD-2 (minor, src/farewell.js): the farewell text misspells Goodbye as 'Godbye'.\n"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"craftbookParams": {
|
|
32
|
+
"workPath": "tasks/eval",
|
|
33
|
+
"leads": "LEAD-1,LEAD-2"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"success": {
|
|
37
|
+
"summary": "Clusters were published, shards drafted, at least one proposal sealed with the four-heading notes, and the workspace was never modified.",
|
|
38
|
+
"deliverables": [
|
|
39
|
+
{
|
|
40
|
+
"path": "tasks/eval/clusters.json",
|
|
41
|
+
"kind": "json",
|
|
42
|
+
"artifact": true,
|
|
43
|
+
"minBytes": 2,
|
|
44
|
+
"checks": [
|
|
45
|
+
{
|
|
46
|
+
"kind": "recordSchema",
|
|
47
|
+
"file": "tasks/eval/clusters.json",
|
|
48
|
+
"artifact": true,
|
|
49
|
+
"minRows": 1,
|
|
50
|
+
"fields": [
|
|
51
|
+
{
|
|
52
|
+
"name": "slug",
|
|
53
|
+
"rule": "nonempty"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "issueRefs",
|
|
57
|
+
"rule": "nonempty"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "focus",
|
|
61
|
+
"rule": "nonempty"
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"taskNotes": {
|
|
69
|
+
"minBytes": 120,
|
|
70
|
+
"requireCraftbookTask": true,
|
|
71
|
+
"checks": [
|
|
72
|
+
{
|
|
73
|
+
"kind": "contains",
|
|
74
|
+
"file": "task-notes.md",
|
|
75
|
+
"pattern": "##\\s*Triage",
|
|
76
|
+
"label": "triage note present"
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
"taskGraph": {
|
|
81
|
+
"requireCraftbookTask": true,
|
|
82
|
+
"requireTerminalStep": true
|
|
83
|
+
},
|
|
84
|
+
"history": [
|
|
85
|
+
{
|
|
86
|
+
"kind": "project.diffpack.sealed",
|
|
87
|
+
"minEntries": 1
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
"unchangedFixtures": [
|
|
91
|
+
"src/greet.js",
|
|
92
|
+
"src/farewell.js",
|
|
93
|
+
"source/findings.md"
|
|
94
|
+
]
|
|
95
|
+
},
|
|
96
|
+
"rubric": {
|
|
97
|
+
"artifact": {
|
|
98
|
+
"path": "tasks/eval/clusters.json",
|
|
99
|
+
"kind": "json"
|
|
100
|
+
},
|
|
101
|
+
"axes": [
|
|
102
|
+
{
|
|
103
|
+
"name": "Triage judgement",
|
|
104
|
+
"description": "Leads were judged against the current code and clustered sensibly; anything left out has an honest reason."
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"name": "Proposal focus",
|
|
108
|
+
"description": "Each drafted proposal is the smallest correct change for its cluster, explained under Problem, Change, Risk, and How to verify."
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"name": "Honesty about mode",
|
|
112
|
+
"description": "Notes never claim anything was fixed or applied; risk sections admit what could not be verified without running the code."
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
"qualityFocus": [
|
|
117
|
+
"proposal discipline",
|
|
118
|
+
"cluster judgement",
|
|
119
|
+
"untouched workspace"
|
|
120
|
+
]
|
|
121
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "perf-audit",
|
|
3
|
+
"name": "Performance Audit",
|
|
4
|
+
"description": "Audit an application or page for performance problems with measurements, then produce a report of the highest-impact optimizations. First scopes the workloads and locks a performance budget and checklist (load time and Core Web Vitals, bundle/asset weight, render and main-thread cost, network waterfall and request count, server/query latency, memory and re-render churn), then MEASURES each against a baseline using real profiling rather than guessing, then writes a report that ranks bottlenecks by impact-vs-effort with a specific fix and the expected gain for each. Use this for a performance audit, speed optimization, finding bottlenecks, a Lighthouse-style review, reducing load time, or profiling slowness — it grounds every recommendation in a measured number and an estimated payoff, not 'it feels slow'.\n\nA gallery craftbook generated from an archetype spec. It runs\n`phase → (per-phase gate) → … → evaluate → (loop) → finish`. Each build\nphase that produces a checkable artifact is followed by a **runtime\ngate-checkpoint** — the runtime verifies the artifact and routes with no\nmodel turn, looping back to redo the phase on a miss. The final `evaluate`\nstep holds a static deliverable gate plus a reviewer QA pass. What it adds\nover the generic `build-loop`: a specialist role per phase, a\ndomain-correct ordering, and a concrete per-phase quality bar.\n\nDeliverables marked \"artifact\" land in the project's artifacts drawer (`write_artifact` / `read_artifact`), not the shipped workspace — review output is not product source.\n\nPhases:\n\n1. Scope the perf budget (reviewer) — lock workloads, a budget, and a metrics checklist → gated on artifact `{{workPath}}/scope.md` (markdown-notes)\n2. Measure the baseline (developer) — profile each workload, locate the real bottlenecks → gated on artifact `{{workPath}}/measure.md` (markdown-notes)\n3. Write the perf report (reviewer) — rank optimizations by impact vs effort → gated on artifact `{{workPath}}/perf-report.md` (markdown-report)\n\nThe gates never advance with an unmet criterion, and loop back to the\nowning phase to fix named gaps.\n",
|
|
5
|
+
"entryStepId": "scope",
|
|
6
|
+
"triggers": [
|
|
7
|
+
"performance audit",
|
|
8
|
+
"why is this slow",
|
|
9
|
+
"find the bottleneck",
|
|
10
|
+
"optimize load time",
|
|
11
|
+
"speed this up",
|
|
12
|
+
"profile the app"
|
|
13
|
+
],
|
|
14
|
+
"steps": [
|
|
15
|
+
{
|
|
16
|
+
"id": "scope",
|
|
17
|
+
"name": "Scope the perf budget",
|
|
18
|
+
"description": "lock workloads, a budget, and a metrics checklist",
|
|
19
|
+
"prompt": "Step 1: Identify the workloads to audit (the slow page/route/endpoint/operation and its typical usage). Step 2: Write a performance acceptance-criteria checklist with concrete budgets, drawn from the relevant metrics: page load and Core Web Vitals (LCP < 2.5s, CLS < 0.1, INP < 200ms), total JS/CSS/image transfer weight, time-to-interactive and main-thread blocking, request count and waterfall serialization, server response and DB query latency (and N+1 detection), and memory growth / excessive re-renders for SPAs. Step 3: For each metric, set the target/budget for THIS app and note the current pain. Step 4: Decide the measurement method and environment (Lighthouse/devtools/profiler/timing logs if available; otherwise read the code and reason about asymptotic and I/O costs). Write the workloads + budgeted checklist + method to `write_task_note` AND `{{workPath}}/scope.md`. No optimizing yet — define 'fast enough' first.\n\nThe deliverable `{{workPath}}/scope.md` lands in the project's artifacts drawer — write it with `write_artifact` and read it back with `read_artifact`; the shipped workspace stays untouched.",
|
|
20
|
+
"suggestedRole": "reviewer",
|
|
21
|
+
"advanceWhen": {
|
|
22
|
+
"file": "{{workPath}}/scope.md",
|
|
23
|
+
"minBytes": 1,
|
|
24
|
+
"sniff": "nonempty",
|
|
25
|
+
"artifact": true
|
|
26
|
+
},
|
|
27
|
+
"gate": {
|
|
28
|
+
"at": "completion",
|
|
29
|
+
"checks": [
|
|
30
|
+
{
|
|
31
|
+
"kind": "minBytes",
|
|
32
|
+
"file": "{{workPath}}/scope.md",
|
|
33
|
+
"bytes": 120,
|
|
34
|
+
"artifact": true
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"kind": "sniff",
|
|
38
|
+
"file": "{{workPath}}/scope.md",
|
|
39
|
+
"sniff": "nonempty",
|
|
40
|
+
"artifact": true
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"onReject": "scope",
|
|
44
|
+
"maxAttempts": 3
|
|
45
|
+
},
|
|
46
|
+
"next": "measure"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "measure",
|
|
50
|
+
"name": "Measure the baseline",
|
|
51
|
+
"description": "profile each workload, locate the real bottlenecks",
|
|
52
|
+
"prompt": "Step 1: Establish a baseline by MEASURING each metric in the checklist (run Lighthouse/devtools/a profiler, time the endpoint, inspect the network waterfall and bundle, log query times). If no live env, statically analyze: bundle composition, algorithmic complexity of hot paths, query patterns, and render triggers. Step 2: For each metric over budget, drill into WHY — which asset is heaviest, which function dominates the flame chart, which query is slow or repeated, which component re-renders needlessly. Step 3: Record the actual numbers (e.g. 'LCP 4.1s; main.js is 480KB, 60% is moment.js+lodash'; 'GET /feed: 1.2s, runs 1+N queries, N≈40'). Step 4: For each bottleneck, identify the fix and ESTIMATE the expected gain and the effort. Step 5: Separate confirmed bottlenecks from suspicions you could not measure. Good looks like: every claim has a number behind it. Stage measurements to `write_task_note`. Do not write the report yet.\n\nThe deliverable `{{workPath}}/measure.md` lands in the project's artifacts drawer — write it with `write_artifact` and read it back with `read_artifact`; the shipped workspace stays untouched.",
|
|
53
|
+
"suggestedRole": "developer",
|
|
54
|
+
"advanceWhen": {
|
|
55
|
+
"file": "{{workPath}}/measure.md",
|
|
56
|
+
"minBytes": 1,
|
|
57
|
+
"sniff": "nonempty",
|
|
58
|
+
"artifact": true
|
|
59
|
+
},
|
|
60
|
+
"gate": {
|
|
61
|
+
"at": "completion",
|
|
62
|
+
"checks": [
|
|
63
|
+
{
|
|
64
|
+
"kind": "minBytes",
|
|
65
|
+
"file": "{{workPath}}/measure.md",
|
|
66
|
+
"bytes": 120,
|
|
67
|
+
"artifact": true
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"kind": "sniff",
|
|
71
|
+
"file": "{{workPath}}/measure.md",
|
|
72
|
+
"sniff": "nonempty",
|
|
73
|
+
"artifact": true
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"onReject": "measure",
|
|
77
|
+
"maxAttempts": 3
|
|
78
|
+
},
|
|
79
|
+
"next": "report"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"id": "report",
|
|
83
|
+
"name": "Write the perf report",
|
|
84
|
+
"description": "rank optimizations by impact vs effort",
|
|
85
|
+
"prompt": "Step 1: Open `{{workPath}}/perf-report.md` and write a '## Summary' table of each metric: budget vs measured vs PASS/FAIL. Step 2: Add a '## Recommendations' section ranked by impact-vs-effort; each entry: the bottleneck (with its measured number), the specific fix (e.g. 'code-split the editor route and lazy-load it', 'replace the 1+N with a single JOIN/batch', 'serve images as WebP at 2x and add width/height'), the ESTIMATED gain, and the effort. Step 3: Add a '## Quick wins' callout for the high-impact/low-effort items to do first. Step 4: Add a '## Needs measurement' section for suspicions not yet confirmed. Every recommendation must cite a measured number and an expected payoff — no generic 'optimize images'. On a loop-back, fix only the named gaps. `write_task_note` the report path and the count of failing metrics.\n\nThe deliverable `{{workPath}}/perf-report.md` lands in the project's artifacts drawer — write it with `write_artifact` and read it back with `read_artifact`; the shipped workspace stays untouched.",
|
|
86
|
+
"suggestedRole": "reviewer",
|
|
87
|
+
"advanceWhen": {
|
|
88
|
+
"file": "{{workPath}}/perf-report.md",
|
|
89
|
+
"minBytes": 1,
|
|
90
|
+
"sniff": "nonempty",
|
|
91
|
+
"artifact": true,
|
|
92
|
+
"requireChange": true
|
|
93
|
+
},
|
|
94
|
+
"gate": {
|
|
95
|
+
"at": "completion",
|
|
96
|
+
"checks": [
|
|
97
|
+
{
|
|
98
|
+
"kind": "minBytes",
|
|
99
|
+
"file": "{{workPath}}/perf-report.md",
|
|
100
|
+
"bytes": 1500,
|
|
101
|
+
"artifact": true
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"kind": "contains",
|
|
105
|
+
"file": "{{workPath}}/perf-report.md",
|
|
106
|
+
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
107
|
+
"flags": "i",
|
|
108
|
+
"label": "at least one markdown heading",
|
|
109
|
+
"artifact": true
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"kind": "citationsResolve",
|
|
113
|
+
"file": "{{workPath}}/perf-report.md",
|
|
114
|
+
"minCitations": 2,
|
|
115
|
+
"artifact": true
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
"onReject": "report",
|
|
119
|
+
"maxAttempts": 4
|
|
120
|
+
},
|
|
121
|
+
"next": "evaluate"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"id": "evaluate",
|
|
125
|
+
"name": "Evaluate",
|
|
126
|
+
"description": "Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.",
|
|
127
|
+
"prompt": "Open `{{workPath}}/perf-report.md` with `read_artifact` first, then review it against the original scope: every claim cites a real path, the severities and priorities are defensible, and nothing important in scope was skipped. Open the underlying files for at least the top findings; do not grade from the report's own summary. If a finding cannot be verified, say so explicitly.\n\nWrite your review to the artifact `{{workPath}}/review.md` with one `write_artifact` call: what you checked, what held, what did not (as a findings table with columns `| Severity | File | Line | Problem | Fix |` when anything needs fixing), ending with exactly `Verdict: PASS` or `Verdict: REVISE`. The gate enforces the verdict: a well-formed REVISE is routed back to the `report` step automatically with your findings. On PASS, `advance_task_step` to `finish`.",
|
|
128
|
+
"suggestedRole": "reviewer",
|
|
129
|
+
"consumes": [
|
|
130
|
+
{
|
|
131
|
+
"file": "{{workPath}}/perf-report.md",
|
|
132
|
+
"artifact": true
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
"next": "finish",
|
|
136
|
+
"gate": {
|
|
137
|
+
"at": "completion",
|
|
138
|
+
"checks": [
|
|
139
|
+
{
|
|
140
|
+
"kind": "minBytes",
|
|
141
|
+
"file": "{{workPath}}/review.md",
|
|
142
|
+
"bytes": 300,
|
|
143
|
+
"artifact": true
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"kind": "contains",
|
|
147
|
+
"file": "{{workPath}}/review.md",
|
|
148
|
+
"pattern": "Verdict:\\s*(?:PASS|REVISE)",
|
|
149
|
+
"flags": "i",
|
|
150
|
+
"label": "explicit PASS or REVISE verdict",
|
|
151
|
+
"artifact": true
|
|
152
|
+
}
|
|
153
|
+
],
|
|
154
|
+
"scripts": [
|
|
155
|
+
{
|
|
156
|
+
"name": "checkFixReview",
|
|
157
|
+
"scope": "standard",
|
|
158
|
+
"inputs": {
|
|
159
|
+
"taskRef": "{{task.ref}}",
|
|
160
|
+
"reviewPath": "{{workPath}}/review.md",
|
|
161
|
+
"fixStepId": "report"
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
],
|
|
165
|
+
"onReject": "evaluate",
|
|
166
|
+
"maxAttempts": 4
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"id": "finish",
|
|
171
|
+
"name": "Finish",
|
|
172
|
+
"description": "All acceptance criteria met. Stamp a short summary and report DONE.",
|
|
173
|
+
"prompt": "Every acceptance criterion passed. Write a one-paragraph DONE summary to task notes via `write_task_note`: what was built, the deliverable path(s), and a one-line confirmation that each criterion is met. Then report DONE.",
|
|
174
|
+
"suggestedRole": "developer",
|
|
175
|
+
"terminal": true
|
|
176
|
+
}
|
|
177
|
+
],
|
|
178
|
+
"version": "1.1.0",
|
|
179
|
+
"releasedAt": "2026-08-24T00:00:00.000Z",
|
|
180
|
+
"paramSchema": {
|
|
181
|
+
"type": "object",
|
|
182
|
+
"properties": {
|
|
183
|
+
"workPath": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"title": "Working folder",
|
|
186
|
+
"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.",
|
|
187
|
+
"default": "{{task.dir}}"
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"minGezelVersion": "1.26236",
|
|
192
|
+
"runModes": {
|
|
193
|
+
"nightShift": "supported"
|
|
194
|
+
}
|
|
195
|
+
}
|