@mmerterden/multi-agent-pipeline 12.6.0 → 12.8.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/CHANGELOG.md +209 -0
- package/README.md +18 -18
- package/docs/FIGMA_PIPELINE.md +34 -34
- package/docs/adr/0001-three-model-triage.md +12 -12
- package/docs/adr/0002-instruction-driven-flag.md +5 -5
- package/docs/adr/0003-unified-shared-skills.md +5 -5
- package/docs/adr/0004-zero-dependency-philosophy.md +5 -5
- package/docs/adr/0005-lazy-phase-docs.md +2 -2
- package/docs/adr/0006-skills-core-external-split.md +6 -6
- package/docs/adr/0007-multi-tool-adapter-framework.md +19 -19
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +19 -19
- package/docs/adr/README.md +1 -1
- package/docs/best-practices.md +3 -3
- package/docs/features.md +28 -28
- package/docs/performance.md +16 -16
- package/docs/recovery-guide.md +39 -39
- package/index.js +4 -4
- package/install/_common.mjs +53 -11
- package/install/_copilot-instructions.mjs +2 -2
- package/install/_dev-only-files.mjs +126 -6
- package/install/_platform-filter.mjs +1 -1
- package/install/_telemetry.mjs +1 -1
- package/install/claude.mjs +20 -13
- package/install/copilot.mjs +11 -23
- package/install/index.mjs +7 -15
- package/install/templates/copilot-instructions.md +54 -54
- package/install.js +1 -1
- package/package.json +29 -11
- package/pipeline/commands/multi-agent/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/analysis/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/build-optimize/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/create-jira/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/design-check/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev-local/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/diff-explain/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/finish/SKILL.md +6 -6
- package/pipeline/commands/multi-agent/forget/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/help/SKILL.md +3 -3
- package/pipeline/commands/multi-agent/issue/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/jira/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/kill/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/language/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/local/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/log/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/prune-logs/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/purge/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/refactor/SKILL.md +16 -8
- package/pipeline/commands/multi-agent/resume/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/review/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/review-issue/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/review-jira/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/routines/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/save/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/scan/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/search/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/setup/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/stack/SKILL.md +3 -3
- package/pipeline/commands/multi-agent/status/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/sync/SKILL.md +5 -5
- package/pipeline/commands/multi-agent/test/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/uninstall/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/update/SKILL.md +3 -3
- package/pipeline/lib/account-resolver.sh +1 -1
- package/pipeline/lib/channels-multi-repo.sh +1 -1
- package/pipeline/lib/context-link-extractor.sh +1 -1
- package/pipeline/lib/credential-store.sh +21 -1
- package/pipeline/lib/fetch-confluence.sh +1 -1
- package/pipeline/lib/fetch-crashlytics.sh +1 -1
- package/pipeline/lib/fetch-fortify.sh +1 -1
- package/pipeline/lib/fetch-graylog.sh +1 -1
- package/pipeline/lib/fetch-swagger.sh +1 -1
- package/pipeline/lib/issue-fetcher.sh +1 -1
- package/pipeline/lib/multi-repo-pipeline.sh +1 -1
- package/pipeline/lib/repo-cache.sh +1 -1
- package/pipeline/lib/submodule-detector.sh +1 -1
- package/pipeline/multi-agent-refs/_account-picker.md +1 -1
- package/pipeline/multi-agent-refs/_dev-context.md +1 -1
- package/pipeline/multi-agent-refs/_repo-picker.md +1 -1
- package/pipeline/multi-agent-refs/component-dispatch.md +1 -1
- package/pipeline/multi-agent-refs/component-generation.md +121 -0
- package/pipeline/multi-agent-refs/cross-cli-contract.md +1 -1
- package/pipeline/multi-agent-refs/features/model-fallback.md +2 -2
- package/pipeline/multi-agent-refs/phases/operations.md +28 -0
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -0
- package/pipeline/multi-agent-refs/phases/phase-2-planning.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-3-dev.md +1 -2
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +50 -5
- package/pipeline/preferences-template.json +5 -11
- package/pipeline/schemas/agent-state.schema.json +39 -9
- package/pipeline/schemas/analysis-output.schema.json +18 -4
- package/pipeline/schemas/analysis-spec.schema.json +120 -32
- package/pipeline/schemas/clarify-output.schema.json +15 -5
- package/pipeline/schemas/design-check-config.schema.json +32 -11
- package/pipeline/schemas/dev-critic-output.schema.json +20 -5
- package/pipeline/schemas/figma-project-config.schema.json +42 -10
- package/pipeline/schemas/learnings-ledger.schema.json +10 -2
- package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +1 -4
- package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +24 -7
- package/pipeline/schemas/plan-todos.schema.json +6 -3
- package/pipeline/schemas/planning-output.schema.json +5 -1
- package/pipeline/schemas/prefs.schema.json +97 -229
- package/pipeline/schemas/test-gap.schema.json +5 -5
- package/pipeline/schemas/token-budget.json +8 -8
- package/pipeline/schemas/triage-corpus.schema.json +1 -1
- package/pipeline/scripts/_smoke-root.sh +61 -0
- package/pipeline/scripts/aggregate-metrics.mjs +18 -6
- package/pipeline/scripts/audit-log.sh +25 -0
- package/pipeline/scripts/build-skills-index.mjs +6 -2
- package/pipeline/scripts/build-stack-plugins.mjs +142 -39
- package/pipeline/scripts/check-derived-drift.mjs +196 -0
- package/pipeline/scripts/classify-plan-safety.mjs +20 -7
- package/pipeline/scripts/cost-budget-check.mjs +2 -1
- package/pipeline/scripts/cost-table.json +1 -1
- package/pipeline/scripts/diff-explain.mjs +7 -3
- package/pipeline/scripts/diff-risk-score.mjs +13 -3
- package/pipeline/scripts/evidence-gate.mjs +7 -2
- package/pipeline/scripts/gen-mode-dispatch.mjs +38 -21
- package/pipeline/scripts/gen-skills-index.mjs +18 -3
- package/pipeline/scripts/learning-curve.mjs +13 -3
- package/pipeline/scripts/learnings-ledger.mjs +103 -36
- package/pipeline/scripts/localize-commands.mjs +6 -1
- package/pipeline/scripts/match-skills.mjs +15 -4
- package/pipeline/scripts/migrate-prefs.mjs +33 -16
- package/pipeline/scripts/phase-tracker.sh +3 -1
- package/pipeline/scripts/repo-map.mjs +110 -64
- package/pipeline/scripts/review-scope.mjs +7 -1
- package/pipeline/scripts/routine-registry.mjs +4 -9
- package/pipeline/scripts/run-aggregator.mjs +11 -5
- package/pipeline/scripts/run-metrics.mjs +13 -8
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +21 -7
- package/pipeline/scripts/test-gap-scan.mjs +44 -12
- package/pipeline/scripts/test-integrity-gate.mjs +5 -1
- package/pipeline/scripts/token-budget-report.mjs +44 -21
- package/pipeline/scripts/triage-memory.mjs +126 -34
- package/pipeline/scripts/uninstall.mjs +74 -30
- package/pipeline/scripts/validate-analysis-doc.mjs +15 -5
- package/pipeline/scripts/validate-diff-risk.mjs +32 -18
- package/pipeline/scripts/validate-test-gap.mjs +17 -7
- package/pipeline/scripts/validate-triage.mjs +17 -5
- package/pipeline/scripts/write-state.mjs +32 -9
- package/pipeline/skills/.skills-index.json +91 -91
- package/pipeline/skills/shared/README.md +57 -57
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +1 -1
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +26 -279
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +16 -8
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +3 -3
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +1 -1
- package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +1 -1
- package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -4
- package/pipeline/skills/shared/external/agentflow/SKILL.md +1 -1
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +1 -1
- package/pipeline/skills/shared/external/android_ui_verification/SKILL.md +1 -1
- package/pipeline/skills/shared/external/api-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +1 -1
- package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +1 -1
- package/pipeline/skills/shared/external/backlog/BACKLOG.md +1 -1
- package/pipeline/skills/shared/external/backlog/SKILL.md +12 -12
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +1 -1
- package/pipeline/skills/shared/external/context-compression/SKILL.md +1 -1
- package/pipeline/skills/shared/external/council/SKILL.md +3 -3
- package/pipeline/skills/shared/external/css-modern/SKILL.md +1 -1
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +1 -1
- package/pipeline/skills/shared/external/docker-expert/SKILL.md +1 -1
- package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +1 -1
- package/pipeline/skills/shared/external/firebase/SKILL.md +1 -1
- package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +1 -1
- package/pipeline/skills/shared/external/help-skills/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-components-content/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-components-status/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-components-system/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-foundations/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-inputs/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-platforms/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-technologies/SKILL.md +1 -1
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +1 -1
- package/pipeline/skills/shared/external/humanizer/SKILL.md +1 -1
- package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +1 -1
- package/pipeline/skills/shared/external/ios-developer/SKILL.md +1 -1
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +1 -1
- package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +1 -1
- package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +1 -1
- package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +1 -1
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +1 -1
- package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/observability-engineer/SKILL.md +1 -1
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +1 -1
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +1 -1
- package/pipeline/skills/shared/external/search-first/SKILL.md +2 -2
- package/pipeline/skills/shared/external/skill-creator/SKILL.md +12 -12
- package/pipeline/skills/shared/external/skill-creator/audit.md +21 -21
- package/pipeline/skills/shared/external/skill-creator/checklist.md +3 -3
- package/pipeline/skills/shared/external/skill-creator/examples.md +10 -10
- package/pipeline/skills/shared/external/skill-creator/label-check.md +17 -17
- package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +86 -50
- package/pipeline/skills/shared/external/skill-creator/template.md +9 -9
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +1 -1
- package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +1 -1
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +1 -1
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +1 -1
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +1 -1
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +1 -1
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +1 -1
- package/pipeline/skills/shared/external/web-performance/SKILL.md +1 -1
- package/pipeline/skills/shared/external/web-testing/SKILL.md +1 -1
- package/pipeline/skills/shared/external/xcode-build-benchmark/schemas/build-benchmark.schema.json +9 -49
- package/pipeline/skills/skills-index.md +57 -57
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +0 -25
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +0 -30
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +0 -20
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +0 -15
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +0 -12
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +0 -43
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +0 -35
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +0 -35
- package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +0 -12
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-2-plan.json +0 -42
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-review.json +0 -20
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-triage.json +0 -15
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/task.json +0 -12
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-2-plan.json +0 -40
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-review.json +0 -20
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-triage.json +0 -15
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/task.json +0 -12
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-2-plan.json +0 -42
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-review.json +0 -28
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-triage.json +0 -27
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/task.json +0 -12
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-2-plan.json +0 -41
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-review.json +0 -12
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-triage.json +0 -6
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/task.json +0 -12
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-2-plan.json +0 -42
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-review.json +0 -28
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-triage.json +0 -27
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/task.json +0 -12
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-1-analysis.json +0 -25
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-2-plan.json +0 -31
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-review.json +0 -12
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-triage.json +0 -18
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/task.json +0 -12
- package/pipeline/eval/golden-tasks/README.md +0 -65
- package/pipeline/eval/intent-cases.json +0 -40
- package/pipeline/eval/run-metrics-fixture.json +0 -46
- package/pipeline/eval/triage/01-empty-findings/expected.json +0 -6
- package/pipeline/eval/triage/01-empty-findings/input.json +0 -5
- package/pipeline/eval/triage/01-empty-findings/notes.md +0 -7
- package/pipeline/eval/triage/02-real-blocker/expected.json +0 -15
- package/pipeline/eval/triage/02-real-blocker/input.json +0 -14
- package/pipeline/eval/triage/02-real-blocker/notes.md +0 -7
- package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +0 -18
- package/pipeline/eval/triage/03-out-of-scope-defer/input.json +0 -14
- package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +0 -10
- package/pipeline/eval/triage/04-false-positive-reject/expected.json +0 -18
- package/pipeline/eval/triage/04-false-positive-reject/input.json +0 -14
- package/pipeline/eval/triage/04-false-positive-reject/notes.md +0 -10
- package/pipeline/eval/triage/05-mixed-classification/expected.json +0 -43
- package/pipeline/eval/triage/05-mixed-classification/input.json +0 -38
- package/pipeline/eval/triage/05-mixed-classification/notes.md +0 -17
- package/pipeline/eval/triage/06-severity-mismatch/expected.json +0 -15
- package/pipeline/eval/triage/06-severity-mismatch/input.json +0 -14
- package/pipeline/eval/triage/06-severity-mismatch/notes.md +0 -9
- package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +0 -27
- package/pipeline/eval/triage/07-duplicate-reviewers/input.json +0 -22
- package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +0 -9
- package/pipeline/eval/triage/08-style-misclassified/expected.json +0 -18
- package/pipeline/eval/triage/08-style-misclassified/input.json +0 -14
- package/pipeline/eval/triage/08-style-misclassified/notes.md +0 -9
- package/pipeline/eval/triage/09-cascading-finding/expected.json +0 -23
- package/pipeline/eval/triage/09-cascading-finding/input.json +0 -22
- package/pipeline/eval/triage/09-cascading-finding/notes.md +0 -9
- package/pipeline/eval/triage/10-deferred-crossref/expected.json +0 -18
- package/pipeline/eval/triage/10-deferred-crossref/input.json +0 -14
- package/pipeline/eval/triage/10-deferred-crossref/notes.md +0 -9
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +0 -27
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +0 -22
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +0 -14
- package/pipeline/eval/triage/README.md +0 -54
- package/pipeline/scripts/benchmark-phase-0.sh +0 -128
- package/pipeline/scripts/check-md-links.mjs +0 -84
- package/pipeline/scripts/eval-golden-tasks-live.mjs +0 -297
- package/pipeline/scripts/eval-golden-tasks.mjs +0 -212
- package/pipeline/scripts/eval-intent.mjs +0 -103
- package/pipeline/scripts/eval-mine-corpus.mjs +0 -201
- package/pipeline/scripts/eval-triage.mjs +0 -171
- package/pipeline/scripts/fixtures/diff-risk-android.diff +0 -40
- package/pipeline/scripts/fixtures/diff-risk-ios.diff +0 -48
- package/pipeline/scripts/fixtures/diff-risk-test-removal.diff +0 -40
- package/pipeline/scripts/fixtures/install-layout.tsv +0 -19
- package/pipeline/scripts/fixtures/pack-expected-count.txt +0 -1
- package/pipeline/scripts/fixtures/test-gap-node.diff +0 -30
- package/pipeline/scripts/fixtures/test-gap-python.diff +0 -32
- package/pipeline/scripts/lint-mcp-refs.mjs +0 -207
- package/pipeline/scripts/lint-skills.mjs +0 -143
- package/pipeline/scripts/run-smokes.mjs +0 -76
- package/pipeline/scripts/smoke-add-detail.sh +0 -137
- package/pipeline/scripts/smoke-agent-guard.sh +0 -74
- package/pipeline/scripts/smoke-agent-log-cost.sh +0 -262
- package/pipeline/scripts/smoke-agent-model-routing.sh +0 -87
- package/pipeline/scripts/smoke-ask-choice.sh +0 -42
- package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +0 -36
- package/pipeline/scripts/smoke-bitbucket-contract.sh +0 -255
- package/pipeline/scripts/smoke-changelog-version.sh +0 -47
- package/pipeline/scripts/smoke-channels-approval-gate.sh +0 -60
- package/pipeline/scripts/smoke-channels-flow.sh +0 -130
- package/pipeline/scripts/smoke-ci-workflows.sh +0 -88
- package/pipeline/scripts/smoke-clarify.sh +0 -148
- package/pipeline/scripts/smoke-command-inventory.sh +0 -81
- package/pipeline/scripts/smoke-commands-skills-parity.sh +0 -87
- package/pipeline/scripts/smoke-community-gates.sh +0 -75
- package/pipeline/scripts/smoke-compliance-skills.sh +0 -119
- package/pipeline/scripts/smoke-config-hygiene.sh +0 -58
- package/pipeline/scripts/smoke-cost-budget.sh +0 -70
- package/pipeline/scripts/smoke-cost-summary.sh +0 -139
- package/pipeline/scripts/smoke-cross-phase-cohesion.sh +0 -128
- package/pipeline/scripts/smoke-description-tr.sh +0 -82
- package/pipeline/scripts/smoke-dev-critic.sh +0 -144
- package/pipeline/scripts/smoke-diff-explain.sh +0 -147
- package/pipeline/scripts/smoke-diff-risk.sh +0 -190
- package/pipeline/scripts/smoke-dynamic-skill-loading.sh +0 -160
- package/pipeline/scripts/smoke-eval-live.sh +0 -136
- package/pipeline/scripts/smoke-evidence-gate.sh +0 -93
- package/pipeline/scripts/smoke-extract-conventions.sh +0 -163
- package/pipeline/scripts/smoke-fetchers-offline.sh +0 -448
- package/pipeline/scripts/smoke-figma-dispatch.sh +0 -112
- package/pipeline/scripts/smoke-gate-hooks.sh +0 -74
- package/pipeline/scripts/smoke-gc-tmp.sh +0 -130
- package/pipeline/scripts/smoke-gc-worktrees.sh +0 -125
- package/pipeline/scripts/smoke-generate-issue.sh +0 -120
- package/pipeline/scripts/smoke-handoff-contract.sh +0 -92
- package/pipeline/scripts/smoke-identity-isolation.sh +0 -70
- package/pipeline/scripts/smoke-install-layout.sh +0 -248
- package/pipeline/scripts/smoke-intent-guard.sh +0 -86
- package/pipeline/scripts/smoke-issue-comment-template.sh +0 -86
- package/pipeline/scripts/smoke-issue-jira-triad.sh +0 -120
- package/pipeline/scripts/smoke-keychain.sh +0 -158
- package/pipeline/scripts/smoke-language-axis.sh +0 -109
- package/pipeline/scripts/smoke-learning-curve.sh +0 -61
- package/pipeline/scripts/smoke-learnings-ledger.sh +0 -86
- package/pipeline/scripts/smoke-lib-scripts.sh +0 -448
- package/pipeline/scripts/smoke-mcp-gate.sh +0 -68
- package/pipeline/scripts/smoke-md-links.sh +0 -8
- package/pipeline/scripts/smoke-md2confluence.sh +0 -126
- package/pipeline/scripts/smoke-metrics-cache-ratio.sh +0 -72
- package/pipeline/scripts/smoke-migrate-state.sh +0 -102
- package/pipeline/scripts/smoke-mode-dispatch-drift.sh +0 -161
- package/pipeline/scripts/smoke-model-fallback.sh +0 -89
- package/pipeline/scripts/smoke-multi-repo-integration.sh +0 -116
- package/pipeline/scripts/smoke-multi-repo-worktree.sh +0 -61
- package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +0 -115
- package/pipeline/scripts/smoke-no-token-prompt.sh +0 -85
- package/pipeline/scripts/smoke-pack-contents.sh +0 -140
- package/pipeline/scripts/smoke-pat-audit.sh +0 -128
- package/pipeline/scripts/smoke-per-repo-memory.sh +0 -156
- package/pipeline/scripts/smoke-phase-0-multi-repo.sh +0 -170
- package/pipeline/scripts/smoke-phase-6-multi.sh +0 -79
- package/pipeline/scripts/smoke-phase-banner.sh +0 -101
- package/pipeline/scripts/smoke-phase-tracker.sh +0 -324
- package/pipeline/scripts/smoke-phase0-bridge-contract.sh +0 -241
- package/pipeline/scripts/smoke-phase4-gates.sh +0 -45
- package/pipeline/scripts/smoke-phase4-triage.sh +0 -229
- package/pipeline/scripts/smoke-plan-approval-gate.sh +0 -71
- package/pipeline/scripts/smoke-plan-safety.sh +0 -139
- package/pipeline/scripts/smoke-plan-todos.sh +0 -196
- package/pipeline/scripts/smoke-plugin-validate.sh +0 -64
- package/pipeline/scripts/smoke-pr-review-actions.sh +0 -152
- package/pipeline/scripts/smoke-pre-commit.sh +0 -170
- package/pipeline/scripts/smoke-pref-migration.sh +0 -226
- package/pipeline/scripts/smoke-prefs-language.sh +0 -134
- package/pipeline/scripts/smoke-progress-contract.sh +0 -127
- package/pipeline/scripts/smoke-prune-logs.sh +0 -137
- package/pipeline/scripts/smoke-purge.sh +0 -138
- package/pipeline/scripts/smoke-push-retry.sh +0 -75
- package/pipeline/scripts/smoke-repo-map.sh +0 -300
- package/pipeline/scripts/smoke-review-readiness.sh +0 -92
- package/pipeline/scripts/smoke-review-watch.sh +0 -146
- package/pipeline/scripts/smoke-routines.sh +0 -84
- package/pipeline/scripts/smoke-run-aggregator.sh +0 -216
- package/pipeline/scripts/smoke-run-metrics.sh +0 -50
- package/pipeline/scripts/smoke-search.sh +0 -187
- package/pipeline/scripts/smoke-shadow-git.sh +0 -224
- package/pipeline/scripts/smoke-skill-authoring.sh +0 -137
- package/pipeline/scripts/smoke-skill-language.sh +0 -83
- package/pipeline/scripts/smoke-skill-manifest.sh +0 -138
- package/pipeline/scripts/smoke-skill-scan.sh +0 -198
- package/pipeline/scripts/smoke-source-parity.sh +0 -85
- package/pipeline/scripts/smoke-subagent-validators.sh +0 -108
- package/pipeline/scripts/smoke-sync-parity.sh +0 -92
- package/pipeline/scripts/smoke-tasklist-ordering.sh +0 -112
- package/pipeline/scripts/smoke-telemetry.sh +0 -147
- package/pipeline/scripts/smoke-test-gap.sh +0 -183
- package/pipeline/scripts/smoke-token-budget.sh +0 -67
- package/pipeline/scripts/smoke-token-preflight.sh +0 -82
- package/pipeline/scripts/smoke-tracker-contract.sh +0 -191
- package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +0 -73
- package/pipeline/scripts/smoke-triage-memory.sh +0 -174
- package/pipeline/scripts/smoke-update-check.sh +0 -135
- package/pipeline/scripts/smoke-url-enrichment.sh +0 -70
- package/pipeline/scripts/smoke-validate-analysis-doc.sh +0 -161
- package/pipeline/scripts/smoke-validator-contradiction.sh +0 -67
- package/pipeline/scripts/smoke-validator-gates.sh +0 -164
- package/pipeline/scripts/smoke-vercel-deploy-redact.sh +0 -129
- package/pipeline/scripts/smoke-verify-by-test.sh +0 -148
- package/pipeline/scripts/smoke-wiki-integration.sh +0 -122
- package/pipeline/scripts/smoke-work-summary.sh +0 -163
- package/pipeline/scripts/smoke-workflow-audit.sh +0 -69
- package/pipeline/scripts/smoke-worktree-path-convention.sh +0 -86
- package/pipeline/scripts/smoke-wrapper-preservation.sh +0 -68
- package/pipeline/scripts/smoke-write-state.sh +0 -115
- package/pipeline/scripts/sync-parity-check.sh +0 -135
- package/pipeline/scripts/test-gap-rules/android.json +0 -25
- package/pipeline/scripts/test-gap-rules/ios.json +0 -29
- package/pipeline/scripts/test-gap-rules/node.json +0 -17
- package/pipeline/scripts/test-gap-rules/python.json +0 -19
- package/pipeline/scripts/validate-schemas.mjs +0 -88
|
@@ -14,7 +14,7 @@ First step of every `multi-agent` flow **that touches a remote provider**.
|
|
|
14
14
|
> repos, account-picker is bypassed and the state file's `accountId` is left
|
|
15
15
|
> `null` with `tokens={}`. Phases 6/7 read these as "local-only" signals.
|
|
16
16
|
|
|
17
|
-
> **Language**:
|
|
17
|
+
> **Language**: see `picker-contract.md` + `rules.md` Language Application matrix.
|
|
18
18
|
|
|
19
19
|
## Steps
|
|
20
20
|
|
|
@@ -6,7 +6,7 @@ description: "Internal - dev context (extra repos) picker for multi-agent."
|
|
|
6
6
|
|
|
7
7
|
Selects extra repos the pipeline may touch beyond the primary repo(s) - typically submodules (e.g. SDKs vendored inside an app repo) or sibling libraries. Each candidate is enriched with a `canPush` flag so the picker can pre-select repos that the active account is allowed to edit, and surface read-only ones as advisory context the pipeline will not modify.
|
|
8
8
|
|
|
9
|
-
> **Language**:
|
|
9
|
+
> **Language**: see `picker-contract.md` + `rules.md` Language Application matrix.
|
|
10
10
|
|
|
11
11
|
## Steps
|
|
12
12
|
|
|
@@ -6,7 +6,7 @@ description: "Internal - multi-select repo picker for multi-agent."
|
|
|
6
6
|
|
|
7
7
|
Used by `picker-issue`, `picker-jira`, `gh-num`, and `freetext` flows.
|
|
8
8
|
|
|
9
|
-
> **Language**:
|
|
9
|
+
> **Language**: see `picker-contract.md` + `rules.md` Language Application matrix.
|
|
10
10
|
|
|
11
11
|
## Steps
|
|
12
12
|
|
|
@@ -84,7 +84,7 @@ Phase 4 reviewer-skipping is **not** Phase 3's concern - Phase 4 decides based
|
|
|
84
84
|
|
|
85
85
|
## Cross-CLI behaviour (intentional divergence)
|
|
86
86
|
|
|
87
|
-
Component dispatch is **no longer byte-identical across CLIs** and that is by design (see `cross-cli-contract.md`
|
|
87
|
+
Component dispatch is **no longer byte-identical across CLIs** and that is by design (see `cross-cli-contract.md` section 1.1):
|
|
88
88
|
|
|
89
89
|
- **Claude Code**: dispatches to the enabled `ai-<platform>-engineering-toolkit` marketplace plugin via the Skill tool (this doc).
|
|
90
90
|
- **Copilot CLI**: has no plugin loader; it continues to use its standalone `~/.copilot/skills/figma-*` skill copies (frozen fallback). Copilot's resolution + progress lines follow those local skills.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Component Generation Guide (generic)
|
|
2
|
+
|
|
3
|
+
> Lifted out of `core/multi-agent/SKILL.md`, where it was loaded on every
|
|
4
|
+
> run of every mode. It applies only to a task that generates a UI
|
|
5
|
+
> component from a design, so it now loads when that path is taken.
|
|
6
|
+
> Component dispatch itself is in `component-dispatch.md`.
|
|
7
|
+
|
|
8
|
+
When the task involves creating a SwiftUI component (any project, not just figma), follow this architecture:
|
|
9
|
+
|
|
10
|
+
### Component Architecture: Configuration / View / Modifiers
|
|
11
|
+
|
|
12
|
+
Every component produces up to 5 files:
|
|
13
|
+
|
|
14
|
+
| File | When | Content |
|
|
15
|
+
|------|------|---------|
|
|
16
|
+
| `{Name}Configuration.swift` | Complex (>3 props) | Pure value type, all declarative properties |
|
|
17
|
+
| `{Name}View.swift` | Always | SwiftUI view, renders Configuration |
|
|
18
|
+
| `{Name}+Modifiers.swift` | Complex | Fluent modifier API chain |
|
|
19
|
+
| `{Name}Preview.swift` | Always | All meaningful variant previews |
|
|
20
|
+
| `{Name}Tests.swift` | Always | ViewInspector + Unit tests |
|
|
21
|
+
|
|
22
|
+
### Configuration Purity Rule
|
|
23
|
+
|
|
24
|
+
Configuration structs hold ONLY declarative, value-type properties:
|
|
25
|
+
|
|
26
|
+
```swift
|
|
27
|
+
// ✅ CORRECT - pure value type
|
|
28
|
+
struct ButtonConfiguration {
|
|
29
|
+
var title: String = ""
|
|
30
|
+
var style: ButtonStyle = .primary
|
|
31
|
+
var isEnabled: Bool = true
|
|
32
|
+
var icon: Image? = nil
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ❌ WRONG - these do NOT belong in Configuration
|
|
36
|
+
// Closures → View property
|
|
37
|
+
// @Binding → View property
|
|
38
|
+
// @State → View property
|
|
39
|
+
// AnyView / @ViewBuilder → View generic parameter
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### View Implementation
|
|
43
|
+
|
|
44
|
+
```swift
|
|
45
|
+
struct ButtonView: View {
|
|
46
|
+
let configuration: ButtonConfiguration
|
|
47
|
+
private var action: (() -> Void)? // closure lives in View, not Config
|
|
48
|
+
|
|
49
|
+
var body: some View {
|
|
50
|
+
Button(action: { action?() }) {
|
|
51
|
+
HStack(spacing: .Spacing.spacing8) {
|
|
52
|
+
if let icon = configuration.icon { icon }
|
|
53
|
+
Text(configuration.title)
|
|
54
|
+
.typographyStyle(.body1)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
.disabled(!configuration.isEnabled)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Modifier Pattern
|
|
63
|
+
|
|
64
|
+
```swift
|
|
65
|
+
extension ButtonView {
|
|
66
|
+
func title(_ value: String) -> ButtonView {
|
|
67
|
+
var config = configuration
|
|
68
|
+
config.title = value
|
|
69
|
+
return ButtonView(configuration: config)
|
|
70
|
+
}
|
|
71
|
+
func style(_ value: ButtonStyle) -> ButtonView {
|
|
72
|
+
var config = configuration
|
|
73
|
+
config.style = value
|
|
74
|
+
return ButtonView(configuration: config)
|
|
75
|
+
}
|
|
76
|
+
func onTap(_ action: @escaping () -> Void) -> ButtonView {
|
|
77
|
+
var view = self
|
|
78
|
+
view.action = action
|
|
79
|
+
return view
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Simple vs Complex Decision
|
|
85
|
+
|
|
86
|
+
| Criteria | Simple | Complex |
|
|
87
|
+
|----------|--------|---------|
|
|
88
|
+
| Properties | ≤3 | >3 |
|
|
89
|
+
| Configuration file | No - props in View directly | Yes - separate struct |
|
|
90
|
+
| +Modifiers file | No | Yes |
|
|
91
|
+
| View file | All-in-one | Renders Configuration |
|
|
92
|
+
|
|
93
|
+
### 3-Layer Test Strategy
|
|
94
|
+
|
|
95
|
+
| Layer | Tool | What It Validates |
|
|
96
|
+
|-------|------|-------------------|
|
|
97
|
+
| Structural | ViewInspector | Hierarchy, subview existence, applied modifiers |
|
|
98
|
+
| Visual | Snapshot Tests | Pixel-correct render: light/dark, RTL/LTR |
|
|
99
|
+
| Behavioral | Unit Tests | State changes, closures, configuration mutations |
|
|
100
|
+
|
|
101
|
+
### Component Checklist (Before Commit)
|
|
102
|
+
|
|
103
|
+
1. No magic numbers - all values are design tokens or named constants
|
|
104
|
+
2. Configuration purity - no side-effects or view logic in Config
|
|
105
|
+
3. Modifier correctness - fluent API valid, paired modifiers live in the View
|
|
106
|
+
4. Accessibility - accessibility label/trait on every interactive element
|
|
107
|
+
5. Preview - all meaningful variants in the preview
|
|
108
|
+
6. Test - structural + unit tests written
|
|
109
|
+
7. Dark mode - renders correctly in both color schemes
|
|
110
|
+
8. Dynamic Type - text scales at large sizes without breaking the layout
|
|
111
|
+
|
|
112
|
+
### When a Figma URL Is Provided
|
|
113
|
+
|
|
114
|
+
If the user provides a Figma URL:
|
|
115
|
+
1. Fetch the design data with Figma MCP tools (get_design_context, get_screenshot)
|
|
116
|
+
2. Map the design's colors, spacing, and typography onto the project's token system
|
|
117
|
+
3. Apply the Configuration/View/Modifiers pattern above
|
|
118
|
+
4. Use the screenshot as a reference, do not copy it - adapt to the project's existing components
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
@@ -50,7 +50,7 @@ Both skills are wired to 4 consumers: `/multi-agent:test "store-ready"` (primary
|
|
|
50
50
|
|
|
51
51
|
### 1.3 Figma-skill routing from multi-agent (superseded)
|
|
52
52
|
|
|
53
|
-
Superseded by
|
|
53
|
+
Superseded by section 1.1: Claude Code resolves component dispatch to the marketplace plugin (dual-name `create-component`/`create-ui-component`; full contract in `$HOME/.claude/multi-agent-refs/component-dispatch.md`); Copilot CLI uses its local `~/.copilot/skills/figma-*` copies. No shared filesystem-path routing table or figma-skill frontmatter/inventory parity remains under enforcement.
|
|
54
54
|
|
|
55
55
|
---
|
|
56
56
|
|
|
@@ -9,7 +9,7 @@ without ever editing persona files at runtime.
|
|
|
9
9
|
|
|
10
10
|
> **Fable 5 available again (2026-07).** `claude-fable-5` is the top tier once
|
|
11
11
|
> more. Architect (`ios/android/backend-architect`), Reviewer-1 (`code-reviewer`),
|
|
12
|
-
> and triage personas declare `preferredModel: fable`
|
|
12
|
+
> and triage personas declare `preferredModel: fable` - the deepest-reasoning
|
|
13
13
|
> roles. **If Fable 5 is unavailable, the first fallback is opus (`claude-opus-4-8`).**
|
|
14
14
|
> Security and other `preferredModel: opus` personas keep opus as their top tier.
|
|
15
15
|
> The `premiumTierUntil` date gate stays in the contract as a generic mechanism
|
|
@@ -98,6 +98,6 @@ per-phase `model` field already carries the override).
|
|
|
98
98
|
- No edits to `pipeline/agents/*.md` at runtime; frontmatter is install-time
|
|
99
99
|
configuration only.
|
|
100
100
|
- Copilot CLI reviewer set is out of scope: Copilot CLI pins its own three
|
|
101
|
-
reviewer models (GPT-5.4 + Opus + Sonnet
|
|
101
|
+
reviewer models (GPT-5.4 + Opus + Sonnet - Fable 5 is not offered there) and
|
|
102
102
|
does not use this persona ladder. Only Claude Code dispatches Reviewer-1 on
|
|
103
103
|
Fable.
|
|
@@ -67,6 +67,34 @@ Run phases sequentially. Log every step to `agent-log.md`.
|
|
|
67
67
|
If any phase fails, mark task as `paused` and stop - user can `resume` later.
|
|
68
68
|
Update `agent-state.json` at EVERY phase transition.
|
|
69
69
|
|
|
70
|
+
### Writing `agent-state.json` (required mechanism)
|
|
71
|
+
|
|
72
|
+
Every state update goes through `write-state.mjs`. Never write the file with a
|
|
73
|
+
plain read-modify-write (`jq ... > tmp && mv`, an editor tool, `cat >`):
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Merge a patch into the current state (the normal case).
|
|
77
|
+
echo '{"currentPhase":4,"phases":{"4":{"status":"running"}}}' \
|
|
78
|
+
| node $HOME/.claude/scripts/write-state.mjs "$STATE_FILE"
|
|
79
|
+
|
|
80
|
+
# Full replacement, only when rewriting the document wholesale.
|
|
81
|
+
printf '%s' "$NEW_STATE" | node $HOME/.claude/scripts/write-state.mjs --replace "$STATE_FILE"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Why the indirection is required: multi-repo mode and concurrent worktrees share
|
|
85
|
+
one `agent-state.json` per task id, so two writers using read-then-write lose one
|
|
86
|
+
of the two updates - the second write is computed from a snapshot taken before
|
|
87
|
+
the first landed. `write-state.mjs` does tmpfile + rename (atomic on POSIX) under
|
|
88
|
+
an advisory `.lock`, reclaims a lock whose holder PID is dead, and releases the
|
|
89
|
+
lock on every error path.
|
|
90
|
+
|
|
91
|
+
Exit codes the caller must handle: `0` written, `1` invalid JSON on stdin, `2`
|
|
92
|
+
lock timeout (another writer held it past the acquire window - retry once, then
|
|
93
|
+
halt per the halt-visibility rule), `3` I/O error.
|
|
94
|
+
|
|
95
|
+
Reads need no wrapper; the rename makes any read see either the old or the new
|
|
96
|
+
document, never a truncated one.
|
|
97
|
+
|
|
70
98
|
**Halt visibility (required, autopilot included).** A halt is never silent. Whenever a phase halts on a hard error (validator failed twice, no subagent returned, dispatch error past fallback, lock irrecoverable), in addition to the `agent-log.md` line: (a) write `state.status = "paused"` and `state.haltReason = "<phase>:<cause>"`; (b) record the cause on the tracker via `phase-tracker.sh meta <phase> halt "<cause>"` and `phase-tracker.sh update <phase> failed`; (c) emit one `>&2` alert line `HALT phase <N>: <cause> - resume with /multi-agent:resume #<id>`. Autopilot suppresses *confirmations*, not *halts* - the user must always be able to see why an unattended run stopped without reading the log.
|
|
71
99
|
|
|
72
100
|
### Pipeline Best Practices
|
|
@@ -487,6 +487,7 @@ done
|
|
|
487
487
|
|
|
488
488
|
State file in multi-repo mode:
|
|
489
489
|
- Single shared `agent-state.json` lives at `$HOME/.claude/logs/multi-agent/{first-project}/{task-id}/agent-state.json` (anchored on the first repo for back-compat with `multi-agent log`/`status` commands)
|
|
490
|
+
- **One shared file + per-repo writers is exactly the race `write-state.mjs` exists for.** Every update to it (here and in every later phase) goes through `node $HOME/.claude/scripts/write-state.mjs` per the required mechanism in `operations.md` "Writing `agent-state.json`". A read-modify-write from two repos in the same loop drops one repo's `projects[]` entry.
|
|
490
491
|
- `state.projects[]` holds per-repo `{name, root, worktreePath, branch, baseBranch, identity, platform, baseFetchStatus, commit, pr, pushAttempts, buildStatus}` - see `agent-state.schema.json`
|
|
491
492
|
- Scalar fields (`project`, `projectRoot`, `worktreePath`, `branch`, `baseBranch`, `identity`) mirror `projects[0]` so legacy phases that read scalars keep working
|
|
492
493
|
- Atomicity: if any repo's worktree creation fails (collision aborted, fetch aborted, disk full), roll back already-created worktrees: `git -C $proj worktree remove --force $WT_PATH; git -C $proj branch -D $BRANCH`. Never leave a partial multi-repo state.
|
|
@@ -13,7 +13,7 @@ Phase 2 Planning consumes the analysis document. MCP forbidden.
|
|
|
13
13
|
- Abort with `ERR: analysis doc missing. Run /multi-agent:analysis "<feature>" first.`
|
|
14
14
|
|
|
15
15
|
2. **Parse YAML front-matter**: `feature`, `platform`, `language`, `mode`, `evidence_digest`, `template_version`. Persist into `state.analysis.frontMatter`.
|
|
16
|
-
-
|
|
16
|
+
- **`template_version` < `v3` aborts**: `ERR: analysis doc is template v<n>; v3 required. Re-run /multi-agent:analysis to regenerate.` No degraded mode.
|
|
17
17
|
|
|
18
18
|
3. **Section coverage check**: verify these sections are non-empty (template v3 required sections per Locked 2):
|
|
19
19
|
- Section 1 Summary, Section 2 Goals + Non-Goals, Section 4 User Stories, Section 9 API Contracts, Section 13 Architecture Plan, Section 14 Files to Add, Section 20 Risks, Section 21 References
|
|
@@ -16,8 +16,7 @@ Pre-flight steps (run in order, abort on failure):
|
|
|
16
16
|
2. **Parse YAML front-matter** (the doc has a `template_version: v3` header):
|
|
17
17
|
- `feature`, `platform`, `language`, `mode (full | lite)`, `evidence_digest`
|
|
18
18
|
- Persist into `state.analysis.frontMatter`
|
|
19
|
-
- **Abort condition
|
|
20
|
-
- **Soft-skip (v9.1.0+, Locked 30)**: when `prefs.global.legacyV2AnalysisAllowed == true` OR env `MULTI_AGENT_LEGACY_V2_ANALYSIS=allow` is set AND `template_version == v2`, emit `WARN: legacy v2 analysis doc detected; v3 expected. Continuing with reduced binding strength.` and persist `state.dev.legacyAnalysisMode = true`. Step 4 (Code Connect lookup) and Step 6 (conventions handoff) still run, but Step 5 (standards binding) and Pass B footnote enforcement degrade to warning level (Phase 4 reviewer flags missing citations rather than blocking). Escape hatch removed in v9.2.0.
|
|
19
|
+
- **Abort condition**: `template_version` < `v3` -> exit with `ERR: analysis doc is template v<n>; v3 required. Re-run /multi-agent:analysis to regenerate.` No degraded mode.
|
|
21
20
|
|
|
22
21
|
3. **Evidence digest match (cache validation)**: if `state.run.lastAnalysisDigest` is present AND matches `frontMatter.evidence_digest`, mark as fresh; otherwise WARN that analysis is stale (continue but flag).
|
|
23
22
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
### Phase 4: Review (deterministic gates + parallel + triage)
|
|
2
2
|
|
|
3
|
-
> **TLDR** - Three-stage review. Stage 1: deterministic gates (build + lint + test + secret scan) that MUST pass. Stage 2: AI models in parallel - reviewer set is **CLI-aware**: Claude Code dispatches 2 reviewers (Fable + Sonnet); Copilot CLI dispatches 3 reviewers (GPT-5.4 + Opus + Sonnet
|
|
3
|
+
> **TLDR** - Three-stage review. Stage 1: deterministic gates (build + lint + test + secret scan) that MUST pass. Stage 2: AI models in parallel - reviewer set is **CLI-aware**: Claude Code dispatches 2 reviewers (Fable + Sonnet); Copilot CLI dispatches 3 reviewers (GPT-5.4 + Opus + Sonnet - Fable 5 is not offered on Copilot CLI). Stage 3: Fable triage (Opus on Copilot CLI) - evaluates raw findings, filters false-positives/out-of-scope, keeps only actionable items. Only triage-accepted blocking items loop back to Phase 3.
|
|
4
4
|
|
|
5
5
|
<!-- progress-contract: applied -->
|
|
6
6
|
Progress emission per `$HOME/.claude/multi-agent-refs/progress-contract.md` - lines for each gate, each reviewer dispatch + finish, triage start, triage verdict, fix dispatch.
|
|
@@ -112,11 +112,16 @@ Cost ledger: `phase-4.repo_map_emitted bytes=N budget=B cache_hit=true|false` -
|
|
|
112
112
|
|
|
113
113
|
Before dispatching reviewers, run the deterministic diff risk scorer and inject the top-N files into each reviewer's prompt as a priority hint. **Advisory only - never gates the pipeline.** Heuristic, zero LLM, runs in well under a second.
|
|
114
114
|
|
|
115
|
+
Score the diff **once, in full** (no `--top`): Steps 1.76/1.77 need every scored file (a shrinking test file ranked 20th; whether ANY file is high-stakes). The top-N hint is derived from that report, not a second git walk.
|
|
116
|
+
|
|
115
117
|
```bash
|
|
116
|
-
|
|
118
|
+
RISK_FULL=$(node pipeline/scripts/diff-risk-score.mjs \
|
|
117
119
|
--base "$BASE_BRANCH" --head HEAD \
|
|
118
|
-
--task-id "$TASK_ID"
|
|
119
|
-
echo "$
|
|
120
|
+
--task-id "$TASK_ID" 2>/dev/null)
|
|
121
|
+
echo "$RISK_FULL" | node pipeline/scripts/validate-diff-risk.mjs - >/dev/null 2>&1 || RISK_FULL=""
|
|
122
|
+
|
|
123
|
+
# Priority hint for the reviewer prompts: top 5 of the full report.
|
|
124
|
+
RISK_JSON=$([ -n "$RISK_FULL" ] && jq -c '.files |= (sort_by(-.score) | .[:5])' <<< "$RISK_FULL" || echo "")
|
|
120
125
|
```
|
|
121
126
|
|
|
122
127
|
**Signals & weights** (see `pipeline/schemas/diff-risk.schema.json`):
|
|
@@ -151,6 +156,35 @@ pipeline/scripts/log-metric.sh "$TASK_ID" 4 review.diff_risk \
|
|
|
151
156
|
|
|
152
157
|
**Opt-out**: `prefs.global.diffRiskAdvisory = false` skips this step entirely (no script invocation, no priority block injection). Default `true` because the cost is bounded and the signal-to-noise has been measured against the golden-task fixture set.
|
|
153
158
|
|
|
159
|
+
#### Step 1.76 - Test-integrity gate (produces BLOCKING findings)
|
|
160
|
+
|
|
161
|
+
Step 1.75 uses `test_lines_removed` as an advisory hint only - too weak for what it detects: a suite made green by deleting tests instead of fixing code. This turns the signal into blocking findings triage must adjudicate. Pure function of the full report, no git, no LLM.
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
TEST_INTEGRITY_JSON=$(printf '%s' "$RISK_FULL" | node pipeline/scripts/test-integrity-gate.mjs 2>/dev/null || echo "")
|
|
165
|
+
TI_COUNT=$(jq -r '.count // 0' <<< "${TEST_INTEGRITY_JSON:-{\}}" 2>/dev/null || echo 0)
|
|
166
|
+
[ "$TI_COUNT" -gt 0 ] && pipeline/scripts/log-metric.sh "$TASK_ID" 4 review.test_integrity findings="$TI_COUNT"
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
`findings[]` are reviewer-shaped (`test_integrity`, `blocking`), so they merge into the reviewer findings at Step 3.0 and need no triage-prompt or `validate-triage.mjs` change. Triage keeps each blocking unless the removal is justified per the immutable-test rule (spec changed AND commit body names the test) → `deferred[]`.
|
|
170
|
+
|
|
171
|
+
The gate never blocks the phase; it *emits* blocking findings. Empty or unreadable input yields zero findings and the phase continues. Feed it the FULL report - `--top` hides a shrinking test file below the cut. **No opt-out**: a run that can switch off its own anti-reward-hacking control cannot be trusted to report a pass.
|
|
172
|
+
|
|
173
|
+
#### Step 1.77 - Reviewer scope (cost gate)
|
|
174
|
+
|
|
175
|
+
On a trivial diff every reviewer agrees and the extra models plus triage are paid for nothing. Reviewer count comes from the same report, no LLM.
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
SCOPE_JSON=$(printf '%s' "$RISK_FULL" | node pipeline/scripts/review-scope.mjs 2>/dev/null \
|
|
179
|
+
|| echo '{"scope":"full","reason":"no risk report - failing safe"}')
|
|
180
|
+
REVIEW_SCOPE=$(jq -r '.scope // "full"' <<< "$SCOPE_JSON")
|
|
181
|
+
pipeline/scripts/log-metric.sh "$TASK_ID" 4 review.scope scope="$REVIEW_SCOPE"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
`single` (Reviewer 1 only) requires **all** of: churn <= 20 lines, `totals.max_score` < 3.0, and no `security_path` / `migration` / `public_api` / `no_test_change` / `test_lines_removed` on any file. Anything else → `full`.
|
|
185
|
+
|
|
186
|
+
Fails safe in one direction only: empty report, parse failure or validator rejection all resolve to `full`, because skipping a reviewer trades coverage for cost. `consensus.reviewerCount` records what actually ran, so a single-reviewer run never reads as cross-model agreement. Opt-out: `prefs.global.reviewScopeGate = false` forces `full`.
|
|
187
|
+
|
|
154
188
|
#### Step 1.8 - Figma visual-fidelity context (when task carries a Figma reference)
|
|
155
189
|
|
|
156
190
|
When `state.evidence.figma[]` is non-empty, the reviewer subagents MUST receive the captured screenshot URLs / paths and the canonical-component name (from `state.evidence.figma[i].screenshotUrl` and `state.evidence.figma[i].codeConnectSnippets[0].componentName` when present) so they can compare visual fidelity. Pass them inline in each reviewer prompt under a `## Figma evidence` block, one row per frame.
|
|
@@ -182,6 +216,8 @@ Phase 4 sends the same diff to every reviewer and then to triage, so the diff is
|
|
|
182
216
|
|
|
183
217
|
Launch Agent instances **in parallel** using the shared `code-reviewer` subagent definition (`~/.claude/agents/code-reviewer.md`). The reviewer set is determined by the host CLI - GPT-5.4 is only available on Copilot CLI, so Claude Code skips that reviewer and runs a 2-model parallel review; Copilot CLI runs all three.
|
|
184
218
|
|
|
219
|
+
**Scope from Step 1.77.** `$REVIEW_SCOPE == "single"` → dispatch **Reviewer 1 only**, and skip Step 2.5 + 3.6 (both no-ops with one reviewer). `"full"` (default + fail-safe) → the whole set below. Either way record the count in `consensus.reviewerCount`.
|
|
220
|
+
|
|
185
221
|
| Reviewer | subagent_type | Model | Focus | Skills Referenced | Where it runs |
|
|
186
222
|
| ---------- | ----------------- | ------------------- | --------------------------------- | --------------------------------------------- | -------------------- |
|
|
187
223
|
| Reviewer 1 | `code-reviewer` | `claude-fable-5` (Claude Code) / `claude-opus-4-8` (Copilot CLI) | Deep security + architecture | `api-security-best-practices`, `architecture` | Both CLIs |
|
|
@@ -259,9 +295,18 @@ Exit 0 = valid. Exit 2 = contradiction (approved=true with blocking findings) -
|
|
|
259
295
|
|
|
260
296
|
Opt-in empirical layer: when `prefs.global.verifyByTest.enabled` is `true`, accepted blocking findings additionally go through Step 3.7 (verify-by-test), which tries to reproduce each one with a minimal failing test before the Phase 3 rework loop fires. Full wiring: `$HOME/.claude/multi-agent-refs/features/verify-by-test.md`.
|
|
261
297
|
|
|
298
|
+
##### 3.0 Merge the deterministic findings in
|
|
299
|
+
|
|
300
|
+
Append the Step 1.76 test-integrity findings to the reviewer findings before counting, so they are adjudicated like any reviewer finding rather than resolved by triage never seeing them:
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
MERGED=$(jq -s '.[0] + (.[1].findings // [])' \
|
|
304
|
+
<(printf '%s' "$REVIEWER_FINDINGS_JSON") <(printf '%s' "${TEST_INTEGRITY_JSON:-{\}}"))
|
|
305
|
+
```
|
|
306
|
+
|
|
262
307
|
##### 3.1 Short-circuit: no findings
|
|
263
308
|
|
|
264
|
-
If merged findings `length === 0`, **skip triage**: write empty result `{"accepted": [], "deferred": [], "rejected": [], "approved": true}`, log, proceed to Phase 5.
|
|
309
|
+
If **merged** findings `length === 0`, **skip triage**: write empty result `{"accepted": [], "deferred": [], "rejected": [], "approved": true}`, log, proceed to Phase 5. Note this is the merged count from 3.0: a run with zero reviewer findings but a non-empty test-integrity set must NOT short-circuit.
|
|
265
310
|
|
|
266
311
|
##### 3.2 Launch triage agent
|
|
267
312
|
|
|
@@ -45,12 +45,7 @@
|
|
|
45
45
|
"autoDiff": false,
|
|
46
46
|
"manualNote": false
|
|
47
47
|
},
|
|
48
|
-
"wikiScope": [
|
|
49
|
-
"main",
|
|
50
|
-
"ios",
|
|
51
|
-
"screenshots",
|
|
52
|
-
"index"
|
|
53
|
-
],
|
|
48
|
+
"wikiScope": ["main", "ios", "screenshots", "index"],
|
|
54
49
|
"autopilotReportTimeoutSeconds": 1800,
|
|
55
50
|
"promptLanguage": "en",
|
|
56
51
|
"outputLanguage": "en",
|
|
@@ -162,17 +157,16 @@
|
|
|
162
157
|
}
|
|
163
158
|
},
|
|
164
159
|
"_derivedSkillSourcesTemplate": {
|
|
165
|
-
"_comment": "Optional. Populate global.derivedSkillSources[] to let /multi-agent:refactor check whether skills you derived from an upstream marketplace plugin have been updated. Kept in your LOCAL prefs only (never synced), so it may reference private sources. Copy an entry like the one below.",
|
|
160
|
+
"_comment": "Optional. Populate global.derivedSkillSources[] to let /multi-agent:refactor check whether skills you derived from an upstream marketplace plugin have been updated. Kept in your LOCAL prefs only (never synced), so it may reference private sources. Copy an entry like the one below. Set upstreamLocalClone when you have a working copy: the installed plugin cache is only as fresh as your last marketplace update, and a stale cache makes the drift check answer 'up to date' when it is four releases behind.",
|
|
166
161
|
"_example": {
|
|
167
162
|
"label": "Component toolkit skills",
|
|
168
163
|
"localPath": "plugins/<my-plugin>/skills/workflow",
|
|
169
164
|
"upstreamMarketplace": "<installed-marketplace-name>",
|
|
170
165
|
"upstreamPlugin": "<upstream-plugin-name>",
|
|
171
|
-
"upstreamSkills": [
|
|
172
|
-
"<skill-a>",
|
|
173
|
-
"<skill-b>"
|
|
174
|
-
],
|
|
166
|
+
"upstreamSkills": ["<skill-a>", "<skill-b>"],
|
|
175
167
|
"derivedFromVersion": "0.0.0",
|
|
168
|
+
"upstreamVersionSource": "marketplace.json",
|
|
169
|
+
"upstreamLocalClone": "$HOME/<upstream-repo-working-copy>",
|
|
176
170
|
"upstreamRepoUrl": "https://github.com/<org>/<repo>"
|
|
177
171
|
}
|
|
178
172
|
},
|
|
@@ -97,8 +97,16 @@
|
|
|
97
97
|
"type": "object",
|
|
98
98
|
"required": ["tool", "phase"],
|
|
99
99
|
"properties": {
|
|
100
|
-
"tool": {
|
|
101
|
-
|
|
100
|
+
"tool": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"description": "MCP tool name, e.g. mcp__claude_ai_Figma__get_design_context."
|
|
103
|
+
},
|
|
104
|
+
"phase": {
|
|
105
|
+
"type": "integer",
|
|
106
|
+
"minimum": 0,
|
|
107
|
+
"maximum": 7,
|
|
108
|
+
"description": "Pipeline phase the call ran in. Only 0 (init) and 1 (analysis) are permitted."
|
|
109
|
+
},
|
|
102
110
|
"timestamp": { "type": "string", "description": "ISO-8601 time of the call." }
|
|
103
111
|
}
|
|
104
112
|
}
|
|
@@ -154,7 +162,10 @@
|
|
|
154
162
|
"items": { "type": "object", "additionalProperties": true },
|
|
155
163
|
"description": "{ id, kind, label, screen, driver, evidence } per state driver (launch-arg / scenario-case / code-scenario / fixture / deep-link)."
|
|
156
164
|
},
|
|
157
|
-
"groups": {
|
|
165
|
+
"groups": {
|
|
166
|
+
"type": "array",
|
|
167
|
+
"items": { "type": "object", "additionalProperties": true }
|
|
168
|
+
},
|
|
158
169
|
"byKind": { "type": "object", "additionalProperties": true },
|
|
159
170
|
"truncated": { "type": "boolean" }
|
|
160
171
|
}
|
|
@@ -164,9 +175,15 @@
|
|
|
164
175
|
"additionalProperties": true,
|
|
165
176
|
"description": "Resolved run scope: the inventory targets this run must audit. The coverage gate applies to this set, not to the whole inventory - a scoped run is not penalised for out-of-scope targets.",
|
|
166
177
|
"properties": {
|
|
167
|
-
"argument": {
|
|
178
|
+
"argument": {
|
|
179
|
+
"type": ["string", "null"],
|
|
180
|
+
"description": "Raw $ARGUMENTS as given (empty = whole module, '--resume' = remainder of the last run)."
|
|
181
|
+
},
|
|
168
182
|
"targetIds": { "type": "array", "items": { "type": "string" } },
|
|
169
|
-
"resumedFrom": {
|
|
183
|
+
"resumedFrom": {
|
|
184
|
+
"type": ["string", "null"],
|
|
185
|
+
"description": "Report dir of the run this scope resumes, when --resume was used."
|
|
186
|
+
}
|
|
170
187
|
}
|
|
171
188
|
},
|
|
172
189
|
"figmaUrl": { "type": ["string", "null"] },
|
|
@@ -208,7 +225,10 @@
|
|
|
208
225
|
"unaccountedIds": { "type": "array", "items": { "type": "string" } }
|
|
209
226
|
}
|
|
210
227
|
},
|
|
211
|
-
"reportDir": {
|
|
228
|
+
"reportDir": {
|
|
229
|
+
"type": ["string", "null"],
|
|
230
|
+
"description": "Output dir under ~/DesignChecks."
|
|
231
|
+
}
|
|
212
232
|
}
|
|
213
233
|
},
|
|
214
234
|
"identity": {
|
|
@@ -218,7 +238,10 @@
|
|
|
218
238
|
"properties": {
|
|
219
239
|
"name": { "type": "string" },
|
|
220
240
|
"email": { "type": "string", "format": "email" },
|
|
221
|
-
"username": {
|
|
241
|
+
"username": {
|
|
242
|
+
"type": "string",
|
|
243
|
+
"description": "SCM username (GitHub/Bitbucket). Used to filter out PR author from reviewer list."
|
|
244
|
+
}
|
|
222
245
|
}
|
|
223
246
|
},
|
|
224
247
|
"phases": {
|
|
@@ -229,7 +252,10 @@
|
|
|
229
252
|
"type": "object",
|
|
230
253
|
"additionalProperties": false,
|
|
231
254
|
"properties": {
|
|
232
|
-
"status": {
|
|
255
|
+
"status": {
|
|
256
|
+
"type": "string",
|
|
257
|
+
"enum": ["pending", "in_progress", "done", "skipped", "failed"]
|
|
258
|
+
},
|
|
233
259
|
"startedAt": { "type": "string", "format": "date-time" },
|
|
234
260
|
"finishedAt": { "type": "string", "format": "date-time" },
|
|
235
261
|
"model": { "type": "string" },
|
|
@@ -312,7 +338,11 @@
|
|
|
312
338
|
"properties": {
|
|
313
339
|
"number": { "type": "integer", "minimum": 1 },
|
|
314
340
|
"url": { "type": "string", "format": "uri" },
|
|
315
|
-
"version": {
|
|
341
|
+
"version": {
|
|
342
|
+
"type": "integer",
|
|
343
|
+
"minimum": 0,
|
|
344
|
+
"description": "Bitbucket PR version - must increment by 1 per PUT."
|
|
345
|
+
},
|
|
316
346
|
"draft": { "type": "boolean" },
|
|
317
347
|
"reviewers": {
|
|
318
348
|
"type": "array",
|
|
@@ -18,8 +18,14 @@
|
|
|
18
18
|
"enum": ["ios", "android", "backend", "frontend", "mobile", "unknown"],
|
|
19
19
|
"description": "Dominant stack inferred from project markers (.xcodeproj, build.gradle, package.json, etc.)."
|
|
20
20
|
},
|
|
21
|
-
"language": {
|
|
22
|
-
|
|
21
|
+
"language": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "E.g. 'Swift 6', 'Kotlin 2.1', 'Python 3.13', 'TypeScript 5'."
|
|
24
|
+
},
|
|
25
|
+
"framework": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "E.g. 'SwiftUI', 'Jetpack Compose', 'FastAPI', 'Next.js 16'."
|
|
28
|
+
}
|
|
23
29
|
}
|
|
24
30
|
},
|
|
25
31
|
"touchedAreas": {
|
|
@@ -30,8 +36,16 @@
|
|
|
30
36
|
"additionalProperties": false,
|
|
31
37
|
"required": ["path", "why"],
|
|
32
38
|
"properties": {
|
|
33
|
-
"path": {
|
|
34
|
-
|
|
39
|
+
"path": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"minLength": 1,
|
|
42
|
+
"description": "File or directory relative to repo root."
|
|
43
|
+
},
|
|
44
|
+
"why": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"minLength": 4,
|
|
47
|
+
"description": "Why the task likely affects this area."
|
|
48
|
+
}
|
|
35
49
|
}
|
|
36
50
|
},
|
|
37
51
|
"description": "Files / modules the task is most likely to modify. Phase 2 uses this to scope tasks."
|