@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,157 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"title": "Security Architecture Review — admin export surface",
|
|
4
|
+
"objective": "Exercise the Security Architecture Review craftbook against a self-contained service slice and require a prioritized, evidence-linked report that includes both confirmed vulnerabilities and working controls.",
|
|
5
|
+
"tags": [
|
|
6
|
+
"workflow",
|
|
7
|
+
"security",
|
|
8
|
+
"architecture-review",
|
|
9
|
+
"typescript"
|
|
10
|
+
],
|
|
11
|
+
"prompt": "Use the Security Architecture Review craftbook to review the seeded service slice. This is report-only: do not modify source files. Model assets, actors, trust boundaries, and data flows; audit authorization, command/SQL construction, secrets handling, and relevant common vulnerability classes. Produce the scope and findings register, then write `tasks/eval/security/security-architecture-review.md`. Every confirmed finding must name severity, confidence, concrete workspace evidence, exploit preconditions, impact, and a specific remediation plus verification. Include working controls and rejected hypotheses. Do not invent CVEs, dependency versions, scans, or tests you did not run, and do not reproduce the example secret value in the report.",
|
|
12
|
+
"setup": {
|
|
13
|
+
"projectName": "Admin export security review",
|
|
14
|
+
"about": "A hermetic source-review fixture. No network or dependency lookup is needed or authorized; conclusions must come from seeded files.",
|
|
15
|
+
"missionObjectives": "Deliver an actionable risk posture that distinguishes confirmed source defects, positive controls, and unverified areas without changing implementation.",
|
|
16
|
+
"managedWorkspaceWritePolicy": "deny",
|
|
17
|
+
"files": [
|
|
18
|
+
{
|
|
19
|
+
"path": "docs/architecture.md",
|
|
20
|
+
"content": "# Service slice\n\nAn authenticated HTTP handler receives an export name and email filter from a browser operated by support staff. The handler calls local process and database adapters. `requireUser` is the shared authentication boundary. Only administrators should reach backup export; ordinary authenticated users may search their own customer records. Deployment injects `SESSION_SECRET` from environment configuration.\n"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"path": "src/auth.ts",
|
|
24
|
+
"content": "export interface User { id: string; role: 'member' | 'admin' }\n\nexport function requireUser(value: User | undefined): User {\n if (!value) throw new Error('unauthorized');\n return value;\n}\n\nexport function requireAdmin(user: User): void {\n if (user.role !== 'admin') throw new Error('forbidden');\n}\n"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"path": "src/admin-export.ts",
|
|
28
|
+
"content": "import { exec } from 'node:child_process';\nimport type { User } from './auth.js';\nimport { requireAdmin, requireUser } from './auth.js';\n\nexport function exportBackup(currentUser: User | undefined, requestedName: string): void {\n const user = requireUser(currentUser);\n requireAdmin(user);\n exec(`tar -czf backups/${requestedName}.tgz data/`);\n}\n"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"path": "src/customer-search.ts",
|
|
32
|
+
"content": "export interface Db { query(sql: string): Promise<unknown[]> }\n\nexport function findCustomerByEmail(db: Db, email: string): Promise<unknown[]> {\n return db.query(`SELECT id, email FROM customers WHERE email = '${email}'`);\n}\n"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"path": "src/safe-audit-log.ts",
|
|
36
|
+
"content": "export interface AuditSink { write(event: { actorId: string; action: string; target: string }): void }\n\nexport function recordExport(sink: AuditSink, actorId: string, target: string): void {\n sink.write({ actorId, action: 'backup.exported', target });\n}\n"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"path": "config/example.env",
|
|
40
|
+
"content": "# Example only; deployment replaces this value\nSESSION_SECRET=local-dev-only-not-a-real-secret\n"
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"craftbookParams": {
|
|
44
|
+
"workPath": "tasks/eval"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"mocks": [],
|
|
48
|
+
"success": {
|
|
49
|
+
"summary": "The named craftbook produces a source-grounded risk posture with prioritized findings, positive controls, remediation, verification, and terminal task evidence.",
|
|
50
|
+
"deliverables": [
|
|
51
|
+
{
|
|
52
|
+
"path": "tasks/eval/security/security-architecture-review.md",
|
|
53
|
+
"kind": "security-report",
|
|
54
|
+
"artifact": true,
|
|
55
|
+
"minBytes": 1700,
|
|
56
|
+
"checks": [
|
|
57
|
+
{
|
|
58
|
+
"kind": "contains",
|
|
59
|
+
"file": "tasks/eval/security/security-architecture-review.md",
|
|
60
|
+
"pattern": "^#{1,3}\\s+Executive risk posture\\b[\\s\\S]*^#{1,3}\\s+What is working\\b[\\s\\S]*^#{1,3}\\s+Prioritized findings\\b[\\s\\S]*^#{1,3}\\s+Remediation plan\\b[\\s\\S]*^#{1,3}\\s+Verification\\b[\\s\\S]*^#{1,3}\\s+Unverified areas\\b",
|
|
61
|
+
"flags": "im",
|
|
62
|
+
"label": "complete security-review structure"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"kind": "contains",
|
|
66
|
+
"file": "tasks/eval/security/security-architecture-review.md",
|
|
67
|
+
"pattern": "(command injection|shell injection)[\\s\\S]{0,500}src/admin-export\\.ts[\\s\\S]*(severity)[\\s\\S]*(confidence)",
|
|
68
|
+
"flags": "is",
|
|
69
|
+
"label": "command-injection finding with evidence metadata"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"kind": "contains",
|
|
73
|
+
"file": "tasks/eval/security/security-architecture-review.md",
|
|
74
|
+
"pattern": "(SQL injection|parameteri[sz]ed quer)[\\s\\S]{0,500}src/customer-search\\.ts",
|
|
75
|
+
"flags": "is",
|
|
76
|
+
"label": "SQL-injection finding and remediation"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"kind": "contains",
|
|
80
|
+
"file": "tasks/eval/security/security-architecture-review.md",
|
|
81
|
+
"pattern": "(requireUser|requireAdmin)[\\s\\S]{0,300}(working|control|authorization|authentication)[\\s\\S]*(safe-audit-log|audit)",
|
|
82
|
+
"flags": "is",
|
|
83
|
+
"label": "positive auth and audit controls"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"kind": "citationsResolve",
|
|
87
|
+
"file": "tasks/eval/security/security-architecture-review.md",
|
|
88
|
+
"minCitations": 4
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"kind": "notContains",
|
|
92
|
+
"file": "tasks/eval/security/security-architecture-review.md",
|
|
93
|
+
"pattern": "CVE-\\d{4}-\\d+",
|
|
94
|
+
"label": "no invented CVEs"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"kind": "notContains",
|
|
98
|
+
"file": "tasks/eval/security/security-architecture-review.md",
|
|
99
|
+
"pattern": "local-dev-only-not-a-real-secret",
|
|
100
|
+
"label": "example secret value is not reproduced"
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
"taskNotes": {
|
|
106
|
+
"minBytes": 180,
|
|
107
|
+
"checks": [
|
|
108
|
+
{
|
|
109
|
+
"kind": "contains",
|
|
110
|
+
"file": "task-notes.md",
|
|
111
|
+
"pattern": "\\bDONE\\b[\\s\\S]*tasks/eval/security/security-architecture-review\\.md[\\s\\S]*(command|SQL)",
|
|
112
|
+
"flags": "i",
|
|
113
|
+
"label": "terminal note records report and principal risks"
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
"requireCraftbookTask": true
|
|
117
|
+
},
|
|
118
|
+
"taskGraph": {
|
|
119
|
+
"requireCraftbookTask": true,
|
|
120
|
+
"requireTerminalStep": true
|
|
121
|
+
},
|
|
122
|
+
"unchangedFixtures": [
|
|
123
|
+
"docs/architecture.md",
|
|
124
|
+
"src/auth.ts",
|
|
125
|
+
"src/admin-export.ts",
|
|
126
|
+
"src/customer-search.ts",
|
|
127
|
+
"src/safe-audit-log.ts",
|
|
128
|
+
"config/example.env"
|
|
129
|
+
]
|
|
130
|
+
},
|
|
131
|
+
"rubric": {
|
|
132
|
+
"artifact": {
|
|
133
|
+
"path": "tasks/eval/security/security-architecture-review.md",
|
|
134
|
+
"kind": "markdown"
|
|
135
|
+
},
|
|
136
|
+
"axes": [
|
|
137
|
+
{
|
|
138
|
+
"name": "Threat-model coverage",
|
|
139
|
+
"description": "The report connects assets, actors, trust boundaries, privileges, and data flows to the reviewed attack surface."
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"name": "Finding rigor",
|
|
143
|
+
"description": "Confirmed findings cite exact source evidence, state preconditions and impact, and calibrate severity and confidence without overclaiming."
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"name": "Remediation utility",
|
|
147
|
+
"description": "Recommendations are prioritized, source-specific, verifiable, and preserve or strengthen the controls that already work."
|
|
148
|
+
}
|
|
149
|
+
],
|
|
150
|
+
"contextNote": "No live dependency or dynamic scan is part of this hermetic source-review scenario; the report should say so."
|
|
151
|
+
},
|
|
152
|
+
"qualityFocus": [
|
|
153
|
+
"Both injection paths are found and tied to exact source",
|
|
154
|
+
"Working authentication, authorization, and audit controls are recognized",
|
|
155
|
+
"Unverified areas and evidence limits are explicit"
|
|
156
|
+
]
|
|
157
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "social-digest",
|
|
3
|
+
"name": "Social Digest",
|
|
4
|
+
"description": "Read everything new on the synced social feeds since the lookback window opened, then compose a grounded morning digest: per-feed activity, notable mentions and replies, engagement movers, and 1-3 suggested next moves carrying one-click gezel-action blocks (fire the draft-social-post craftbook with a prefilled topic, or a reply task for a mention worth answering). Every number in the digest must trace to a synced record via the scan notes — no invented metrics. Runs happily with no connector bound: it reports from posts/index.json alone and names the missing corpus as a gap.",
|
|
5
|
+
"entryStepId": "scan",
|
|
6
|
+
"triggers": [
|
|
7
|
+
"social digest",
|
|
8
|
+
"what happened on our feeds",
|
|
9
|
+
"engagement digest",
|
|
10
|
+
"overnight social summary"
|
|
11
|
+
],
|
|
12
|
+
"command": "social-digest",
|
|
13
|
+
"runModes": {
|
|
14
|
+
"scheduled": "supported",
|
|
15
|
+
"nightShift": "recommended"
|
|
16
|
+
},
|
|
17
|
+
"connectors": [
|
|
18
|
+
{
|
|
19
|
+
"typeId": "bluesky-posts",
|
|
20
|
+
"optional": true,
|
|
21
|
+
"reason": "Read the synced Bluesky posts, mentions, and engagement counts the digest reports on."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"typeId": "x-posts",
|
|
25
|
+
"optional": true,
|
|
26
|
+
"reason": "Read the synced X posts, mentions, and engagement counts the digest reports on."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"typeId": "instagram-media",
|
|
30
|
+
"optional": true,
|
|
31
|
+
"reason": "Read the synced Instagram records so captions and comments show up in the digest."
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"paramSchema": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"properties": {
|
|
37
|
+
"workPath": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"title": "Working folder",
|
|
40
|
+
"description": "Per-task working folder in the artifacts drawer. Defaults to this task's own folder so runs never collide; override with a stable name when you deliberately want runs to share files.",
|
|
41
|
+
"default": "{{task.dir}}"
|
|
42
|
+
},
|
|
43
|
+
"lookbackHours": {
|
|
44
|
+
"type": "integer",
|
|
45
|
+
"default": 24,
|
|
46
|
+
"description": "How many hours back to scan for new records. Default 24."
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"steps": [
|
|
51
|
+
{
|
|
52
|
+
"id": "scan",
|
|
53
|
+
"name": "Scan the feeds",
|
|
54
|
+
"description": "Collect raw notes from every synced corpus record in the window — the only numbers the digest may cite.",
|
|
55
|
+
"prompt": "You are collecting the raw material for the overnight social digest. Look back {{lookbackHours}} hours (if that value reads as a raw {{...}} placeholder, use the default: 24).\n\n1. Call `list_artifacts` on `data/` in the project artifacts. Each subfolder there is one synced feed corpus (Bluesky, X, Instagram, ...); its `_meta.json` names the feed and the last sync. If there is no `data/` folder, nothing is synced: still write the notes artifact, open it with the line \"no synced corpus this run\", record what `posts/index.json` says we published lately, and never invent feed activity.\n2. Read every record inside the window with `read_artifact` — records are markdown files with frontmatter under each corpus, organized newest-first by folder. Collect per feed: posts by us, mentions and replies (author handle plus a short verbatim quote), and each record's engagement counts (`likes`, `reposts`, `replies`) together with its `metrics_updated_at` stamp.\n3. Read `posts/index.json` in the workspace with `read_file` so the digest can match feed records to the posts we shipped.\n4. Write your raw notes to the artifact `{{workPath}}/reports/social-digest-notes.md` with `write_artifact`: one section per feed, and every count copied verbatim next to the record path it came from (for example `data/bluesky/posts/2026-08/2026-08-02-meet-the-makers.md`). These notes are the only source of numbers the digest step may cite.\n\nWhen the notes artifact is written, call `advance_task_step` to move to compose.",
|
|
56
|
+
"suggestedRole": "omroeper",
|
|
57
|
+
"toolPolicy": {
|
|
58
|
+
"disallowBuiltinToolsets": [
|
|
59
|
+
"ai-apps",
|
|
60
|
+
"archives",
|
|
61
|
+
"audio",
|
|
62
|
+
"browser-automation",
|
|
63
|
+
"code-execution",
|
|
64
|
+
"craftbooks",
|
|
65
|
+
"data-tables",
|
|
66
|
+
"entity-intel",
|
|
67
|
+
"git",
|
|
68
|
+
"image-intel",
|
|
69
|
+
"images",
|
|
70
|
+
"role-delegation",
|
|
71
|
+
"role-delegation-escalation",
|
|
72
|
+
"security-intel",
|
|
73
|
+
"team-management",
|
|
74
|
+
"videos",
|
|
75
|
+
"web",
|
|
76
|
+
"workspace-fs-write"
|
|
77
|
+
],
|
|
78
|
+
"outputMedium": "artifact",
|
|
79
|
+
"additionalOutputMedia": [
|
|
80
|
+
"task-note"
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
"advanceWhen": {
|
|
84
|
+
"file": "{{workPath}}/reports/social-digest-notes.md",
|
|
85
|
+
"minBytes": 150,
|
|
86
|
+
"artifact": true
|
|
87
|
+
},
|
|
88
|
+
"gate": {
|
|
89
|
+
"at": "completion",
|
|
90
|
+
"checks": [
|
|
91
|
+
{
|
|
92
|
+
"kind": "minBytes",
|
|
93
|
+
"file": "{{workPath}}/reports/social-digest-notes.md",
|
|
94
|
+
"bytes": 150,
|
|
95
|
+
"artifact": true
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"maxAttempts": 3
|
|
99
|
+
},
|
|
100
|
+
"next": "compose"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"id": "compose",
|
|
104
|
+
"name": "Compose the digest",
|
|
105
|
+
"description": "Write the morning digest from the scan notes, ending with 1-3 one-click actions.",
|
|
106
|
+
"prompt": "Write the digest from `{{workPath}}/reports/social-digest-notes.md` (read it with `read_artifact` first). Every number you cite must appear in those notes — no other source of numbers is allowed.\n\nWrite the digest to the artifact `{{workPath}}/reports/social-digest-<today YYYY-MM-DD>.md` with `write_artifact` (use today's real date in the filename), then write the exact same content to `{{workPath}}/reports/social-digest-latest.md` — the stable path the completion gate reads. Write the latest file last. Sections, in order:\n\n- `## What happened on each feed` — one short block per synced feed; when a feed has no corpus or no new activity, say so in one line.\n- `## Notable mentions & replies` — who said what: name each author, quote them briefly, and say whether the mention deserves a reply.\n- `## Engagement movers` — which of our posts moved: compare the engagement counts and their `metrics_updated_at` stamps from the notes, and call out over- and under-performers. Never invent a number.\n- `## Suggested next moves` — 1-3 concrete suggestions. When a suggestion is directly actionable, follow it with a ```gezel-action fenced YAML block so the user can fire it with one click in the morning. Rules for these blocks: one block per action; flat YAML keys (only `params` nests one level); each block carries a unique, stable `id` slug that stays the same when tomorrow's digest repeats the suggestion; keep `title` short and `reason` to a sentence or two; never invent craftbook ids — the only craftbook you may reference is `draft-social-post`, which ships alongside this workflow. Two kinds:\n\nTo suggest drafting a post (prefill the topic):\n```gezel-action\nkind: fire-craftbook\nid: draft-<short-topic-slug>\ntitle: Draft a post about <thing>\nreason: <why, one sentence grounded in the notes>\ncraftbookId: draft-social-post\nparams:\n topic: <the suggested topic>\n```\n\nTo suggest replying to a mention (a bespoke task with a concrete prompt):\n```gezel-action\nkind: create-task\nid: reply-<author-slug>\ntitle: Reply to <author>\nreason: <why this mention matters, one sentence>\nprompt: Read <record path> in the project artifacts and draft a reply in our voice for the user to approve. Do not post it.\nrole: omroeper\n```\n\nWhen both digest files are written, call `advance_task_step` to move to evaluate.",
|
|
107
|
+
"suggestedRole": "omroeper",
|
|
108
|
+
"toolPolicy": {
|
|
109
|
+
"disallowBuiltinToolsets": [
|
|
110
|
+
"ai-apps",
|
|
111
|
+
"archives",
|
|
112
|
+
"audio",
|
|
113
|
+
"browser-automation",
|
|
114
|
+
"code-execution",
|
|
115
|
+
"craftbooks",
|
|
116
|
+
"data-tables",
|
|
117
|
+
"entity-intel",
|
|
118
|
+
"git",
|
|
119
|
+
"image-intel",
|
|
120
|
+
"images",
|
|
121
|
+
"role-delegation",
|
|
122
|
+
"role-delegation-escalation",
|
|
123
|
+
"security-intel",
|
|
124
|
+
"team-management",
|
|
125
|
+
"videos",
|
|
126
|
+
"web",
|
|
127
|
+
"workspace-fs-write"
|
|
128
|
+
],
|
|
129
|
+
"outputMedium": "artifact",
|
|
130
|
+
"additionalOutputMedia": [
|
|
131
|
+
"task-note"
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
"advanceWhen": {
|
|
135
|
+
"file": "{{workPath}}/reports/social-digest-latest.md",
|
|
136
|
+
"minBytes": 400,
|
|
137
|
+
"requireChange": true,
|
|
138
|
+
"artifact": true
|
|
139
|
+
},
|
|
140
|
+
"gate": {
|
|
141
|
+
"at": "completion",
|
|
142
|
+
"checks": [
|
|
143
|
+
{
|
|
144
|
+
"kind": "minBytes",
|
|
145
|
+
"file": "{{workPath}}/reports/social-digest-latest.md",
|
|
146
|
+
"bytes": 400,
|
|
147
|
+
"artifact": true
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"kind": "contains",
|
|
151
|
+
"file": "{{workPath}}/reports/social-digest-latest.md",
|
|
152
|
+
"pattern": "```gezel-action",
|
|
153
|
+
"label": "digest carries at least one one-click action",
|
|
154
|
+
"artifact": true
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"kind": "judge",
|
|
158
|
+
"file": "{{workPath}}/reports/social-digest-latest.md",
|
|
159
|
+
"rubric": "Every count or metric named in the digest appears verbatim in the scan notes; mentions name real authors from the notes; nothing is invented.",
|
|
160
|
+
"sourceFiles": [
|
|
161
|
+
"{{workPath}}/reports/social-digest-notes.md"
|
|
162
|
+
],
|
|
163
|
+
"label": "no invented metrics",
|
|
164
|
+
"artifact": true
|
|
165
|
+
}
|
|
166
|
+
],
|
|
167
|
+
"onReject": "compose",
|
|
168
|
+
"maxAttempts": 4
|
|
169
|
+
},
|
|
170
|
+
"next": "evaluate"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"id": "evaluate",
|
|
174
|
+
"name": "Evaluate",
|
|
175
|
+
"description": "Grade the digest against every criterion. All pass — finish; any fail — loop back to compose with the named gaps.",
|
|
176
|
+
"prompt": "Open `{{workPath}}/reports/social-digest-latest.md` and `{{workPath}}/reports/social-digest-notes.md` with `read_artifact` and grade the digest. Check EACH criterion and write PASS/FAIL with a one-line reason:\n\n1. Every number in the digest appears in the notes (spot-check at least three).\n2. Each feed present in the notes is covered — or its silence is stated in one line.\n3. Mentions name their authors and quote them accurately.\n4. The engagement-movers section compares real counts from the notes, not impressions.\n5. There are 1-3 suggested next moves, and every ```gezel-action block is valid flat YAML with `kind`, `id`, `title`, `reason`, and — for fire-craftbook — `craftbookId: draft-social-post` only.\n6. The digest is tight enough to read over coffee: no padding, no repeated sections.\n\nThen route — this is the whole point of the loop:\n\n- **Every criterion PASSES →** call `advance_task_step({ ref, stepId: \"evaluate\", next: \"finish\" })`.\n- **Any criterion FAILS →** write the specific gaps to task notes with `write_task_note`, then call `advance_task_step({ ref, stepId: \"evaluate\", next: \"compose\" })` to loop back. The compose step fixes exactly those gaps.\n\nNever route to finish while a criterion is unmet. After ~3 unproductive loops, stop and report DONE_WITH_CONCERNS so the user can step in.",
|
|
177
|
+
"suggestedRole": "reviewer",
|
|
178
|
+
"toolPolicy": {
|
|
179
|
+
"disallowBuiltinToolsets": [
|
|
180
|
+
"ai-apps",
|
|
181
|
+
"archives",
|
|
182
|
+
"audio",
|
|
183
|
+
"browser-automation",
|
|
184
|
+
"code-execution",
|
|
185
|
+
"craftbooks",
|
|
186
|
+
"data-tables",
|
|
187
|
+
"entity-intel",
|
|
188
|
+
"git",
|
|
189
|
+
"image-intel",
|
|
190
|
+
"images",
|
|
191
|
+
"role-delegation",
|
|
192
|
+
"role-delegation-escalation",
|
|
193
|
+
"security-intel",
|
|
194
|
+
"team-management",
|
|
195
|
+
"videos",
|
|
196
|
+
"web",
|
|
197
|
+
"workspace-fs-write"
|
|
198
|
+
],
|
|
199
|
+
"outputMedium": "task-note"
|
|
200
|
+
},
|
|
201
|
+
"next": "compose"
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"id": "finish",
|
|
205
|
+
"name": "Finish",
|
|
206
|
+
"description": "Stamp the summary note and stop.",
|
|
207
|
+
"prompt": "Write a one-paragraph DONE summary with `write_task_note`: the digest artifact paths (the dated file and `{{workPath}}/reports/social-digest-latest.md`), the headline in one line, how many mentions deserve a reply, and how many one-click actions the digest carries. Report DONE.",
|
|
208
|
+
"suggestedRole": "omroeper",
|
|
209
|
+
"toolPolicy": {
|
|
210
|
+
"disallowBuiltinToolsets": [
|
|
211
|
+
"ai-apps",
|
|
212
|
+
"archives",
|
|
213
|
+
"artifacts",
|
|
214
|
+
"audio",
|
|
215
|
+
"browser-automation",
|
|
216
|
+
"code-execution",
|
|
217
|
+
"craftbooks",
|
|
218
|
+
"data-tables",
|
|
219
|
+
"entity-intel",
|
|
220
|
+
"git",
|
|
221
|
+
"image-intel",
|
|
222
|
+
"images",
|
|
223
|
+
"role-delegation",
|
|
224
|
+
"role-delegation-escalation",
|
|
225
|
+
"security-intel",
|
|
226
|
+
"team-management",
|
|
227
|
+
"videos",
|
|
228
|
+
"web",
|
|
229
|
+
"workspace-fs-write"
|
|
230
|
+
],
|
|
231
|
+
"outputMedium": "task-note"
|
|
232
|
+
},
|
|
233
|
+
"terminal": true
|
|
234
|
+
}
|
|
235
|
+
],
|
|
236
|
+
"version": "1.0.3",
|
|
237
|
+
"releasedAt": "2026-09-05T03:30:00Z",
|
|
238
|
+
"minGezelVersion": "1.26233"
|
|
239
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"title": "Overnight digest grounded in a synced Bluesky corpus",
|
|
4
|
+
"objective": "Prove that social-digest reads the synced corpus records, names the people who mentioned us, reports engagement movers without inventing a number, and leaves one-click follow-up actions.",
|
|
5
|
+
"tags": [
|
|
6
|
+
"corpus"
|
|
7
|
+
],
|
|
8
|
+
"prompt": "Run the Social Digest craftbook for this project. Treat every synced record in the artifacts drawer as inside the digest window (the lookback parameter is set very wide for this eval). Write the digest artifact, ground every number in the synced records via your scan notes, name the people who mentioned us, and close with suggested next moves carrying at least one one-click gezel-action block.",
|
|
9
|
+
"setup": {
|
|
10
|
+
"projectName": "Social Digest Eval",
|
|
11
|
+
"about": "Overnight digest eval for a small furniture workshop's Bluesky presence. The artifacts drawer carries a synced corpus of the account's posts plus two mentions; the workspace carries the post index.",
|
|
12
|
+
"missionObjectives": "Produce the morning social digest as a real craftbook task: scan notes first, then the digest with per-feed activity, both mentions named and quoted, engagement movers compared from real counts, and 1-3 suggested next moves with gezel-action blocks referencing only the draft-social-post craftbook.",
|
|
13
|
+
"files": [
|
|
14
|
+
{
|
|
15
|
+
"path": "posts/index.json",
|
|
16
|
+
"content": "{\n \"entries\": [\n {\n \"slug\": \"shop-refresh\",\n \"folder\": \"posts/2026-07-20-shop-refresh\",\n \"title\": \"The shop got a fresh coat\",\n \"status\": \"published\",\n \"platforms\": [\"bluesky\"],\n \"created\": \"2026-07-20\"\n },\n {\n \"slug\": \"meet-the-makers\",\n \"folder\": \"posts/2026-08-01-meet-the-makers\",\n \"title\": \"Meet the makers\",\n \"status\": \"published\",\n \"platforms\": [\"bluesky\"],\n \"created\": \"2026-08-01\"\n },\n {\n \"slug\": \"oak-bench-run\",\n \"folder\": \"posts/2026-08-07-oak-bench-run\",\n \"title\": \"A short run of oak benches\",\n \"status\": \"published\",\n \"platforms\": [\"bluesky\"],\n \"created\": \"2026-08-07\"\n }\n ]\n}\n"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"path": "data/bluesky/_meta.json",
|
|
20
|
+
"surface": "artifact",
|
|
21
|
+
"content": "{\n \"bindingId\": \"bluesky-workshop\",\n \"typeId\": \"bluesky-posts\",\n \"displayName\": \"Bluesky — @bankenbeitel.bsky.social\",\n \"completeness\": \"window\",\n \"lastSyncedAt\": \"2026-08-12T05:00:00Z\"\n}\n"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"path": "data/bluesky/posts/2026-07/2026-07-20-shop-refresh.md",
|
|
25
|
+
"surface": "artifact",
|
|
26
|
+
"content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kshop001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-07-20T09:05:00Z\nlikes: 14\nreposts: 2\nreplies: 1\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nThe shop got a fresh coat over the weekend. Same bench, better light. Come by and see.\n"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"path": "data/bluesky/posts/2026-07/2026-07-24-sharpening-night.md",
|
|
30
|
+
"surface": "artifact",
|
|
31
|
+
"content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3ksharp01\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-07-24T18:30:00Z\nlikes: 9\nreposts: 1\nreplies: 0\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nSharpening night. Every chisel in the rack gets its turn.\n"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"path": "data/bluesky/posts/2026-07/2026-07-27-glue-up.md",
|
|
35
|
+
"surface": "artifact",
|
|
36
|
+
"content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kglue001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-07-27T11:10:00Z\nlikes: 11\nreposts: 0\nreplies: 2\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nBig glue-up day. Twelve clamps, one tabletop, no room for lunch on the bench.\n"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"path": "data/bluesky/posts/2026-08/2026-08-01-meet-the-makers.md",
|
|
40
|
+
"surface": "artifact",
|
|
41
|
+
"content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kmake001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-01T10:00:00Z\nlikes: 63\nreposts: 19\nreplies: 8\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nMeet the makers: three of us, one bench, thirty years of chisels between us.\n"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"path": "data/bluesky/posts/2026-08/2026-08-04-workbench-tour.md",
|
|
45
|
+
"surface": "artifact",
|
|
46
|
+
"content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3ktour001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-04T09:20:00Z\nlikes: 22\nreposts: 4\nreplies: 3\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nA thirty-second tour of the bench: shooting board, bench hooks, and the drawer of mystery screws.\n"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"path": "data/bluesky/posts/2026-08/2026-08-07-oak-bench-run.md",
|
|
50
|
+
"surface": "artifact",
|
|
51
|
+
"content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3koak0001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-07T08:45:00Z\nlikes: 37\nreposts: 11\nreplies: 5\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nA short run of oak benches: six pieces, numbered and signed. First come, first seated.\n"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"path": "data/bluesky/posts/2026-08/2026-08-09-offcut-boxes.md",
|
|
55
|
+
"surface": "artifact",
|
|
56
|
+
"content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kbox0001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-09T16:00:00Z\nlikes: 8\nreposts: 0\nreplies: 1\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nOffcut boxes back in the window. Small wood, small prices.\n"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"path": "data/bluesky/posts/2026-08/2026-08-10-finish-test.md",
|
|
60
|
+
"surface": "artifact",
|
|
61
|
+
"content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kfin0001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-10T13:30:00Z\nlikes: 12\nreposts: 2\nreplies: 4\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nThree finishes on the same oak offcut: raw, oiled, soaped. Which would you take home?\n"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"path": "data/bluesky/posts/2026-08/2026-08-11-bench-dog.md",
|
|
65
|
+
"surface": "artifact",
|
|
66
|
+
"content": "---\nrecord: post\nplatform: bluesky\npostId: at://did:plc:bankenbeitel/app.bsky.feed.post/3kdog0001\nauthor: bankenbeitel.bsky.social\ncreatedAt: 2026-08-11T09:00:00Z\nlikes: 5\nreposts: 0\nreplies: 0\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nNew bench dogs turned from leftover beech. The old ones earned their retirement.\n"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"path": "data/bluesky/mentions/2026-08/2026-08-10-meike-commission.md",
|
|
70
|
+
"surface": "artifact",
|
|
71
|
+
"content": "---\nrecord: mention\nplatform: bluesky\npostId: at://did:plc:meike/app.bsky.feed.post/3kmen0001\nauthor: meike.bsky.social\ninReplyTo: at://did:plc:bankenbeitel/app.bsky.feed.post/3kmake001\ncreatedAt: 2026-08-10T18:40:00Z\nlikes: 9\nreposts: 1\nreplies: 2\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nWent by the workshop after seeing this — walked out with a stool and a story. Do you take commissions for a matching bench?\n"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"path": "data/bluesky/mentions/2026-08/2026-08-11-stef-vandam-question.md",
|
|
75
|
+
"surface": "artifact",
|
|
76
|
+
"content": "---\nrecord: mention\nplatform: bluesky\npostId: at://did:plc:stefvandam/app.bsky.feed.post/3kmen0002\nauthor: stef-vandam.bsky.social\ninReplyTo: at://did:plc:bankenbeitel/app.bsky.feed.post/3kfin0001\ncreatedAt: 2026-08-11T20:15:00Z\nlikes: 3\nreposts: 0\nreplies: 1\nmetrics_updated_at: 2026-08-12T05:00:00Z\n---\nSoaped, every time. Does the soap finish hold up on a kitchen table, or is that asking for water rings?\n"
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
"craftbookParams": {
|
|
80
|
+
"lookbackHours": "87600"
|
|
81
|
+
},
|
|
82
|
+
"worker": {
|
|
83
|
+
"name": "Nora",
|
|
84
|
+
"role": "Omroeper"
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"mocks": [],
|
|
88
|
+
"success": {
|
|
89
|
+
"summary": "The digest artifact exists at its stable path, names both mention authors, compares real engagement counts, and carries at least one gezel-action block; the scan notes artifact grounds every number.",
|
|
90
|
+
"checks": [
|
|
91
|
+
{
|
|
92
|
+
"kind": "minBytes",
|
|
93
|
+
"file": "{{task.dir}}/reports/social-digest-notes.md",
|
|
94
|
+
"bytes": 150,
|
|
95
|
+
"artifact": true
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"kind": "minBytes",
|
|
99
|
+
"file": "{{task.dir}}/reports/social-digest-latest.md",
|
|
100
|
+
"bytes": 400,
|
|
101
|
+
"artifact": true
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"kind": "contains",
|
|
105
|
+
"file": "{{task.dir}}/reports/social-digest-latest.md",
|
|
106
|
+
"pattern": "meike",
|
|
107
|
+
"flags": "i",
|
|
108
|
+
"label": "names the first mention author",
|
|
109
|
+
"artifact": true
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"kind": "contains",
|
|
113
|
+
"file": "{{task.dir}}/reports/social-digest-latest.md",
|
|
114
|
+
"pattern": "stef-vandam|stef vandam",
|
|
115
|
+
"flags": "i",
|
|
116
|
+
"label": "names the second mention author",
|
|
117
|
+
"artifact": true
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"kind": "contains",
|
|
121
|
+
"file": "{{task.dir}}/reports/social-digest-latest.md",
|
|
122
|
+
"pattern": "```gezel-action",
|
|
123
|
+
"label": "carries at least one one-click action",
|
|
124
|
+
"artifact": true
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"kind": "contains",
|
|
128
|
+
"file": "{{task.dir}}/reports/social-digest-latest.md",
|
|
129
|
+
"pattern": "meet-the-makers|Meet the makers",
|
|
130
|
+
"label": "the standout post shows up in the digest",
|
|
131
|
+
"artifact": true
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"taskGraph": {
|
|
135
|
+
"requireCraftbookTask": true,
|
|
136
|
+
"requireTerminalStep": true
|
|
137
|
+
},
|
|
138
|
+
"unchangedFixtures": [
|
|
139
|
+
"posts/index.json"
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
"rubric": {
|
|
143
|
+
"artifact": {
|
|
144
|
+
"path": "tasks/eval/reports/social-digest-latest.md",
|
|
145
|
+
"kind": "markdown"
|
|
146
|
+
},
|
|
147
|
+
"axes": [
|
|
148
|
+
{
|
|
149
|
+
"name": "grounding",
|
|
150
|
+
"description": "Every count in the digest appears in the seeded records; mentions are quoted accurately and attributed to meike.bsky.social and stef-vandam.bsky.social."
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"name": "structure",
|
|
154
|
+
"description": "The four sections are present and each does its job: per-feed activity, mention triage, engagement movers compared from real counts, and suggested next moves."
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"name": "actionability",
|
|
158
|
+
"description": "The gezel-action blocks are valid flat YAML with stable id slugs, reference only draft-social-post, and the suggestions follow from the evidence (e.g. people-first posts outperforming)."
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
"contextNote": "The digest is an artifacts-drawer report; the lookback parameter was set very wide so all seeded records fall inside the window."
|
|
162
|
+
},
|
|
163
|
+
"qualityFocus": [
|
|
164
|
+
"every metric traceable to a synced record",
|
|
165
|
+
"mention triage names authors and quotes them",
|
|
166
|
+
"one-click actions valid and never inventing craftbook ids"
|
|
167
|
+
]
|
|
168
|
+
}
|