@pennyfarthing/core 6.6.0
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/README.md +293 -0
- package/package.json +58 -0
- package/packages/core/bin/pennyfarthing.js +14 -0
- package/packages/core/dist/bmad/context-reader.d.ts +71 -0
- package/packages/core/dist/bmad/context-reader.d.ts.map +1 -0
- package/packages/core/dist/bmad/context-reader.js +369 -0
- package/packages/core/dist/bmad/context-reader.js.map +1 -0
- package/packages/core/dist/bmad/context-reader.test.d.ts +71 -0
- package/packages/core/dist/bmad/context-reader.test.d.ts.map +1 -0
- package/packages/core/dist/bmad/context-reader.test.js +878 -0
- package/packages/core/dist/bmad/context-reader.test.js.map +1 -0
- package/packages/core/dist/bmad/epics-parser.d.ts +61 -0
- package/packages/core/dist/bmad/epics-parser.d.ts.map +1 -0
- package/packages/core/dist/bmad/epics-parser.js +331 -0
- package/packages/core/dist/bmad/epics-parser.js.map +1 -0
- package/packages/core/dist/bmad/epics-parser.test.d.ts +7 -0
- package/packages/core/dist/bmad/epics-parser.test.d.ts.map +1 -0
- package/packages/core/dist/bmad/epics-parser.test.js +449 -0
- package/packages/core/dist/bmad/epics-parser.test.js.map +1 -0
- package/packages/core/dist/bmad/index.d.ts +11 -0
- package/packages/core/dist/bmad/index.d.ts.map +1 -0
- package/packages/core/dist/bmad/index.js +24 -0
- package/packages/core/dist/bmad/index.js.map +1 -0
- package/packages/core/dist/bmad/status-sync.d.ts +173 -0
- package/packages/core/dist/bmad/status-sync.d.ts.map +1 -0
- package/packages/core/dist/bmad/status-sync.js +463 -0
- package/packages/core/dist/bmad/status-sync.js.map +1 -0
- package/packages/core/dist/bmad/status-sync.test.d.ts +7 -0
- package/packages/core/dist/bmad/status-sync.test.d.ts.map +1 -0
- package/packages/core/dist/bmad/status-sync.test.js +702 -0
- package/packages/core/dist/bmad/status-sync.test.js.map +1 -0
- package/packages/core/dist/bmad/story-exporter.d.ts +55 -0
- package/packages/core/dist/bmad/story-exporter.d.ts.map +1 -0
- package/packages/core/dist/bmad/story-exporter.js +170 -0
- package/packages/core/dist/bmad/story-exporter.js.map +1 -0
- package/packages/core/dist/bmad/story-exporter.test.d.ts +51 -0
- package/packages/core/dist/bmad/story-exporter.test.d.ts.map +1 -0
- package/packages/core/dist/bmad/story-exporter.test.js +603 -0
- package/packages/core/dist/bmad/story-exporter.test.js.map +1 -0
- package/packages/core/dist/bmad/story-parser.d.ts +44 -0
- package/packages/core/dist/bmad/story-parser.d.ts.map +1 -0
- package/packages/core/dist/bmad/story-parser.js +307 -0
- package/packages/core/dist/bmad/story-parser.js.map +1 -0
- package/packages/core/dist/bmad/story-parser.test.d.ts +44 -0
- package/packages/core/dist/bmad/story-parser.test.d.ts.map +1 -0
- package/packages/core/dist/bmad/story-parser.test.js +693 -0
- package/packages/core/dist/bmad/story-parser.test.js.map +1 -0
- package/packages/core/dist/cli/commands/command.d.ts +28 -0
- package/packages/core/dist/cli/commands/command.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/command.js +399 -0
- package/packages/core/dist/cli/commands/command.js.map +1 -0
- package/packages/core/dist/cli/commands/cyclist.d.ts +46 -0
- package/packages/core/dist/cli/commands/cyclist.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/cyclist.js +191 -0
- package/packages/core/dist/cli/commands/cyclist.js.map +1 -0
- package/packages/core/dist/cli/commands/cyclist.test.d.ts +13 -0
- package/packages/core/dist/cli/commands/cyclist.test.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/cyclist.test.js +243 -0
- package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -0
- package/packages/core/dist/cli/commands/doctor.d.ts +9 -0
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/doctor.js +652 -0
- package/packages/core/dist/cli/commands/doctor.js.map +1 -0
- package/packages/core/dist/cli/commands/init.d.ts +8 -0
- package/packages/core/dist/cli/commands/init.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/init.js +524 -0
- package/packages/core/dist/cli/commands/init.js.map +1 -0
- package/packages/core/dist/cli/commands/skill.d.ts +28 -0
- package/packages/core/dist/cli/commands/skill.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/skill.js +416 -0
- package/packages/core/dist/cli/commands/skill.js.map +1 -0
- package/packages/core/dist/cli/commands/theme.d.ts +21 -0
- package/packages/core/dist/cli/commands/theme.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/theme.js +201 -0
- package/packages/core/dist/cli/commands/theme.js.map +1 -0
- package/packages/core/dist/cli/commands/uninstall.d.ts +8 -0
- package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/uninstall.js +237 -0
- package/packages/core/dist/cli/commands/uninstall.js.map +1 -0
- package/packages/core/dist/cli/commands/update.d.ts +9 -0
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/update.js +545 -0
- package/packages/core/dist/cli/commands/update.js.map +1 -0
- package/packages/core/dist/cli/commands/version.d.ts +2 -0
- package/packages/core/dist/cli/commands/version.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/version.js +28 -0
- package/packages/core/dist/cli/commands/version.js.map +1 -0
- package/packages/core/dist/cli/customization.test.d.ts +12 -0
- package/packages/core/dist/cli/customization.test.d.ts.map +1 -0
- package/packages/core/dist/cli/customization.test.js +84 -0
- package/packages/core/dist/cli/customization.test.js.map +1 -0
- package/packages/core/dist/cli/cyclist-migration.test.d.ts +16 -0
- package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
- package/packages/core/dist/cli/cyclist-migration.test.js +224 -0
- package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
- package/packages/core/dist/cli/index.d.ts +3 -0
- package/packages/core/dist/cli/index.d.ts.map +1 -0
- package/packages/core/dist/cli/index.js +174 -0
- package/packages/core/dist/cli/index.js.map +1 -0
- package/packages/core/dist/cli/ocean-profiles.test.d.ts +13 -0
- package/packages/core/dist/cli/ocean-profiles.test.d.ts.map +1 -0
- package/packages/core/dist/cli/ocean-profiles.test.js +134 -0
- package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -0
- package/packages/core/dist/cli/theme-maker.test.d.ts +11 -0
- package/packages/core/dist/cli/theme-maker.test.d.ts.map +1 -0
- package/packages/core/dist/cli/theme-maker.test.js +356 -0
- package/packages/core/dist/cli/theme-maker.test.js.map +1 -0
- package/packages/core/dist/cli/utils/constants.d.ts +60 -0
- package/packages/core/dist/cli/utils/constants.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/constants.js +52 -0
- package/packages/core/dist/cli/utils/constants.js.map +1 -0
- package/packages/core/dist/cli/utils/files.d.ts +71 -0
- package/packages/core/dist/cli/utils/files.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/files.js +162 -0
- package/packages/core/dist/cli/utils/files.js.map +1 -0
- package/packages/core/dist/cli/utils/logger.d.ts +26 -0
- package/packages/core/dist/cli/utils/logger.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/logger.js +88 -0
- package/packages/core/dist/cli/utils/logger.js.map +1 -0
- package/packages/core/dist/cli/utils/manifest.d.ts +47 -0
- package/packages/core/dist/cli/utils/manifest.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/manifest.js +90 -0
- package/packages/core/dist/cli/utils/manifest.js.map +1 -0
- package/packages/core/dist/cli/utils/node-modules.d.ts +6 -0
- package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/node-modules.js +22 -0
- package/packages/core/dist/cli/utils/node-modules.js.map +1 -0
- package/packages/core/dist/cli/utils/prompts.d.ts +34 -0
- package/packages/core/dist/cli/utils/prompts.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/prompts.js +93 -0
- package/packages/core/dist/cli/utils/prompts.js.map +1 -0
- package/packages/core/dist/cli/utils/symlinks.d.ts +29 -0
- package/packages/core/dist/cli/utils/symlinks.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/symlinks.js +181 -0
- package/packages/core/dist/cli/utils/symlinks.js.map +1 -0
- package/packages/core/dist/cli/utils/themes.d.ts +104 -0
- package/packages/core/dist/cli/utils/themes.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/themes.js +393 -0
- package/packages/core/dist/cli/utils/themes.js.map +1 -0
- package/packages/core/dist/cli/utils/themes.test.d.ts +12 -0
- package/packages/core/dist/cli/utils/themes.test.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/themes.test.js +144 -0
- package/packages/core/dist/cli/utils/themes.test.js.map +1 -0
- package/packages/core/dist/cli/utils/version.d.ts +10 -0
- package/packages/core/dist/cli/utils/version.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/version.js +63 -0
- package/packages/core/dist/cli/utils/version.js.map +1 -0
- package/packages/core/dist/cli/workspace.test.d.ts +8 -0
- package/packages/core/dist/cli/workspace.test.d.ts.map +1 -0
- package/packages/core/dist/cli/workspace.test.js +154 -0
- package/packages/core/dist/cli/workspace.test.js.map +1 -0
- package/packages/core/dist/index.d.ts +6 -0
- package/packages/core/dist/index.d.ts.map +1 -0
- package/packages/core/dist/index.js +10 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/dist/permissions/index.d.ts +9 -0
- package/packages/core/dist/permissions/index.d.ts.map +1 -0
- package/packages/core/dist/permissions/index.js +13 -0
- package/packages/core/dist/permissions/index.js.map +1 -0
- package/packages/core/dist/permissions/permission-schema.d.ts +89 -0
- package/packages/core/dist/permissions/permission-schema.d.ts.map +1 -0
- package/packages/core/dist/permissions/permission-schema.js +120 -0
- package/packages/core/dist/permissions/permission-schema.js.map +1 -0
- package/packages/core/dist/permissions/permission-schema.test.d.ts +40 -0
- package/packages/core/dist/permissions/permission-schema.test.d.ts.map +1 -0
- package/packages/core/dist/permissions/permission-schema.test.js +367 -0
- package/packages/core/dist/permissions/permission-schema.test.js.map +1 -0
- package/packages/core/dist/scripts/add-ocean-profiles.d.ts +9 -0
- package/packages/core/dist/scripts/add-ocean-profiles.d.ts.map +1 -0
- package/packages/core/dist/scripts/add-ocean-profiles.js +695 -0
- package/packages/core/dist/scripts/add-ocean-profiles.js.map +1 -0
- package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
- package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
- package/packages/core/dist/scripts/benchmark-integration.js +691 -0
- package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
- package/packages/core/dist/scripts/benchmark-integration.test.d.ts +13 -0
- package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/benchmark-integration.test.js +680 -0
- package/packages/core/dist/scripts/benchmark-integration.test.js.map +1 -0
- package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +18 -0
- package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/debugging-scenarios.test.js +317 -0
- package/packages/core/dist/scripts/debugging-scenarios.test.js.map +1 -0
- package/packages/core/dist/scripts/generate-all-faces.d.ts +10 -0
- package/packages/core/dist/scripts/generate-all-faces.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-all-faces.js +256 -0
- package/packages/core/dist/scripts/generate-all-faces.js.map +1 -0
- package/packages/core/dist/scripts/generate-all-faces.test.d.ts +17 -0
- package/packages/core/dist/scripts/generate-all-faces.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-all-faces.test.js +372 -0
- package/packages/core/dist/scripts/generate-all-faces.test.js.map +1 -0
- package/packages/core/dist/scripts/generate-all-spiders.d.ts +10 -0
- package/packages/core/dist/scripts/generate-all-spiders.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-all-spiders.js +306 -0
- package/packages/core/dist/scripts/generate-all-spiders.js.map +1 -0
- package/packages/core/dist/scripts/generate-ascii-face.d.ts +52 -0
- package/packages/core/dist/scripts/generate-ascii-face.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-ascii-face.js +155 -0
- package/packages/core/dist/scripts/generate-ascii-face.js.map +1 -0
- package/packages/core/dist/scripts/generate-face.d.ts +52 -0
- package/packages/core/dist/scripts/generate-face.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-face.js +199 -0
- package/packages/core/dist/scripts/generate-face.js.map +1 -0
- package/packages/core/dist/scripts/generate-face.test.d.ts +13 -0
- package/packages/core/dist/scripts/generate-face.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-face.test.js +301 -0
- package/packages/core/dist/scripts/generate-face.test.js.map +1 -0
- package/packages/core/dist/scripts/generate-report.d.ts +65 -0
- package/packages/core/dist/scripts/generate-report.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-report.js +378 -0
- package/packages/core/dist/scripts/generate-report.js.map +1 -0
- package/packages/core/dist/scripts/generate-report.test.d.ts +13 -0
- package/packages/core/dist/scripts/generate-report.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-report.test.js +363 -0
- package/packages/core/dist/scripts/generate-report.test.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider-report.d.ts +65 -0
- package/packages/core/dist/scripts/generate-spider-report.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-spider-report.js +366 -0
- package/packages/core/dist/scripts/generate-spider-report.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider-report.test.d.ts +13 -0
- package/packages/core/dist/scripts/generate-spider-report.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-spider-report.test.js +367 -0
- package/packages/core/dist/scripts/generate-spider-report.test.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider.d.ts +37 -0
- package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-spider.js +315 -0
- package/packages/core/dist/scripts/generate-spider.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider.test.d.ts +14 -0
- package/packages/core/dist/scripts/generate-spider.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-spider.test.js +269 -0
- package/packages/core/dist/scripts/generate-spider.test.js.map +1 -0
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts +150 -0
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +1 -0
- package/packages/core/dist/scripts/job-fair-aggregator.js +547 -0
- package/packages/core/dist/scripts/job-fair-aggregator.js.map +1 -0
- package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts +14 -0
- package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/job-fair-aggregator.test.js +616 -0
- package/packages/core/dist/scripts/job-fair-aggregator.test.js.map +1 -0
- package/packages/core/dist/scripts/run-ci.test.d.ts +20 -0
- package/packages/core/dist/scripts/run-ci.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/run-ci.test.js +127 -0
- package/packages/core/dist/scripts/run-ci.test.js.map +1 -0
- package/packages/core/dist/scripts/theme-detail.test.d.ts +10 -0
- package/packages/core/dist/scripts/theme-detail.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/theme-detail.test.js +199 -0
- package/packages/core/dist/scripts/theme-detail.test.js.map +1 -0
- package/packages/core/dist/scripts/validate-ocean-profiles.d.ts +9 -0
- package/packages/core/dist/scripts/validate-ocean-profiles.d.ts.map +1 -0
- package/packages/core/dist/scripts/validate-ocean-profiles.js +130 -0
- package/packages/core/dist/scripts/validate-ocean-profiles.js.map +1 -0
- package/packages/core/dist/workflow/generic-handoff.d.ts +235 -0
- package/packages/core/dist/workflow/generic-handoff.d.ts.map +1 -0
- package/packages/core/dist/workflow/generic-handoff.js +358 -0
- package/packages/core/dist/workflow/generic-handoff.js.map +1 -0
- package/packages/core/dist/workflow/generic-handoff.test.d.ts +21 -0
- package/packages/core/dist/workflow/generic-handoff.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/generic-handoff.test.js +499 -0
- package/packages/core/dist/workflow/generic-handoff.test.js.map +1 -0
- package/packages/core/dist/workflow/generic-sm-finish.d.ts +89 -0
- package/packages/core/dist/workflow/generic-sm-finish.d.ts.map +1 -0
- package/packages/core/dist/workflow/generic-sm-finish.js +157 -0
- package/packages/core/dist/workflow/generic-sm-finish.js.map +1 -0
- package/packages/core/dist/workflow/generic-sm-setup.d.ts +138 -0
- package/packages/core/dist/workflow/generic-sm-setup.d.ts.map +1 -0
- package/packages/core/dist/workflow/generic-sm-setup.js +382 -0
- package/packages/core/dist/workflow/generic-sm-setup.js.map +1 -0
- package/packages/core/dist/workflow/sm-subagents.test.d.ts +23 -0
- package/packages/core/dist/workflow/sm-subagents.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/sm-subagents.test.js +727 -0
- package/packages/core/dist/workflow/sm-subagents.test.js.map +1 -0
- package/packages/core/dist/workflow/story-workflow-routing.test.d.ts +17 -0
- package/packages/core/dist/workflow/story-workflow-routing.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/story-workflow-routing.test.js +559 -0
- package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -0
- package/packages/core/dist/workflow/test-cache.d.ts +131 -0
- package/packages/core/dist/workflow/test-cache.d.ts.map +1 -0
- package/packages/core/dist/workflow/test-cache.js +226 -0
- package/packages/core/dist/workflow/test-cache.js.map +1 -0
- package/packages/core/dist/workflow/test-cache.test.d.ts +17 -0
- package/packages/core/dist/workflow/test-cache.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/test-cache.test.js +438 -0
- package/packages/core/dist/workflow/test-cache.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-loader.d.ts +76 -0
- package/packages/core/dist/workflow/workflow-loader.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-loader.js +133 -0
- package/packages/core/dist/workflow/workflow-loader.js.map +1 -0
- package/packages/core/dist/workflow/workflow-loader.test.d.ts +15 -0
- package/packages/core/dist/workflow/workflow-loader.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-loader.test.js +354 -0
- package/packages/core/dist/workflow/workflow-loader.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-migration.test.d.ts +17 -0
- package/packages/core/dist/workflow/workflow-migration.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-migration.test.js +372 -0
- package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-router.d.ts +55 -0
- package/packages/core/dist/workflow/workflow-router.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-router.js +245 -0
- package/packages/core/dist/workflow/workflow-router.js.map +1 -0
- package/packages/core/dist/workflow/workflow-router.test.d.ts +20 -0
- package/packages/core/dist/workflow/workflow-router.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-router.test.js +607 -0
- package/packages/core/dist/workflow/workflow-router.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-schema.d.ts +98 -0
- package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-schema.js +230 -0
- package/packages/core/dist/workflow/workflow-schema.js.map +1 -0
- package/packages/core/dist/workflow/workflow-schema.test.d.ts +45 -0
- package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-schema.test.js +512 -0
- package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -0
- package/pennyfarthing-dist/agents/README.md +397 -0
- package/pennyfarthing-dist/agents/architect.md +171 -0
- package/pennyfarthing-dist/agents/dev.md +225 -0
- package/pennyfarthing-dist/agents/devops.md +183 -0
- package/pennyfarthing-dist/agents/generic-handoff.md +451 -0
- package/pennyfarthing-dist/agents/generic-sm-finish.md +261 -0
- package/pennyfarthing-dist/agents/generic-sm-setup.md +214 -0
- package/pennyfarthing-dist/agents/orchestrator.md +316 -0
- package/pennyfarthing-dist/agents/pm.md +153 -0
- package/pennyfarthing-dist/agents/reviewer-preflight.md +224 -0
- package/pennyfarthing-dist/agents/reviewer.md +315 -0
- package/pennyfarthing-dist/agents/sm-file-summary.md +109 -0
- package/pennyfarthing-dist/agents/sm-handoff.md +97 -0
- package/pennyfarthing-dist/agents/sm.md +480 -0
- package/pennyfarthing-dist/agents/tea.md +191 -0
- package/pennyfarthing-dist/agents/tech-writer.md +148 -0
- package/pennyfarthing-dist/agents/testing-runner.md +420 -0
- package/pennyfarthing-dist/agents/ux-designer.md +158 -0
- package/pennyfarthing-dist/agents/workflow-status-check.md +332 -0
- package/pennyfarthing-dist/commands/architect.md +62 -0
- package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
- package/pennyfarthing-dist/commands/benchmark.md +467 -0
- package/pennyfarthing-dist/commands/brainstorm.md +91 -0
- package/pennyfarthing-dist/commands/check.md +156 -0
- package/pennyfarthing-dist/commands/chore.md +178 -0
- package/pennyfarthing-dist/commands/close-epic.md +136 -0
- package/pennyfarthing-dist/commands/continue-session.md +184 -0
- package/pennyfarthing-dist/commands/create-branches-from-story.md +374 -0
- package/pennyfarthing-dist/commands/create-theme.md +29 -0
- package/pennyfarthing-dist/commands/dev.md +60 -0
- package/pennyfarthing-dist/commands/devops.md +59 -0
- package/pennyfarthing-dist/commands/git-cleanup.md +340 -0
- package/pennyfarthing-dist/commands/health-check.md +108 -0
- package/pennyfarthing-dist/commands/help.md +264 -0
- package/pennyfarthing-dist/commands/job-fair.md +102 -0
- package/pennyfarthing-dist/commands/list-themes.md +17 -0
- package/pennyfarthing-dist/commands/new-work.md +127 -0
- package/pennyfarthing-dist/commands/orchestrator.md +56 -0
- package/pennyfarthing-dist/commands/parallel-work.md +71 -0
- package/pennyfarthing-dist/commands/party-mode.md +67 -0
- package/pennyfarthing-dist/commands/permissions.md +193 -0
- package/pennyfarthing-dist/commands/pm.md +60 -0
- package/pennyfarthing-dist/commands/prime.md +140 -0
- package/pennyfarthing-dist/commands/release.md +58 -0
- package/pennyfarthing-dist/commands/repo-status.md +49 -0
- package/pennyfarthing-dist/commands/retro.md +200 -0
- package/pennyfarthing-dist/commands/reviewer.md +64 -0
- package/pennyfarthing-dist/commands/run-ci.md +116 -0
- package/pennyfarthing-dist/commands/set-theme.md +52 -0
- package/pennyfarthing-dist/commands/show-theme.md +21 -0
- package/pennyfarthing-dist/commands/sm.md +70 -0
- package/pennyfarthing-dist/commands/solo.md +411 -0
- package/pennyfarthing-dist/commands/sprint-planning.md +109 -0
- package/pennyfarthing-dist/commands/start-epic.md +156 -0
- package/pennyfarthing-dist/commands/sync-epic-to-jira.md +184 -0
- package/pennyfarthing-dist/commands/sync-work-with-sprint.md +376 -0
- package/pennyfarthing-dist/commands/tea.md +63 -0
- package/pennyfarthing-dist/commands/tech-writer.md +53 -0
- package/pennyfarthing-dist/commands/theme-maker.md +671 -0
- package/pennyfarthing-dist/commands/update-domain-docs.md +83 -0
- package/pennyfarthing-dist/commands/ux-designer.md +62 -0
- package/pennyfarthing-dist/commands/work.md +111 -0
- package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +480 -0
- package/pennyfarthing-dist/guides/AGENT-SCOPES.md +201 -0
- package/pennyfarthing-dist/guides/HOOKS.md +230 -0
- package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +338 -0
- package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +193 -0
- package/pennyfarthing-dist/guides/agent-template-strategic.md +148 -0
- package/pennyfarthing-dist/guides/agent-template-tactical.md +162 -0
- package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +746 -0
- package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +574 -0
- package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +488 -0
- package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +402 -0
- package/pennyfarthing-dist/guides/permission-protocol.md +188 -0
- package/pennyfarthing-dist/guides/persona-loading.md +46 -0
- package/pennyfarthing-dist/guides/persona-system.md +294 -0
- package/pennyfarthing-dist/guides/shared-agent-behavior.md +388 -0
- package/pennyfarthing-dist/guides/shared-context.md +147 -0
- package/pennyfarthing-dist/guides/strategic-agent-behavior.md +348 -0
- package/pennyfarthing-dist/guides/tactical-agent-behavior.md +1041 -0
- package/pennyfarthing-dist/guides/workflow-schema.md +195 -0
- package/pennyfarthing-dist/guides/worktree-mode.md +113 -0
- package/pennyfarthing-dist/output-styles/teaching.md +33 -0
- package/pennyfarthing-dist/output-styles/terse.md +20 -0
- package/pennyfarthing-dist/output-styles/verbose.md +28 -0
- package/pennyfarthing-dist/personas/themes/1984.yaml +312 -0
- package/pennyfarthing-dist/personas/themes/a-team.yaml +207 -0
- package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +330 -0
- package/pennyfarthing-dist/personas/themes/all-stars.yaml +332 -0
- package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +306 -0
- package/pennyfarthing-dist/personas/themes/arcane.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +331 -0
- package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/babylon-5.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/black-sails.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/blade-runner.yaml +295 -0
- package/pennyfarthing-dist/personas/themes/bobiverse.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +327 -0
- package/pennyfarthing-dist/personas/themes/catch-22.yaml +316 -0
- package/pennyfarthing-dist/personas/themes/classical-composers.yaml +310 -0
- package/pennyfarthing-dist/personas/themes/control.yaml +197 -0
- package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +323 -0
- package/pennyfarthing-dist/personas/themes/deadwood.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/dickens.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/discworld.yaml +332 -0
- package/pennyfarthing-dist/personas/themes/doctor-who.yaml +290 -0
- package/pennyfarthing-dist/personas/themes/don-quixote.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/dune.yaml +307 -0
- package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/fargo.yaml +330 -0
- package/pennyfarthing-dist/personas/themes/film-auteurs.yaml +312 -0
- package/pennyfarthing-dist/personas/themes/firefly.yaml +328 -0
- package/pennyfarthing-dist/personas/themes/foundation.yaml +290 -0
- package/pennyfarthing-dist/personas/themes/futurama.yaml +321 -0
- package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +290 -0
- package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +243 -0
- package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +308 -0
- package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +308 -0
- package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +330 -0
- package/pennyfarthing-dist/personas/themes/hannibal.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/harry-potter.yaml +324 -0
- package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +291 -0
- package/pennyfarthing-dist/personas/themes/historical-figures.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +331 -0
- package/pennyfarthing-dist/personas/themes/house-md.yaml +321 -0
- package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +289 -0
- package/pennyfarthing-dist/personas/themes/inspector-morse.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/jane-austen.yaml +287 -0
- package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/justified.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +219 -0
- package/pennyfarthing-dist/personas/themes/les-miserables.yaml +299 -0
- package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +334 -0
- package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +334 -0
- package/pennyfarthing-dist/personas/themes/mad-max.yaml +355 -0
- package/pennyfarthing-dist/personas/themes/mad-men.yaml +289 -0
- package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/mash.yaml +334 -0
- package/pennyfarthing-dist/personas/themes/mass-effect.yaml +289 -0
- package/pennyfarthing-dist/personas/themes/military-commanders.yaml +306 -0
- package/pennyfarthing-dist/personas/themes/moby-dick.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/monty-python.yaml +303 -0
- package/pennyfarthing-dist/personas/themes/neuromancer.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +329 -0
- package/pennyfarthing-dist/personas/themes/parks-and-rec.yaml +242 -0
- package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +298 -0
- package/pennyfarthing-dist/personas/themes/princess-bride.yaml +220 -0
- package/pennyfarthing-dist/personas/themes/renaissance-masters.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/rome.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/russian-masters.yaml +318 -0
- package/pennyfarthing-dist/personas/themes/sandman.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/scientific-revolutionaries.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/shakespeare.yaml +301 -0
- package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +289 -0
- package/pennyfarthing-dist/personas/themes/snow-crash.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +230 -0
- package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +210 -0
- package/pennyfarthing-dist/personas/themes/star-wars.yaml +303 -0
- package/pennyfarthing-dist/personas/themes/succession.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/superfriends.yaml +208 -0
- package/pennyfarthing-dist/personas/themes/ted-lasso.yaml +236 -0
- package/pennyfarthing-dist/personas/themes/the-americans.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/the-crown.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/the-expanse.yaml +213 -0
- package/pennyfarthing-dist/personas/themes/the-good-place.yaml +322 -0
- package/pennyfarthing-dist/personas/themes/the-matrix.yaml +353 -0
- package/pennyfarthing-dist/personas/themes/the-odyssey.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/the-office.yaml +330 -0
- package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +308 -0
- package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/the-wire.yaml +311 -0
- package/pennyfarthing-dist/personas/themes/the-witcher.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/twin-peaks.yaml +302 -0
- package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/watchmen.yaml +291 -0
- package/pennyfarthing-dist/personas/themes/west-wing.yaml +291 -0
- package/pennyfarthing-dist/personas/themes/world-explorers.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +307 -0
- package/pennyfarthing-dist/personas/themes/x-files.yaml +302 -0
- package/pennyfarthing-dist/scripts/add-short-names.mjs +264 -0
- package/pennyfarthing-dist/scripts/agent-session.sh +367 -0
- package/pennyfarthing-dist/scripts/check-context.sh +187 -0
- package/pennyfarthing-dist/scripts/check.sh +497 -0
- package/pennyfarthing-dist/scripts/deploy.sh +284 -0
- package/pennyfarthing-dist/scripts/doctor-dogfood.sh +360 -0
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +61 -0
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +66 -0
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +35 -0
- package/pennyfarthing-dist/scripts/hooks/post-merge.sh +166 -0
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +50 -0
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +71 -0
- package/pennyfarthing-dist/scripts/hooks/pre-push.sh +54 -0
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +98 -0
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +59 -0
- package/pennyfarthing-dist/scripts/install-git-hooks.sh +91 -0
- package/pennyfarthing-dist/scripts/prime.sh +161 -0
- package/pennyfarthing-dist/scripts/release.sh +198 -0
- package/pennyfarthing-dist/scripts/repo-utils.sh +778 -0
- package/pennyfarthing-dist/scripts/run-ci.sh +219 -0
- package/pennyfarthing-dist/scripts/run.sh +65 -0
- package/pennyfarthing-dist/scripts/statusline.sh +264 -0
- package/pennyfarthing-dist/scripts/tests/check.test.sh +582 -0
- package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +107 -0
- package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +597 -0
- package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +514 -0
- package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +517 -0
- package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +331 -0
- package/pennyfarthing-dist/scripts/uninstall.sh +271 -0
- package/pennyfarthing-dist/scripts/utils/background-tasks.sh +177 -0
- package/pennyfarthing-dist/scripts/utils/check-status.sh +251 -0
- package/pennyfarthing-dist/scripts/utils/checkpoint.sh +136 -0
- package/pennyfarthing-dist/scripts/utils/common.sh +157 -0
- package/pennyfarthing-dist/scripts/utils/create-feature-branches.sh +230 -0
- package/pennyfarthing-dist/scripts/utils/file-lock.sh +269 -0
- package/pennyfarthing-dist/scripts/utils/find-related-work.sh +231 -0
- package/pennyfarthing-dist/scripts/utils/find-root.sh +33 -0
- package/pennyfarthing-dist/scripts/utils/generate-skill-docs.sh +110 -0
- package/pennyfarthing-dist/scripts/utils/git-status-all.sh +127 -0
- package/pennyfarthing-dist/scripts/utils/ground-truth-judge.py +289 -0
- package/pennyfarthing-dist/scripts/utils/jira/jira-lib.mjs +443 -0
- package/pennyfarthing-dist/scripts/utils/jira/jira-sync-story.mjs +208 -0
- package/pennyfarthing-dist/scripts/utils/jira/jira-sync.mjs +198 -0
- package/pennyfarthing-dist/scripts/utils/jira-claim-story.sh +162 -0
- package/pennyfarthing-dist/scripts/utils/jira-lib.sh +463 -0
- package/pennyfarthing-dist/scripts/utils/jira-sync-story.sh +8 -0
- package/pennyfarthing-dist/scripts/utils/jira-sync.sh +8 -0
- package/pennyfarthing-dist/scripts/utils/log-skill-usage.sh +74 -0
- package/pennyfarthing-dist/scripts/utils/logging.sh +186 -0
- package/pennyfarthing-dist/scripts/utils/repo-scan.sh +141 -0
- package/pennyfarthing-dist/scripts/utils/retry.sh +76 -0
- package/pennyfarthing-dist/scripts/utils/run-timestamp.sh +7 -0
- package/pennyfarthing-dist/scripts/utils/session-cleanup.sh +319 -0
- package/pennyfarthing-dist/scripts/utils/skill-usage-report.sh +193 -0
- package/pennyfarthing-dist/scripts/utils/sprint-common.sh +286 -0
- package/pennyfarthing-dist/scripts/utils/sprint-metrics.sh +241 -0
- package/pennyfarthing-dist/scripts/utils/swebench-judge.py +400 -0
- package/pennyfarthing-dist/scripts/utils/sync-epic-to-jira.sh +16 -0
- package/pennyfarthing-dist/scripts/utils/test-setup.sh +337 -0
- package/pennyfarthing-dist/scripts/utils/validate-subagent-frontmatter.sh +160 -0
- package/pennyfarthing-dist/scripts/worktree-manager.sh +498 -0
- package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +236 -0
- package/pennyfarthing-dist/skills/changelog/SKILL.md +367 -0
- package/pennyfarthing-dist/skills/code-review/SKILL.md +168 -0
- package/pennyfarthing-dist/skills/context-engineering/SKILL.md +268 -0
- package/pennyfarthing-dist/skills/cyclist/SKILL.md +117 -0
- package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +421 -0
- package/pennyfarthing-dist/skills/finalize-run/SKILL.md +258 -0
- package/pennyfarthing-dist/skills/jira/SKILL.md +281 -0
- package/pennyfarthing-dist/skills/judge/SKILL.md +524 -0
- package/pennyfarthing-dist/skills/just/SKILL.md +160 -0
- package/pennyfarthing-dist/skills/mermaid/SKILL.md +240 -0
- package/pennyfarthing-dist/skills/otel/skill.md +222 -0
- package/pennyfarthing-dist/skills/permissions/skill.md +172 -0
- package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +173 -0
- package/pennyfarthing-dist/skills/skill-registry.schema.json +102 -0
- package/pennyfarthing-dist/skills/skill-registry.yaml +335 -0
- package/pennyfarthing-dist/skills/sprint-context/SKILL.md +120 -0
- package/pennyfarthing-dist/skills/story-management/SKILL.md +208 -0
- package/pennyfarthing-dist/skills/testing/SKILL.md +99 -0
- package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +124 -0
- package/pennyfarthing-dist/skills/theme/skill.md +129 -0
- package/pennyfarthing-dist/skills/theme-creation/SKILL.md +169 -0
- package/pennyfarthing-dist/skills/workflow/SKILL.md +160 -0
- package/pennyfarthing-dist/skills/yq/SKILL.md +264 -0
- package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +187 -0
- package/pennyfarthing-dist/templates/LEADERBOARD.template.md +59 -0
- package/pennyfarthing-dist/templates/agent-scopes.yaml.template +276 -0
- package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +61 -0
- package/pennyfarthing-dist/templates/persona-config.yaml.template +22 -0
- package/pennyfarthing-dist/templates/preferences.yaml.template +15 -0
- package/pennyfarthing-dist/templates/settings.local.json.template +90 -0
- package/pennyfarthing-dist/templates/setup-env.sh.template +18 -0
- package/pennyfarthing-dist/templates/shared-context.md.template +70 -0
- package/pennyfarthing-dist/templates/sidecar/decisions.md.template +40 -0
- package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +37 -0
- package/pennyfarthing-dist/templates/sidecar/patterns.md.template +34 -0
- package/pennyfarthing-dist/workflows/agent-docs.yaml +70 -0
- package/pennyfarthing-dist/workflows/bdd.yaml +58 -0
- package/pennyfarthing-dist/workflows/tdd.yaml +50 -0
- package/pennyfarthing-dist/workflows/trivial.yaml +40 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dev-patterns
|
|
3
|
+
description: Common development patterns, fixes, and gotchas. Use when implementing features, debugging issues, or avoiding known pitfalls.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Dev Patterns Skill
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
This skill captures common development patterns, fixes, and gotchas that apply across projects using the pennyfarthing agent framework.
|
|
11
|
+
|
|
12
|
+
## Critical Patterns
|
|
13
|
+
|
|
14
|
+
### Bash Tool Working Directory
|
|
15
|
+
|
|
16
|
+
**Problem:** The Bash tool maintains a persistent working directory. Relative `cd` commands fail when already in a different directory.
|
|
17
|
+
|
|
18
|
+
**Symptoms:**
|
|
19
|
+
- `cd API && just test` fails with "no such file or directory"
|
|
20
|
+
- Commands fail because assuming wrong directory
|
|
21
|
+
|
|
22
|
+
**Solution:** Always use absolute paths with `$CLAUDE_PROJECT_DIR`:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# WRONG - relative cd fails if you're already somewhere else
|
|
26
|
+
cd API && just test
|
|
27
|
+
|
|
28
|
+
# CORRECT - absolute path always works
|
|
29
|
+
cd $CLAUDE_PROJECT_DIR/API && just test
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Best Practice:** Explicit `cd` with absolute path in every Bash call:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Single-repo: from anywhere - always works
|
|
36
|
+
cd $CLAUDE_PROJECT_DIR && git push -u origin feat/branch
|
|
37
|
+
cd $CLAUDE_PROJECT_DIR && just test
|
|
38
|
+
|
|
39
|
+
# Multi-repo: use repo-utils.sh for dynamic lookup
|
|
40
|
+
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
41
|
+
cd $CLAUDE_PROJECT_DIR/$(get_repo_path "myrepo") && just test
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### TypeScript Type Imports
|
|
45
|
+
|
|
46
|
+
**Problem:** Build fails with `verbatimModuleSyntax` errors.
|
|
47
|
+
|
|
48
|
+
**Solution:** Use `import type` for type-only imports:
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// WRONG - causes build errors
|
|
52
|
+
import { User, Ticket } from '@/types';
|
|
53
|
+
|
|
54
|
+
// CORRECT
|
|
55
|
+
import type { User, Ticket } from '@/types';
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Go Error Handling
|
|
59
|
+
|
|
60
|
+
**Problem:** Silent failures when errors aren't checked.
|
|
61
|
+
|
|
62
|
+
**Solution:** Always handle errors explicitly:
|
|
63
|
+
|
|
64
|
+
```go
|
|
65
|
+
// WRONG - ignores error
|
|
66
|
+
result, _ := doSomething()
|
|
67
|
+
|
|
68
|
+
// CORRECT
|
|
69
|
+
result, err := doSomething()
|
|
70
|
+
if err != nil {
|
|
71
|
+
return fmt.Errorf("doSomething failed: %w", err)
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### UUID Parsing
|
|
76
|
+
|
|
77
|
+
**Problem:** Invalid UUIDs cause panics or unexpected behavior.
|
|
78
|
+
|
|
79
|
+
**Solution:** Always validate UUID parsing:
|
|
80
|
+
|
|
81
|
+
```go
|
|
82
|
+
// WRONG - panics on invalid UUID
|
|
83
|
+
id := uuid.MustParse(rawID)
|
|
84
|
+
|
|
85
|
+
// CORRECT
|
|
86
|
+
id, err := uuid.Parse(rawID)
|
|
87
|
+
if err != nil {
|
|
88
|
+
return fmt.Errorf("invalid UUID: %w", err)
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## HTTP Status Codes
|
|
93
|
+
|
|
94
|
+
Use appropriate status codes consistently:
|
|
95
|
+
|
|
96
|
+
| Code | When to Use |
|
|
97
|
+
|------|-------------|
|
|
98
|
+
| `200 OK` | Successful GET, PUT, PATCH |
|
|
99
|
+
| `201 Created` | Successful POST creating new resource |
|
|
100
|
+
| `204 No Content` | Successful DELETE |
|
|
101
|
+
| `400 Bad Request` | Invalid input (validation errors) |
|
|
102
|
+
| `401 Unauthorized` | Missing or invalid authentication |
|
|
103
|
+
| `403 Forbidden` | Authenticated but not authorized |
|
|
104
|
+
| `404 Not Found` | Resource doesn't exist |
|
|
105
|
+
| `409 Conflict` | Resource state conflict (duplicate) |
|
|
106
|
+
| `500 Internal Server Error` | Server-side error (always log it!) |
|
|
107
|
+
|
|
108
|
+
## Test Patterns
|
|
109
|
+
|
|
110
|
+
### Test Isolation
|
|
111
|
+
|
|
112
|
+
Each test should:
|
|
113
|
+
1. Set up its own state
|
|
114
|
+
2. Clean up after itself
|
|
115
|
+
3. Not depend on other tests' state
|
|
116
|
+
|
|
117
|
+
```go
|
|
118
|
+
func TestCreate(t *testing.T) {
|
|
119
|
+
// Setup
|
|
120
|
+
db := testutil.NewTestDB(t)
|
|
121
|
+
defer db.Cleanup()
|
|
122
|
+
|
|
123
|
+
// Test
|
|
124
|
+
result, err := Create(db, input)
|
|
125
|
+
|
|
126
|
+
// Assert
|
|
127
|
+
require.NoError(t, err)
|
|
128
|
+
assert.Equal(t, expected, result)
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Table-Driven Tests
|
|
133
|
+
|
|
134
|
+
```go
|
|
135
|
+
func TestValidate(t *testing.T) {
|
|
136
|
+
tests := []struct {
|
|
137
|
+
name string
|
|
138
|
+
input string
|
|
139
|
+
wantErr bool
|
|
140
|
+
}{
|
|
141
|
+
{"valid input", "good", false},
|
|
142
|
+
{"empty input", "", true},
|
|
143
|
+
{"too long", strings.Repeat("x", 1000), true},
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
for _, tt := range tests {
|
|
147
|
+
t.Run(tt.name, func(t *testing.T) {
|
|
148
|
+
err := Validate(tt.input)
|
|
149
|
+
if tt.wantErr {
|
|
150
|
+
assert.Error(t, err)
|
|
151
|
+
} else {
|
|
152
|
+
assert.NoError(t, err)
|
|
153
|
+
}
|
|
154
|
+
})
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Common Gotchas
|
|
160
|
+
|
|
161
|
+
1. **Working directory** - Always use `$CLAUDE_PROJECT_DIR` for absolute paths
|
|
162
|
+
2. **Type imports** - Use `import type` for TypeScript types
|
|
163
|
+
3. **Error handling** - Never ignore errors in Go
|
|
164
|
+
4. **UUID parsing** - Always validate, never panic
|
|
165
|
+
5. **Test isolation** - Each test manages its own state
|
|
166
|
+
|
|
167
|
+
## Turn-Efficient Patterns
|
|
168
|
+
|
|
169
|
+
Minimize API round-trips by batching operations and parallelizing where possible. Each tool call is a "turn" - fewer turns means faster completion.
|
|
170
|
+
|
|
171
|
+
### Batch Bash Commands
|
|
172
|
+
|
|
173
|
+
Chain related commands with `&&` instead of separate calls:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# INEFFICIENT - 3 turns
|
|
177
|
+
git status
|
|
178
|
+
git branch --show-current
|
|
179
|
+
git log -1 --oneline
|
|
180
|
+
|
|
181
|
+
# EFFICIENT - 1 turn
|
|
182
|
+
git status && git branch --show-current && git log -1 --oneline
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
For git workflows, batch the entire operation:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
# INEFFICIENT - 3 turns
|
|
189
|
+
git add .
|
|
190
|
+
git commit -m "feat: add feature"
|
|
191
|
+
git push -u origin $(git branch --show-current)
|
|
192
|
+
|
|
193
|
+
# EFFICIENT - 1 turn
|
|
194
|
+
git add . && git commit -m "feat: add feature" && git push -u origin $(git branch --show-current)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Parallel Tool Calls
|
|
198
|
+
|
|
199
|
+
When operations are independent, invoke multiple tools in the same turn:
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
# INEFFICIENT - 3 sequential turns
|
|
203
|
+
Turn 1: Read file A
|
|
204
|
+
Turn 2: Read file B
|
|
205
|
+
Turn 3: Read file C
|
|
206
|
+
|
|
207
|
+
# EFFICIENT - 1 parallel turn
|
|
208
|
+
Turn 1: Read file A, Read file B, Read file C (parallel)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**When to parallelize:**
|
|
212
|
+
- Reading multiple independent files
|
|
213
|
+
- Spawning subagents that don't depend on each other's results
|
|
214
|
+
- Running Glob and Grep searches simultaneously
|
|
215
|
+
- Fetching multiple web resources
|
|
216
|
+
|
|
217
|
+
**When NOT to parallelize:**
|
|
218
|
+
- Operations where later calls depend on earlier results
|
|
219
|
+
- Writes that might conflict
|
|
220
|
+
- Sequential logic (must read before edit)
|
|
221
|
+
|
|
222
|
+
### Smart File Operations
|
|
223
|
+
|
|
224
|
+
Use Grep's internal file reading instead of Read + manual search:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
# INEFFICIENT - 2 turns
|
|
228
|
+
Turn 1: Read entire file
|
|
229
|
+
Turn 2: (mentally search for pattern)
|
|
230
|
+
|
|
231
|
+
# EFFICIENT - 1 turn with context
|
|
232
|
+
Grep pattern with -C 5 for context
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Use Glob with brace expansion for multiple patterns:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# INEFFICIENT - 2 turns
|
|
239
|
+
Glob: **/*.ts
|
|
240
|
+
Glob: **/*.tsx
|
|
241
|
+
|
|
242
|
+
# EFFICIENT - 1 turn
|
|
243
|
+
Glob: **/*.{ts,tsx}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Compound Subagents
|
|
247
|
+
|
|
248
|
+
Design subagents to do multiple related steps in one spawn:
|
|
249
|
+
|
|
250
|
+
```yaml
|
|
251
|
+
# INEFFICIENT - 2 subagent spawns
|
|
252
|
+
Spawn 1: workflow-status-check
|
|
253
|
+
Spawn 2: sm-file-summary
|
|
254
|
+
|
|
255
|
+
# EFFICIENT - 1 compound subagent
|
|
256
|
+
Spawn 1: (combined status-check + file-summary subagent)
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**Good candidates for combining:**
|
|
260
|
+
- Preflight checks + handoff updates
|
|
261
|
+
- Status gathering + session file updates
|
|
262
|
+
- Test running + result parsing
|
|
263
|
+
|
|
264
|
+
**Creating Compound Subagents:**
|
|
265
|
+
|
|
266
|
+
When you notice a pattern of sequential subagent calls, consider creating a compound subagent:
|
|
267
|
+
|
|
268
|
+
1. **Identify the pattern:** Look for repeated sequences like "always call A then B"
|
|
269
|
+
2. **Check dependencies:** Can B start before A completes? If yes, parallelize instead.
|
|
270
|
+
3. **Create combined prompt:** Merge both subagents' responsibilities into one
|
|
271
|
+
|
|
272
|
+
**Example: Compound Preflight + Handoff**
|
|
273
|
+
|
|
274
|
+
Instead of:
|
|
275
|
+
```yaml
|
|
276
|
+
# Turn 1: Preflight
|
|
277
|
+
Task tool:
|
|
278
|
+
subagent_type: "reviewer-preflight"
|
|
279
|
+
prompt: |
|
|
280
|
+
STORY_ID: X-Y
|
|
281
|
+
...
|
|
282
|
+
|
|
283
|
+
# Turn 2: Wait for result, then handoff
|
|
284
|
+
Task tool:
|
|
285
|
+
subagent_type: "reviewer-handoff-approve"
|
|
286
|
+
prompt: |
|
|
287
|
+
STORY_ID: X-Y
|
|
288
|
+
...
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Create a compound definition that does both:
|
|
292
|
+
```yaml
|
|
293
|
+
Task tool:
|
|
294
|
+
subagent_type: "general-purpose"
|
|
295
|
+
model: "haiku"
|
|
296
|
+
prompt: |
|
|
297
|
+
You are a combined preflight + handoff assistant.
|
|
298
|
+
|
|
299
|
+
## Phase 1: Pre-flight checks
|
|
300
|
+
[Include preflight steps]
|
|
301
|
+
|
|
302
|
+
## Phase 2: If all checks pass, complete handoff
|
|
303
|
+
[Include handoff steps]
|
|
304
|
+
|
|
305
|
+
## Output
|
|
306
|
+
Report: preflight results + handoff status
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**When NOT to combine:**
|
|
310
|
+
- When steps need human review between them (e.g., reviewer assessment before handoff)
|
|
311
|
+
- When the first step might fail often (better to fail fast)
|
|
312
|
+
- When prompts are already long (context limits)
|
|
313
|
+
|
|
314
|
+
### Turn Budget Guidelines
|
|
315
|
+
|
|
316
|
+
| Story Size | Target Turns |
|
|
317
|
+
|------------|--------------|
|
|
318
|
+
| 1 point (trivial) | 10-15 |
|
|
319
|
+
| 2 points (small) | 15-25 |
|
|
320
|
+
| 3 points (medium) | 25-35 |
|
|
321
|
+
| 5 points (large) | 35-50 |
|
|
322
|
+
|
|
323
|
+
**Techniques to reduce turns:**
|
|
324
|
+
1. Batch bash commands with `&&`
|
|
325
|
+
2. Read multiple files in parallel
|
|
326
|
+
3. Use Grep with context instead of Read + search
|
|
327
|
+
4. Combine related subagent work
|
|
328
|
+
5. Use brace expansion in Glob patterns
|
|
329
|
+
6. Spawn independent subagents in parallel
|
|
330
|
+
7. Run tests in background while continuing work
|
|
331
|
+
|
|
332
|
+
### Background Subagent Execution
|
|
333
|
+
|
|
334
|
+
Run slow operations in background to continue working:
|
|
335
|
+
|
|
336
|
+
```yaml
|
|
337
|
+
# Spawn tests in background
|
|
338
|
+
Task tool:
|
|
339
|
+
subagent_type: "testing-runner"
|
|
340
|
+
run_in_background: true
|
|
341
|
+
prompt: |
|
|
342
|
+
REPOS: all
|
|
343
|
+
CONTEXT: Background test run
|
|
344
|
+
RUN_ID: bg-001
|
|
345
|
+
SKIP_CACHE_WRITE: true
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
**Check status without blocking:**
|
|
349
|
+
```yaml
|
|
350
|
+
TaskOutput tool:
|
|
351
|
+
task_id: {task_id}
|
|
352
|
+
block: false
|
|
353
|
+
timeout: 1000
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**When to use background execution:**
|
|
357
|
+
- Test runs while writing more code
|
|
358
|
+
- Multiple independent file searches
|
|
359
|
+
- Parallel exploration of code paths
|
|
360
|
+
- Long-running git operations
|
|
361
|
+
|
|
362
|
+
**When NOT to use:**
|
|
363
|
+
- Operations where next steps depend on the result
|
|
364
|
+
- Operations that modify shared state
|
|
365
|
+
- Before commit (need to verify GREEN)
|
|
366
|
+
- During handoff (need synchronous verification)
|
|
367
|
+
|
|
368
|
+
### Background Task Tracking
|
|
369
|
+
|
|
370
|
+
Use the background task tracking utilities to manage session file entries:
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
source $CLAUDE_PROJECT_DIR/scripts/utils/background-tasks.sh
|
|
374
|
+
SESSION_FILE="$CLAUDE_PROJECT_DIR/.session/${STORY_ID}-session.md"
|
|
375
|
+
|
|
376
|
+
# After spawning background task, record it:
|
|
377
|
+
bg_task_add "$SESSION_FILE" "$TASK_ID" "testing-runner" "Background test run"
|
|
378
|
+
|
|
379
|
+
# After checking TaskOutput, update status:
|
|
380
|
+
bg_task_update "$SESSION_FILE" "$TASK_ID" "completed" # or "error"
|
|
381
|
+
|
|
382
|
+
# Clean up finished tasks:
|
|
383
|
+
bg_task_cleanup "$SESSION_FILE"
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
**Available functions:**
|
|
387
|
+
| Function | Purpose |
|
|
388
|
+
|----------|---------|
|
|
389
|
+
| `bg_task_add` | Record new background task |
|
|
390
|
+
| `bg_task_update` | Update task status (running/completed/error) |
|
|
391
|
+
| `bg_task_cleanup` | Remove completed and errored tasks |
|
|
392
|
+
| `bg_task_list` | Show all running tasks |
|
|
393
|
+
| `bg_task_check` | Return 0 if any tasks running (for conditionals) |
|
|
394
|
+
| `bg_task_summary` | Print counts by status |
|
|
395
|
+
|
|
396
|
+
**Lifecycle:**
|
|
397
|
+
1. Spawn with `run_in_background: true`
|
|
398
|
+
2. Record: `bg_task_add "$SESSION_FILE" "$TASK_ID" "type" "description"`
|
|
399
|
+
3. Continue other work
|
|
400
|
+
4. Periodically check `TaskOutput` with `block: false`
|
|
401
|
+
5. Update: `bg_task_update "$SESSION_FILE" "$TASK_ID" "completed"`
|
|
402
|
+
6. Cleanup: `bg_task_cleanup "$SESSION_FILE"`
|
|
403
|
+
|
|
404
|
+
### Example: Background Tests While Implementing
|
|
405
|
+
|
|
406
|
+
```
|
|
407
|
+
Turn 1: Spawn testing-runner in background, continue editing
|
|
408
|
+
Turn 2: Make code changes
|
|
409
|
+
Turn 3: Check TaskOutput (still running), continue editing
|
|
410
|
+
Turn 4: Make more changes
|
|
411
|
+
Turn 5: Check TaskOutput (complete, GREEN), proceed to commit
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
This pattern saves turns by overlapping test execution with implementation work.
|
|
415
|
+
|
|
416
|
+
## Project Customization
|
|
417
|
+
|
|
418
|
+
Projects should create their own dev-patterns skill in `.claude/project/skills/dev-patterns/` with:
|
|
419
|
+
- Project-specific patterns and conventions
|
|
420
|
+
- Known pitfalls for the tech stack
|
|
421
|
+
- File location conventions
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: finalize-run
|
|
3
|
+
description: Validate and save run results. Single exit point for all benchmark runs.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Finalize Run Skill
|
|
7
|
+
|
|
8
|
+
All runs MUST pass through this skill before saving. This is the guardrail.
|
|
9
|
+
|
|
10
|
+
## Invocation
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
/finalize-run --type <type> --data <json>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**Types:**
|
|
17
|
+
- `solo` - Single agent evaluation
|
|
18
|
+
- `duel` - Two-agent comparison
|
|
19
|
+
- `relay` - Team relay competition
|
|
20
|
+
|
|
21
|
+
## Validation Rules
|
|
22
|
+
|
|
23
|
+
### Agent Validation
|
|
24
|
+
|
|
25
|
+
For EACH agent in the run:
|
|
26
|
+
|
|
27
|
+
| Field | Rule | Action on Fail |
|
|
28
|
+
|-------|------|----------------|
|
|
29
|
+
| `cli_timestamp` | Valid ISO8601 | REJECT |
|
|
30
|
+
| `response_text` | ≥ 200 characters | REJECT |
|
|
31
|
+
| `input_tokens` | > 0 | REJECT |
|
|
32
|
+
| `output_tokens` | > 0 | REJECT |
|
|
33
|
+
|
|
34
|
+
### Judge Validation
|
|
35
|
+
|
|
36
|
+
| Field | Rule | Action on Fail |
|
|
37
|
+
|-------|------|----------------|
|
|
38
|
+
| `cli_timestamp` | Valid ISO8601 | REJECT |
|
|
39
|
+
| `response_text` | Contains "WEIGHTED_TOTAL" or "RATING:" | REJECT |
|
|
40
|
+
| `response_text` | ≥ 100 characters | REJECT |
|
|
41
|
+
|
|
42
|
+
### Score Validation
|
|
43
|
+
|
|
44
|
+
| Field | Rule | Action on Fail |
|
|
45
|
+
|-------|------|----------------|
|
|
46
|
+
| `total` | Number 1-100 | REJECT |
|
|
47
|
+
| Extracted from judge | Matches claimed score | REJECT |
|
|
48
|
+
|
|
49
|
+
### Timestamp Sanity
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
elapsed = last_timestamp - first_timestamp
|
|
53
|
+
minimum = 30 × number_of_agents
|
|
54
|
+
|
|
55
|
+
if elapsed < minimum:
|
|
56
|
+
WARN: "Timestamps suspiciously close"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## On Invoke
|
|
60
|
+
|
|
61
|
+
### Step 1: Parse Input
|
|
62
|
+
|
|
63
|
+
Extract:
|
|
64
|
+
- `type`: solo, duel, or relay
|
|
65
|
+
- `data`: JSON with run data
|
|
66
|
+
|
|
67
|
+
**Required data structure:**
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"type": "solo|duel|relay",
|
|
72
|
+
"timestamp": "ISO8601",
|
|
73
|
+
"scenario": {"name": "...", "title": "..."},
|
|
74
|
+
"agents": [
|
|
75
|
+
{
|
|
76
|
+
"spec": "theme:agent",
|
|
77
|
+
"cli_timestamp": "ISO8601",
|
|
78
|
+
"response_text": "full response",
|
|
79
|
+
"input_tokens": 1234,
|
|
80
|
+
"output_tokens": 5678
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"judge": {
|
|
84
|
+
"cli_timestamp": "ISO8601",
|
|
85
|
+
"response_text": "full verdict",
|
|
86
|
+
"input_tokens": 2345,
|
|
87
|
+
"output_tokens": 890
|
|
88
|
+
},
|
|
89
|
+
"scores": {"spec": score},
|
|
90
|
+
"output_path": "results/..."
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Step 2: Validate Agents
|
|
95
|
+
|
|
96
|
+
For each agent:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Check timestamp format
|
|
100
|
+
if ! [[ "$cli_timestamp" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}T ]]; then
|
|
101
|
+
REJECT "Invalid timestamp: $cli_timestamp"
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
# Check response length
|
|
105
|
+
response_len=${#response_text}
|
|
106
|
+
if [[ $response_len -lt 200 ]]; then
|
|
107
|
+
REJECT "Response too short: $response_len chars (min 200)"
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
# Check tokens
|
|
111
|
+
if [[ $input_tokens -le 0 ]] || [[ $output_tokens -le 0 ]]; then
|
|
112
|
+
REJECT "Invalid tokens: in=$input_tokens out=$output_tokens"
|
|
113
|
+
fi
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Step 3: Validate Judge
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# Check for score marker
|
|
120
|
+
if ! echo "$judge_response" | grep -qE "WEIGHTED_TOTAL|RATING:"; then
|
|
121
|
+
REJECT "Judge response missing score marker"
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
# Check response length
|
|
125
|
+
if [[ ${#judge_response} -lt 100 ]]; then
|
|
126
|
+
REJECT "Judge response too short"
|
|
127
|
+
fi
|
|
128
|
+
|
|
129
|
+
# Check tokens
|
|
130
|
+
if [[ $judge_input_tokens -le 0 ]] || [[ $judge_output_tokens -le 0 ]]; then
|
|
131
|
+
REJECT "Invalid judge tokens"
|
|
132
|
+
fi
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Step 4: Validate Scores
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Extract score from judge
|
|
139
|
+
extracted=$(echo "$judge_response" | grep -oE "WEIGHTED_TOTAL[^0-9]*([0-9]+)" | grep -oE "[0-9]+" | tail -1)
|
|
140
|
+
|
|
141
|
+
# Verify against claimed score
|
|
142
|
+
if [[ "$extracted" != "$claimed_score" ]]; then
|
|
143
|
+
REJECT "Score mismatch: claimed=$claimed_score extracted=$extracted"
|
|
144
|
+
fi
|
|
145
|
+
|
|
146
|
+
# Check range
|
|
147
|
+
if [[ $extracted -lt 1 ]] || [[ $extracted -gt 100 ]]; then
|
|
148
|
+
REJECT "Score out of range: $extracted"
|
|
149
|
+
fi
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Step 5: Timestamp Sanity Check
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# Calculate elapsed time
|
|
156
|
+
first_ts=$(date -d "$first_agent_timestamp" +%s)
|
|
157
|
+
last_ts=$(date -d "$judge_timestamp" +%s)
|
|
158
|
+
elapsed=$((last_ts - first_ts))
|
|
159
|
+
|
|
160
|
+
# Check minimum expected time
|
|
161
|
+
num_agents=${#agents[@]}
|
|
162
|
+
minimum=$((30 * num_agents))
|
|
163
|
+
|
|
164
|
+
if [[ $elapsed -lt $minimum ]]; then
|
|
165
|
+
WARN "Elapsed time ${elapsed}s < expected ${minimum}s"
|
|
166
|
+
fi
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Step 6: Display Validation Report
|
|
170
|
+
|
|
171
|
+
```markdown
|
|
172
|
+
### Finalize Run Validation
|
|
173
|
+
|
|
174
|
+
**Type:** {type}
|
|
175
|
+
**Scenario:** {scenario.name}
|
|
176
|
+
|
|
177
|
+
#### Agent Validation
|
|
178
|
+
| Agent | Timestamp | Response | Tokens | Status |
|
|
179
|
+
|-------|-----------|----------|--------|--------|
|
|
180
|
+
| {spec} | {ts} | {len} chars | in={in} out={out} | ✓ |
|
|
181
|
+
|
|
182
|
+
#### Judge Validation
|
|
183
|
+
| Field | Value | Status |
|
|
184
|
+
|-------|-------|--------|
|
|
185
|
+
| Timestamp | {ts} | ✓ |
|
|
186
|
+
| Response | {len} chars | ✓ |
|
|
187
|
+
| Score | {score}/100 | ✓ |
|
|
188
|
+
|
|
189
|
+
#### Timestamp Sanity
|
|
190
|
+
- Elapsed: {elapsed}s
|
|
191
|
+
- Expected: ≥{minimum}s
|
|
192
|
+
- Status: ✓ PASS
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
**VALIDATION: PASSED**
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Step 7: Save Results
|
|
199
|
+
|
|
200
|
+
If ALL validations pass:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# Ensure directory exists
|
|
204
|
+
mkdir -p "$(dirname "$output_path")"
|
|
205
|
+
|
|
206
|
+
# Write result
|
|
207
|
+
echo "$result_json" > "$output_path"
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Display:
|
|
211
|
+
```
|
|
212
|
+
✓ Saved to {output_path}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Step 8: Return Success
|
|
216
|
+
|
|
217
|
+
```json
|
|
218
|
+
{
|
|
219
|
+
"success": true,
|
|
220
|
+
"path": "{output_path}",
|
|
221
|
+
"validation": {
|
|
222
|
+
"agents_validated": {count},
|
|
223
|
+
"judge_validated": true,
|
|
224
|
+
"scores_verified": true,
|
|
225
|
+
"timestamp_sane": true
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## On Validation Failure
|
|
231
|
+
|
|
232
|
+
```markdown
|
|
233
|
+
### ❌ VALIDATION FAILED
|
|
234
|
+
|
|
235
|
+
**Failed Check:** {which validation}
|
|
236
|
+
**Reason:** {specific reason}
|
|
237
|
+
**Value:** {what was provided}
|
|
238
|
+
|
|
239
|
+
**This run will NOT be saved.**
|
|
240
|
+
|
|
241
|
+
To fix:
|
|
242
|
+
- {remediation steps}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Return:
|
|
246
|
+
```json
|
|
247
|
+
{
|
|
248
|
+
"success": false,
|
|
249
|
+
"error": "{reason}",
|
|
250
|
+
"failed_check": "{which}"
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## The Golden Rule
|
|
255
|
+
|
|
256
|
+
**Real data or no data.**
|
|
257
|
+
|
|
258
|
+
Never estimate. Never fabricate. If validation fails, the run did not happen.
|