@bendyline/gilde 0.1.49 → 0.1.51
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/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.0/test.json +14 -17
- package/data/craftbook-templates/ad/ad-variations/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/al/album-curate/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/al/alert-rules/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/an/anniversary-cut/versions/1.0.4/test.json +0 -3
- package/data/craftbook-templates/an/annotated-bibliography/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ap/api-contract-review/versions/1.1.2/test.json +82 -8
- package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.0/test.json +21 -22
- package/data/craftbook-templates/au/audio-ad-spot/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/au/audio-highlight-reel/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/au/audiobook-master-pack/versions/1.0.4/test.json +0 -3
- package/data/craftbook-templates/au/automation-recipe/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ba/backup-routine/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/bl/blog-post/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/bo/board-deck/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/bo/board-game-web/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/bo/booking-automation/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/br/broadcast-announcement/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.5/test.json +1 -4
- package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.0/test.json +14 -15
- package/data/craftbook-templates/ca/calendar-brief/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ca/canvas-generative-art/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ca/case-study/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ca/case-study-writeup/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ch/chapter-narration-run/versions/1.0.3/test.json +0 -3
- package/data/craftbook-templates/ch/chapter-weave/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ch/character-sheet/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ch/character-turnaround/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ch/chart-pack/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ch/chrome-extension/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.0/test.json +14 -17
- package/data/craftbook-templates/cl/cli-tool/versions/1.1.2/test.json +0 -3
- package/data/craftbook-templates/co/code-review/versions/1.0.0/test.json +175 -53
- package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/test.json +12 -13
- package/data/craftbook-templates/co/company-research-brief/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/co/comparison-matrix/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/co/config-scaffold/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/co/content-deck/versions/1.2.2/craftbook.json +217 -0
- package/data/craftbook-templates/co/content-deck/versions/1.2.2/test.json +169 -0
- package/data/craftbook-templates/co/contract-template/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/co/cookbook-layout/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.2/craftbook.json +221 -0
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.2/test.json +187 -0
- package/data/craftbook-templates/co/cover-letter/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/cr/crm-update-batch/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/cr/cron-job/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/cs/csv-transformer/versions/1.2.3/test.json +0 -3
- package/data/craftbook-templates/da/dashboard-spec/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/da/data-dictionary/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/da/data-export-migrate/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/da/data-join-merge/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.3/test.json +0 -3
- package/data/craftbook-templates/da/data-viz-page/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/da/dataset-clean/versions/1.2.3/test.json +0 -3
- package/data/craftbook-templates/db/db-index-tuning/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/de/deep-security-review/versions/1.1.2/test.json +28 -4
- package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.0/test.json +12 -13
- package/data/craftbook-templates/de/deploy-checklist/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/de/design-system-consultation/versions/2.0.4/test.json +1 -4
- package/data/craftbook-templates/di/diagram-from-text/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/di/digest-from-feeds/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/do/doc-rewrite/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/do/dockerize-app/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/do/docs-site/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/dr/drive-wrap-up/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/du/due-diligence-brief/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/eb/ebook-compile/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ed/edit-notes/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/em/email-sequence/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/em/email-template/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.4/test.json +1 -4
- package/data/craftbook-templates/es/escalation-playbook/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ev/evidence-brief/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ex/expense-categorize/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/fa/fact-check/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/fa/faq-from-docs/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/fa/favicon-set/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.0/test.json +0 -3
- package/data/craftbook-templates/fe/feedback-widget/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.0/test.json +15 -16
- package/data/craftbook-templates/fo/folder-to-audio/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/fo/forecast-model/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/fo/form-wizard/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ga/game-with-screens/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/gl/glossary-build/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/gr/graphql-api/versions/1.0.3/test.json +0 -3
- package/data/craftbook-templates/gr/grpc-service/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ha/handbook-section/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/he/hero-image/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ho/holiday-card-run/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.0/test.json +12 -13
- package/data/craftbook-templates/ht/html-puzzle-game/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ic/icon-pack/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/id/idea-office-hours/versions/2.0.4/test.json +1 -4
- package/data/craftbook-templates/id/idle-clicker-game/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/im/image-batch-edit/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/im/image-dedup-cluster/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/im/image-palette-extract/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/im/image-seo-rename/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/in/inbox-triage/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/in/incident-comms-templates/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/in/incident-postmortem/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/in/insurance-inventory/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/in/interactive-quiz/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/in/invitation-design/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/in/invoice-generator/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/in/invoice-run/versions/1.1.2/test.json +0 -3
- package/data/craftbook-templates/index.json +1 -1
- package/data/craftbook-templates/it/item-intake/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ju/juice-pass/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/kn/knowledge-base-article/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/kp/kpi-scorecard/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/la/landing-copy/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/la/landing-page/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/le/lead-enrichment/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/li/library-package/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/li/literature-review/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/lo/localize-content/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/lo/logo-set/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/me/meeting-minutes/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/me/meeting-notes-to-actions/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/me/meeting-summary-audio/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/me/message-queue-consumer/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/mi/micro-game-jam/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/mo/mock-interview/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/mo/monitor-and-alert/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/mo/month-close/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/mo/moodboard/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/mo/morning-brief/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/mo/morning-report/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/mu/music-metadata-tag/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/na/narrated-slideshow/versions/1.1.2/test.json +0 -3
- package/data/craftbook-templates/ne/newsletter-issue/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.0/test.json +3 -4
- package/data/craftbook-templates/no/notification-router/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/oc/ocr-extract/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/of/offer-compare/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/on/onboarding-checklist/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/on/onboarding-flow/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/on/oncall-handoff/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/on/one-pager/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/op/ops-runbook/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pa/page-spread/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pa/parser-grammar/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pe/perf-audit/versions/1.1.0/test.json +0 -3
- package/data/craftbook-templates/pe/perf-optimization/versions/2.0.0/test.json +16 -17
- package/data/craftbook-templates/pe/pest-diagnosis/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ph/photo-cull/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ph/physics-toy/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pi/pitch-deck/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pl/playtest-report/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/po/podcast-chaptering/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/po/portfolio-site/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/po/powerpoint-deck/versions/1.7.8/craftbook.json +404 -0
- package/data/craftbook-templates/po/powerpoint-deck/versions/1.7.8/test.json +240 -0
- package/data/craftbook-templates/pr/pr-security-review/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pr/practice-exam/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pr/practice-session/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pr/pre-departure-countdown/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pr/press-release/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pr/price-tracker/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pr/pricing-page/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pr/product-descriptions/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pr/proposal-sow/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pu/pull-request-review/versions/1.9.0/test.json +0 -3
- package/data/craftbook-templates/pu/puzzle-pack-layout/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/pw/pwa-offline/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/re/reading-list/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/re/receipt-intake/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/re/reception-report/versions/1.0.1/test.json +8 -9
- package/data/craftbook-templates/re/recipe-capture/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/re/record-a-relative/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/re/refactor-module/versions/2.0.0/test.json +15 -16
- package/data/craftbook-templates/re/regex-builder/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/re/release-announcement/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/re/release-notes/versions/1.0.3/test.json +0 -3
- package/data/craftbook-templates/re/release-readiness-review/versions/1.1.0/test.json +0 -3
- package/data/craftbook-templates/re/report-pdf/versions/1.1.2/test.json +0 -3
- package/data/craftbook-templates/re/rest-api/versions/1.0.3/test.json +0 -3
- package/data/craftbook-templates/re/resume-cv/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ro/rollback-plan/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ro/rough-cut-assembly/versions/1.0.3/test.json +0 -3
- package/data/craftbook-templates/ru/runbook/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/sc/schema-migration/versions/2.0.0/test.json +12 -13
- package/data/craftbook-templates/sc/scrape-to-structured/versions/1.0.3/test.json +0 -3
- package/data/craftbook-templates/sc/script-automation/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/sd/sdk-wrapper/versions/1.0.3/test.json +0 -3
- package/data/craftbook-templates/se/seasonal-maintenance-sweep/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/se/seo-meta-pack/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/so/social-digest/versions/1.0.1/test.json +7 -8
- package/data/craftbook-templates/so/social-thread/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/so/source-quality-audit/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/sp/spa-dashboard/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/sp/spec-authoring/versions/2.0.4/test.json +1 -4
- package/data/craftbook-templates/sp/spec-doc/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/sp/spreadsheet-model/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/sp/sprite-sheet/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/sq/sql-analysis/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/st/standup-summary/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/st/state-machine/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/st/status-report/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/su/subscription-audit/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/su/subtitle-generator/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/su/summarize-long/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/su/survey-analysis/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/sv/svg-animation/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ta/tailor-resume/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/te/technical-documentation/versions/2.0.4/test.json +1 -4
- package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.0/test.json +13 -16
- package/data/craftbook-templates/th/thank-you-sweep/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/th/threat-model/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/th/thumbnail-generator/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ti/tileset-batch/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/to/tone-rewrite/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/to/topic-explainer/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/tr/transcribe-audio/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/tr/translate-content/versions/1.1.1/craftbook.json +90 -0
- package/data/craftbook-templates/tr/translate-content/versions/1.1.1/test.json +141 -0
- package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.0/test.json +13 -14
- package/data/craftbook-templates/ux/ux-update/versions/1.0.0/test.json +12 -13
- package/data/craftbook-templates/ve/version-bump/versions/1.1.0/test.json +0 -3
- package/data/craftbook-templates/vi/video-storyboard/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/vi/visit-prep/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/vo/voiceover-script/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/we/weak-spot-drill/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/we/web-app-crud/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/we/web-component/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/we/webhook-handler/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/we/weekly-menu-plan/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/we/weekly-pipeline-review/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/we/weekly-review/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/we/weekly-walkthrough/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/ye/year-in-review/versions/1.0.2/test.json +0 -3
- package/data/craftbook-templates/yo/youtube-chapters-seo/versions/1.0.2/test.json +0 -3
- package/package.json +1 -1
- package/schemas/craftbook-doc.schema.json +12 -0
- package/schemas/craftbook-template-version.schema.json +12 -0
- package/schemas/craftbook-test.schema.json +12 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"title": "Snapshot-driven code review with a gated artifact report",
|
|
4
|
-
"objective": "Measure the snapshot-review class: read a staged change-set snapshot from the artifacts drawer, ground findings in the actual diff, and produce a severity-ranked, file-cited report artifact whose verdict follows from the findings.",
|
|
4
|
+
"objective": "Measure the snapshot-review class under volume: read a staged change-set snapshot from the artifacts drawer, ground findings in the actual diff, catch every seeded defect, raise nothing against the constructs that only look like defects, and produce a severity-ranked, file-cited report artifact whose verdict follows from the findings.",
|
|
5
5
|
"tags": [],
|
|
6
|
-
"prompt": "A change-set snapshot for review rev-eval-1 is staged in this project's artifacts drawer: reviews/rev-eval-1/manifest.json and reviews/rev-eval-1/changes.diff. Run the code-review craftbook against it and write the gated report artifact to reviews/rev-eval-1/report.md with write_artifact. The diff is the change set under review; the matching source files are in the workspace. Do not
|
|
6
|
+
"prompt": "A change-set snapshot for review rev-eval-1 is staged in this project's artifacts drawer: reviews/rev-eval-1/manifest.json and reviews/rev-eval-1/changes.diff. Run the code-review craftbook against it and write the gated report artifact to reviews/rev-eval-1/report.md with write_artifact. The diff is the change set under review; the matching source files are in the workspace, and docs/review-conventions.md is the house style this codebase is reviewed against. Also leave the machine-readable finding list at the workspace path review-output/findings.json with write_file - a JSON array with one record per finding, each record naming the file (the path as it appears in the diff), the line, a severity of critical, major, minor or nit, a category, and a recommendation - so the follow-up fix pass can pick it up. Do not change any source file: review-output/findings.json is the only workspace file you write.",
|
|
7
7
|
"setup": {
|
|
8
8
|
"projectName": "Code Review Eval",
|
|
9
|
-
"about": "A
|
|
9
|
+
"about": "A small payments service. A seven-file change set is staged for review in the artifacts drawer; the house style it is reviewed against is documented in docs/review-conventions.md.",
|
|
10
10
|
"worker": {
|
|
11
11
|
"name": "Rex",
|
|
12
12
|
"role": "Reviewer"
|
|
@@ -18,68 +18,173 @@
|
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
"path": "src/util.js",
|
|
21
|
-
"content": "function formatCents(cents) {\n return `$${(cents / 100).toFixed(2)}`;\n}\n\nmodule.exports = { formatCents };\n"
|
|
21
|
+
"content": "function formatCents(cents) {\n return `$${(cents / 100).toFixed(2)}`;\n}\n\nmodule.exports = { formatCents };\n",
|
|
22
|
+
"modelInput": false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"path": "src/pagination.js",
|
|
26
|
+
"content": "const DEFAULT_PAGE_SIZE = 25;\n\nfunction pageOf(items, page, pageSize = DEFAULT_PAGE_SIZE) {\n const start = (page - 1) * pageSize;\n const end = start + pageSize + 1;\n return items.slice(start, end);\n}\n\nfunction pageCount(items, pageSize = DEFAULT_PAGE_SIZE) {\n return Math.ceil(items.length / pageSize);\n}\n\nmodule.exports = { pageOf, pageCount, DEFAULT_PAGE_SIZE };\n",
|
|
27
|
+
"modelInput": false
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"path": "src/settings.js",
|
|
31
|
+
"content": "const fs = require('fs');\n\nfunction loadSettings(path) {\n try {\n return { ok: true, settings: JSON.parse(fs.readFileSync(path, 'utf8')) };\n } catch (err) {\n return { ok: true, settings: {} };\n }\n}\n\nmodule.exports = { loadSettings };\n",
|
|
32
|
+
"modelInput": false
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"path": "src/export.js",
|
|
36
|
+
"content": "const fs = require('fs/promises');\n\nasync function exportCharges(db, outPath) {\n const handle = await fs.open(outPath, 'w');\n const rows = await db.query('SELECT id, customer_id, amount FROM charges ORDER BY id');\n for (const row of rows) {\n await handle.write(`${row.id},${row.customer_id},${row.amount}\\n`);\n }\n await handle.close();\n}\n\nmodule.exports = { exportCharges };\n",
|
|
37
|
+
"modelInput": false
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"path": "src/customer.js",
|
|
41
|
+
"content": "// `== null` is the one loose comparison the house style allows: it matches\n// null and undefined together and nothing else, which is exactly what an\n// optional field needs. See docs/review-conventions.md.\nfunction displayName(customer) {\n if (customer.nickname == null) return customer.legalName;\n return customer.nickname;\n}\n\nfunction billingEmail(customer) {\n return customer.billingEmail == null ? customer.email : customer.billingEmail;\n}\n\nmodule.exports = { displayName, billingEmail };\n",
|
|
42
|
+
"modelInput": false
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"path": "src/audit.js",
|
|
46
|
+
"content": "const logger = require('./logger');\n\n// Audit writes are best-effort: they must never delay or break the charge\n// that triggered them, so this call is deliberately not awaited. The\n// attached .catch is what keeps a rejected write from becoming an\n// unhandled rejection. See docs/review-conventions.md.\nfunction recordAudit(db, event) {\n db.insertAudit(event).catch((err) => logger.warn('audit write skipped', err));\n}\n\nmodule.exports = { recordAudit };\n",
|
|
47
|
+
"modelInput": false
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"path": "src/errors.js",
|
|
51
|
+
"content": "const logger = require('./logger');\n\n// Express selects error middleware by ARITY: a handler is only registered\n// as an error handler when it declares exactly four parameters. `req` and\n// `next` are required by that signature even though this terminal handler\n// uses neither. See docs/review-conventions.md.\nfunction errorHandler(err, req, res, next) {\n logger.error('unhandled request error', err);\n res.status(500).json({ error: 'internal_error' });\n}\n\nfunction register(app) {\n app.use(errorHandler);\n}\n\nmodule.exports = { errorHandler, register };\n",
|
|
52
|
+
"modelInput": false
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"path": "src/logger.js",
|
|
56
|
+
"content": "function warn(message, err) {\n process.stderr.write(`[warn] ${message}: ${err && err.message}\\n`);\n}\n\nfunction error(message, err) {\n process.stderr.write(`[error] ${message}: ${err && err.stack}\\n`);\n}\n\nmodule.exports = { warn, error };\n",
|
|
57
|
+
"modelInput": false
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"path": "docs/review-conventions.md",
|
|
61
|
+
"content": "# Review conventions\n\nThe house rules this codebase is reviewed against.\n\n- Every SQL statement uses placeholders. A request value is never\n concatenated or interpolated into a query string.\n- Every acquired resource (file handle, connection, lock) is released on\n every path out of the function, including the error path.\n- A caught error is either handled or re-thrown. A catch block never\n reports success.\n- Slice and range bounds are half-open: `slice(start, start + size)`.\n- Debug logging does not ship.\n\n## Deliberate patterns - correct as written\n\nThese three shapes look like common smells and are not. They are house\nstyle, and a review must not raise them as findings.\n\n- `== null` is the one loose comparison the style allows. It matches null\n and undefined together and nothing else, which is precisely what an\n optional field needs. It is not to be tightened to `===`.\n- Best-effort background writes (audit, telemetry) are deliberately not\n awaited, so they cannot delay or break the request that triggered them.\n A `.catch` handler attached at the call site is the required form; a\n promise carrying a `.catch` is not a floating promise.\n- Express selects error middleware by arity: a handler is only registered\n as an error handler when it declares exactly four parameters. The\n parameters such a handler does not use are required by that signature\n and stay.\n"
|
|
22
62
|
},
|
|
23
63
|
{
|
|
24
64
|
"path": "reviews/rev-eval-1/manifest.json",
|
|
25
65
|
"surface": "artifact",
|
|
26
|
-
"content": "{\n \"version\": 1,\n \"reviewId\": \"rev-eval-1\",\n \"kind\": \"commit\",\n \"createdAt\": \"2026-07-29T09:00:00Z\",\n \"branch\": \"main\",\n \"headSha\": \"3d0c1a2\",\n \"baseRef\": \"HEAD\",\n \"files\": [\n {
|
|
66
|
+
"content": "{\n \"version\": 1,\n \"reviewId\": \"rev-eval-1\",\n \"kind\": \"commit\",\n \"createdAt\": \"2026-07-29T09:00:00Z\",\n \"branch\": \"main\",\n \"headSha\": \"3d0c1a2\",\n \"baseRef\": \"HEAD\",\n \"files\": [\n {\n \"path\": \"src/payment.js\",\n \"kind\": \"modified\",\n \"additions\": 8,\n \"deletions\": 2\n },\n {\n \"path\": \"src/audit.js\",\n \"kind\": \"added\",\n \"additions\": 11,\n \"deletions\": 0\n },\n {\n \"path\": \"src/customer.js\",\n \"kind\": \"added\",\n \"additions\": 13,\n \"deletions\": 0\n },\n {\n \"path\": \"src/errors.js\",\n \"kind\": \"added\",\n \"additions\": 16,\n \"deletions\": 0\n },\n {\n \"path\": \"src/export.js\",\n \"kind\": \"added\",\n \"additions\": 12,\n \"deletions\": 0\n },\n {\n \"path\": \"src/pagination.js\",\n \"kind\": \"added\",\n \"additions\": 13,\n \"deletions\": 0\n },\n {\n \"path\": \"src/settings.js\",\n \"kind\": \"added\",\n \"additions\": 11,\n \"deletions\": 0\n }\n ],\n \"totalFiles\": 7,\n \"filesTruncated\": false,\n \"diffFile\": \"changes.diff\",\n \"diffChars\": 4396,\n \"diffTruncated\": false,\n \"notes\": []\n}\n"
|
|
27
67
|
},
|
|
28
68
|
{
|
|
29
69
|
"path": "reviews/rev-eval-1/changes.diff",
|
|
30
70
|
"surface": "artifact",
|
|
31
|
-
"content": "diff --git a/src/payment.js b/src/payment.js\nindex 3d0c1a2..9f4b7e1 100644\n--- a/src/payment.js\n+++ b/src/payment.js\n@@ -1,12 +1,16 @@\n const db = require('./db');\n \n async function chargeCustomer(req) {\n const amount = req.body.amount;\n const customerId = req.body.customerId;\n- const rows = await db.query('SELECT * FROM customers WHERE id = $1', [customerId]);\n+ // TODO: validate amount server-side\n+ const rows = await db.query(\"SELECT * FROM customers WHERE id = '\" + customerId + \"'\");\n const customer = rows[0];\n- const receipt = await db.query('INSERT INTO charges (customer_id, amount) VALUES ($1, $2) RETURNING id', [customerId, amount]);\n+ console.log('charging', customerId, amount);\n+ const receipt = await db.query(\n+ \"INSERT INTO charges (customer_id, amount) VALUES ('\" + customerId + \"', \" + amount + \") RETURNING id\",\n+ );\n return { chargeId: receipt[0].id, customer: customer.name };\n }\n \n module.exports = { chargeCustomer };\n"
|
|
71
|
+
"content": "diff --git a/src/payment.js b/src/payment.js\nindex 3d0c1a2..9f4b7e1 100644\n--- a/src/payment.js\n+++ b/src/payment.js\n@@ -1,12 +1,16 @@\n const db = require('./db');\n \n async function chargeCustomer(req) {\n const amount = req.body.amount;\n const customerId = req.body.customerId;\n- const rows = await db.query('SELECT * FROM customers WHERE id = $1', [customerId]);\n+ // TODO: validate amount server-side\n+ const rows = await db.query(\"SELECT * FROM customers WHERE id = '\" + customerId + \"'\");\n const customer = rows[0];\n- const receipt = await db.query('INSERT INTO charges (customer_id, amount) VALUES ($1, $2) RETURNING id', [customerId, amount]);\n+ console.log('charging', customerId, amount);\n+ const receipt = await db.query(\n+ \"INSERT INTO charges (customer_id, amount) VALUES ('\" + customerId + \"', \" + amount + \") RETURNING id\",\n+ );\n return { chargeId: receipt[0].id, customer: customer.name };\n }\n \n module.exports = { chargeCustomer };\ndiff --git a/src/audit.js b/src/audit.js\nnew file mode 100644\nindex 0000000..297df83\n--- /dev/null\n+++ b/src/audit.js\n@@ -0,0 +1,11 @@\n+const logger = require('./logger');\n+\n+// Audit writes are best-effort: they must never delay or break the charge\n+// that triggered them, so this call is deliberately not awaited. The\n+// attached .catch is what keeps a rejected write from becoming an\n+// unhandled rejection. See docs/review-conventions.md.\n+function recordAudit(db, event) {\n+ db.insertAudit(event).catch((err) => logger.warn('audit write skipped', err));\n+}\n+\n+module.exports = { recordAudit };\ndiff --git a/src/customer.js b/src/customer.js\nnew file mode 100644\nindex 0000000..c722780\n--- /dev/null\n+++ b/src/customer.js\n@@ -0,0 +1,13 @@\n+// `== null` is the one loose comparison the house style allows: it matches\n+// null and undefined together and nothing else, which is exactly what an\n+// optional field needs. See docs/review-conventions.md.\n+function displayName(customer) {\n+ if (customer.nickname == null) return customer.legalName;\n+ return customer.nickname;\n+}\n+\n+function billingEmail(customer) {\n+ return customer.billingEmail == null ? customer.email : customer.billingEmail;\n+}\n+\n+module.exports = { displayName, billingEmail };\ndiff --git a/src/errors.js b/src/errors.js\nnew file mode 100644\nindex 0000000..7107b89\n--- /dev/null\n+++ b/src/errors.js\n@@ -0,0 +1,16 @@\n+const logger = require('./logger');\n+\n+// Express selects error middleware by ARITY: a handler is only registered\n+// as an error handler when it declares exactly four parameters. `req` and\n+// `next` are required by that signature even though this terminal handler\n+// uses neither. See docs/review-conventions.md.\n+function errorHandler(err, req, res, next) {\n+ logger.error('unhandled request error', err);\n+ res.status(500).json({ error: 'internal_error' });\n+}\n+\n+function register(app) {\n+ app.use(errorHandler);\n+}\n+\n+module.exports = { errorHandler, register };\ndiff --git a/src/export.js b/src/export.js\nnew file mode 100644\nindex 0000000..01f5dcf\n--- /dev/null\n+++ b/src/export.js\n@@ -0,0 +1,12 @@\n+const fs = require('fs/promises');\n+\n+async function exportCharges(db, outPath) {\n+ const handle = await fs.open(outPath, 'w');\n+ const rows = await db.query('SELECT id, customer_id, amount FROM charges ORDER BY id');\n+ for (const row of rows) {\n+ await handle.write(`${row.id},${row.customer_id},${row.amount}\\n`);\n+ }\n+ await handle.close();\n+}\n+\n+module.exports = { exportCharges };\ndiff --git a/src/pagination.js b/src/pagination.js\nnew file mode 100644\nindex 0000000..008b78a\n--- /dev/null\n+++ b/src/pagination.js\n@@ -0,0 +1,13 @@\n+const DEFAULT_PAGE_SIZE = 25;\n+\n+function pageOf(items, page, pageSize = DEFAULT_PAGE_SIZE) {\n+ const start = (page - 1) * pageSize;\n+ const end = start + pageSize + 1;\n+ return items.slice(start, end);\n+}\n+\n+function pageCount(items, pageSize = DEFAULT_PAGE_SIZE) {\n+ return Math.ceil(items.length / pageSize);\n+}\n+\n+module.exports = { pageOf, pageCount, DEFAULT_PAGE_SIZE };\ndiff --git a/src/settings.js b/src/settings.js\nnew file mode 100644\nindex 0000000..b7c463b\n--- /dev/null\n+++ b/src/settings.js\n@@ -0,0 +1,11 @@\n+const fs = require('fs');\n+\n+function loadSettings(path) {\n+ try {\n+ return { ok: true, settings: JSON.parse(fs.readFileSync(path, 'utf8')) };\n+ } catch (err) {\n+ return { ok: true, settings: {} };\n+ }\n+}\n+\n+module.exports = { loadSettings };\n"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"path": "tests/code-review-oracle.mjs",
|
|
75
|
+
"content": "// Precision/recall oracle for the snapshot code review.\n//\n// Run by the harness with the reviewed workspace as cwd. It grades the two\n// halves of a real review separately, because recall alone is passed by a\n// review that flags everything:\n//\n// RECALL - each of the four seeded defects in the change set is\n// reported, against the right file and as the right class.\n// PRECISION - no finding repeats one of the three shotgun smells the\n// change set deliberately baits, and no finding is raised\n// against a file outside the change set.\n//\n// Two rules keep this from punishing correct work.\n//\n// First, defect classes are matched by the ordinary vocabulary of the\n// class, never by wording this fixture invented: \"26 items per page\",\n// \"the end index is one too high\" and \"half-open range\" all count as the\n// pagination defect. The bar is \"a real review of this class\", not this\n// scenario's phrasing.\n//\n// Second, the precision half is scoped to the SMELL, not to the file.\n// src/customer.js, src/audit.js and src/errors.js are baited with a\n// documented house-style construct that must not be flagged - but they\n// are still ordinary code, and a reviewer may legitimately find\n// something else in them (a missing res.headersSent guard in the error\n// handler, say, or a synchronous throw escaping the best-effort audit\n// call). Failing those would punish the exact deep reading this eval is\n// trying to reward, so only a finding that IS the baited smell counts\n// against precision. Whole-file scope is reserved for the two files that\n// are not in the change set at all, where any finding is out of scope by\n// the book's own rule.\n//\n// Precision is graded on the finding records only: a report that\n// discusses a correct construct and explicitly clears it is good\n// reviewing, and is not penalised here.\nimport { readFileSync } from 'node:fs';\n\n/**\n * Fail with the message ALONE on stderr.\n *\n * A thrown Error would work, but the harness feeds this script's stderr\n * into the model's repair nudge verbatim, and an uncaught throw pads that\n * nudge with a Node stack trace and a version banner. The actionable\n * sentence is what the next attempt needs; the stack is noise that pushes\n * it out of view on a small model.\n */\nfunction fail(message) {\n console.error(message);\n process.exit(1);\n}\n\n\nconst FINDINGS = 'review-output/findings.json';\n\nlet raw;\ntry {\n raw = readFileSync(FINDINGS, 'utf8');\n} catch {\n fail(FINDINGS + ' does not exist - the machine-readable finding list is required');\n}\n\nlet findings;\ntry {\n findings = JSON.parse(raw.replace(/^\\uFEFF/, ''));\n} catch (err) {\n fail(FINDINGS + ' is not valid JSON: ' + err.message);\n}\nif (!Array.isArray(findings)) {\n const nested =\n findings && typeof findings === 'object'\n ? Object.values(findings).find((value) => Array.isArray(value))\n : null;\n if (!nested) fail(FINDINGS + ' must be an array of finding records');\n findings = nested;\n}\nfindings = findings.filter((finding) => finding && typeof finding === 'object');\n\n// Every PROSE string anywhere in the record, nested objects and arrays\n// included - a reviewer who nests the explanation under `detail` or\n// splits it across an array is saying the same thing. Citation and\n// identifier fields are excluded: they are addresses, not description,\n// and letting them through means a line number or a path fragment can\n// satisfy a defect-class matcher by coincidence.\nconst CITATION_KEYS = new Set([\n 'file',\n 'path',\n 'filename',\n 'location',\n 'line',\n 'lines',\n 'endline',\n 'startline',\n 'column',\n 'col',\n 'id',\n '#',\n]);\nconst collectStrings = (value, out) => {\n if (typeof value === 'string') out.push(value);\n else if (Array.isArray(value)) for (const item of value) collectStrings(item, out);\n else if (value && typeof value === 'object') {\n for (const [key, item] of Object.entries(value)) {\n if (CITATION_KEYS.has(key.toLowerCase())) continue;\n collectStrings(item, out);\n }\n }\n return out;\n};\nconst text = (finding) => collectStrings(finding, []).join(' ').toLowerCase();\n\nconst fileOf = (finding) =>\n String(finding.file ?? finding.path ?? finding.filename ?? finding.location ?? '')\n .replace(/\\\\/g, '/')\n .replace(/^\\.\\//, '')\n .replace(/^[ab]\\//, '')\n .replace(/\\s*\\([^()]*\\)\\s*$/, '')\n .replace(/[:#]\\s*L?\\d+(?:\\s*-\\s*L?\\d+)?\\s*$/, '')\n .trim();\n\n// Basenames are unique across every seeded file, so a bare `payment.js`\n// citation resolves the same as `src/payment.js`.\nconst onFile = (path) => {\n const base = path.slice(path.lastIndexOf('/') + 1);\n const full = new RegExp('(^|/)' + path.replace(/\\./g, '\\\\.') + '$');\n const bare = new RegExp('^' + base.replace(/\\./g, '\\\\.') + '$');\n return findings.filter((finding) => {\n const cited = fileOf(finding);\n return full.test(cited) || bare.test(cited);\n });\n};\n\nconst REQUIRED = [\n {\n file: 'src/payment.js',\n label: 'the customer and charge queries build SQL by string concatenation from req.body',\n match: (t) =>\n /injection|sqli\\b|parameteri|parametri|placeholder|prepared statement|\\bbind\\b|\\bbinding\\b|bound parameter|concatenat|interpolat|escap|sanitiz|quoting/.test(\n t,\n ) ||\n (/\\bsql\\b|\\bquery\\b|\\bqueries\\b|statement/.test(t) &&\n /untrusted|user[- ](?:input|supplied|controlled|data)|req\\.body|request (?:value|data|input|body)|unsafe|unsanitiz|unvalidated|string (?:concat|building|built)|built from|splic/.test(\n t,\n )),\n },\n {\n file: 'src/pagination.js',\n label: 'pageOf is off by one on its slice end bound, so pages overlap by a row',\n match: (t) =>\n /off.?by.?one|\\bslice\\b|\\bbound(?:ary|aries|s)?\\b|half.?open|exclusive|inclusive|overlap|duplicat|repeat|reappear|one too many|one (?:extra|more)|too many|extra (?:item|row|record|element|entry|result)|\\+\\s?1\\b|pagesize \\+|\\+ pagesize|increment|\\b26\\b|end (?:index|bound|offset|position)|last (?:item|row|record|element)/.test(\n t,\n ),\n },\n {\n file: 'src/settings.js',\n label: 'loadSettings swallows the parse error and still reports ok: true',\n match: (t) =>\n /swallow|silent|suppress|\\bmask|\\bhid(?:e|es|den|ing)|\\bignor|empty catch|catch block|\\bok\\b|\\btrue\\b|success|succeed|re-?throw|rethrow|propagat|bubble|surfac|indistinguishable|no indication|cannot tell|unaware|misleading|misreport|false (?:success|positive)|as if|pretend/.test(\n t,\n ),\n },\n {\n file: 'src/export.js',\n label: 'exportCharges leaks the file handle when the query or a write throws',\n match: (t) =>\n /leak|\\bclos(?:e|es|ed|ing)\\b|\\bfinally\\b|clean.?up|releas|dispos|\\bhandle\\b|descriptor|\\bfd\\b|resource|left open|remains open|stays open|still open|dangling|exhaust|unclosed/.test(\n t,\n ),\n },\n];\n\nconst missing = REQUIRED.filter(\n (required) => !onFile(required.file).some((finding) => required.match(text(finding))),\n);\nif (missing.length > 0) {\n const reported = findings.map((finding) => fileOf(finding) || '?').join(', ') || '(nothing)';\n fail(\n 'RECALL SHORTFALL - the change set holds four separate defects and these were not reported: ' +\n missing.map((entry) => entry.file + ' (' + entry.label + ')').join('; ') +\n '. Files carrying a reported finding: ' +\n reported +\n '. Re-walk changes.diff hunk by hunk; every defect above is visible in the added lines.',\n );\n}\n\n// Baited smells. Each of these three files carries a construct that looks\n// like a common lint smell and is documented house style in\n// docs/review-conventions.md. Only a finding that raises THAT construct\n// is a precision failure; any other observation about the file is fair\n// review work and passes.\nconst BAITED = [\n {\n file: 'src/customer.js',\n smell: 'loose equality',\n matches: (t) =>\n /[=!]==?|loose equal|strict equal|\\bequality\\b|double equals|triple equals|coerc|nullish|\\?\\?/.test(\n t,\n ),\n why: '`== null` is the documented house idiom for a null-or-undefined check (docs/review-conventions.md) and is not to be tightened',\n },\n {\n file: 'src/audit.js',\n smell: 'floating / unawaited promise',\n matches: (t) =>\n /floating|un-?awaited|not awaited|missing await|no await|without await|should (?:be )?await|add (?:an )?await|\\bawait\\b|fire.?and.?forget|dangling promise|unhandled (?:promise )?rejection/.test(\n t,\n ) &&\n // A reviewer who spots that a SYNCHRONOUS throw from insertAudit\n // still escapes into the charge path has found something real, not\n // the bait. That finding is welcome.\n !/synchronous|synchronously|thenable|non-?promise|not (?:return )?a promise|does not return|returns undefined|before the promise/.test(\n t,\n ),\n why: 'the audit write is deliberately not awaited and carries a .catch, which is the required form for a best-effort write (docs/review-conventions.md)',\n },\n {\n file: 'src/errors.js',\n smell: 'unused parameters',\n matches: (t) =>\n /unused|not used|never used|un-?referenced|no-unused-vars|underscore|_req|_next|dead (?:parameter|argument)|(?:remove|drop|omit) (?:the )?(?:`?req`?|`?next`?|parameter|argument)|unnecessary (?:parameter|argument)/.test(\n t,\n ),\n why: \"Express registers error middleware by arity, so the four-parameter signature and the parameters it does not use are required (docs/review-conventions.md)\",\n },\n];\n\n// Not in manifest.json's seven-file list and not in changes.diff. The\n// book says to discuss only files in the change set, so any finding here\n// is out of scope whatever it says.\nconst OUT_OF_SCOPE = [\n { file: 'src/util.js', why: 'it is not one of the seven files in manifest.json' },\n { file: 'src/logger.js', why: 'it is not one of the seven files in manifest.json' },\n];\n\nconst nameOf = (finding) =>\n String(finding.category ?? finding.finding ?? finding.title ?? 'unnamed');\n\nconst wrong = [];\nfor (const bait of BAITED) {\n for (const finding of onFile(bait.file)) {\n if (!bait.matches(text(finding))) continue;\n wrong.push(bait.file + ' (' + nameOf(finding) + ' - ' + bait.smell + ') - ' + bait.why);\n }\n}\nfor (const out of OUT_OF_SCOPE) {\n for (const finding of onFile(out.file)) {\n wrong.push(out.file + ' (' + nameOf(finding) + ') - ' + out.why);\n }\n}\nif (wrong.length > 0) {\n fail(\n 'PRECISION SHORTFALL - drop these records from ' +\n FINDINGS +\n ': ' +\n wrong.join('; ') +\n '. A review that raises everything is not usable. Re-read docs/review-conventions.md, ' +\n 'which names the shapes that are deliberate house style, and re-read manifest.json for ' +\n 'which files are actually under review. Discussing a construct in report.md and clearing ' +\n 'it is fine - listing it as a finding is not. Any OTHER defect you find in these files is ' +\n 'welcome; only the constructs named above are off limits.',\n );\n}\n\nconsole.log(\n 'CODEREVIEW_ORACLE ok - all 4 seeded defects reported (src/payment.js, src/pagination.js, ' +\n 'src/settings.js, src/export.js) and none of the 3 baited house-style smells or 2 ' +\n 'out-of-scope files carries a finding.',\n);\n",
|
|
76
|
+
"surface": "harness",
|
|
77
|
+
"modelInput": false
|
|
32
78
|
}
|
|
33
79
|
]
|
|
34
80
|
},
|
|
35
81
|
"mocks": [],
|
|
36
82
|
"success": {
|
|
37
|
-
"summary": "reviews/rev-eval-1/report.md exists in the artifacts drawer with Summary/Findings/Verdict sections, a severity table citing
|
|
38
|
-
"
|
|
39
|
-
{
|
|
40
|
-
"kind": "minBytes",
|
|
41
|
-
"file": "reviews/rev-eval-1/report.md",
|
|
42
|
-
"bytes": 400,
|
|
43
|
-
"artifact": true
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"kind": "contains",
|
|
47
|
-
"file": "reviews/rev-eval-1/report.md",
|
|
48
|
-
"pattern": "##\\s+Summary",
|
|
49
|
-
"label": "Summary section",
|
|
50
|
-
"artifact": true
|
|
51
|
-
},
|
|
83
|
+
"summary": "reviews/rev-eval-1/report.md exists in the artifacts drawer with Summary/Findings/Verdict sections, a severity table citing the flawed files, and a request-changes verdict; review-output/findings.json holds one record per finding carrying at least file, line, severity, category and recommendation (extra context such as a title or a cwe is welcome), lists every seeded defect (unparameterized SQL, the off-by-one page bound, the swallowed settings error, the leaked export file handle), repeats none of the three documented house-style smells, and raises nothing against the two files outside the change set.",
|
|
84
|
+
"deliverables": [
|
|
52
85
|
{
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
86
|
+
"path": "reviews/rev-eval-1/report.md",
|
|
87
|
+
"kind": "markdown-report",
|
|
88
|
+
"artifact": true,
|
|
89
|
+
"minBytes": 400,
|
|
90
|
+
"checks": [
|
|
91
|
+
{
|
|
92
|
+
"kind": "contains",
|
|
93
|
+
"file": "reviews/rev-eval-1/report.md",
|
|
94
|
+
"pattern": "##\\s+Summary",
|
|
95
|
+
"label": "Summary section",
|
|
96
|
+
"artifact": true
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"kind": "contains",
|
|
100
|
+
"file": "reviews/rev-eval-1/report.md",
|
|
101
|
+
"pattern": "##\\s+Findings",
|
|
102
|
+
"label": "Findings section",
|
|
103
|
+
"artifact": true
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"kind": "contains",
|
|
107
|
+
"file": "reviews/rev-eval-1/report.md",
|
|
108
|
+
"pattern": "Verdict:\\s*request-changes",
|
|
109
|
+
"label": "request-changes verdict (SQL concat is at least major)",
|
|
110
|
+
"artifact": true
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"kind": "contains",
|
|
114
|
+
"file": "reviews/rev-eval-1/report.md",
|
|
115
|
+
"pattern": "src/payment\\.js",
|
|
116
|
+
"label": "cites the flawed file",
|
|
117
|
+
"artifact": true
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"kind": "tableShape",
|
|
121
|
+
"file": "reviews/rev-eval-1/report.md",
|
|
122
|
+
"requiredColumns": [
|
|
123
|
+
"Severity",
|
|
124
|
+
"File",
|
|
125
|
+
"Finding"
|
|
126
|
+
],
|
|
127
|
+
"minRows": 1,
|
|
128
|
+
"artifact": true
|
|
129
|
+
}
|
|
130
|
+
]
|
|
58
131
|
},
|
|
59
132
|
{
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
133
|
+
"path": "review-output/findings.json",
|
|
134
|
+
"kind": "json",
|
|
135
|
+
"minBytes": 300,
|
|
136
|
+
"checks": [
|
|
137
|
+
{
|
|
138
|
+
"kind": "sniff",
|
|
139
|
+
"file": "review-output/findings.json",
|
|
140
|
+
"sniff": "json-valid"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"kind": "recordSchema",
|
|
144
|
+
"file": "review-output/findings.json",
|
|
145
|
+
"format": "json",
|
|
146
|
+
"minRows": 4,
|
|
147
|
+
"fields": [
|
|
148
|
+
{
|
|
149
|
+
"name": "file",
|
|
150
|
+
"type": "nonempty",
|
|
151
|
+
"required": true
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"name": "line",
|
|
155
|
+
"type": "^\\d+(\\s*-\\s*\\d+)?$",
|
|
156
|
+
"required": true
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"name": "severity",
|
|
160
|
+
"type": "^([Cc]ritical|[Mm]ajor|[Mm]inor|[Nn]it|CRITICAL|MAJOR|MINOR|NIT)$",
|
|
161
|
+
"required": true
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"name": "category",
|
|
165
|
+
"type": "nonempty",
|
|
166
|
+
"required": true
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"name": "recommendation",
|
|
170
|
+
"type": "nonempty",
|
|
171
|
+
"required": true
|
|
172
|
+
}
|
|
173
|
+
],
|
|
174
|
+
"allowExtraFields": true
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"kind": "nodeScriptPasses",
|
|
178
|
+
"script": "tests/code-review-oracle.mjs",
|
|
179
|
+
"timeoutMs": 30000,
|
|
180
|
+
"requiredOutput": [
|
|
181
|
+
{
|
|
182
|
+
"pattern": "CODEREVIEW_ORACLE ok",
|
|
183
|
+
"label": "every seeded defect reported, and no correct-as-written construct reported"
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
}
|
|
187
|
+
]
|
|
83
188
|
}
|
|
84
189
|
],
|
|
85
190
|
"taskNotes": {
|
|
@@ -92,7 +197,19 @@
|
|
|
92
197
|
"flags": "i"
|
|
93
198
|
}
|
|
94
199
|
]
|
|
95
|
-
}
|
|
200
|
+
},
|
|
201
|
+
"unchangedFixtures": [
|
|
202
|
+
"src/payment.js",
|
|
203
|
+
"src/util.js",
|
|
204
|
+
"src/pagination.js",
|
|
205
|
+
"src/settings.js",
|
|
206
|
+
"src/export.js",
|
|
207
|
+
"src/customer.js",
|
|
208
|
+
"src/audit.js",
|
|
209
|
+
"src/errors.js",
|
|
210
|
+
"src/logger.js",
|
|
211
|
+
"docs/review-conventions.md"
|
|
212
|
+
]
|
|
96
213
|
},
|
|
97
214
|
"rubric": {
|
|
98
215
|
"artifact": {
|
|
@@ -104,23 +221,28 @@
|
|
|
104
221
|
"name": "grounding",
|
|
105
222
|
"description": "Findings reference code that actually appears in changes.diff; nothing is invented and cited lines exist."
|
|
106
223
|
},
|
|
224
|
+
{
|
|
225
|
+
"name": "precision",
|
|
226
|
+
"description": "The three documented house-style constructs (the `== null` check, the unawaited best-effort audit write with its .catch, the four-parameter Express error handler) are not raised as findings, and the two files outside the change set (src/util.js, src/logger.js) carry no findings at all; if a house-style construct is discussed it is to clear it. A different, real defect found in one of those three files is good review work and counts in its favour, not against it."
|
|
227
|
+
},
|
|
107
228
|
{
|
|
108
229
|
"name": "severity-judgment",
|
|
109
|
-
"description": "The SQL string concatenation
|
|
230
|
+
"description": "The SQL string concatenation, the off-by-one page bound, the swallowed settings error and the leaked export file handle are rated critical or major; the console.log and TODO are minor or nit - severities proportionate to impact."
|
|
110
231
|
},
|
|
111
232
|
{
|
|
112
233
|
"name": "actionability",
|
|
113
|
-
"description": "Every finding carries a concrete, minimal recommendation (e.g. return to parameterized queries), not generic advice."
|
|
234
|
+
"description": "Every finding carries a concrete, minimal recommendation (e.g. return to parameterized queries, close the handle in a finally), not generic advice."
|
|
114
235
|
},
|
|
115
236
|
{
|
|
116
237
|
"name": "verdict-consistency",
|
|
117
238
|
"description": "The verdict follows mechanically from the findings table: any critical or major finding yields request-changes."
|
|
118
239
|
}
|
|
119
240
|
],
|
|
120
|
-
"contextNote": "The report is an artifacts-drawer file
|
|
241
|
+
"contextNote": "The report is an artifacts-drawer file and review-output/findings.json is the single workspace file the reviewer writes - no source file may change. Some of the reviewed code only looks wrong: docs/review-conventions.md records which shapes are deliberate house style. src/util.js and src/logger.js are in the workspace as context but are not in the change set - manifest.json's seven files are."
|
|
121
242
|
},
|
|
122
243
|
"qualityFocus": [
|
|
123
244
|
"evidence-grounded review",
|
|
245
|
+
"review precision",
|
|
124
246
|
"file citations",
|
|
125
247
|
"artifact deliverable discipline"
|
|
126
248
|
]
|
|
@@ -52,7 +52,6 @@
|
|
|
52
52
|
}
|
|
53
53
|
],
|
|
54
54
|
"craftbookParams": {
|
|
55
|
-
"workPath": "tasks/eval",
|
|
56
55
|
"scope": "Rename fetchUserData to loadUser everywhere, including log strings that mention it; CHANGELOG.md keeps the historical name; no behavior change. See source/rename-brief.md."
|
|
57
56
|
}
|
|
58
57
|
},
|
|
@@ -61,62 +60,62 @@
|
|
|
61
60
|
"summary": "Zero references to the old name remain outside the excluded changelog and brief, every site (including the re-export and the log string) behaves under the new name, the suite is green, and every fleet artifact exists with counts that reconcile.",
|
|
62
61
|
"deliverables": [
|
|
63
62
|
{
|
|
64
|
-
"path": "
|
|
63
|
+
"path": "{{task.dir}}/sites.md",
|
|
65
64
|
"kind": "markdown-notes",
|
|
66
65
|
"artifact": true,
|
|
67
66
|
"minBytes": 500,
|
|
68
67
|
"checks": [
|
|
69
68
|
{
|
|
70
69
|
"kind": "contains",
|
|
71
|
-
"file": "
|
|
70
|
+
"file": "{{task.dir}}/sites.md",
|
|
72
71
|
"pattern": "^##\\s+Pattern[\\s\\S]*^##\\s+Sites found[\\s\\S]*^##\\s+Exclusions",
|
|
73
72
|
"flags": "im",
|
|
74
73
|
"label": "sites sections in order"
|
|
75
74
|
},
|
|
76
75
|
{
|
|
77
76
|
"kind": "contains",
|
|
78
|
-
"file": "
|
|
77
|
+
"file": "{{task.dir}}/sites.md",
|
|
79
78
|
"pattern": "src/index\\.js",
|
|
80
79
|
"label": "found the re-export site"
|
|
81
80
|
},
|
|
82
81
|
{
|
|
83
82
|
"kind": "citationsResolve",
|
|
84
|
-
"file": "
|
|
83
|
+
"file": "{{task.dir}}/sites.md",
|
|
85
84
|
"minCitations": 2,
|
|
86
85
|
"artifact": true
|
|
87
86
|
}
|
|
88
87
|
]
|
|
89
88
|
},
|
|
90
89
|
{
|
|
91
|
-
"path": "
|
|
90
|
+
"path": "{{task.dir}}/change-notes.md",
|
|
92
91
|
"kind": "markdown-notes",
|
|
93
92
|
"artifact": true,
|
|
94
93
|
"minBytes": 500,
|
|
95
94
|
"checks": [
|
|
96
95
|
{
|
|
97
96
|
"kind": "contains",
|
|
98
|
-
"file": "
|
|
97
|
+
"file": "{{task.dir}}/change-notes.md",
|
|
99
98
|
"pattern": "^##\\s+Sites changed[\\s\\S]*^##\\s+Files touched[\\s\\S]*^##\\s+Invariants held",
|
|
100
99
|
"flags": "im",
|
|
101
100
|
"label": "change-notes sections in order"
|
|
102
101
|
},
|
|
103
102
|
{
|
|
104
103
|
"kind": "citationsResolve",
|
|
105
|
-
"file": "
|
|
104
|
+
"file": "{{task.dir}}/change-notes.md",
|
|
106
105
|
"minCitations": 2,
|
|
107
106
|
"artifact": true
|
|
108
107
|
}
|
|
109
108
|
]
|
|
110
109
|
},
|
|
111
110
|
{
|
|
112
|
-
"path": "
|
|
111
|
+
"path": "{{task.dir}}/verification.md",
|
|
113
112
|
"kind": "markdown-notes",
|
|
114
113
|
"artifact": true,
|
|
115
114
|
"minBytes": 450,
|
|
116
115
|
"checks": [
|
|
117
116
|
{
|
|
118
117
|
"kind": "contains",
|
|
119
|
-
"file": "
|
|
118
|
+
"file": "{{task.dir}}/verification.md",
|
|
120
119
|
"pattern": "^##\\s+Residual scan[\\s\\S]*^##\\s+Counts reconciled[\\s\\S]*^##\\s+Suite[\\s\\S]*^##\\s+Result",
|
|
121
120
|
"flags": "im",
|
|
122
121
|
"label": "verification sections in order"
|
|
@@ -124,14 +123,14 @@
|
|
|
124
123
|
]
|
|
125
124
|
},
|
|
126
125
|
{
|
|
127
|
-
"path": "
|
|
126
|
+
"path": "{{task.dir}}/review.md",
|
|
128
127
|
"kind": "markdown-report",
|
|
129
128
|
"artifact": true,
|
|
130
129
|
"minBytes": 400,
|
|
131
130
|
"checks": [
|
|
132
131
|
{
|
|
133
132
|
"kind": "contains",
|
|
134
|
-
"file": "
|
|
133
|
+
"file": "{{task.dir}}/review.md",
|
|
135
134
|
"pattern": "Verdict:\\s*(?:PASS|REVISE)",
|
|
136
135
|
"flags": "i",
|
|
137
136
|
"label": "explicit reviewer verdict"
|
|
@@ -227,7 +226,7 @@
|
|
|
227
226
|
},
|
|
228
227
|
"rubric": {
|
|
229
228
|
"artifact": {
|
|
230
|
-
"path": "
|
|
229
|
+
"path": "{{task.dir}}/verification.md",
|
|
231
230
|
"kind": "markdown"
|
|
232
231
|
},
|
|
233
232
|
"axes": [
|