@bendyline/gilde 0.1.55 → 0.1.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/authoring/chat-models/glm-5.3-flash-320b-q2.json +129 -0
- package/authoring/gstack/wave.json +2 -2
- package/data/chat-models/gl/glm-5.3-flash-320b-q2/manifest.json +137 -0
- package/data/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.0/manifest.json +23 -0
- package/data/chat-models/index.json +1 -1
- package/data/craftbook-templates/a1/a11y-audit/versions/1.1.3/test.json +16 -8
- package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/craftbook.json +618 -0
- package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/test.json +228 -0
- package/data/craftbook-templates/al/album-curate/versions/1.0.3/test.json +6 -3
- package/data/craftbook-templates/al/alert-rules/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/an/anniversary-cut/versions/1.0.5/test.json +10 -5
- package/data/craftbook-templates/an/annual-document-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/an/anomaly-scan/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/craftbook.json +602 -0
- package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/test.json +290 -0
- package/data/craftbook-templates/ar/artifact-integrity-review/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/au/audiobook-master-pack/versions/1.0.5/test.json +10 -5
- package/data/craftbook-templates/au/auth-flow/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/au/auth-flow/versions/1.0.4/craftbook.json +282 -0
- package/data/craftbook-templates/au/auth-flow/versions/1.0.4/test.json +143 -0
- package/data/craftbook-templates/au/automation-recipe/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/craftbook.json +282 -0
- package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/test.json +108 -0
- package/data/craftbook-templates/bl/blog-post/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/br/branding-website/versions/1.1.3/craftbook.json +335 -0
- package/data/craftbook-templates/br/branding-website/versions/1.1.3/test.json +164 -0
- package/data/craftbook-templates/br/broadcast-announcement/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/craftbook.json +621 -0
- package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/test.json +376 -0
- package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/craftbook.json +730 -0
- package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/test.json +221 -0
- package/data/craftbook-templates/bu/build-loop/versions/1.1.1/test.json +8 -8
- package/data/craftbook-templates/ca/case-study/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/ch/chapter-narration-run/versions/1.0.4/test.json +10 -5
- package/data/craftbook-templates/ch/character-turnaround/versions/1.0.3/test.json +25 -11
- package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/craftbook.json +587 -0
- package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/test.json +225 -0
- package/data/craftbook-templates/ci/citation-audit/versions/1.0.3/test.json +28 -14
- package/data/craftbook-templates/cl/cli-tool/versions/1.1.3/test.json +8 -8
- package/data/craftbook-templates/co/codebase-refactoring-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/co/codebase-ux-review/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/craftbook.json +605 -0
- package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/test.json +252 -0
- package/data/craftbook-templates/co/cohort-analysis/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/co/competitive-analysis/versions/1.0.3/test.json +23 -15
- package/data/craftbook-templates/co/content-accuracy-review/versions/1.0.3/test.json +28 -14
- package/data/craftbook-templates/co/content-deck/versions/1.2.3/craftbook.json +4 -4
- package/data/craftbook-templates/co/content-deck/versions/1.2.3/test.json +3 -0
- package/data/craftbook-templates/co/content-deck/versions/1.2.4/craftbook.json +341 -0
- package/data/craftbook-templates/co/content-deck/versions/1.2.4/test.json +169 -0
- package/data/craftbook-templates/co/copy-review/versions/1.0.3/test.json +14 -7
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/craftbook.json +4 -4
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/test.json +3 -0
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/craftbook.json +345 -0
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/test.json +187 -0
- package/data/craftbook-templates/co/corpus-synthesis/versions/1.0.3/test.json +26 -13
- package/data/craftbook-templates/co/cover-letter/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/cs/csv-transformer/versions/1.2.4/test.json +7 -7
- package/data/craftbook-templates/da/dashboard-spec/versions/1.0.3/test.json +7 -7
- package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/craftbook.json +284 -0
- package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/test.json +162 -0
- package/data/craftbook-templates/da/data-quality-audit/versions/1.0.3/test.json +38 -19
- package/data/craftbook-templates/da/data-to-report/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/craftbook.json +286 -0
- package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/de/dependency-audit/versions/1.1.3/test.json +14 -7
- package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/craftbook.json +621 -0
- package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/test.json +235 -0
- package/data/craftbook-templates/de/design-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/craftbook.json +616 -0
- package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/test.json +201 -0
- package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/do/doc-rewrite/versions/1.0.3/test.json +119 -55
- package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/test.json +92 -0
- package/data/craftbook-templates/do/documentation-drift-review/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/craftbook.json +324 -0
- package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/test.json +161 -0
- package/data/craftbook-templates/ed/edit-notes/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/craftbook.json +566 -0
- package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/test.json +191 -0
- package/data/craftbook-templates/ep/episode-plan/versions/1.0.3/test.json +10 -5
- package/data/craftbook-templates/ex/executive-level-review/versions/2.0.7/test.json +7 -10
- package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/craftbook.json +595 -0
- package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/test.json +139 -0
- package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/craftbook.json +277 -0
- package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/craftbook.json +327 -0
- package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/test.json +162 -0
- package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/craftbook.json +718 -0
- package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/test.json +239 -0
- package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/test.json +162 -0
- package/data/craftbook-templates/fo/form-wizard/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/ho/holiday-card-run/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/craftbook.json +610 -0
- package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/test.json +220 -0
- package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/craftbook.json +343 -0
- package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/test.json +176 -0
- package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/craftbook.json +566 -0
- package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/test.json +141 -0
- package/data/craftbook-templates/im/image-set-index/versions/1.2.3/craftbook.json +298 -0
- package/data/craftbook-templates/im/image-set-index/versions/1.2.3/test.json +180 -0
- package/data/craftbook-templates/in/insurance-inventory/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/in/interactive-quiz/versions/1.0.3/test.json +48 -23
- package/data/craftbook-templates/in/invitation-design/versions/1.0.3/test.json +1 -1
- package/data/craftbook-templates/index.json +1 -1
- package/data/craftbook-templates/it/item-intake/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/craftbook.json +277 -0
- package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/me/meeting-prep-brief/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.3/test.json +3 -0
- package/data/craftbook-templates/mo/morning-report/versions/1.0.3/test.json +21 -9
- package/data/craftbook-templates/of/office-hours/versions/1.1.1/test.json +8 -8
- package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/craftbook.json +697 -0
- package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/test.json +235 -0
- package/data/craftbook-templates/pe/pest-diagnosis/versions/1.0.3/test.json +19 -8
- package/data/craftbook-templates/pl/plan/versions/1.0.2/test.json +8 -8
- package/data/craftbook-templates/pl/playtest-report/versions/1.0.3/test.json +17 -7
- package/data/craftbook-templates/pr/practice-exam/versions/1.0.3/test.json +7 -2
- package/data/craftbook-templates/pr/practice-session/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/craftbook.json +435 -0
- package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/test.json +141 -0
- package/data/craftbook-templates/qu/quarterly-summary/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/re/receipt-intake/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/craftbook.json +277 -0
- package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/re/recipe-capture/versions/1.0.3/test.json +13 -5
- package/data/craftbook-templates/re/record-a-relative/versions/1.0.3/test.json +3 -0
- package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/re/refactor-module/versions/2.0.2/craftbook.json +695 -0
- package/data/craftbook-templates/re/refactor-module/versions/2.0.2/test.json +241 -0
- package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/craftbook.json +361 -0
- package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/test.json +138 -0
- package/data/craftbook-templates/re/release-notes/versions/1.0.4/test.json +8 -8
- package/data/craftbook-templates/re/release-notes/versions/1.0.5/craftbook.json +339 -0
- package/data/craftbook-templates/re/release-notes/versions/1.0.5/test.json +111 -0
- package/data/craftbook-templates/re/reliability-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/re/research-report/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/craftbook.json +596 -0
- package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/test.json +157 -0
- package/data/craftbook-templates/ro/rough-cut-assembly/versions/1.0.4/test.json +13 -5
- package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/craftbook.json +624 -0
- package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/test.json +225 -0
- package/data/craftbook-templates/sc/script-automation/versions/1.0.4/craftbook.json +284 -0
- package/data/craftbook-templates/sc/script-automation/versions/1.0.4/test.json +162 -0
- package/data/craftbook-templates/se/security-architecture-review/versions/2.0.7/test.json +10 -13
- package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/craftbook.json +597 -0
- package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/test.json +157 -0
- package/data/craftbook-templates/so/social-digest/versions/1.0.3/craftbook.json +239 -0
- package/data/craftbook-templates/so/social-digest/versions/1.0.3/test.json +168 -0
- package/data/craftbook-templates/so/source-quality-audit/versions/1.0.3/test.json +25 -11
- package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/craftbook.json +599 -0
- package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/test.json +162 -0
- package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/craftbook.json +577 -0
- package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/test.json +174 -0
- package/data/craftbook-templates/te/test-coverage-review/versions/1.2.1/test.json +16 -8
- package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/craftbook.json +592 -0
- package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/test.json +195 -0
- package/data/craftbook-templates/th/thank-you-batch/versions/1.0.3/test.json +6 -3
- package/data/craftbook-templates/th/thank-you-sweep/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/ti/tileset-batch/versions/1.0.3/test.json +9 -3
- package/data/craftbook-templates/tr/transcribe-and-shownotes/versions/1.0.3/test.json +10 -5
- package/data/craftbook-templates/tr/transcribe-index/versions/1.0.3/test.json +6 -3
- package/data/craftbook-templates/tr/translate-content/versions/1.1.3/craftbook.json +140 -0
- package/data/craftbook-templates/tr/translate-content/versions/1.1.3/test.json +141 -0
- package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/craftbook.json +594 -0
- package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/test.json +221 -0
- package/data/craftbook-templates/ux/ux-update/versions/1.0.2/craftbook.json +606 -0
- package/data/craftbook-templates/ux/ux-update/versions/1.0.2/test.json +206 -0
- package/data/craftbook-templates/we/weak-spot-drill/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/we/weekly-walkthrough/versions/1.0.3/test.json +21 -9
- package/data/craftbook-templates/wh/whitepaper/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/ye/year-in-review/versions/1.0.3/test.json +8 -4
- package/data/project-types/index.json +1 -1
- package/data/project-types/ju/just-chat/manifest.json +1 -1
- package/data/project-types/ju/just-chat/versions/1.0.1/about.md +5 -0
- package/data/project-types/ju/just-chat/versions/1.0.1/manifest.json +19 -0
- package/package.json +1 -1
- package/schemas/chat-model-identity.schema.json +27 -0
- package/schemas/chat-model-version.schema.json +22 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "auth-flow",
|
|
3
|
+
"name": "Auth / Session Implementation",
|
|
4
|
+
"description": "Implement an authentication and session flow — login, session/token issuance, verification, and logout — with the security fundamentals baked in. Threat-models FIRST to lock the security requirements — credential hashing, token/session strategy, expiry, CSRF/XSS posture, and the attacks in scope — then implements registration/login/verify/logout to those requirements, then a security-minded reviewer audits for the classic auth pitfalls. Covers password hashing (bcrypt/argon2), session vs JWT, token expiry/refresh, secure cookie flags, timing-safe comparison, CSRF protection, and brute-force throttling.\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. Threat scope (planner) — lock the security requirements and threats in scope → gated on artifact `{{workPath}}/threat-scope.md` (markdown-notes)\n2. Build the auth flow (developer) — implement register/login/verify/logout securely → gated on `src/auth.js` (code-module)\n3. Security review (reviewer) — audit for the classic auth pitfalls → gated on artifact `{{workPath}}/review.md` (markdown-notes)\n\nThe gates never advance with an unmet criterion, and loop back to the\nowning phase to fix named gaps.\n",
|
|
5
|
+
"entryStepId": "threat-scope",
|
|
6
|
+
"triggers": [
|
|
7
|
+
"implement login",
|
|
8
|
+
"build an auth flow",
|
|
9
|
+
"session handling",
|
|
10
|
+
"add authentication",
|
|
11
|
+
"jwt or session auth"
|
|
12
|
+
],
|
|
13
|
+
"paramSchema": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"properties": {
|
|
16
|
+
"workPath": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"title": "Working folder",
|
|
19
|
+
"description": "Per-task working folder in the artifacts drawer. Defaults to this task's own folder so runs never collide; override with a stable name when you deliberately want runs to share files.",
|
|
20
|
+
"default": "{{task.dir}}"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"steps": [
|
|
25
|
+
{
|
|
26
|
+
"id": "threat-scope",
|
|
27
|
+
"name": "Threat scope",
|
|
28
|
+
"description": "lock the security requirements and threats in scope",
|
|
29
|
+
"prompt": "Lock the security requirements before implementing auth — auth done casually is a vulnerability. Step 1: Decide the session strategy: server sessions vs JWT, where the token lives (httpOnly cookie vs header), and expiry/refresh. Step 2: Lock credential handling: passwords hashed with a strong adaptive function (bcrypt/argon2) and never stored or logged in plaintext, with timing-safe verification. Step 3: Enumerate the threats in scope and the mitigations: brute force (throttling/lockout), CSRF (token or SameSite cookie), XSS (httpOnly), session fixation (rotate on login), and enumeration (uniform error messages). Step 4: Write a numbered acceptance-criteria checklist of 6-9 items (e.g. 'passwords are hashed, never plaintext', 'wrong password and unknown user return the same error', 'sessions expire and rotate on login', 'logout invalidates the session', 'cookies are httpOnly/secure/SameSite'). `write_task_note` the requirements + threat list + checklist and write the same to the produces path.\n\nThe deliverable `{{workPath}}/threat-scope.md` lands in the project's artifacts drawer — write it with `write_artifact` and read it back with `read_artifact`; the shipped workspace stays untouched.",
|
|
30
|
+
"suggestedRole": "planner",
|
|
31
|
+
"toolPolicy": {
|
|
32
|
+
"disallowBuiltinToolsets": [
|
|
33
|
+
"ai-apps",
|
|
34
|
+
"archives",
|
|
35
|
+
"audio",
|
|
36
|
+
"browser-automation",
|
|
37
|
+
"code-execution",
|
|
38
|
+
"craftbooks",
|
|
39
|
+
"data-tables",
|
|
40
|
+
"entity-intel",
|
|
41
|
+
"git",
|
|
42
|
+
"image-intel",
|
|
43
|
+
"images",
|
|
44
|
+
"role-delegation",
|
|
45
|
+
"role-delegation-escalation",
|
|
46
|
+
"team-management",
|
|
47
|
+
"videos",
|
|
48
|
+
"web",
|
|
49
|
+
"workspace-fs-write"
|
|
50
|
+
],
|
|
51
|
+
"outputMedium": "artifact",
|
|
52
|
+
"additionalOutputMedia": [
|
|
53
|
+
"task-note"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"advanceWhen": {
|
|
57
|
+
"file": "{{workPath}}/threat-scope.md",
|
|
58
|
+
"minBytes": 1,
|
|
59
|
+
"sniff": "nonempty",
|
|
60
|
+
"artifact": true
|
|
61
|
+
},
|
|
62
|
+
"gate": {
|
|
63
|
+
"at": "completion",
|
|
64
|
+
"checks": [
|
|
65
|
+
{
|
|
66
|
+
"kind": "minBytes",
|
|
67
|
+
"file": "{{workPath}}/threat-scope.md",
|
|
68
|
+
"bytes": 120,
|
|
69
|
+
"artifact": true
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"kind": "sniff",
|
|
73
|
+
"file": "{{workPath}}/threat-scope.md",
|
|
74
|
+
"sniff": "nonempty",
|
|
75
|
+
"artifact": true
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
"onReject": "threat-scope",
|
|
79
|
+
"maxAttempts": 3
|
|
80
|
+
},
|
|
81
|
+
"next": "build"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"id": "build",
|
|
85
|
+
"name": "Build the auth flow",
|
|
86
|
+
"description": "implement register/login/verify/logout securely",
|
|
87
|
+
"prompt": "Implement the auth flow to the security requirements. Step 1: Registration — hash passwords with the chosen adaptive function and a per-user salt; never store/log plaintext. Step 2: Login — look up the user and verify with a timing-safe comparison; on success issue the session/token with expiry and set the cookie with httpOnly/secure/SameSite (rotate the session id to prevent fixation). Step 3: Use a UNIFORM error for both unknown-user and wrong-password to avoid enumeration; add basic brute-force throttling. Step 4: Verify — middleware/function that validates the session/token and rejects expired/invalid ones. Step 5: Logout — invalidate the session server-side and clear the cookie. Add CSRF protection for state-changing routes. Write the implementation to the produces path. On a loop-back, fix only the flagged issue. `write_task_note` the file path and which criteria now pass.",
|
|
88
|
+
"suggestedRole": "developer",
|
|
89
|
+
"toolPolicy": {
|
|
90
|
+
"disallowBuiltinToolsets": [
|
|
91
|
+
"ai-apps",
|
|
92
|
+
"archives",
|
|
93
|
+
"artifacts",
|
|
94
|
+
"audio",
|
|
95
|
+
"browser-automation",
|
|
96
|
+
"craftbooks",
|
|
97
|
+
"data-tables",
|
|
98
|
+
"entity-intel",
|
|
99
|
+
"git",
|
|
100
|
+
"image-intel",
|
|
101
|
+
"images",
|
|
102
|
+
"role-delegation",
|
|
103
|
+
"role-delegation-escalation",
|
|
104
|
+
"team-management",
|
|
105
|
+
"videos",
|
|
106
|
+
"web"
|
|
107
|
+
],
|
|
108
|
+
"outputMedium": "workspace",
|
|
109
|
+
"additionalOutputMedia": [
|
|
110
|
+
"task-note"
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
"advanceWhen": {
|
|
114
|
+
"file": "src/auth.js",
|
|
115
|
+
"minBytes": 1,
|
|
116
|
+
"sniff": "nonempty"
|
|
117
|
+
},
|
|
118
|
+
"gate": {
|
|
119
|
+
"at": "completion",
|
|
120
|
+
"checks": [
|
|
121
|
+
{
|
|
122
|
+
"kind": "minBytes",
|
|
123
|
+
"file": "src/auth.js",
|
|
124
|
+
"bytes": 200
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"kind": "sniff",
|
|
128
|
+
"file": "src/auth.js",
|
|
129
|
+
"sniff": "nonempty"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"kind": "esmImports",
|
|
133
|
+
"file": "src/auth.js"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"kind": "sourceParses",
|
|
137
|
+
"file": "src/auth.js"
|
|
138
|
+
}
|
|
139
|
+
],
|
|
140
|
+
"onReject": "build",
|
|
141
|
+
"maxAttempts": 3
|
|
142
|
+
},
|
|
143
|
+
"next": "review"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"id": "review",
|
|
147
|
+
"name": "Security review",
|
|
148
|
+
"description": "audit for the classic auth pitfalls",
|
|
149
|
+
"prompt": "Audit the auth implementation against the threat scope and the classic pitfalls. Step 1: Confirm passwords are hashed with a strong adaptive function (not MD5/SHA-1/plaintext) and never logged. Step 2: Confirm login uses timing-safe comparison and that unknown-user vs wrong-password are indistinguishable (no enumeration). Step 3: Confirm sessions/tokens expire, rotate on login, and are invalidated on logout, and that cookies carry httpOnly/secure/SameSite. Step 4: Confirm CSRF protection on state-changing routes and that brute force is throttled. Step 5: Look for secrets hardcoded in source. Write an audit note listing each threat and PASS/FAIL with the specific finding to the produces path.\n\nThe deliverable `{{workPath}}/review.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.",
|
|
150
|
+
"suggestedRole": "reviewer",
|
|
151
|
+
"toolPolicy": {
|
|
152
|
+
"disallowBuiltinToolsets": [
|
|
153
|
+
"ai-apps",
|
|
154
|
+
"archives",
|
|
155
|
+
"audio",
|
|
156
|
+
"browser-automation",
|
|
157
|
+
"code-execution",
|
|
158
|
+
"craftbooks",
|
|
159
|
+
"data-tables",
|
|
160
|
+
"entity-intel",
|
|
161
|
+
"git",
|
|
162
|
+
"image-intel",
|
|
163
|
+
"images",
|
|
164
|
+
"role-delegation",
|
|
165
|
+
"role-delegation-escalation",
|
|
166
|
+
"team-management",
|
|
167
|
+
"videos",
|
|
168
|
+
"web",
|
|
169
|
+
"workspace-fs-write"
|
|
170
|
+
],
|
|
171
|
+
"outputMedium": "artifact",
|
|
172
|
+
"additionalOutputMedia": [
|
|
173
|
+
"task-note"
|
|
174
|
+
]
|
|
175
|
+
},
|
|
176
|
+
"advanceWhen": {
|
|
177
|
+
"file": "{{workPath}}/review.md",
|
|
178
|
+
"minBytes": 1,
|
|
179
|
+
"sniff": "nonempty",
|
|
180
|
+
"artifact": true
|
|
181
|
+
},
|
|
182
|
+
"gate": {
|
|
183
|
+
"at": "completion",
|
|
184
|
+
"checks": [
|
|
185
|
+
{
|
|
186
|
+
"kind": "minBytes",
|
|
187
|
+
"file": "src/auth.js",
|
|
188
|
+
"bytes": 200
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"kind": "sniff",
|
|
192
|
+
"file": "src/auth.js",
|
|
193
|
+
"sniff": "nonempty"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"kind": "esmImports",
|
|
197
|
+
"file": "src/auth.js"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"kind": "sourceParses",
|
|
201
|
+
"file": "src/auth.js"
|
|
202
|
+
}
|
|
203
|
+
],
|
|
204
|
+
"onReject": "review",
|
|
205
|
+
"maxAttempts": 4
|
|
206
|
+
},
|
|
207
|
+
"next": "evaluate"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"id": "evaluate",
|
|
211
|
+
"name": "Evaluate",
|
|
212
|
+
"description": "Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.",
|
|
213
|
+
"prompt": "Exercise the auth flow and audit the code. For EACH acceptance criterion: confirm passwords are hashed (never plaintext/logged), confirm unknown-user and wrong-password return identical errors, confirm sessions expire/rotate and logout invalidates, confirm cookies are httpOnly/secure/SameSite, and confirm CSRF + brute-force protections exist. Write PASS/FAIL per criterion; plaintext passwords or user enumeration is an automatic FAIL.\n\nThen route — this is the whole point of the loop:\n\n- **Every criterion PASSES →** call `advance_task_step({ ref, stepId: \"evaluate\", next: \"finish\" })`.\n- **Any criterion FAILS →** write the specific gaps to notes, then call `advance_task_step({ ref, stepId: \"evaluate\", next: \"build\" })` to loop back. The builder fixes exactly those gaps.\n\nNever route to `finish` while any criterion is unmet. The build phase's completion gate already blocked a grossly-incomplete deliverable; your job is the judgment an automated check cannot make (does it actually work, read well, look right). After ~3 unproductive loops, stop and report DONE_WITH_CONCERNS so the user can step in.",
|
|
214
|
+
"suggestedRole": "reviewer",
|
|
215
|
+
"toolPolicy": {
|
|
216
|
+
"disallowBuiltinToolsets": [
|
|
217
|
+
"ai-apps",
|
|
218
|
+
"archives",
|
|
219
|
+
"artifacts",
|
|
220
|
+
"audio",
|
|
221
|
+
"browser-automation",
|
|
222
|
+
"code-execution",
|
|
223
|
+
"craftbooks",
|
|
224
|
+
"data-tables",
|
|
225
|
+
"entity-intel",
|
|
226
|
+
"git",
|
|
227
|
+
"image-intel",
|
|
228
|
+
"images",
|
|
229
|
+
"role-delegation",
|
|
230
|
+
"role-delegation-escalation",
|
|
231
|
+
"security-intel",
|
|
232
|
+
"team-management",
|
|
233
|
+
"videos",
|
|
234
|
+
"web",
|
|
235
|
+
"workspace-fs-write"
|
|
236
|
+
],
|
|
237
|
+
"outputMedium": "task-note"
|
|
238
|
+
},
|
|
239
|
+
"consumes": [
|
|
240
|
+
{
|
|
241
|
+
"file": "src/auth.js"
|
|
242
|
+
}
|
|
243
|
+
],
|
|
244
|
+
"next": "build"
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"id": "finish",
|
|
248
|
+
"name": "Finish",
|
|
249
|
+
"description": "All acceptance criteria met. Stamp a short summary and report DONE.",
|
|
250
|
+
"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.",
|
|
251
|
+
"suggestedRole": "developer",
|
|
252
|
+
"toolPolicy": {
|
|
253
|
+
"disallowBuiltinToolsets": [
|
|
254
|
+
"ai-apps",
|
|
255
|
+
"archives",
|
|
256
|
+
"artifacts",
|
|
257
|
+
"audio",
|
|
258
|
+
"browser-automation",
|
|
259
|
+
"code-execution",
|
|
260
|
+
"craftbooks",
|
|
261
|
+
"data-tables",
|
|
262
|
+
"entity-intel",
|
|
263
|
+
"git",
|
|
264
|
+
"image-intel",
|
|
265
|
+
"images",
|
|
266
|
+
"role-delegation",
|
|
267
|
+
"role-delegation-escalation",
|
|
268
|
+
"security-intel",
|
|
269
|
+
"team-management",
|
|
270
|
+
"videos",
|
|
271
|
+
"web",
|
|
272
|
+
"workspace-fs-write"
|
|
273
|
+
],
|
|
274
|
+
"outputMedium": "task-note"
|
|
275
|
+
},
|
|
276
|
+
"terminal": true
|
|
277
|
+
}
|
|
278
|
+
],
|
|
279
|
+
"version": "1.0.4",
|
|
280
|
+
"releasedAt": "2026-09-05T03:30:00Z",
|
|
281
|
+
"minGezelVersion": "1.26233"
|
|
282
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"title": "Secure auth-flow module",
|
|
4
|
+
"objective": "Measure whether the auth-flow craftbook scopes threats before writing a password/session flow with basic security controls.",
|
|
5
|
+
"tags": [
|
|
6
|
+
"code"
|
|
7
|
+
],
|
|
8
|
+
"prompt": "In the `Auth Flow Eval` project, write `src/auth.js`: a small dependency-free ESM module for a session-based email/password login flow. Include registration, login, logout, session creation/validation, password hashing with Node crypto pbkdf2 or scrypt, CSRF token generation/validation, rate-limit bookkeeping, and safe error messages. Also write `tasks/eval/review.md` with a concise security review that covers password storage, session expiry, CSRF, rate limiting, and what is intentionally out of scope. Do not use live network services or real credentials.",
|
|
9
|
+
"setup": {
|
|
10
|
+
"projectName": "Auth Flow Eval",
|
|
11
|
+
"about": "Self-contained eval project for auth-flow. Deliverables are workspace/src/auth.js and workspace/notes/review.md.",
|
|
12
|
+
"missionObjectives": "Build a small local auth module and a threat/security review covering storage, sessions, CSRF, and rate limiting.",
|
|
13
|
+
"files": [],
|
|
14
|
+
"worker": {
|
|
15
|
+
"name": "Sander",
|
|
16
|
+
"role": "Developer"
|
|
17
|
+
},
|
|
18
|
+
"craftbookParams": {
|
|
19
|
+
"workPath": "tasks/eval"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"mocks": [],
|
|
23
|
+
"success": {
|
|
24
|
+
"summary": "src/auth.js implements a local auth module and tasks/eval/review.md covers the required security controls.",
|
|
25
|
+
"deliverables": [
|
|
26
|
+
{
|
|
27
|
+
"path": "src/auth.js",
|
|
28
|
+
"kind": "code-module",
|
|
29
|
+
"minBytes": 1800,
|
|
30
|
+
"checks": [
|
|
31
|
+
{
|
|
32
|
+
"kind": "contains",
|
|
33
|
+
"file": "src/auth.js",
|
|
34
|
+
"pattern": "pbkdf2|scrypt|crypto",
|
|
35
|
+
"flags": "i"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"kind": "contains",
|
|
39
|
+
"file": "src/auth.js",
|
|
40
|
+
"pattern": "register",
|
|
41
|
+
"flags": "i"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"kind": "contains",
|
|
45
|
+
"file": "src/auth.js",
|
|
46
|
+
"pattern": "login",
|
|
47
|
+
"flags": "i"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"kind": "contains",
|
|
51
|
+
"file": "src/auth.js",
|
|
52
|
+
"pattern": "logout",
|
|
53
|
+
"flags": "i"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"kind": "contains",
|
|
57
|
+
"file": "src/auth.js",
|
|
58
|
+
"pattern": "session",
|
|
59
|
+
"flags": "i"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"kind": "contains",
|
|
63
|
+
"file": "src/auth.js",
|
|
64
|
+
"pattern": "csrf",
|
|
65
|
+
"flags": "i"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"kind": "contains",
|
|
69
|
+
"file": "src/auth.js",
|
|
70
|
+
"pattern": "rate|attempt",
|
|
71
|
+
"flags": "i"
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"path": "tasks/eval/review.md",
|
|
77
|
+
"kind": "markdown-notes",
|
|
78
|
+
"minBytes": 350,
|
|
79
|
+
"checks": [
|
|
80
|
+
{
|
|
81
|
+
"kind": "contains",
|
|
82
|
+
"file": "tasks/eval/review.md",
|
|
83
|
+
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
84
|
+
"flags": "i"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"kind": "contains",
|
|
88
|
+
"file": "tasks/eval/review.md",
|
|
89
|
+
"pattern": "password|hash",
|
|
90
|
+
"flags": "i"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"kind": "contains",
|
|
94
|
+
"file": "tasks/eval/review.md",
|
|
95
|
+
"pattern": "session|expiry|expiration",
|
|
96
|
+
"flags": "i"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"kind": "contains",
|
|
100
|
+
"file": "tasks/eval/review.md",
|
|
101
|
+
"pattern": "csrf",
|
|
102
|
+
"flags": "i"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"kind": "contains",
|
|
106
|
+
"file": "tasks/eval/review.md",
|
|
107
|
+
"pattern": "rate limit|rate-limit|attempt",
|
|
108
|
+
"flags": "i"
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
"rubric": {
|
|
115
|
+
"artifact": {
|
|
116
|
+
"path": "src/auth.js",
|
|
117
|
+
"kind": "typescript"
|
|
118
|
+
},
|
|
119
|
+
"axes": [
|
|
120
|
+
{
|
|
121
|
+
"name": "correctness",
|
|
122
|
+
"description": "The module does what the requirements ask, with sensible edge handling."
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"name": "verification",
|
|
126
|
+
"description": "Self-tests exercise real behavior, not trivial truths."
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"name": "clarity",
|
|
130
|
+
"description": "Exports, naming, and structure make the module usable without reading every line."
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"name": "robustness",
|
|
134
|
+
"description": "Invalid input and boundary cases fail loudly rather than silently."
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
"qualityFocus": [
|
|
139
|
+
"security scoping",
|
|
140
|
+
"session flow",
|
|
141
|
+
"review notes"
|
|
142
|
+
]
|
|
143
|
+
}
|
|
@@ -217,28 +217,32 @@
|
|
|
217
217
|
"kind": "contains",
|
|
218
218
|
"file": "tasks/eval/report.md",
|
|
219
219
|
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
220
|
-
"flags": "i"
|
|
220
|
+
"flags": "i",
|
|
221
|
+
"artifact": true
|
|
221
222
|
},
|
|
222
223
|
{
|
|
223
224
|
"kind": "contains",
|
|
224
225
|
"file": "tasks/eval/report.md",
|
|
225
226
|
"pattern": "dry[ -]?run",
|
|
226
227
|
"flags": "i",
|
|
227
|
-
"label": "the dry run is reported"
|
|
228
|
+
"label": "the dry run is reported",
|
|
229
|
+
"artifact": true
|
|
228
230
|
},
|
|
229
231
|
{
|
|
230
232
|
"kind": "contains",
|
|
231
233
|
"file": "tasks/eval/report.md",
|
|
232
234
|
"pattern": "override|manual|stop",
|
|
233
235
|
"flags": "i",
|
|
234
|
-
"label": "the install notes say how to stop it"
|
|
236
|
+
"label": "the install notes say how to stop it",
|
|
237
|
+
"artifact": true
|
|
235
238
|
},
|
|
236
239
|
{
|
|
237
240
|
"kind": "citationsResolve",
|
|
238
241
|
"file": "tasks/eval/report.md",
|
|
239
242
|
"pattern": "(automations/[a-z0-9-]+\\.json)",
|
|
240
243
|
"minCitations": 1,
|
|
241
|
-
"label": "the install notes point at a recipe file that exists on disk"
|
|
244
|
+
"label": "the install notes point at a recipe file that exists on disk",
|
|
245
|
+
"artifact": true
|
|
242
246
|
},
|
|
243
247
|
{
|
|
244
248
|
"kind": "judge",
|
|
@@ -248,9 +252,11 @@
|
|
|
248
252
|
"tasks/eval/dry-run.md",
|
|
249
253
|
"home/devices.json"
|
|
250
254
|
],
|
|
251
|
-
"label": "honest, grounded install notes"
|
|
255
|
+
"label": "honest, grounded install notes",
|
|
256
|
+
"artifact": true
|
|
252
257
|
}
|
|
253
|
-
]
|
|
258
|
+
],
|
|
259
|
+
"artifact": true
|
|
254
260
|
}
|
|
255
261
|
],
|
|
256
262
|
"mocks": [
|