@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,195 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"title": "Test backfill proven by mutants",
|
|
4
|
+
"objective": "The craftbook drives a risk-ranked backfill of an untested date-range module. The oracle proves the new tests bite: three seeded mutations (an exclusive boundary, a duration off-by-one, overlap collapsed to containment) are applied in copies and the model's suite must fail at least two of them while staying green on the real tree — with the module under test byte-identical to the fixture.",
|
|
5
|
+
"tags": [
|
|
6
|
+
"code",
|
|
7
|
+
"tests",
|
|
8
|
+
"coverage",
|
|
9
|
+
"tactical-fleet"
|
|
10
|
+
],
|
|
11
|
+
"prompt": "Use the Test Suite Backfill craftbook: src/date-range.js schedules bookings across the product and has no tests at all — tests/ only covers the formatter. Backfill a meaningful suite for the date-range module in the existing test layout, highest-risk behavior first: its bounds are inclusive on both ends and an inverted range must throw.",
|
|
12
|
+
"setup": {
|
|
13
|
+
"projectName": "Booking Ranges",
|
|
14
|
+
"about": "A tiny scheduling library. Tests run with `npm run test` (node --test). src/date-range.js is untested; src/format.js has an existing test that shows the layout and style.",
|
|
15
|
+
"files": [
|
|
16
|
+
{
|
|
17
|
+
"path": "package.json",
|
|
18
|
+
"content": "{\n \"name\": \"booking-ranges\",\n \"private\": true,\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"test\": \"node --test\"\n }\n}\n"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"path": "src/date-range.js",
|
|
22
|
+
"content": "// Inclusive [start, end] day ranges. Days are ISO strings like '2026-03-14'.\nconst DAY_MS = 86400000;\n\nfunction dayValue(day) {\n if (typeof day !== 'string' || !/^\\d{4}-\\d{2}-\\d{2}$/.test(day)) {\n throw new Error(`invalid day: ${day}`);\n }\n const value = Date.parse(`${day}T00:00:00Z`);\n if (Number.isNaN(value)) throw new Error(`invalid day: ${day}`);\n return value;\n}\n\nfunction assertRange(range) {\n const start = dayValue(range.start);\n const end = dayValue(range.end);\n if (start > end) {\n throw new Error(`invalid range: ${range.start} is after ${range.end}`);\n }\n return { start, end };\n}\n\nexport function overlaps(a, b) {\n const ra = assertRange(a);\n const rb = assertRange(b);\n return ra.start <= rb.end && rb.start <= ra.end;\n}\n\nexport function containsDay(range, day) {\n const r = assertRange(range);\n const d = dayValue(day);\n return d >= r.start && d <= r.end;\n}\n\nexport function durationDays(range) {\n const r = assertRange(range);\n return Math.round((r.end - r.start) / DAY_MS) + 1;\n}\n"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"path": "src/format.js",
|
|
26
|
+
"content": "export function slugify(text) {\n return String(text)\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"path": "tests/format.test.mjs",
|
|
30
|
+
"content": "import assert from 'node:assert/strict';\nimport { test } from 'node:test';\nimport { slugify } from '../src/format.js';\n\ntest('slugify collapses spaces and punctuation', () => {\n assert.equal(slugify('Walnut writing desk!'), 'walnut-writing-desk');\n});\n\ntest('slugify trims stray dashes', () => {\n assert.equal(slugify(' --Oak shelf-- '), 'oak-shelf');\n});\n"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"path": "tests/verify-backfill.mjs",
|
|
34
|
+
"content": "import assert from 'node:assert/strict';\nimport { execFileSync } from 'node:child_process';\nimport { cpSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst root = process.cwd();\nconst ORACLE = 'verify-backfill.mjs';\n\n// Bare `node --test` discovery: finds tests/**/*.test.* from cwd and skips\n// dot-directories, so the .oracle-* mutant copies never leak into a run.\n// (A literal `--test tests/` directory argument no longer resolves on\n// modern Node - it is treated as a module path.)\nfunction runSuite(cwd) {\n try {\n execFileSync(process.execPath, ['--test'], { cwd, stdio: 'pipe', timeout: 30000 });\n return 0;\n } catch (err) {\n return typeof err.status === 'number' ? err.status : 1;\n }\n}\n\n// 1) New tests exist in the real layout and target the date-range module.\nconst testFiles = readdirSync(join(root, 'tests'), { recursive: true })\n .map(String)\n .filter((f) => /\\.test\\.(mjs|js|cjs)$/.test(f) && !f.endsWith('format.test.mjs'));\nassert.ok(testFiles.length >= 1, 'no new test file found in tests/');\nconst newTestText = testFiles.map((f) => readFileSync(join(root, 'tests', f), 'utf8')).join('\\n');\nassert.ok(/date-range/.test(newTestText), 'the new tests never reference the date-range module');\nconsole.log('BACKFILL_ORACLE new tests found');\n\n// 2) The suite is green on the real tree.\nassert.equal(runSuite(root), 0, 'the suite must pass on the real tree');\nconsole.log('BACKFILL_ORACLE suite green');\n\n// 3) Seeded defects in copies must make the new suite fail - proof the tests bite.\nconst source = readFileSync(join(root, 'src', 'date-range.js'), 'utf8');\nfunction mutantCaught(name, mutate) {\n const mroot = join(root, `.oracle-${name}`);\n rmSync(mroot, { recursive: true, force: true });\n mkdirSync(mroot, { recursive: true });\n cpSync(join(root, 'src'), join(mroot, 'src'), { recursive: true });\n cpSync(join(root, 'tests'), join(mroot, 'tests'), { recursive: true });\n rmSync(join(mroot, 'tests', ORACLE), { force: true });\n cpSync(join(root, 'package.json'), join(mroot, 'package.json'));\n const mutated = mutate(source);\n assert.notEqual(mutated, source, `mutation ${name} failed to apply - src/date-range.js was altered`);\n writeFileSync(join(mroot, 'src', 'date-range.js'), mutated);\n const caught = runSuite(mroot) !== 0;\n console.log(`BACKFILL_ORACLE mutant ${name} ${caught ? 'caught' : 'MISSED'}`);\n return caught;\n}\n\nconst caught = [\n mutantCaught('boundary', (s) => s.replace('rb.start <= ra.end', 'rb.start < ra.end')),\n mutantCaught('duration', (s) => s.replace('/ DAY_MS) + 1', '/ DAY_MS)')),\n mutantCaught('containment', (s) => s.replace('ra.start <= rb.end && rb.start <= ra.end', 'ra.start <= rb.start && rb.end <= ra.end')),\n].filter(Boolean).length;\nassert.ok(caught >= 2, `the new tests caught only ${caught}/3 seeded defects - they do not pin real behavior`);\nconsole.log(`BACKFILL_ORACLE mutants ${caught}/3`);\nconsole.log('BACKFILL_ORACLE done');\n",
|
|
35
|
+
"surface": "harness"
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"mocks": [],
|
|
40
|
+
"success": {
|
|
41
|
+
"summary": "New tests for the date-range module live in the real layout, the whole suite is green on the untouched tree, and the tests catch at least two of three seeded mutations — with every fleet artifact present and honestly cited.",
|
|
42
|
+
"deliverables": [
|
|
43
|
+
{
|
|
44
|
+
"path": "{{task.dir}}/risk-map.md",
|
|
45
|
+
"kind": "markdown-notes",
|
|
46
|
+
"artifact": true,
|
|
47
|
+
"minBytes": 500,
|
|
48
|
+
"checks": [
|
|
49
|
+
{
|
|
50
|
+
"kind": "contains",
|
|
51
|
+
"file": "{{task.dir}}/risk-map.md",
|
|
52
|
+
"pattern": "^##\\s+Modules[\\s\\S]*^##\\s+Risks ranked[\\s\\S]*^##\\s+Chosen targets",
|
|
53
|
+
"flags": "im",
|
|
54
|
+
"label": "risk-map sections in order"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"kind": "contains",
|
|
58
|
+
"file": "{{task.dir}}/risk-map.md",
|
|
59
|
+
"pattern": "src/date-range\\.js",
|
|
60
|
+
"label": "names the real target module"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"kind": "citationsResolve",
|
|
64
|
+
"file": "{{task.dir}}/risk-map.md",
|
|
65
|
+
"minCitations": 2,
|
|
66
|
+
"artifact": true
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"path": "{{task.dir}}/test-notes.md",
|
|
72
|
+
"kind": "markdown-notes",
|
|
73
|
+
"artifact": true,
|
|
74
|
+
"minBytes": 600,
|
|
75
|
+
"checks": [
|
|
76
|
+
{
|
|
77
|
+
"kind": "contains",
|
|
78
|
+
"file": "{{task.dir}}/test-notes.md",
|
|
79
|
+
"pattern": "^##\\s+Tests added[\\s\\S]*^##\\s+Behaviors pinned[\\s\\S]*^##\\s+How each test would catch a realistic break",
|
|
80
|
+
"flags": "im",
|
|
81
|
+
"label": "test-notes sections in order"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"kind": "citationsResolve",
|
|
85
|
+
"file": "{{task.dir}}/test-notes.md",
|
|
86
|
+
"minCitations": 2,
|
|
87
|
+
"artifact": true
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"path": "{{task.dir}}/verification.md",
|
|
93
|
+
"kind": "markdown-notes",
|
|
94
|
+
"artifact": true,
|
|
95
|
+
"minBytes": 400,
|
|
96
|
+
"checks": [
|
|
97
|
+
{
|
|
98
|
+
"kind": "contains",
|
|
99
|
+
"file": "{{task.dir}}/verification.md",
|
|
100
|
+
"pattern": "^##\\s+Suite[\\s\\S]*^##\\s+Coverage summary[\\s\\S]*^##\\s+Result",
|
|
101
|
+
"flags": "im",
|
|
102
|
+
"label": "verification sections in order"
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"path": "{{task.dir}}/review.md",
|
|
108
|
+
"kind": "markdown-report",
|
|
109
|
+
"artifact": true,
|
|
110
|
+
"minBytes": 400,
|
|
111
|
+
"checks": [
|
|
112
|
+
{
|
|
113
|
+
"kind": "contains",
|
|
114
|
+
"file": "{{task.dir}}/review.md",
|
|
115
|
+
"pattern": "Verdict:\\s*(?:PASS|REVISE)",
|
|
116
|
+
"flags": "i",
|
|
117
|
+
"label": "explicit reviewer verdict"
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
"checks": [
|
|
123
|
+
{
|
|
124
|
+
"kind": "nodeRuns",
|
|
125
|
+
"file": "tests/format.test.mjs"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"kind": "nodeScriptPasses",
|
|
129
|
+
"script": "tests/verify-backfill.mjs",
|
|
130
|
+
"timeoutMs": 120000,
|
|
131
|
+
"requiredOutput": [
|
|
132
|
+
{
|
|
133
|
+
"pattern": "BACKFILL_ORACLE new tests found",
|
|
134
|
+
"label": "new tests exist in the real layout"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"pattern": "BACKFILL_ORACLE suite green",
|
|
138
|
+
"label": "the whole suite passes on the real tree"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"pattern": "BACKFILL_ORACLE mutants [23]/3",
|
|
142
|
+
"label": "the new tests catch seeded defects"
|
|
143
|
+
}
|
|
144
|
+
]
|
|
145
|
+
}
|
|
146
|
+
],
|
|
147
|
+
"taskNotes": {
|
|
148
|
+
"minBytes": 120,
|
|
149
|
+
"checks": [
|
|
150
|
+
{
|
|
151
|
+
"kind": "contains",
|
|
152
|
+
"file": "task-notes.md",
|
|
153
|
+
"pattern": "\\bDONE\\b[\\s\\S]*(npm\\s+run\\s+test|node\\s+--test)",
|
|
154
|
+
"flags": "i",
|
|
155
|
+
"label": "DONE note names the real test command"
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
},
|
|
159
|
+
"taskGraph": {
|
|
160
|
+
"requireCraftbookTask": true,
|
|
161
|
+
"requireTerminalStep": true
|
|
162
|
+
},
|
|
163
|
+
"unchangedFixtures": [
|
|
164
|
+
"package.json",
|
|
165
|
+
"src/date-range.js",
|
|
166
|
+
"src/format.js",
|
|
167
|
+
"tests/format.test.mjs"
|
|
168
|
+
]
|
|
169
|
+
},
|
|
170
|
+
"rubric": {
|
|
171
|
+
"artifact": {
|
|
172
|
+
"path": "{{task.dir}}/test-notes.md",
|
|
173
|
+
"kind": "markdown"
|
|
174
|
+
},
|
|
175
|
+
"axes": [
|
|
176
|
+
{
|
|
177
|
+
"name": "Risk-driven targeting",
|
|
178
|
+
"description": "The tests pin the behaviors whose silent breakage costs most — inclusive bounds, duration arithmetic, the invalid-range throw — following the risk map rather than the easiest paths."
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"name": "Tests that bite",
|
|
182
|
+
"description": "Each test asserts real values, errors, and edge cases a wrong implementation would fail; no tautologies, and seeded mutations to the module are actually caught."
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"name": "Layout fidelity and honesty",
|
|
186
|
+
"description": "Tests follow the existing layout and style, the suite result comes from real runs, the module under test is untouched, and uncovered targets are deferred honestly."
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
"qualityFocus": [
|
|
191
|
+
"mutation-proof regression guards",
|
|
192
|
+
"risk-ranked coverage",
|
|
193
|
+
"enforced review of assertions"
|
|
194
|
+
]
|
|
195
|
+
}
|
|
@@ -99,16 +99,19 @@
|
|
|
99
99
|
{
|
|
100
100
|
"kind": "contains",
|
|
101
101
|
"file": "tasks/eval/report.md",
|
|
102
|
-
"pattern": "(?:^|\\n)#{1,3}\\s+\\S"
|
|
102
|
+
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
103
|
+
"artifact": true
|
|
103
104
|
},
|
|
104
105
|
{
|
|
105
106
|
"kind": "contains",
|
|
106
107
|
"file": "tasks/eval/report.md",
|
|
107
108
|
"pattern": "logged|recorded",
|
|
108
109
|
"flags": "i",
|
|
109
|
-
"label": "notes logged against the roster"
|
|
110
|
+
"label": "notes logged against the roster",
|
|
111
|
+
"artifact": true
|
|
110
112
|
}
|
|
111
|
-
]
|
|
113
|
+
],
|
|
114
|
+
"artifact": true
|
|
112
115
|
}
|
|
113
116
|
]
|
|
114
117
|
},
|
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
"worker": {
|
|
24
24
|
"name": "Coby",
|
|
25
25
|
"role": "Event assistant"
|
|
26
|
+
},
|
|
27
|
+
"craftbookParams": {
|
|
28
|
+
"workPath": "tasks/eval"
|
|
26
29
|
}
|
|
27
30
|
},
|
|
28
31
|
"mocks": [],
|
|
@@ -90,23 +93,27 @@
|
|
|
90
93
|
{
|
|
91
94
|
"kind": "contains",
|
|
92
95
|
"file": "tasks/eval/report.md",
|
|
93
|
-
"pattern": "(?:^|\\n)#{1,3}\\s+\\S"
|
|
96
|
+
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
97
|
+
"artifact": true
|
|
94
98
|
},
|
|
95
99
|
{
|
|
96
100
|
"kind": "contains",
|
|
97
101
|
"file": "tasks/eval/report.md",
|
|
98
102
|
"pattern": "sent|tracked",
|
|
99
103
|
"flags": "i",
|
|
100
|
-
"label": "tracking state recorded"
|
|
104
|
+
"label": "tracking state recorded",
|
|
105
|
+
"artifact": true
|
|
101
106
|
},
|
|
102
107
|
{
|
|
103
108
|
"kind": "contains",
|
|
104
109
|
"file": "tasks/eval/report.md",
|
|
105
110
|
"pattern": "9|nine",
|
|
106
111
|
"flags": "i",
|
|
107
|
-
"label": "coverage count stated"
|
|
112
|
+
"label": "coverage count stated",
|
|
113
|
+
"artifact": true
|
|
108
114
|
}
|
|
109
|
-
]
|
|
115
|
+
],
|
|
116
|
+
"artifact": true
|
|
110
117
|
}
|
|
111
118
|
]
|
|
112
119
|
},
|
|
@@ -31,6 +31,9 @@
|
|
|
31
31
|
"worker": {
|
|
32
32
|
"name": "Bram",
|
|
33
33
|
"role": "Assetsmid"
|
|
34
|
+
},
|
|
35
|
+
"craftbookParams": {
|
|
36
|
+
"workPath": "tasks/eval"
|
|
34
37
|
}
|
|
35
38
|
},
|
|
36
39
|
"mocks": [],
|
|
@@ -114,16 +117,19 @@
|
|
|
114
117
|
"kind": "contains",
|
|
115
118
|
"file": "tasks/eval/report.md",
|
|
116
119
|
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
117
|
-
"flags": "i"
|
|
120
|
+
"flags": "i",
|
|
121
|
+
"artifact": true
|
|
118
122
|
},
|
|
119
123
|
{
|
|
120
124
|
"kind": "contains",
|
|
121
125
|
"file": "tasks/eval/report.md",
|
|
122
126
|
"pattern": "tile",
|
|
123
127
|
"flags": "i",
|
|
124
|
-
"label": "the batch is summarized"
|
|
128
|
+
"label": "the batch is summarized",
|
|
129
|
+
"artifact": true
|
|
125
130
|
}
|
|
126
|
-
]
|
|
131
|
+
],
|
|
132
|
+
"artifact": true
|
|
127
133
|
}
|
|
128
134
|
]
|
|
129
135
|
},
|
|
@@ -41,19 +41,22 @@
|
|
|
41
41
|
"kind": "contains",
|
|
42
42
|
"file": "tasks/eval/report.md",
|
|
43
43
|
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
44
|
-
"flags": "i"
|
|
44
|
+
"flags": "i",
|
|
45
|
+
"artifact": true
|
|
45
46
|
},
|
|
46
47
|
{
|
|
47
48
|
"kind": "contains",
|
|
48
49
|
"file": "tasks/eval/report.md",
|
|
49
50
|
"pattern": "\\d{1,2}:\\d{2}",
|
|
50
|
-
"label": "timestamped chapters"
|
|
51
|
+
"label": "timestamped chapters",
|
|
52
|
+
"artifact": true
|
|
51
53
|
},
|
|
52
54
|
{
|
|
53
55
|
"kind": "contains",
|
|
54
56
|
"file": "tasks/eval/report.md",
|
|
55
57
|
"pattern": "chapter",
|
|
56
|
-
"flags": "i"
|
|
58
|
+
"flags": "i",
|
|
59
|
+
"artifact": true
|
|
57
60
|
},
|
|
58
61
|
{
|
|
59
62
|
"kind": "valuesSubsetOf",
|
|
@@ -63,9 +66,11 @@
|
|
|
63
66
|
],
|
|
64
67
|
"pattern": "(\\d{1,2}:\\d{2})",
|
|
65
68
|
"minMatches": 4,
|
|
66
|
-
"label": "every timestamp traces to the transcript"
|
|
69
|
+
"label": "every timestamp traces to the transcript",
|
|
70
|
+
"artifact": true
|
|
67
71
|
}
|
|
68
|
-
]
|
|
72
|
+
],
|
|
73
|
+
"artifact": true
|
|
69
74
|
}
|
|
70
75
|
]
|
|
71
76
|
},
|
|
@@ -110,15 +110,18 @@
|
|
|
110
110
|
"kind": "contains",
|
|
111
111
|
"file": "tasks/eval/report.md",
|
|
112
112
|
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
113
|
-
"flags": "i"
|
|
113
|
+
"flags": "i",
|
|
114
|
+
"artifact": true
|
|
114
115
|
},
|
|
115
116
|
{
|
|
116
117
|
"kind": "contains",
|
|
117
118
|
"file": "tasks/eval/report.md",
|
|
118
119
|
"pattern": "\\d{2}:\\d{2}:\\d{2}",
|
|
119
|
-
"label": "highlights point at real timecodes"
|
|
120
|
+
"label": "highlights point at real timecodes",
|
|
121
|
+
"artifact": true
|
|
120
122
|
}
|
|
121
|
-
]
|
|
123
|
+
],
|
|
124
|
+
"artifact": true
|
|
122
125
|
}
|
|
123
126
|
]
|
|
124
127
|
},
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "translate-content",
|
|
3
|
+
"name": "Translate Content",
|
|
4
|
+
"description": "Translate the project's new and changed content into the designated language as sidecar files under translations/<language>/, mirroring the source structure and never modifying originals.",
|
|
5
|
+
"entryStepId": "translate",
|
|
6
|
+
"triggers": [
|
|
7
|
+
"translate the content",
|
|
8
|
+
"translate everything",
|
|
9
|
+
"update the translations"
|
|
10
|
+
],
|
|
11
|
+
"command": "translate-content",
|
|
12
|
+
"runModes": {
|
|
13
|
+
"scheduled": "supported",
|
|
14
|
+
"nightShift": "recommended"
|
|
15
|
+
},
|
|
16
|
+
"paramSchema": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"properties": {
|
|
19
|
+
"language": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Target language — a language name or BCP-47 tag (e.g. Nederlands, de, pt-BR).",
|
|
22
|
+
"projectProperty": "content.language"
|
|
23
|
+
},
|
|
24
|
+
"workPath": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"title": "Working folder",
|
|
27
|
+
"description": "Per-task working folder in the artifacts drawer for this run's intermediate files. Defaults to this task's own folder so concurrent runs never overwrite each other; override with a stable name only when runs should deliberately share working files.",
|
|
28
|
+
"default": "{{task.dir}}"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"required": [
|
|
32
|
+
"language"
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
"steps": [
|
|
36
|
+
{
|
|
37
|
+
"id": "translate",
|
|
38
|
+
"name": "Translate changed content",
|
|
39
|
+
"prompt": "You are running the incremental translation pass into **{{language}}**.\n\n1. List the project's content files (markdown, text, and documents converted to markdown). Skip code, lockfiles, binaries, and anything under `translations/`.\n2. For each content file, check whether a sidecar already exists at `translations/{{language}}/<same relative path>` and whether the source changed since it was written (compare content, not timestamps — if the existing translation still matches the source's current content, skip it).\n3. Translate each new or changed file into {{language}} and write the result to `translations/{{language}}/<same relative path>` with `write_file`. Preserve meaning, tone, register, markdown structure, links, and code blocks. Never translate product names, code identifiers, or content inside code fences. NEVER modify a source file.\n4. After every translation sidecar is written, finish by calling `write_artifact` for `{{workPath}}/run-note.md`: list which files you translated this pass, which you skipped as unchanged, and anything you could not translate (with the reason).\n\nIf no content has changed since the last pass, still write the run-note artifact saying so. Keep the note factual and short. Write the run note last: it triggers completion, and the completion gate requires at least one sidecar under `translations/{{language}}/` plus a substantive run note.",
|
|
40
|
+
"suggestedRole": "Translator",
|
|
41
|
+
"toolPolicy": {
|
|
42
|
+
"disallowBuiltinToolsets": [
|
|
43
|
+
"ai-apps",
|
|
44
|
+
"archives",
|
|
45
|
+
"audio",
|
|
46
|
+
"browser-automation",
|
|
47
|
+
"code-execution",
|
|
48
|
+
"craftbooks",
|
|
49
|
+
"data-tables",
|
|
50
|
+
"entity-intel",
|
|
51
|
+
"git",
|
|
52
|
+
"image-intel",
|
|
53
|
+
"images",
|
|
54
|
+
"role-delegation",
|
|
55
|
+
"role-delegation-escalation",
|
|
56
|
+
"security-intel",
|
|
57
|
+
"team-management",
|
|
58
|
+
"videos",
|
|
59
|
+
"web"
|
|
60
|
+
],
|
|
61
|
+
"outputMedium": "artifact",
|
|
62
|
+
"additionalOutputMedia": [
|
|
63
|
+
"task-note",
|
|
64
|
+
"workspace"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
"advanceWhen": {
|
|
68
|
+
"file": "{{workPath}}/run-note.md",
|
|
69
|
+
"minBytes": 80,
|
|
70
|
+
"requireChange": true,
|
|
71
|
+
"artifact": true
|
|
72
|
+
},
|
|
73
|
+
"gate": {
|
|
74
|
+
"at": "completion",
|
|
75
|
+
"checks": [
|
|
76
|
+
{
|
|
77
|
+
"kind": "fileCount",
|
|
78
|
+
"ext": [
|
|
79
|
+
"md",
|
|
80
|
+
"markdown",
|
|
81
|
+
"txt"
|
|
82
|
+
],
|
|
83
|
+
"min": 1,
|
|
84
|
+
"dir": "translations/{{language}}"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"kind": "minBytes",
|
|
88
|
+
"file": "{{workPath}}/run-note.md",
|
|
89
|
+
"bytes": 80,
|
|
90
|
+
"artifact": true
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"kind": "contains",
|
|
94
|
+
"file": "{{workPath}}/run-note.md",
|
|
95
|
+
"pattern": "translated|skipped|unchanged|could not translate",
|
|
96
|
+
"flags": "i",
|
|
97
|
+
"label": "run note reports the pass outcome",
|
|
98
|
+
"artifact": true
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
"onReject": "translate",
|
|
102
|
+
"maxAttempts": 4
|
|
103
|
+
},
|
|
104
|
+
"next": "done"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"id": "done",
|
|
108
|
+
"name": "Done",
|
|
109
|
+
"prompt": "The translation sidecars and run-note artifact cleared the completion gate. Call `write_task_note` with the target language, translated and skipped counts, the sidecar root, and confirmation that source files stayed untouched. Then finish the task.",
|
|
110
|
+
"suggestedRole": "Translator",
|
|
111
|
+
"toolPolicy": {
|
|
112
|
+
"disallowBuiltinToolsets": [
|
|
113
|
+
"ai-apps",
|
|
114
|
+
"archives",
|
|
115
|
+
"artifacts",
|
|
116
|
+
"audio",
|
|
117
|
+
"browser-automation",
|
|
118
|
+
"code-execution",
|
|
119
|
+
"craftbooks",
|
|
120
|
+
"data-tables",
|
|
121
|
+
"entity-intel",
|
|
122
|
+
"git",
|
|
123
|
+
"image-intel",
|
|
124
|
+
"images",
|
|
125
|
+
"role-delegation",
|
|
126
|
+
"role-delegation-escalation",
|
|
127
|
+
"security-intel",
|
|
128
|
+
"team-management",
|
|
129
|
+
"videos",
|
|
130
|
+
"web",
|
|
131
|
+
"workspace-fs-write"
|
|
132
|
+
],
|
|
133
|
+
"outputMedium": "task-note"
|
|
134
|
+
},
|
|
135
|
+
"terminal": true
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
"version": "1.1.3",
|
|
139
|
+
"releasedAt": "2026-09-05T03:30:00Z"
|
|
140
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"title": "Incremental sidecar translation workflow",
|
|
4
|
+
"objective": "Prove that the translate-content task writes faithful mirrored translations, preserves originals, records the run, and clears its runtime completion gate.",
|
|
5
|
+
"tags": [
|
|
6
|
+
"corpus"
|
|
7
|
+
],
|
|
8
|
+
"prompt": "Run the Translate Content craftbook for this project into Dutch (language: Nederlands). Translate docs/welcome.md and docs/pricing.md into mirrored sidecars under translations/Nederlands/, never modify the source files, and complete the real craftbook task including its run-note gate.",
|
|
9
|
+
"setup": {
|
|
10
|
+
"projectName": "Translate Content Eval",
|
|
11
|
+
"about": "Self-contained translation workflow eval. Two small English content documents are seeded under workspace/docs; the designated language is Dutch.",
|
|
12
|
+
"missionObjectives": "Use the Translate Content craftbook as a real task, keep a faithful Dutch shadow under translations/Nederlands/, preserve originals byte-for-byte, and clear the task's completion gate.",
|
|
13
|
+
"files": [
|
|
14
|
+
{
|
|
15
|
+
"path": "docs/welcome.md",
|
|
16
|
+
"content": "# Welcome to Brightbeam\n\nBrightbeam helps small workshops schedule their apprentices. Create a workshop, invite your crew, and the weekly plan builds itself.\n\nThe `brightbeam sync` command uploads your local plan. Do not rename it.\n"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"path": "docs/pricing.md",
|
|
20
|
+
"content": "# Pricing\n\nBrightbeam has two plans. The Workshop plan is free for up to five crew members. The Guild plan costs 12 euro per month and adds shared reports and priority support.\n"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"craftbookParams": {
|
|
24
|
+
"language": "Nederlands"
|
|
25
|
+
},
|
|
26
|
+
"worker": {
|
|
27
|
+
"name": "Els",
|
|
28
|
+
"role": "Translator"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"mocks": [],
|
|
32
|
+
"success": {
|
|
33
|
+
"summary": "Both Dutch sidecars exist, originals remain intact, and History proves the translate step's runtime gate approved on a task sourced from translate-content.",
|
|
34
|
+
"deliverables": [
|
|
35
|
+
{
|
|
36
|
+
"path": "translations/Nederlands/docs/welcome.md",
|
|
37
|
+
"kind": "markdown-report",
|
|
38
|
+
"minBytes": 150,
|
|
39
|
+
"checks": [
|
|
40
|
+
{
|
|
41
|
+
"kind": "contains",
|
|
42
|
+
"file": "translations/Nederlands/docs/welcome.md",
|
|
43
|
+
"pattern": "Brightbeam",
|
|
44
|
+
"label": "product name stays untranslated"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"kind": "contains",
|
|
48
|
+
"file": "translations/Nederlands/docs/welcome.md",
|
|
49
|
+
"pattern": "`brightbeam sync`",
|
|
50
|
+
"label": "code identifier stays untranslated"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"kind": "contains",
|
|
54
|
+
"file": "translations/Nederlands/docs/welcome.md",
|
|
55
|
+
"pattern": "welkom|werkplaats|plannen|ploeg|leerling",
|
|
56
|
+
"flags": "i",
|
|
57
|
+
"label": "body reads as Dutch"
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"path": "translations/Nederlands/docs/pricing.md",
|
|
63
|
+
"kind": "markdown-report",
|
|
64
|
+
"minBytes": 100,
|
|
65
|
+
"checks": [
|
|
66
|
+
{
|
|
67
|
+
"kind": "contains",
|
|
68
|
+
"file": "translations/Nederlands/docs/pricing.md",
|
|
69
|
+
"pattern": "12",
|
|
70
|
+
"label": "the price survives translation"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"kind": "contains",
|
|
74
|
+
"file": "translations/Nederlands/docs/pricing.md",
|
|
75
|
+
"pattern": "gratis|per maand|prijzen|abonnement",
|
|
76
|
+
"flags": "i",
|
|
77
|
+
"label": "body reads as Dutch"
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"checks": [
|
|
83
|
+
{
|
|
84
|
+
"kind": "contains",
|
|
85
|
+
"file": "docs/welcome.md",
|
|
86
|
+
"pattern": "Brightbeam helps small workshops schedule their apprentices",
|
|
87
|
+
"label": "original welcome.md is unmodified"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"kind": "contains",
|
|
91
|
+
"file": "docs/pricing.md",
|
|
92
|
+
"pattern": "The Workshop plan is free for up to five crew members",
|
|
93
|
+
"label": "original pricing.md is unmodified"
|
|
94
|
+
}
|
|
95
|
+
],
|
|
96
|
+
"taskGraph": {
|
|
97
|
+
"requireCraftbookTask": true,
|
|
98
|
+
"requireTerminalStep": true
|
|
99
|
+
},
|
|
100
|
+
"history": [
|
|
101
|
+
{
|
|
102
|
+
"kind": "task.step.gated",
|
|
103
|
+
"minEntries": 1,
|
|
104
|
+
"details": {
|
|
105
|
+
"bookCatalogId": "translate-content",
|
|
106
|
+
"stepId": "translate",
|
|
107
|
+
"decision": "approve"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
],
|
|
111
|
+
"unchangedFixtures": [
|
|
112
|
+
"docs/welcome.md",
|
|
113
|
+
"docs/pricing.md"
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
"rubric": {
|
|
117
|
+
"artifact": {
|
|
118
|
+
"path": "translations/Nederlands/docs/welcome.md",
|
|
119
|
+
"kind": "markdown"
|
|
120
|
+
},
|
|
121
|
+
"axes": [
|
|
122
|
+
{
|
|
123
|
+
"name": "fidelity",
|
|
124
|
+
"description": "Meaning, tone, and register survive translation; nothing material is added or dropped."
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"name": "terminology",
|
|
128
|
+
"description": "Product names and code identifiers stay untranslated; established Dutch terms are used consistently."
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"name": "structure",
|
|
132
|
+
"description": "Markdown structure and mirrored source paths are preserved exactly."
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
"qualityFocus": [
|
|
137
|
+
"real craftbook task attribution",
|
|
138
|
+
"runtime gate approval evidence",
|
|
139
|
+
"sidecar and source-preservation discipline"
|
|
140
|
+
]
|
|
141
|
+
}
|