@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
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# smoke-validator-contradiction.sh - verify bidirectional approved↔blocking auto-correction.
|
|
3
|
-
# Tests both directions of the triage validator's contradiction detection.
|
|
4
|
-
|
|
5
|
-
set -uo pipefail
|
|
6
|
-
|
|
7
|
-
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
8
|
-
VALIDATOR="$SCRIPT_DIR/validate-triage.mjs"
|
|
9
|
-
|
|
10
|
-
PASS=0
|
|
11
|
-
FAIL=0
|
|
12
|
-
|
|
13
|
-
pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
|
|
14
|
-
fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
|
|
15
|
-
|
|
16
|
-
echo "→ 1. approved=false but no blocking items → auto-correct to true (exit 3)"
|
|
17
|
-
RESULT=$(echo '{"accepted":[{"severity":"suggestion","file":"x.ts","line":1,"issue":"naming convention","fix":"rename to camelCase","reviewer":"opus"}],"deferred":[],"rejected":[],"approved":false}' | node "$VALIDATOR" -)
|
|
18
|
-
CODE=$?
|
|
19
|
-
if [ "$CODE" -eq 3 ]; then pass "exit code 3 (contradiction corrected)"; else fail "expected exit 3, got $CODE"; fi
|
|
20
|
-
CORRECTED=$(echo "$RESULT" | jq -r '.corrected.approved')
|
|
21
|
-
if [ "$CORRECTED" = "true" ]; then pass "corrected.approved == true"; else fail "corrected.approved = $CORRECTED, expected true"; fi
|
|
22
|
-
|
|
23
|
-
echo ""
|
|
24
|
-
echo "→ 2. approved=true but has blocking item → auto-correct to false (exit 3)"
|
|
25
|
-
RESULT=$(echo '{"accepted":[{"severity":"blocking","file":"auth.ts","line":42,"issue":"SQL injection vulnerability","fix":"use parameterized query","reviewer":"opus"}],"deferred":[],"rejected":[],"approved":true}' | node "$VALIDATOR" -)
|
|
26
|
-
CODE=$?
|
|
27
|
-
if [ "$CODE" -eq 3 ]; then pass "exit code 3 (contradiction corrected)"; else fail "expected exit 3, got $CODE"; fi
|
|
28
|
-
CORRECTED=$(echo "$RESULT" | jq -r '.corrected.approved')
|
|
29
|
-
if [ "$CORRECTED" = "false" ]; then pass "corrected.approved == false"; else fail "corrected.approved = $CORRECTED, expected false"; fi
|
|
30
|
-
|
|
31
|
-
echo ""
|
|
32
|
-
echo "→ 3. approved=true with no blocking → valid (exit 0)"
|
|
33
|
-
RESULT=$(echo '{"accepted":[{"severity":"important","file":"x.ts","line":1,"issue":"missing null check","fix":"add guard clause","reviewer":"sonnet"}],"deferred":[],"rejected":[],"approved":true}' | node "$VALIDATOR" -)
|
|
34
|
-
CODE=$?
|
|
35
|
-
if [ "$CODE" -eq 0 ]; then pass "exit code 0 (valid, no contradiction)"; else fail "expected exit 0, got $CODE"; fi
|
|
36
|
-
OK=$(echo "$RESULT" | jq -r '.ok')
|
|
37
|
-
if [ "$OK" = "true" ]; then pass "ok == true"; else fail "ok = $OK, expected true"; fi
|
|
38
|
-
|
|
39
|
-
echo ""
|
|
40
|
-
echo "→ 4. approved=false with blocking → valid (exit 0)"
|
|
41
|
-
RESULT=$(echo '{"accepted":[{"severity":"blocking","file":"x.ts","line":1,"issue":"memory leak in closure","fix":"add [weak self]","reviewer":"opus"}],"deferred":[],"rejected":[],"approved":false}' | node "$VALIDATOR" -)
|
|
42
|
-
CODE=$?
|
|
43
|
-
if [ "$CODE" -eq 0 ]; then pass "exit code 0 (valid, correct state)"; else fail "expected exit 0, got $CODE"; fi
|
|
44
|
-
OK=$(echo "$RESULT" | jq -r '.ok')
|
|
45
|
-
if [ "$OK" = "true" ]; then pass "ok == true"; else fail "ok = $OK, expected true"; fi
|
|
46
|
-
|
|
47
|
-
echo ""
|
|
48
|
-
echo "→ 5. empty accepted + approved=true → valid (exit 0)"
|
|
49
|
-
RESULT=$(echo '{"accepted":[],"deferred":[],"rejected":[],"approved":true}' | node "$VALIDATOR" -)
|
|
50
|
-
CODE=$?
|
|
51
|
-
if [ "$CODE" -eq 0 ]; then pass "exit code 0 (empty, approved=true is correct)"; else fail "expected exit 0, got $CODE"; fi
|
|
52
|
-
|
|
53
|
-
echo ""
|
|
54
|
-
echo "→ 6. all suggestions + approved=false → auto-correct (exit 3)"
|
|
55
|
-
RESULT=$(echo '{"accepted":[{"severity":"suggestion","file":"a.ts","line":1,"issue":"test name convention","fix":"rename test","reviewer":"sonnet"},{"severity":"suggestion","file":"b.ts","line":2,"issue":"unused import","fix":"remove import","reviewer":"opus"}],"deferred":[],"rejected":[],"approved":false}' | node "$VALIDATOR" -)
|
|
56
|
-
CODE=$?
|
|
57
|
-
if [ "$CODE" -eq 3 ]; then pass "exit code 3 (no blockers, corrected to true)"; else fail "expected exit 3, got $CODE"; fi
|
|
58
|
-
|
|
59
|
-
echo ""
|
|
60
|
-
echo "→ 7. mixed blocking+suggestion + approved=true → auto-correct to false (exit 3)"
|
|
61
|
-
RESULT=$(echo '{"accepted":[{"severity":"blocking","file":"a.ts","line":1,"issue":"auth bypass","fix":"add auth check","reviewer":"opus"},{"severity":"suggestion","file":"b.ts","line":2,"issue":"naming","fix":"rename","reviewer":"sonnet"}],"deferred":[],"rejected":[],"approved":true}' | node "$VALIDATOR" -)
|
|
62
|
-
CODE=$?
|
|
63
|
-
if [ "$CODE" -eq 3 ]; then pass "exit code 3 (has blocker, corrected to false)"; else fail "expected exit 3, got $CODE"; fi
|
|
64
|
-
|
|
65
|
-
echo ""
|
|
66
|
-
echo "══ validator-contradiction smoke: $PASS passed, $FAIL failed ══"
|
|
67
|
-
[ "$FAIL" -eq 0 ]
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# smoke-validator-gates.sh - v9.11.0
|
|
3
|
-
#
|
|
4
|
-
# Validates that the orchestrator phase docs wire the structured-output
|
|
5
|
-
# validators (validate-analysis / validate-planning / validate-reviewer /
|
|
6
|
-
# validate-triage) as deterministic gates, not just npm-test fixtures.
|
|
7
|
-
#
|
|
8
|
-
# Without this, a malformed analysis spec, plan, reviewer verdict, or triage
|
|
9
|
-
# verdict flows downstream unchecked - the validators existed but only ran
|
|
10
|
-
# in `npm test`, never in the live pipeline.
|
|
11
|
-
#
|
|
12
|
-
# What this enforces:
|
|
13
|
-
# 1. Each validator accepts a FILE argument (the gate invocation form) and
|
|
14
|
-
# exits 0 on a valid artifact / 1 on a malformed one.
|
|
15
|
-
# 2. phase-1-analysis.md gates the analysis object via validate-analysis.mjs.
|
|
16
|
-
# 3. phase-2-planning.md gates the plan object via validate-planning.mjs.
|
|
17
|
-
# 4. phase-4-review.md gates reviewer outputs via validate-reviewer.mjs AND
|
|
18
|
-
# the triage verdict via validate-triage.mjs.
|
|
19
|
-
# 5. Every gate block documents the failure protocol: emit stderr, ONE
|
|
20
|
-
# self-correction rework, re-run, then HALT with a recovery hint.
|
|
21
|
-
#
|
|
22
|
-
# What this does NOT enforce:
|
|
23
|
-
# - Runtime - that the agent actually invokes the gate. This smoke catches
|
|
24
|
-
# the prompt-side gap, same as smoke-tracker-contract.sh.
|
|
25
|
-
|
|
26
|
-
set -euo pipefail
|
|
27
|
-
|
|
28
|
-
REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
29
|
-
SCRIPTS_DIR="$REPO_ROOT/pipeline/scripts"
|
|
30
|
-
PHASES_DIR="$REPO_ROOT/pipeline/multi-agent-refs/phases"
|
|
31
|
-
|
|
32
|
-
PASS=0
|
|
33
|
-
FAIL=0
|
|
34
|
-
pass() { PASS=$((PASS + 1)); echo " ✓ $1"; }
|
|
35
|
-
fail() { FAIL=$((FAIL + 1)); echo " ✗ $1"; }
|
|
36
|
-
|
|
37
|
-
command -v node >/dev/null 2>&1 || { echo "error: node required" >&2; exit 127; }
|
|
38
|
-
|
|
39
|
-
TMP="$(mktemp -d)"
|
|
40
|
-
trap 'rm -rf "$TMP"' EXIT
|
|
41
|
-
|
|
42
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
43
|
-
echo "→ 1. Validators exist and accept a file argument (gate invocation form)"
|
|
44
|
-
|
|
45
|
-
printf '%s' '{"stack":{"primary":"ios"},"touchedAreas":[{"path":"Sources/App/Login.swift","why":"target of the change"}],"risks":[],"summary":"Valid analysis fixture used by the validator-gates smoke."}' > "$TMP/analysis.json"
|
|
46
|
-
printf '%s' '{"approved":true,"tasks":[{"id":"T1","title":"Add validator gate","type":"code","files":["Sources/App/Login.swift"]}]}' > "$TMP/plan.json"
|
|
47
|
-
printf '%s' '{"findings":[],"approved":true}' > "$TMP/reviewer.json"
|
|
48
|
-
printf '%s' '{"accepted":[],"deferred":[],"rejected":[],"approved":true}' > "$TMP/triage.json"
|
|
49
|
-
|
|
50
|
-
declare -a CHECKS=(
|
|
51
|
-
"validate-analysis.mjs|$TMP/analysis.json"
|
|
52
|
-
"validate-planning.mjs|$TMP/plan.json"
|
|
53
|
-
"validate-reviewer.mjs|$TMP/reviewer.json"
|
|
54
|
-
"validate-triage.mjs|$TMP/triage.json"
|
|
55
|
-
)
|
|
56
|
-
for entry in "${CHECKS[@]}"; do
|
|
57
|
-
validator="${entry%%|*}"
|
|
58
|
-
fixture="${entry##*|}"
|
|
59
|
-
if [ ! -f "$SCRIPTS_DIR/$validator" ]; then
|
|
60
|
-
fail "$validator missing under pipeline/scripts/"
|
|
61
|
-
continue
|
|
62
|
-
fi
|
|
63
|
-
if node "$SCRIPTS_DIR/$validator" "$fixture" >/dev/null 2>&1; then
|
|
64
|
-
pass "$validator accepts a file argument (exit 0 on valid fixture)"
|
|
65
|
-
else
|
|
66
|
-
fail "$validator rejected a valid fixture via file argument"
|
|
67
|
-
fi
|
|
68
|
-
done
|
|
69
|
-
|
|
70
|
-
rc=0
|
|
71
|
-
printf '%s' '{}' > "$TMP/malformed.json"
|
|
72
|
-
node "$SCRIPTS_DIR/validate-analysis.mjs" "$TMP/malformed.json" >/dev/null 2>&1 || rc=$?
|
|
73
|
-
if [ "$rc" -eq 1 ]; then
|
|
74
|
-
pass "validate-analysis.mjs fails CLOSED on a malformed file (exit 1)"
|
|
75
|
-
else
|
|
76
|
-
fail "validate-analysis.mjs malformed-file exit wrong (got $rc, expected 1)"
|
|
77
|
-
fi
|
|
78
|
-
|
|
79
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
80
|
-
echo "→ 2. Phase docs carry the file-based gate invocation marker"
|
|
81
|
-
|
|
82
|
-
declare -a GATES=(
|
|
83
|
-
"phase-1-analysis.md|validate-analysis.mjs \"\$ANALYSIS_FILE\""
|
|
84
|
-
"phase-2-planning.md|validate-planning.mjs \"\$PLAN_FILE\""
|
|
85
|
-
"phase-4-review.md|validate-reviewer.mjs \"\$REVIEWER_FILE\""
|
|
86
|
-
"phase-4-review.md|validate-triage.mjs \"\$TRIAGE_FILE\""
|
|
87
|
-
)
|
|
88
|
-
for entry in "${GATES[@]}"; do
|
|
89
|
-
doc="${entry%%|*}"
|
|
90
|
-
marker="${entry##*|}"
|
|
91
|
-
if [ ! -f "$PHASES_DIR/$doc" ]; then
|
|
92
|
-
fail "$doc missing"
|
|
93
|
-
continue
|
|
94
|
-
fi
|
|
95
|
-
if grep -qF "$marker" "$PHASES_DIR/$doc"; then
|
|
96
|
-
pass "$doc invokes $marker"
|
|
97
|
-
else
|
|
98
|
-
fail "$doc missing gate invocation marker: $marker"
|
|
99
|
-
fi
|
|
100
|
-
done
|
|
101
|
-
|
|
102
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
103
|
-
echo "→ 3. Gate invocations use the installed-scripts path (\$HOME/.claude/scripts)"
|
|
104
|
-
|
|
105
|
-
declare -a INSTALLED=(
|
|
106
|
-
"phase-1-analysis.md|validate-analysis.mjs"
|
|
107
|
-
"phase-2-planning.md|validate-planning.mjs"
|
|
108
|
-
"phase-4-review.md|validate-reviewer.mjs"
|
|
109
|
-
"phase-4-review.md|validate-triage.mjs"
|
|
110
|
-
)
|
|
111
|
-
for entry in "${INSTALLED[@]}"; do
|
|
112
|
-
doc="${entry%%|*}"
|
|
113
|
-
validator="${entry##*|}"
|
|
114
|
-
if grep -qF "\$HOME/.claude/scripts/$validator" "$PHASES_DIR/$doc" 2>/dev/null; then
|
|
115
|
-
pass "$doc invokes \$HOME/.claude/scripts/$validator"
|
|
116
|
-
else
|
|
117
|
-
fail "$doc missing \$HOME/.claude/scripts/$validator invocation"
|
|
118
|
-
fi
|
|
119
|
-
done
|
|
120
|
-
|
|
121
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
122
|
-
echo "→ 4. Every gate block documents the failure protocol (rework once, then halt)"
|
|
123
|
-
|
|
124
|
-
declare -a PROTOCOL_DOCS=(
|
|
125
|
-
"phase-1-analysis.md"
|
|
126
|
-
"phase-2-planning.md"
|
|
127
|
-
"phase-4-review.md"
|
|
128
|
-
)
|
|
129
|
-
for doc in "${PROTOCOL_DOCS[@]}"; do
|
|
130
|
-
full="$PHASES_DIR/$doc"
|
|
131
|
-
[ -f "$full" ] || { fail "$doc missing"; continue; }
|
|
132
|
-
if grep -qi "ONE self-correction rework" "$full"; then
|
|
133
|
-
pass "$doc documents the single self-correction rework"
|
|
134
|
-
else
|
|
135
|
-
fail "$doc missing the self-correction rework step"
|
|
136
|
-
fi
|
|
137
|
-
if grep -q "HALT the phase" "$full"; then
|
|
138
|
-
pass "$doc halts the phase on second validator failure"
|
|
139
|
-
else
|
|
140
|
-
fail "$doc missing the halt-on-second-failure rule"
|
|
141
|
-
fi
|
|
142
|
-
done
|
|
143
|
-
|
|
144
|
-
# Recovery hints name the validator and the schema to inspect.
|
|
145
|
-
declare -a HINTS=(
|
|
146
|
-
"phase-1-analysis.md|failed validate-analysis.mjs twice"
|
|
147
|
-
"phase-2-planning.md|failed validate-planning.mjs twice"
|
|
148
|
-
"phase-4-review.md|failed validate-reviewer.mjs twice"
|
|
149
|
-
"phase-4-review.md|failed validate-triage.mjs twice"
|
|
150
|
-
)
|
|
151
|
-
for entry in "${HINTS[@]}"; do
|
|
152
|
-
doc="${entry%%|*}"
|
|
153
|
-
hint="${entry##*|}"
|
|
154
|
-
if grep -qF "$hint" "$PHASES_DIR/$doc" 2>/dev/null; then
|
|
155
|
-
pass "$doc carries recovery hint: $hint"
|
|
156
|
-
else
|
|
157
|
-
fail "$doc missing recovery hint: $hint"
|
|
158
|
-
fi
|
|
159
|
-
done
|
|
160
|
-
|
|
161
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
162
|
-
echo ""
|
|
163
|
-
echo "══ validator-gates smoke: $PASS passed, $FAIL failed ══"
|
|
164
|
-
[ "$FAIL" -eq 0 ]
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# smoke-vercel-deploy-redact.sh - verify pipeline/lib/vercel-deploy.sh
|
|
4
|
-
# scrubs every known token-leak shape from CLI output.
|
|
5
|
-
#
|
|
6
|
-
# Background: v7.9.1 production deploy failed with the Vercel CLI
|
|
7
|
-
# printing `vercel deploy --token=vcp_...` in the retry hint. The token leaked
|
|
8
|
-
# into the conversation transcript and required rotation. v8.0.0 added
|
|
9
|
-
# vercel-deploy.sh as the safe wrapper. This smoke is the regression gate -
|
|
10
|
-
# any future change to the redact filter must keep these patterns covered.
|
|
11
|
-
#
|
|
12
|
-
# Patterns under test:
|
|
13
|
-
# - --token=vcp_<hex> (the original 7.9.1 leak shape)
|
|
14
|
-
# - --token vcp_<hex> (space-separated argv)
|
|
15
|
-
# - vcp_<bare> (token-only mention)
|
|
16
|
-
# - Bearer <jwt-ish> (HTTP auth header)
|
|
17
|
-
# - "token":"<val>" (JSON body)
|
|
18
|
-
# - "VERCEL_TOKEN":"<val>" (env-dump JSON)
|
|
19
|
-
#
|
|
20
|
-
# Exit codes: 0=pass, 1=at least one pattern survived redaction
|
|
21
|
-
set -euo pipefail
|
|
22
|
-
|
|
23
|
-
REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
24
|
-
WRAPPER="$REPO_ROOT/pipeline/lib/vercel-deploy.sh"
|
|
25
|
-
|
|
26
|
-
[ -x "$WRAPPER" ] || chmod +x "$WRAPPER" 2>/dev/null || true
|
|
27
|
-
[ -f "$WRAPPER" ] || { echo "FAIL: vercel-deploy.sh missing"; exit 2; }
|
|
28
|
-
|
|
29
|
-
PASS=0
|
|
30
|
-
FAIL=0
|
|
31
|
-
pass() { echo " ✓ $*"; PASS=$((PASS + 1)); }
|
|
32
|
-
fail() { echo " ✗ $*"; FAIL=$((FAIL + 1)); }
|
|
33
|
-
|
|
34
|
-
assert_redacts() {
|
|
35
|
-
local label="$1"
|
|
36
|
-
local input="$2"
|
|
37
|
-
local must_not_contain="$3"
|
|
38
|
-
local out
|
|
39
|
-
out=$(printf '%s' "$input" | bash "$WRAPPER" redact)
|
|
40
|
-
if echo "$out" | grep -qE "$must_not_contain"; then
|
|
41
|
-
fail "$label - leak survived: $(echo "$out" | grep -oE "$must_not_contain" | head -1)"
|
|
42
|
-
else
|
|
43
|
-
pass "$label"
|
|
44
|
-
fi
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
# --- Pattern 1: --token=vcp_... (original v7.9.1 leak) ---
|
|
48
|
-
assert_redacts "--token=vcp_... argv form scrubbed" \
|
|
49
|
-
'Run `vercel deploy --token=vcp_AbCdEf123456789abcdef --prod` to retry' \
|
|
50
|
-
'vcp_AbCdEf123456789abcdef'
|
|
51
|
-
|
|
52
|
-
# --- Pattern 2: --token <space> vcp_... ---
|
|
53
|
-
assert_redacts "--token <space> argv form scrubbed" \
|
|
54
|
-
'next.command: vercel deploy --token vcp_QwertyUiopASDFghj1234' \
|
|
55
|
-
'vcp_QwertyUiopASDFghj1234'
|
|
56
|
-
|
|
57
|
-
# --- Pattern 3: bare vcp_... token mention ---
|
|
58
|
-
assert_redacts "bare vcp_... token mention scrubbed" \
|
|
59
|
-
'Authentication failed for token vcp_BareLeak987654321xyz on retry.' \
|
|
60
|
-
'vcp_BareLeak987654321xyz'
|
|
61
|
-
|
|
62
|
-
# --- Pattern 4: Bearer <jwt-ish> auth header ---
|
|
63
|
-
assert_redacts "Bearer <jwt> auth header scrubbed" \
|
|
64
|
-
'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0In0.signature' \
|
|
65
|
-
'eyJhbGciOiJIUzI1NiJ9'
|
|
66
|
-
|
|
67
|
-
# --- Pattern 5: "token":"<val>" JSON body ---
|
|
68
|
-
assert_redacts '"token":"<val>" JSON body scrubbed' \
|
|
69
|
-
'{"token":"vcp_JsonBodyLeak555","scope":"deploy"}' \
|
|
70
|
-
'vcp_JsonBodyLeak555'
|
|
71
|
-
|
|
72
|
-
# --- Pattern 6: "VERCEL_TOKEN":"<val>" env-dump JSON ---
|
|
73
|
-
assert_redacts '"VERCEL_TOKEN":"<val>" env-dump scrubbed' \
|
|
74
|
-
'env: { "VERCEL_TOKEN":"vcp_EnvDumpLeak777", "NODE_ENV":"production" }' \
|
|
75
|
-
'vcp_EnvDumpLeak777'
|
|
76
|
-
|
|
77
|
-
# --- Pattern 7: multi-line CLI failure dump (real-world shape from v7.9.1) ---
|
|
78
|
-
multiline=$'Error: failed to deploy\n next.command: vercel deploy --token=vcp_RealDumpLeak888 --prod\n retry: yes'
|
|
79
|
-
assert_redacts "multi-line CLI failure dump scrubbed" \
|
|
80
|
-
"$multiline" \
|
|
81
|
-
'vcp_RealDumpLeak888'
|
|
82
|
-
|
|
83
|
-
# --- Negative: non-token text passes through unchanged ---
|
|
84
|
-
echo ""
|
|
85
|
-
echo "→ Negative cases - non-token text MUST pass through verbatim"
|
|
86
|
-
sample='Deployment URL: https://example.vercel.app/page (200 OK)'
|
|
87
|
-
roundtrip=$(printf '%s' "$sample" | bash "$WRAPPER" redact)
|
|
88
|
-
if [ "$roundtrip" = "$sample" ]; then
|
|
89
|
-
pass "innocuous output unchanged"
|
|
90
|
-
else
|
|
91
|
-
fail "redactor mangled innocuous output: '$roundtrip' != '$sample'"
|
|
92
|
-
fi
|
|
93
|
-
|
|
94
|
-
# --- Wrapper guard: refuses --token argv ---
|
|
95
|
-
echo ""
|
|
96
|
-
echo "→ Wrapper guard - refuses to deploy with --token argv"
|
|
97
|
-
guard_out=$(VERCEL_TOKEN=vcp_GuardCheck111 bash "$WRAPPER" deploy --token=vcp_BadArg 2>&1 || true)
|
|
98
|
-
if echo "$guard_out" | grep -q "refused to deploy with --token argv"; then
|
|
99
|
-
pass "wrapper rejects --token argv with explicit error"
|
|
100
|
-
else
|
|
101
|
-
fail "wrapper did not reject --token argv (output: $guard_out)"
|
|
102
|
-
fi
|
|
103
|
-
# Verify the refusal message itself doesn't leak the bad token
|
|
104
|
-
if echo "$guard_out" | grep -q "vcp_BadArg"; then
|
|
105
|
-
fail "refusal message leaked the bad token (vcp_BadArg)"
|
|
106
|
-
else
|
|
107
|
-
pass "refusal message does not echo the offending token"
|
|
108
|
-
fi
|
|
109
|
-
|
|
110
|
-
# --- Doctor mode runs without VERCEL_TOKEN crashing ---
|
|
111
|
-
echo ""
|
|
112
|
-
echo "→ doctor subcommand"
|
|
113
|
-
doctor_out=$(VERCEL_TOKEN= bash "$WRAPPER" doctor 2>&1 || true)
|
|
114
|
-
if echo "$doctor_out" | grep -q "VERCEL_TOKEN: unset"; then
|
|
115
|
-
pass "doctor reports unset token clearly"
|
|
116
|
-
else
|
|
117
|
-
fail "doctor did not handle unset VERCEL_TOKEN gracefully"
|
|
118
|
-
fi
|
|
119
|
-
|
|
120
|
-
doctor_set_out=$(VERCEL_TOKEN=vcp_DoctorTokenABCDEF12345 bash "$WRAPPER" doctor 2>&1 || true)
|
|
121
|
-
if echo "$doctor_set_out" | grep -q "vcp_DoctorTokenABCDEF12345"; then
|
|
122
|
-
fail "doctor leaked the token in set-mode output"
|
|
123
|
-
else
|
|
124
|
-
pass "doctor masks the token in set-mode output"
|
|
125
|
-
fi
|
|
126
|
-
|
|
127
|
-
echo ""
|
|
128
|
-
echo "══ smoke-vercel-deploy-redact: $PASS passed, $FAIL failed ══"
|
|
129
|
-
[ "$FAIL" -gt 0 ] && exit 1 || exit 0
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# smoke-verify-by-test.sh
|
|
3
|
-
#
|
|
4
|
-
# Verifies the Phase 4 Step 3.7 verify-by-test contract:
|
|
5
|
-
# 1. phase-4-review.md documents Step 3.7 with evidence-gate invocation + feature-doc pointer
|
|
6
|
-
# 2. refs/features/verify-by-test.md exists and covers the verdict table + red-test handoff
|
|
7
|
-
# 3. prefs.schema.json exposes global.verifyByTest.{enabled,maxFindings,model,stepTimeoutSec}
|
|
8
|
-
# 4. verifyByTest.enabled defaults to false (opt-in, no surprise cost)
|
|
9
|
-
# 5. triage-output.schema.json is v3.2.0 with the $defs.verification result enum
|
|
10
|
-
# 6. validate-triage.mjs accepts a valid `confirmed` verification and rejects bad ones
|
|
11
|
-
# 7. phase-3-dev.md documents the redTests rework re-entry
|
|
12
|
-
#
|
|
13
|
-
# Exit 0 = all pass, 1 = any failure.
|
|
14
|
-
|
|
15
|
-
set -euo pipefail
|
|
16
|
-
|
|
17
|
-
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
18
|
-
PHASE4_DOC="$ROOT/pipeline/multi-agent-refs/phases/phase-4-review.md"
|
|
19
|
-
PHASE3_DOC="$ROOT/pipeline/multi-agent-refs/phases/phase-3-dev.md"
|
|
20
|
-
FEATURE_DOC="$ROOT/pipeline/multi-agent-refs/features/verify-by-test.md"
|
|
21
|
-
PREFS_SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
|
|
22
|
-
TRIAGE_SCHEMA="$ROOT/pipeline/schemas/triage-output.schema.json"
|
|
23
|
-
VALIDATOR="$ROOT/pipeline/scripts/validate-triage.mjs"
|
|
24
|
-
|
|
25
|
-
pass=0
|
|
26
|
-
fail=0
|
|
27
|
-
failures=()
|
|
28
|
-
record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
|
|
29
|
-
record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
|
|
30
|
-
|
|
31
|
-
printf '→ smoke-verify-by-test: Phase 4 Step 3.7 contract\n'
|
|
32
|
-
|
|
33
|
-
# 1. Phase 4 doc documents Step 3.7
|
|
34
|
-
if [ ! -f "$PHASE4_DOC" ]; then
|
|
35
|
-
record_fail "phase-4-review.md missing"
|
|
36
|
-
else
|
|
37
|
-
if grep -qF "3.7 Verify-by-test" "$PHASE4_DOC"; then
|
|
38
|
-
record_pass "phase-4-review.md documents Step 3.7"
|
|
39
|
-
else
|
|
40
|
-
record_fail "phase-4-review.md missing Step 3.7 section"
|
|
41
|
-
fi
|
|
42
|
-
if grep -qF "evidence-gate.mjs --claim test --status passed" "$PHASE4_DOC"; then
|
|
43
|
-
record_pass "Step 3.7 downgrade is evidence-gated"
|
|
44
|
-
else
|
|
45
|
-
record_fail "Step 3.7 must gate downgrades via evidence-gate.mjs --claim test --status passed"
|
|
46
|
-
fi
|
|
47
|
-
if grep -qF "refs/features/verify-by-test.md" "$PHASE4_DOC"; then
|
|
48
|
-
record_pass "phase-4-review.md points to the feature doc"
|
|
49
|
-
else
|
|
50
|
-
record_fail "phase-4-review.md must reference refs/features/verify-by-test.md"
|
|
51
|
-
fi
|
|
52
|
-
if grep -qF "review.verify_by_test" "$PHASE4_DOC"; then
|
|
53
|
-
record_pass "Step 3.7 emits review.verify_by_test telemetry"
|
|
54
|
-
else
|
|
55
|
-
record_fail "Step 3.7 must document the review.verify_by_test metric"
|
|
56
|
-
fi
|
|
57
|
-
fi
|
|
58
|
-
|
|
59
|
-
# 2. Feature doc exists with verdict + handoff coverage
|
|
60
|
-
if [ ! -f "$FEATURE_DOC" ]; then
|
|
61
|
-
record_fail "refs/features/verify-by-test.md missing"
|
|
62
|
-
else
|
|
63
|
-
for token in "not-reproduced" "inconclusive" "redTests" "Off by default"; do
|
|
64
|
-
if grep -qF "$token" "$FEATURE_DOC"; then
|
|
65
|
-
record_pass "feature doc covers '$token'"
|
|
66
|
-
else
|
|
67
|
-
record_fail "feature doc missing '$token'"
|
|
68
|
-
fi
|
|
69
|
-
done
|
|
70
|
-
fi
|
|
71
|
-
|
|
72
|
-
# 3. Prefs schema exposes verifyByTest knobs
|
|
73
|
-
for prop in enabled maxFindings model stepTimeoutSec; do
|
|
74
|
-
if jq -e ".properties.global.properties.verifyByTest.properties.${prop}" "$PREFS_SCHEMA" >/dev/null 2>&1; then
|
|
75
|
-
record_pass "prefs schema exposes verifyByTest.${prop}"
|
|
76
|
-
else
|
|
77
|
-
record_fail "prefs schema missing verifyByTest.${prop}"
|
|
78
|
-
fi
|
|
79
|
-
done
|
|
80
|
-
|
|
81
|
-
# 4. Off by default - preserves existing-user baseline
|
|
82
|
-
if jq -e '.properties.global.properties.verifyByTest.properties.enabled
|
|
83
|
-
| has("default") and .default == false' "$PREFS_SCHEMA" >/dev/null 2>&1; then
|
|
84
|
-
record_pass "verifyByTest.enabled defaults to false (opt-in)"
|
|
85
|
-
else
|
|
86
|
-
record_fail "verifyByTest.enabled must default to false"
|
|
87
|
-
fi
|
|
88
|
-
|
|
89
|
-
# 5. Triage schema version + verification enum
|
|
90
|
-
schema_version=$(jq -r '.version // empty' "$TRIAGE_SCHEMA")
|
|
91
|
-
if [ "$schema_version" = "3.2.0" ]; then
|
|
92
|
-
record_pass "triage-output schema version is 3.2.0"
|
|
93
|
-
else
|
|
94
|
-
record_fail "triage-output schema version should be 3.2.0 (was: ${schema_version:-missing})"
|
|
95
|
-
fi
|
|
96
|
-
if jq -e '.["$defs"].verification.properties.result.enum
|
|
97
|
-
| (index("confirmed") != null
|
|
98
|
-
and index("not-reproduced") != null
|
|
99
|
-
and index("inconclusive") != null)' "$TRIAGE_SCHEMA" >/dev/null 2>&1; then
|
|
100
|
-
record_pass "schema verification.result enum complete"
|
|
101
|
-
else
|
|
102
|
-
record_fail "schema \$defs.verification.result enum must be confirmed/not-reproduced/inconclusive"
|
|
103
|
-
fi
|
|
104
|
-
|
|
105
|
-
# 6. Behavioral validator round-trips
|
|
106
|
-
valid_fixture='{"accepted":[{"severity":"blocking","file":"Sources/Auth/Login.swift","line":42,"issue":"expired token accepted as valid","fix":"reject tokens past expiry in validateToken()","reviewer":"fable","verification":{"result":"confirmed","testRef":"AuthTests/LoginTests/testExpiredTokenRejected","evidencePath":".pipeline/verify-1.test.log"}}],"deferred":[],"rejected":[],"approved":false}'
|
|
107
|
-
if printf '%s' "$valid_fixture" | node "$VALIDATOR" - >/dev/null 2>&1; then
|
|
108
|
-
record_pass "validator accepts confirmed verification with testRef+evidencePath"
|
|
109
|
-
else
|
|
110
|
-
record_fail "validator rejected a valid confirmed verification"
|
|
111
|
-
fi
|
|
112
|
-
|
|
113
|
-
bad_result_fixture='{"accepted":[{"severity":"blocking","file":"a.swift","line":1,"issue":"some issue here","fix":"do the fix","reviewer":"fable","verification":{"result":"maybe"}}],"deferred":[],"rejected":[],"approved":false}'
|
|
114
|
-
if printf '%s' "$bad_result_fixture" | node "$VALIDATOR" - >/dev/null 2>&1; then
|
|
115
|
-
record_fail "validator must reject verification.result 'maybe'"
|
|
116
|
-
else
|
|
117
|
-
record_pass "validator rejects bad verification.result"
|
|
118
|
-
fi
|
|
119
|
-
|
|
120
|
-
missing_ref_fixture='{"accepted":[{"severity":"blocking","file":"a.swift","line":1,"issue":"some issue here","fix":"do the fix","reviewer":"fable","verification":{"result":"confirmed"}}],"deferred":[],"rejected":[],"approved":false}'
|
|
121
|
-
if printf '%s' "$missing_ref_fixture" | node "$VALIDATOR" - >/dev/null 2>&1; then
|
|
122
|
-
record_fail "validator must reject confirmed verification without testRef/evidencePath"
|
|
123
|
-
else
|
|
124
|
-
record_pass "validator rejects confirmed verification lacking testRef/evidencePath"
|
|
125
|
-
fi
|
|
126
|
-
|
|
127
|
-
# Reviewer enum parity: fable (Claude Code default) and gpt (Copilot CLI) accepted
|
|
128
|
-
fable_fixture='{"accepted":[{"severity":"important","file":"a.swift","line":1,"issue":"some issue here","fix":"do the fix","reviewer":"gpt"}],"deferred":[],"rejected":[],"approved":true}'
|
|
129
|
-
if printf '%s' "$fable_fixture" | node "$VALIDATOR" - >/dev/null 2>&1; then
|
|
130
|
-
record_pass "validator accepts schema-allowed reviewers (fable/gpt)"
|
|
131
|
-
else
|
|
132
|
-
record_fail "validator must accept reviewer values fable and gpt (schema v3.1.0 parity)"
|
|
133
|
-
fi
|
|
134
|
-
|
|
135
|
-
# 7. Phase 3 doc documents the red-test rework re-entry
|
|
136
|
-
if grep -qF "verifyByTest.redTests" "$PHASE3_DOC"; then
|
|
137
|
-
record_pass "phase-3-dev.md documents redTests rework re-entry"
|
|
138
|
-
else
|
|
139
|
-
record_fail "phase-3-dev.md must document verifyByTest.redTests re-entry"
|
|
140
|
-
fi
|
|
141
|
-
|
|
142
|
-
printf '\n══ verify-by-test smoke: %d passed, %d failed ══\n' "$pass" "$fail"
|
|
143
|
-
if [ "$fail" -gt 0 ]; then
|
|
144
|
-
printf '\nFailures:\n'
|
|
145
|
-
for msg in "${failures[@]}"; do printf ' - %s\n' "$msg"; done
|
|
146
|
-
exit 1
|
|
147
|
-
fi
|
|
148
|
-
exit 0
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# smoke-wiki-integration.sh - v5.7+ wiki channel adapter contract.
|
|
3
|
-
#
|
|
4
|
-
# Verifies:
|
|
5
|
-
# 1. prefs.schema.json declares global.wikiScope (array of enum) + reportChannels.wiki (boolean).
|
|
6
|
-
# 2. figma-project-config schema declares wiki.mode enum with 4 adapters.
|
|
7
|
-
# 3. Wiki adapter surface (channels.md + wiki-capture.md) documents:
|
|
8
|
-
# - Case A (preconditions met) scope multi-select
|
|
9
|
-
# - Case B (preconditions missing) actionable menu
|
|
10
|
-
# - taskType === "component" gate
|
|
11
|
-
# - wiki.enabled gate
|
|
12
|
-
# - 4 adapter modes (submodule / in-repo / github-wiki / separate-repo)
|
|
13
|
-
# - Writing wiki progress line
|
|
14
|
-
# 4. figma-component-wiki SKILL.md has dispatch contract + 4 adapters.
|
|
15
|
-
|
|
16
|
-
set -euo pipefail
|
|
17
|
-
|
|
18
|
-
HERE="$(cd "$(dirname "$0")" && pwd)"
|
|
19
|
-
ROOT="$(cd "$HERE/../.." && pwd)"
|
|
20
|
-
PREFS="$ROOT/pipeline/schemas/prefs.schema.json"
|
|
21
|
-
FIGMA_SCHEMA="$ROOT/pipeline/schemas/figma-project-config.schema.json"
|
|
22
|
-
CHANNELS="$ROOT/pipeline/commands/multi-agent/channels/SKILL.md"
|
|
23
|
-
WIKI_REF="$ROOT/pipeline/multi-agent-refs/wiki-capture.md"
|
|
24
|
-
PHASE7="$ROOT/pipeline/multi-agent-refs/phases/phase-7-report.md"
|
|
25
|
-
MODES="$ROOT/pipeline/multi-agent-refs/phases/modes.md"
|
|
26
|
-
# (figma-component-wiki skill now lives in the ai-ios-engineering-toolkit plugin, not this repo)
|
|
27
|
-
|
|
28
|
-
PASS=0
|
|
29
|
-
FAIL=0
|
|
30
|
-
pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
|
|
31
|
-
fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
|
|
32
|
-
|
|
33
|
-
need() { command -v "$1" >/dev/null 2>&1 || { echo "error: $1 required" >&2; exit 127; }; }
|
|
34
|
-
need jq
|
|
35
|
-
|
|
36
|
-
for f in "$PREFS" "$FIGMA_SCHEMA" "$CHANNELS" "$WIKI_REF" "$PHASE7" "$MODES"; do
|
|
37
|
-
[ -f "$f" ] || { echo "error: missing $f" >&2; exit 1; }
|
|
38
|
-
done
|
|
39
|
-
|
|
40
|
-
# Combined surface - channels.md + wiki-capture.md + phase-7-report.md + modes.md. Any may carry assertion.
|
|
41
|
-
WIKI_SURFACE="$(mktemp)"
|
|
42
|
-
trap 'rm -f "$WIKI_SURFACE"' EXIT
|
|
43
|
-
cat "$CHANNELS" "$WIKI_REF" "$PHASE7" "$MODES" > "$WIKI_SURFACE"
|
|
44
|
-
|
|
45
|
-
echo "→ 1. prefs schema declares wikiScope (array) + reportChannels.wiki (boolean)"
|
|
46
|
-
SCOPE_TYPE=$(jq -r '.properties.global.properties.wikiScope.type // "missing"' "$PREFS")
|
|
47
|
-
[ "$SCOPE_TYPE" = "array" ] && pass "wikiScope is array" || fail "wikiScope type = '$SCOPE_TYPE' (want array)"
|
|
48
|
-
SCOPE_ENUM=$(jq -c '.properties.global.properties.wikiScope.items.enum // []' "$PREFS")
|
|
49
|
-
EXPECTED_ENUM='["main","ios","screenshots","index"]'
|
|
50
|
-
[ "$SCOPE_ENUM" = "$EXPECTED_ENUM" ] && pass "wikiScope enum = [main,ios,screenshots,index]" || fail "wikiScope enum mismatch: $SCOPE_ENUM"
|
|
51
|
-
|
|
52
|
-
CHAN_WIKI_TYPE=$(jq -r '.properties.global.properties.reportChannels.properties.wiki.type // "missing"' "$PREFS")
|
|
53
|
-
[ "$CHAN_WIKI_TYPE" = "boolean" ] && pass "reportChannels.wiki is boolean" || fail "reportChannels.wiki type = '$CHAN_WIKI_TYPE'"
|
|
54
|
-
|
|
55
|
-
echo ""
|
|
56
|
-
echo "→ 2. figma-project-config schema declares wiki.mode with 4 adapters"
|
|
57
|
-
MODE_ENUM=$(jq -c '.properties.wiki.properties.mode.enum' "$FIGMA_SCHEMA")
|
|
58
|
-
EXPECTED='["submodule","in-repo","github-wiki","separate-repo"]'
|
|
59
|
-
[ "$MODE_ENUM" = "$EXPECTED" ] && pass "wiki.mode enum = 4 adapters" || fail "wiki.mode enum mismatch: $MODE_ENUM"
|
|
60
|
-
|
|
61
|
-
echo ""
|
|
62
|
-
echo "→ 3. Wiki adapter (channels.md + wiki-capture.md) has Case A + Case B"
|
|
63
|
-
if grep -Fq "Case A" "$WIKI_REF" || grep -Fq "preconditions met" "$WIKI_REF"; then
|
|
64
|
-
pass "Case A (preconditions met) documented"
|
|
65
|
-
else
|
|
66
|
-
fail "Case A not documented"
|
|
67
|
-
fi
|
|
68
|
-
if grep -Fq "Case B" "$WIKI_REF" || grep -Fq "preconditions missing" "$WIKI_REF"; then
|
|
69
|
-
pass "Case B (preconditions missing) documented"
|
|
70
|
-
else
|
|
71
|
-
fail "Case B not documented"
|
|
72
|
-
fi
|
|
73
|
-
|
|
74
|
-
echo ""
|
|
75
|
-
echo "→ 4. Wiki surface gates on taskType === component"
|
|
76
|
-
if grep -Fq 'state.taskType === "component"' "$WIKI_SURFACE" || grep -Fq 'taskType=component' "$WIKI_SURFACE"; then
|
|
77
|
-
pass "taskType gate documented"
|
|
78
|
-
else
|
|
79
|
-
fail "taskType gate missing"
|
|
80
|
-
fi
|
|
81
|
-
|
|
82
|
-
echo ""
|
|
83
|
-
echo "→ 5. Wiki surface references wiki.enabled"
|
|
84
|
-
if grep -Fq "wiki.enabled" "$WIKI_SURFACE"; then
|
|
85
|
-
pass "wiki.enabled gate documented"
|
|
86
|
-
else
|
|
87
|
-
fail "wiki.enabled gate missing"
|
|
88
|
-
fi
|
|
89
|
-
|
|
90
|
-
echo ""
|
|
91
|
-
echo "→ 6. Wiki surface lists all 4 adapter modes"
|
|
92
|
-
MODES_HIT=0
|
|
93
|
-
for mode in submodule in-repo github-wiki separate-repo; do
|
|
94
|
-
if grep -Fq "\`$mode\`" "$WIKI_SURFACE"; then
|
|
95
|
-
MODES_HIT=$((MODES_HIT+1))
|
|
96
|
-
fi
|
|
97
|
-
done
|
|
98
|
-
[ "$MODES_HIT" -eq 4 ] && pass "all 4 modes listed" || fail "wiki surface lists $MODES_HIT/4 modes"
|
|
99
|
-
|
|
100
|
-
echo ""
|
|
101
|
-
echo "→ 7. Wiki surface emits wiki progress line"
|
|
102
|
-
if grep -qE '→ writing wiki' "$WIKI_SURFACE"; then
|
|
103
|
-
pass "progress line shape documented"
|
|
104
|
-
else
|
|
105
|
-
fail "missing progress line"
|
|
106
|
-
fi
|
|
107
|
-
|
|
108
|
-
echo ""
|
|
109
|
-
echo "→ 8. Wiki surface documents autopilot always-pause behaviour"
|
|
110
|
-
if grep -qiE 'autopilot.*pause|ALWAYS pauses|Phase 7 autopilot exception' "$WIKI_SURFACE"; then
|
|
111
|
-
pass "autopilot always-pause documented"
|
|
112
|
-
else
|
|
113
|
-
fail "autopilot always-pause not documented"
|
|
114
|
-
fi
|
|
115
|
-
|
|
116
|
-
# (The figma-component-wiki SKILL.md and its dispatch-contract / 4-adapter / frontmatter
|
|
117
|
-
# assertions moved with the skill into the ai-ios-engineering-toolkit marketplace plugin;
|
|
118
|
-
# this pipeline smoke now only covers the wiki CHANNEL wiring on the pipeline side.)
|
|
119
|
-
|
|
120
|
-
echo ""
|
|
121
|
-
echo "══ wiki-integration smoke: $PASS passed, $FAIL failed ══"
|
|
122
|
-
[ "$FAIL" -eq 0 ]
|