@ccoalm/ccl-skills 0.1.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/LICENSE +201 -0
- package/README.md +49 -0
- package/dist/assets/marketplace/.agents/plugins/marketplace.json +12 -0
- package/dist/assets/marketplace/.claude-plugin/marketplace.json +13 -0
- package/dist/assets/marketplace/marketplace-manifest.json +12 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.claude-plugin/marketplace.json +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.claude-plugin/plugin.json +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.codex-plugin/plugin.json +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.worktree-only +3 -0
- package/dist/assets/marketplace/plugins/ccl-skills/agent-context/session-start.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/agent-context/subagent-start.md +12 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/AGENTS.md +19 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-delegation-owner.sh +125 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-edit-isolation.sh +102 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-merge-authorization.sh +1156 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/hooks.json +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/merge-authorization-prompt.sh +142 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/owner-dispatch-guard.sh +12 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/owner-dispatch-stop.sh +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/remind-post-merge-cleanup.sh +144 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/session-context.sh +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/session-start.sh +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/skill-extraction-gate-stop.sh +69 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/subagent-start.sh +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_delegation_owner.sh +329 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_edit_isolation.sh +322 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_merge_authorization.sh +902 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_merge_authorization_prompt.sh +178 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_remind_post_merge_cleanup.sh +121 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_session_start.sh +170 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/AGENTS.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/ccl-skills.ts +564 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-install-skills.md +14 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-update-skills.md +44 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-verify-skills.md +109 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-worktree-check.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/AGENTS.md +28 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/README.md +276 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/owner-dispatch.example.json +10 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/owner-dispatch.sh +1307 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/test.sh +941 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/agents-file-coverage-gate/SKILL.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/agents-file-coverage-gate/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/SKILL.md +188 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/android-dev.md +92 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/flutter-dev.md +80 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/ios-dev.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/kotlin-multiplatform.md +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-platform-boundaries.md +77 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-quality-release.md +77 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/source-evidence-map.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/SKILL.md +353 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/client-routing.md +419 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/manual-invocation-and-prompts.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md +197 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/timeout-auth-and-capabilities.md +179 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/AGENTS.md +98 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/classify_envelope.py +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/classify_timeout_exit.sh +15 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/claude_review.sh +1438 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/codex_review.sh +324 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/concern_excerpt.py +295 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/egress_schema.py +214 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/init_policy_matrix.py +642 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_packet_mcp.py +181 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_review.sh +1165 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/opencode_review.sh +1190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_cli_review.py +946 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_opencode_review.py +474 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_probe_result.py +1899 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_review_json.py +200 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py +2845 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.sh +6 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/run_claude_capture.py +71 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/runtime-surface-verification-design.md +53 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_classify_envelope.sh +68 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_claude_review_probe.sh +2311 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_cli_review_wrappers.sh +1832 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_code_review_identity.sh +73 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_concern_excerpt.sh +245 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_egress_schema.sh +177 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_init_policy_matrix.sh +272 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_kimi_packet_mcp.py +195 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_opencode_review_concurrency.sh +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_opencode_review_retry.sh +1005 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_opencode_review.sh +258 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_probe_result.sh +574 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_review_json.sh +349 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_compat.py +434 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_order.sh +264 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +2412 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/verify_native_skill_binding.py +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/SKILL.md +153 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/references/diagnosis-playbook.md +54 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/references/prevention-routing.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/SKILL.md +69 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/references/security-review-gate.md +41 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/SKILL.md +165 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/api-security-boundaries.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/architecture-playbook.md +160 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/artifact-generation-architecture.md +37 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/audit-history-architecture.md +29 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/bulk-workflow-architecture.md +33 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/config-rule-routing-architecture.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/cross-cutting-concerns.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/data-modeling-and-migrations.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/data-platform-architecture.md +210 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/dependency-platform.md +105 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/developer-tooling-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/error-contract-architecture.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/event-driven-architecture.md +260 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/http-gateway-architecture.md +74 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/mq-consumer-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/multi-tenant-isolation.md +275 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/notification-architecture.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/ops-checklist.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/performance-capacity-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/protobuf-contract-architecture.md +119 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/redis-cache-coordination.md +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/release-runtime-readiness.md +65 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/replay-comparison-architecture.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/runtime-observability.md +94 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/service-scaffold.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/source-evidence-map.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/workflow-state-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/SKILL.md +159 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/artifact-generation-patterns.md +37 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/audit-history-patterns.md +28 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/bulk-import-export-patterns.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/config-rule-routing-patterns.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/data-access-patterns.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/db-schema-and-dal-patterns.md +109 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/dependency-client-patterns.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/developer-tooling-patterns.md +70 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/domain-feature-patterns.md +78 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/engineering-patterns.md +119 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/error-contract-patterns.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/feature-playbook.md +61 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/http-gateway-client-patterns.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/mq-consumer-patterns.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/notification-patterns.md +42 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/observability-implementation-patterns.md +101 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/performance-capacity-patterns.md +44 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/protobuf-contract-patterns.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/public-api-integration-patterns.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/quality-and-testing-patterns.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/redis-cache-lock-patterns.md +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/release-ops-patterns.md +112 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/reliability-patterns.md +83 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/replay-comparison-patterns.md +32 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/scaffold-and-codegen.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/source-evidence-map.md +54 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/state-machine-task-patterns.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/grill-me/SKILL.md +80 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/grill-me/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/SKILL.md +117 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-approval-auto-reviewer.md +106 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-command-sandbox.md +441 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-context-freshness.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-credentials-auth.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-extensions-skills.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-file-edit-protocol.md +129 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-ide-integration.md +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-input-ingestion.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-instruction-composition.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-lifecycle-hooks.md +92 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-messaging.md +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-runtime-bootstrap.md +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-session-persistence.md +448 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-task-orchestration.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-tool-dispatch.md +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-turn-lifecycle.md +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/inference-capacity-operations.md +162 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/llm-client-gateway.md +156 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/model-prompt-evaluation.md +146 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/retrieval-agent-safety.md +273 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/SKILL.md +202 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/contracts-and-state.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/cross-stack-alignment.md +94 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/framework-choice.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/online-practice-uptake.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/platform-capabilities.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/product-page-checklist.md +40 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/qa-release.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/source-evidence-map.md +82 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/SKILL.md +103 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/agents/openai.yaml +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/references/multi-agent-delegation-playbook.md +100 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/SKILL.md +70 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/public-data-acquisition.md +549 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/public-disclosure-channels.md +97 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/research-prompts.md +66 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/scripts/AGENTS.md +32 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/scripts/test-public-data-acquisition-recipes.sh +379 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/SKILL.md +244 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/alerting-and-on-call.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/framework-middleware-checklist.md +142 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/infra-component-deployment.md +268 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/log-correlation-recipe.md +124 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/log-schema-canonical.md +208 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/metrics-conventions.md +105 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/obs-stack-architecture.md +107 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/sli-slo-design.md +95 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/source-register.md +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/SKILL.md +303 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/canary-and-rollout-strategy.md +163 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/config-center-via-etcd.md +245 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/custom-control-plane-boundary.md +298 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/deploy-cli-concrete-recipe.md +312 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/deploy-pipeline.md +165 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/env-and-lane-matrix.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/lane-orchestration-control-plane.md +383 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/multi-region-and-cluster.md +135 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/promotion-gate-and-review.md +149 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/python-package-registry-release.md +462 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/rollback-playbook.md +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/secret-and-config-management.md +231 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/version-authority-and-deprecation.md +21 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/SKILL.md +276 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/dual-sidecar-and-traffic-config-center.md +127 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/framework-middleware.md +143 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/grpc-authority-workaround.md +90 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/http-response-envelope-contract.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/mesh-architecture.md +127 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/multi-env-routing.md +192 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/protobuf-http-contract-signals.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/retry-timeout-circuit-breaker.md +124 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/rpc-framework-recipe.md +494 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-choice.md +113 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-migration-playbook.md +231 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-recipe.md +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +235 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/adr-convention.md +146 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-checklist.md +30 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-evaluation-report-template.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-execution-spec.md +108 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-sop.md +457 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-templates.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/artifact-egress-confidentiality.md +58 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/code-review-checklist.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/cross-repo-coordination.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/delivery-lifecycle.md +192 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-review-gate-mechanics.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-routing-and-readiness.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/diagnostic-spec-match-gate.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/dispatch-owner-skills.md +35 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/dormant-code-activation.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/existing-project-assessment-report.md +223 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/external-skill-augmentation.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/feature-deprecation-cascade.md +15 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/high-risk-resilience-gates.md +73 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/implementation-completeness-and-minimality.md +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/implementation-entry-reentry-gate.md +122 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/modular-monolith-heuristic.md +105 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/pre-final-continuation-gate.md +115 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/problem-resolution-and-learning.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/quality-attributes.md +112 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/quality-remediation-program.md +88 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/rd-standards-doc-family-checklist.md +27 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/refactoring-discipline.md +52 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/review-reception.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/shared-gate-artifact-classification.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/source-evidence-map.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/status-tracker-sync.md +77 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/sync-spec-repo-contract.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/verify-developer-experience.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/worktree-mechanics.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/scripts/AGENTS.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh +213 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/SKILL.md +136 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/agents/openai.yaml +9 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/analytics-visualization-interactions.md +206 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/behavioral-aesthetic-logic.md +108 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/complex-creation-interactions.md +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-execution-checklist.md +214 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-impl-naming-and-versioning.md +53 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-intake-and-acceptance.md +129 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-system-source-of-truth.md +97 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/external-ui-ux-quality-benchmarks.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/frontend-code-evidence-map.md +63 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/interaction-design-patterns.md +146 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/layout-recipes-and-screenshot-acceptance.md +250 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-project-token-consistency.md +237 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-stack-strategy.md +65 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/operational-processing-workflows.md +237 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-mobile-patterns.md +324 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-web-desktop-patterns.md +456 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-lifecycle-acceptance-and-iteration.md +114 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-surface-patterns.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/resource-management-interactions.md +113 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/scenario-community-patterns.md +133 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/source-map.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/tokens-and-components.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/trust-sensitive-ai-and-data-patterns.md +96 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-audit.md +106 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-design-development.md +176 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/visual-craft.md +111 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/SKILL.md +157 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/ai-service-integration-boundaries.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/api-contract-and-schema.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/api-security-boundaries.md +39 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/architecture-playbook.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/async-execution-model.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/background-jobs-and-scheduling.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/batch-and-pipeline-architecture.md +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/config-secrets-runtime.md +22 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/data-modeling-and-migrations.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/data-platform-architecture.md +211 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/event-driven-architecture.md +263 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/multi-tenant-isolation.md +281 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/observability-and-ops.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/packaging-runtime-readiness.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/redis-cache-coordination.md +41 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/reliability-and-error-contract.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/source-evidence-map.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/web-framework-boundaries.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/SKILL.md +143 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/ai-service-wiring-patterns.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/async-and-worker-patterns.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/background-job-patterns.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/batch-and-artifact-patterns.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/dependency-client-patterns.md +39 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/error-handling-patterns.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/feature-playbook.md +43 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/observability-implementation-patterns.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/project-structure-and-tooling.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/public-api-security-patterns.md +52 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/redis-cache-lock-patterns.md +78 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/schema-and-validation-patterns.md +23 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/source-evidence-map.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/sqlalchemy-and-migrations-patterns.md +99 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/testing-and-quality-patterns.md +61 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/web-framework-patterns.md +35 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/SKILL.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/config-runtime-readback.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/mr-merge-authorization.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/post-release-env-reset.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/release-closeout-evidence.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/release-scope-confirmation.md +21 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/tag-and-prod-pipeline-gate.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/test-scope-prompt.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/watcher-discipline.md +14 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/SKILL.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/comment-safe-release-doc.md +19 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/release-evidence-workflow.md +23 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/release-testing-scope-section.md +15 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-baseline/SKILL.md +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-baseline/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/SKILL.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/prd-composition-contract.md +35 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/requirement-closure-contract.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/security-four-questions.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-intent/SKILL.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-intent/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-scope/SKILL.md +88 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-scope/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +337 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/analysis-parse-fix-test-challenge-replay.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/attribution-verification.md +69 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/bootstrap-slim-c3-obligation-table.md +112 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/coverage-exhaustion-traps.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/description-authoring.md +162 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +507 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/eval-routing.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/evidence-card-template.md +51 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/example-domain-preselect.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/external-practice-controls.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-lifecycle-handoff.md +65 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/firing-point-placement.md +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/harness-patterns-and-eval.md +286 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/incident-postmortem-extraction.md +190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/l0-l1-l2-routing.md +114 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/online-skill-review.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/parallel-stack-references-pattern.md +164 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/r0-leakage-audit.md +90 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/recurring-anti-patterns-checklist.md +320 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/resume-paused-delivery.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-feedback-mining.md +33 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-finding-standards.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-rubric.md +40 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/rule-consolidation.md +118 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/skill-listing-budget.md +19 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +254 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +658 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/two-source-extraction-pattern.md +167 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-judgment-extraction.md +179 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-routing-map.md +51 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md +180 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/AGENTS.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +1452 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-evidence-card-leak.sh +491 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-mr-target-freshness.sh +173 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-size-budget.sh +488 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-sync-pointers.sh +419 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-golden-trace.rb +197 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-health.rb +327 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing-bank.rb +401 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing.rb +248 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/generic-r0-leak-scan.sh +282 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/governing-chain-diff.py +321 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +964 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/register-firing-path-resolution.rb +708 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/skill-behavior-eval.py +540 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/source-register-lifecycle.rb +51 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/source-register-pending-status.rb +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_ai_coding_implementation_gates.sh +829 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh +1203 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_r0_status.sh +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_register_pending_exclusion.sh +137 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +173 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_route_drift.sh +377 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_size_budget.sh +833 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_skill_catalog.sh +491 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_source_register_lifecycle.sh +114 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_mr_target_freshness.sh +261 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_sync_pointers.sh +538 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_controlled_escalation_pins.sh +154 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_grader_diagnostics.sh +190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_surface_binding.sh +178 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_prose_target.sh +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_generic_r0_leak_scan.sh +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_git_identity_predicate_gate.sh +243 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_governing_chain_diff.sh +419 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_dateless_host.sh +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_resolution.sh +724 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_wiring.sh +414 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_regression_runner_registration.sh +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_bank_integrity.sh +205 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_pointer_integrity.sh +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_credential_cwd.sh +61 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_cross_refs.sh +111 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_root_depth.sh +53 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate-skill.sh +257 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/SKILL.md +98 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/input-state-machines.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/streaming-rich-output.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/terminal-side-channels.md +96 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/SKILL.md +408 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/AGENTS.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/bitable-setup.md +573 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/README.md +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/github-actions.yml +119 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/gitlab-ci.yml +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/jenkins.Jenkinsfile +106 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/classical-test-design-techniques.md +279 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/gen_report.py +2807 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/makefile-template.md +200 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/report-config-schema.md +272 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/run_pytestless.py +475 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/source-to-case-workflows.md +258 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc-marker-conventions.md +316 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc-review-and-prioritization.md +145 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/AGENTS.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.dart +129 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.go +197 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.py +135 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.ts +285 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/test_gen_report.py +2144 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/update-lifecycle.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md +212 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/ci-fixtures-and-flake-control.md +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/client-runtime-test-matrices.md +50 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/data-and-workflow-testing.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/design-closed-contract-oracles.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/e2e-real-flow-testing.md +71 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/fitness-functions.md +240 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/integration-contract-testing.md +235 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/non-functional-specialized-scenarios.md +296 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/rd-testing-standard-template.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/run-killing-mutation-walk.md +43 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/scenario-testing.md +136 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/source-evidence-map.md +59 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/structured-tc-input-translation.md +67 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-code-authoring-patterns.md +392 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-data-and-determinism.md +39 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-topology-and-commands.md +92 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/unit-testing.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/vendored-contract-drift-checklist.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/verify-enforcement-mechanisms.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/AGENTS.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/client-terminal-ansi-check.py +140 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/client-terminal-ansi-check.test.sh +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-ast-check.py +170 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-ast-check.test.sh +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-go-check.go +198 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-go-check.test.sh +109 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/test_mutation_backup_recipe.sh +237 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/SKILL.md +184 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/comment-safe-feishu.md +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/cross-model-co-review.md +3 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/delivery-face-closeout.md +60 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/doc-charter-first.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/session-vantage-leakage.md +58 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/SKILL.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/complex-workspace-patterns.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/embedded-h5-in-host.md +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/react-architecture.md +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/source-evidence-map.md +60 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-quality-release.md +190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-ui-quality.md +83 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/SKILL.md +179 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/references/shared-branch-rebase.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/AGENTS.md +23 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/test_worktree_status.sh +207 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/test_worktree_sweep.sh +481 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/worktree-status.sh +325 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/worktree-sweep.sh +245 -0
- package/dist/assets/release.json +2797 -0
- package/dist/claude-adapter.d.ts +9 -0
- package/dist/claude-adapter.js +240 -0
- package/dist/cli-worker.d.ts +1 -0
- package/dist/cli-worker.js +32 -0
- package/dist/cli.d.ts +22 -0
- package/dist/cli.js +214 -0
- package/dist/codex-host.d.ts +30 -0
- package/dist/codex-host.js +162 -0
- package/dist/fs-safe.d.ts +21 -0
- package/dist/fs-safe.js +241 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/manifest.d.ts +8 -0
- package/dist/manifest.js +135 -0
- package/dist/opencode-adapter.d.ts +10 -0
- package/dist/opencode-adapter.js +416 -0
- package/dist/operations.d.ts +3 -0
- package/dist/operations.js +956 -0
- package/dist/paths.d.ts +20 -0
- package/dist/paths.js +4 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.js +1 -0
- package/dist/unified.d.ts +4 -0
- package/dist/unified.js +64 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +5 -0
- package/package.json +35 -0
|
@@ -0,0 +1,1005 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Wrapper-level tests for opencode_review.sh's bounded format-repair retry,
|
|
3
|
+
# using a deterministic stub `opencode` binary. No live opencode needed.
|
|
4
|
+
#
|
|
5
|
+
# Covers:
|
|
6
|
+
# - the wrapper performs structural debug-agent validation without a second
|
|
7
|
+
# model invocation
|
|
8
|
+
# - first reply unparseable prose -> ONE strict retry -> conforming reply passes
|
|
9
|
+
# - retry also unparseable -> inconclusive/unparseable_findings, exactly 2 runs
|
|
10
|
+
# - conforming first reply -> no retry (1 run)
|
|
11
|
+
# - an exposed forbidden tool stops before inference
|
|
12
|
+
# - eligibility gate: a first reply carrying findings-like content (severity
|
|
13
|
+
# token, dotted path, root-file, or dot-prefixed locator) is NEVER retried
|
|
14
|
+
# and stays inconclusive/unparseable_findings (laundering is structurally
|
|
15
|
+
# impossible: nothing findings-like is ever replaced)
|
|
16
|
+
# - findings produced by the retry are surfaced (status findings, exit 0)
|
|
17
|
+
# - export failure (empty export args) still yields a structured verdict
|
|
18
|
+
# - retry timeout still yields a structured inconclusive verdict
|
|
19
|
+
set -uo pipefail
|
|
20
|
+
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
|
|
21
|
+
WRAPPER="$DIR/opencode_review.sh"
|
|
22
|
+
WORK="$(mktemp -d "${TMPDIR:-/tmp}/oc-retry-test.XXXXXX")"
|
|
23
|
+
trap 'rm -rf "$WORK"' EXIT
|
|
24
|
+
fails=0
|
|
25
|
+
|
|
26
|
+
command -v jq >/dev/null 2>&1 || { echo "FAIL - jq is required for opencode_review.sh and its tests"; exit 1; }
|
|
27
|
+
REAL_PYTHON_BIN="$(command -v python3)"
|
|
28
|
+
export REAL_PYTHON_BIN
|
|
29
|
+
REAL_TIMEOUT_BIN="$(command -v timeout)"
|
|
30
|
+
export REAL_TIMEOUT_BIN
|
|
31
|
+
|
|
32
|
+
mkdir -p "$WORK/bin" "$WORK/state" "$WORK/tmp" "$WORK/source-data/opencode"
|
|
33
|
+
printf '%s\n' '{"deepseek":{"type":"api","key":"test-only"}}' >"$WORK/source-data/opencode/auth.json"
|
|
34
|
+
|
|
35
|
+
cat >"$WORK/bin/timeout" <<'STUB'
|
|
36
|
+
#!/usr/bin/env bash
|
|
37
|
+
printf '%s\n' "$*" >>"$STUB_STATE_DIR/timeout_args"
|
|
38
|
+
exec "$REAL_TIMEOUT_BIN" "$@"
|
|
39
|
+
STUB
|
|
40
|
+
chmod +x "$WORK/bin/timeout"
|
|
41
|
+
|
|
42
|
+
cat >"$WORK/bin/opencode" <<'STUB'
|
|
43
|
+
#!/usr/bin/env bash
|
|
44
|
+
# Deterministic opencode stub. Behavior is driven by $STUB_STATE_DIR:
|
|
45
|
+
# review_mode: pass_first | pass_on_retry | never_pass | tool_exposed |
|
|
46
|
+
# completed_session_timeout | completed_malformed_timeout |
|
|
47
|
+
# idless_export_timeout | invalid_export_timeout |
|
|
48
|
+
# native_stream_timeout | native_large_log_timeout |
|
|
49
|
+
# native_slow_copy_timeout | legacy_stream_timeout |
|
|
50
|
+
# pre_stream_timeout | provider_balance_exhausted |
|
|
51
|
+
# provider_balance_then_server_error | provider_auth_then_server_error
|
|
52
|
+
set -u
|
|
53
|
+
STATE="$STUB_STATE_DIR"
|
|
54
|
+
MODE="$(cat "$STATE/review_mode")"
|
|
55
|
+
[ -z "${OPENCODE_PURE:-}" ] || touch "$STATE/pure_mode_forced"
|
|
56
|
+
if [ "$1" = "debug" ] && [ "${2:-}" = "agent" ]; then
|
|
57
|
+
"$REAL_PYTHON_BIN" -c 'import time; print(time.monotonic_ns())' \
|
|
58
|
+
>>"$STATE/boundary_started_ns"
|
|
59
|
+
sleep "${STUB_BOUNDARY_DELAY_S:-0}"
|
|
60
|
+
grep -q '^model:' .opencode/agent/ccl-review.md 2>/dev/null && touch "$STATE/agent_model_override"
|
|
61
|
+
grep -q '^ "\*": deny$' .opencode/agent/ccl-review.md 2>/dev/null \
|
|
62
|
+
&& touch "$STATE/packet_only_permissions"
|
|
63
|
+
grep -q '^ "testing-strategy": allow$' .opencode/agent/ccl-review.md 2>/dev/null \
|
|
64
|
+
&& touch "$STATE/selected_skill_only"
|
|
65
|
+
model_full="$(cat "$STATE/resolved_model" 2>/dev/null || printf '%s' deepseek/deepseek-chat)"
|
|
66
|
+
provider="${model_full%%/*}"
|
|
67
|
+
model="${model_full#*/}"
|
|
68
|
+
bash_enabled=false
|
|
69
|
+
skill_enabled=false
|
|
70
|
+
[ "$MODE" = "tool_exposed" ] && bash_enabled=true
|
|
71
|
+
[ -e "$STATE/selected_skill_only" ] && skill_enabled=true
|
|
72
|
+
printf '{"name":"ccl-review","mode":"primary","model":{"providerID":"%s","modelID":"%s"},"tools":{"invalid":true,"question":false,"bash":%s,"read":false,"glob":false,"grep":false,"edit":false,"write":false,"task":false,"webfetch":false,"todowrite":false,"skill":%s,"ccl_context":false}}\n' \
|
|
73
|
+
"$provider" "$model" "$bash_enabled" "$skill_enabled"
|
|
74
|
+
exit 0
|
|
75
|
+
fi
|
|
76
|
+
if [ "$1" = "run" ]; then
|
|
77
|
+
"$REAL_PYTHON_BIN" -c 'import time; print(time.monotonic_ns())' \
|
|
78
|
+
>>"$STATE/run_started_ns"
|
|
79
|
+
review_dir=""
|
|
80
|
+
prompt_file=""
|
|
81
|
+
previous=""
|
|
82
|
+
after_separator=no
|
|
83
|
+
for arg in "$@"; do
|
|
84
|
+
[ "$arg" = "--model" ] && touch "$STATE/cli_model_override"
|
|
85
|
+
[ "$previous" = "--dir" ] && review_dir="$arg"
|
|
86
|
+
[ "$previous" = "--file" ] && prompt_file="$arg"
|
|
87
|
+
if [ "$after_separator" = consumed ]; then
|
|
88
|
+
touch "$STATE/extra_positional_prompt"
|
|
89
|
+
elif [ "$after_separator" = yes ]; then
|
|
90
|
+
printf '%s' "$arg" >"$STATE/positional_prompt"
|
|
91
|
+
after_separator=consumed
|
|
92
|
+
elif [ "$arg" = "--" ]; then
|
|
93
|
+
after_separator=yes
|
|
94
|
+
touch "$STATE/option_separator"
|
|
95
|
+
fi
|
|
96
|
+
previous="$arg"
|
|
97
|
+
done
|
|
98
|
+
if [ -n "$prompt_file" ]; then
|
|
99
|
+
prompt="$(cat "$prompt_file")"
|
|
100
|
+
touch "$STATE/prompt_file_transport"
|
|
101
|
+
else
|
|
102
|
+
# Compatibility branch for detecting an accidental return to argv transport.
|
|
103
|
+
for prompt in "$@"; do :; done
|
|
104
|
+
fi
|
|
105
|
+
[ ! -f "$review_dir/opencode.json" ] || cp "$review_dir/opencode.json" "$STATE/native-opencode.json"
|
|
106
|
+
if compgen -G "$review_dir/agent-boundary.*" >/dev/null \
|
|
107
|
+
|| compgen -G "$review_dir/review-events.*" >/dev/null \
|
|
108
|
+
|| compgen -G "$review_dir/review-export.*" >/dev/null; then
|
|
109
|
+
touch "$STATE/audit_files_visible"
|
|
110
|
+
fi
|
|
111
|
+
n=$(( $(cat "$STATE/review_runs" 2>/dev/null || echo 0) + 1 ))
|
|
112
|
+
printf '%s' "$n" >"$STATE/review_runs"
|
|
113
|
+
printf '%s\n' "$prompt" >"$STATE/review_prompt_$n"
|
|
114
|
+
if [ "$MODE" = "interrupt_wait" ]; then
|
|
115
|
+
touch "$STATE/interrupt_waiting"
|
|
116
|
+
sleep 3
|
|
117
|
+
fi
|
|
118
|
+
if [ "$MODE" = "signal_exit" ]; then
|
|
119
|
+
exit 143
|
|
120
|
+
fi
|
|
121
|
+
if [ "$MODE" = "provider_balance_exhausted" ]; then
|
|
122
|
+
printf '%s\n' '{"type":"error","sessionID":"sid-review-billing","error":{"name":"APIError","data":{"message":"Insufficient Balance","statusCode":402,"isRetryable":false}}}'
|
|
123
|
+
exit 1
|
|
124
|
+
fi
|
|
125
|
+
if [ "$MODE" = "provider_balance_then_server_error" ]; then
|
|
126
|
+
printf '%s\n' \
|
|
127
|
+
'{"type":"error","sessionID":"sid-review-billing","error":{"name":"APIError","data":{"message":"Insufficient Balance","statusCode":402,"isRetryable":false}}}' \
|
|
128
|
+
'{"type":"error","sessionID":"sid-review-billing","error":{"name":"APIError","data":{"message":"upstream failed","statusCode":500,"isRetryable":true}}}'
|
|
129
|
+
exit 1
|
|
130
|
+
fi
|
|
131
|
+
if [ "$MODE" = "provider_auth_then_server_error" ]; then
|
|
132
|
+
printf '%s\n' \
|
|
133
|
+
'{"type":"error","sessionID":"sid-review-auth","error":{"name":"APIError","data":{"message":"Unauthorized","statusCode":401,"isRetryable":false}}}' \
|
|
134
|
+
'{"type":"error","sessionID":"sid-review-auth","error":{"name":"APIError","data":{"message":"upstream failed","statusCode":500,"isRetryable":true}}}'
|
|
135
|
+
exit 1
|
|
136
|
+
fi
|
|
137
|
+
if [ "$MODE" = "retry_timeout" ] && [ "$n" -ge 2 ]; then
|
|
138
|
+
sleep 8
|
|
139
|
+
fi
|
|
140
|
+
if [ "$MODE" = "pre_stream_timeout" ]; then
|
|
141
|
+
sleep 8
|
|
142
|
+
fi
|
|
143
|
+
if [ "$MODE" = "invalid_stream_timeout" ]; then
|
|
144
|
+
printf '%s\n' 'partial non-json transport output'
|
|
145
|
+
sleep 8
|
|
146
|
+
fi
|
|
147
|
+
if [ "$MODE" = "session_only_timeout" ]; then
|
|
148
|
+
printf '%s\n' "{\"type\":\"session_created\",\"sessionID\":\"sid-review-$n\"}"
|
|
149
|
+
sleep 8
|
|
150
|
+
fi
|
|
151
|
+
if [ "$MODE" = "completed_session_timeout" ] \
|
|
152
|
+
|| [ "$MODE" = "completed_malformed_timeout" ] \
|
|
153
|
+
|| [ "$MODE" = "idless_export_timeout" ] \
|
|
154
|
+
|| [ "$MODE" = "invalid_export_timeout" ]; then
|
|
155
|
+
printf '%s\n' "{\"type\":\"step_start\",\"sessionID\":\"sid-review-$n\",\"part\":{\"type\":\"step-start\"}}"
|
|
156
|
+
printf '%s\n' "{\"type\":\"step_finish\",\"sessionID\":\"sid-review-$n\",\"part\":{\"type\":\"step-finish\",\"reason\":\"stop\"}}"
|
|
157
|
+
sleep 8
|
|
158
|
+
fi
|
|
159
|
+
if [ "$MODE" = "legacy_stream_timeout" ]; then
|
|
160
|
+
printf '%s\n' "{\"type\":\"step_start\",\"sessionID\":\"sid-review-$n\",\"part\":{\"type\":\"step-start\"}}"
|
|
161
|
+
sleep 8
|
|
162
|
+
fi
|
|
163
|
+
if [ "$MODE" = "native_stream_timeout" ]; then
|
|
164
|
+
mkdir -p "$XDG_DATA_HOME/opencode/log"
|
|
165
|
+
printf '%s\n' 'native owner skill loaded; second model stream pending' \
|
|
166
|
+
>"$XDG_DATA_HOME/opencode/log/reviewer.log"
|
|
167
|
+
printf '%s\n' "{\"type\":\"step_start\",\"sessionID\":\"sid-review-$n\",\"part\":{\"type\":\"step-start\"}}"
|
|
168
|
+
sleep 8
|
|
169
|
+
fi
|
|
170
|
+
if [ "$MODE" = "native_large_log_timeout" ]; then
|
|
171
|
+
mkdir -p "$XDG_DATA_HOME/opencode/log"
|
|
172
|
+
head -c 6000000 /dev/zero >"$XDG_DATA_HOME/opencode/log/oversized.log"
|
|
173
|
+
printf '%s\n' "{\"type\":\"step_start\",\"sessionID\":\"sid-review-$n\",\"part\":{\"type\":\"step-start\"}}"
|
|
174
|
+
sleep 8
|
|
175
|
+
fi
|
|
176
|
+
if [ "$MODE" = "native_slow_copy_timeout" ]; then
|
|
177
|
+
mkdir -p "$XDG_DATA_HOME/opencode/log"
|
|
178
|
+
printf '%s\n' 'copy interrupted sentinel' \
|
|
179
|
+
>"$XDG_DATA_HOME/opencode/log/slow-copy.log"
|
|
180
|
+
printf '%s\n' "{\"type\":\"step_start\",\"sessionID\":\"sid-review-$n\",\"part\":{\"type\":\"step-start\"}}"
|
|
181
|
+
sleep 8
|
|
182
|
+
fi
|
|
183
|
+
if [ "$MODE" = "auth_refresh" ]; then
|
|
184
|
+
printf '%s\n' '{"openai":{"type":"oauth","refresh":"rotated","access":"fresh","expires":9999999999999}}' \
|
|
185
|
+
>"$XDG_DATA_HOME/opencode/auth.json"
|
|
186
|
+
fi
|
|
187
|
+
if [ "$MODE" = "no_session" ]; then
|
|
188
|
+
printf '%s\n' '{"type":"step_start","part":{"type":"step-start"}}'
|
|
189
|
+
else
|
|
190
|
+
printf '%s\n' "{\"type\":\"step_start\",\"sessionID\":\"sid-review-$n\",\"part\":{\"type\":\"step-start\"}}"
|
|
191
|
+
fi
|
|
192
|
+
exit 0
|
|
193
|
+
fi
|
|
194
|
+
if [ "$1" = "export" ]; then
|
|
195
|
+
sid="$2"
|
|
196
|
+
MODE="$(cat "$STATE/review_mode")"
|
|
197
|
+
[ "$MODE" = "export_fail" ] && exit 1
|
|
198
|
+
[ "$MODE" = "export_timeout" ] && sleep 8
|
|
199
|
+
if [ "$MODE" = "invalid_export_timeout" ]; then
|
|
200
|
+
printf '%s\n' 'not-json'
|
|
201
|
+
exit 0
|
|
202
|
+
fi
|
|
203
|
+
n="${sid#sid-review-}"
|
|
204
|
+
MODEL_INFO='"info":{"role":"assistant","modelID":"deepseek-chat","providerID":"deepseek"}'
|
|
205
|
+
[ "$MODE" = "missing_attribution" ] && MODEL_INFO='"info":{"role":"assistant"}'
|
|
206
|
+
conforming='{"type":"text","text":"CHECK correctness | Independently checked correctness against the frozen candidate.\nNO_BLOCKING_FINDINGS"}'
|
|
207
|
+
empty_text='{"type":"text","text":""}'
|
|
208
|
+
prose='{"type":"text","text":"No issues found."}'
|
|
209
|
+
prose_with_finding='{"type":"text","text":"I am worried this could be a serious problem around auth handling, roughly a P1: the null check near handlers/auth.code line 3 seems missing."}'
|
|
210
|
+
finding_line='{"type":"text","text":"P1 handlers/auth.code:3 missing null check | add a guard before dereference"}'
|
|
211
|
+
prose_with_high='{"type":"text","text":"The auth handling worries me and the exposure feels HIGH but I cannot phrase it in your format."}'
|
|
212
|
+
prose_with_rootfile='{"type":"text","text":"I am uneasy about the build wiring change around Makefile:12 but cannot articulate it formally."}'
|
|
213
|
+
prose_with_dotfile='{"type":"text","text":"Something in the pipeline change at .github/workflows/ci.yml:12 seems off but I cannot phrase it formally."}'
|
|
214
|
+
prose_concern_only='{"type":"text","text":"This can silently discard the original reviewer concern and approve a broken change."}'
|
|
215
|
+
prose_mixed='{"type":"text","text":"Overall this looks good, but it can silently discard the original reviewer concern."}'
|
|
216
|
+
# A clean no-findings assertion padded with punctuation: the retry gate's
|
|
217
|
+
# whole-reply anchor allows unlimited surrounding [[:space:][:punct:]], so a
|
|
218
|
+
# reply of any size passes the gate and lands in the retry verdict.
|
|
219
|
+
prose_padded="{\"type\":\"text\",\"text\":\"No issues found.$(awk 'BEGIN { for (i = 0; i < 2000; i++) printf "." }')\"}"
|
|
220
|
+
# Long malformed prose carrying a locator: findings-like, so it is never
|
|
221
|
+
# retried and lands on the terminal concern-evidence path with its full text.
|
|
222
|
+
prose_long_concern="{\"type\":\"text\",\"text\":\"I cannot phrase this formally but handlers/auth.code:3 looks wrong. ZZPROSESENTINELZZ $(awk 'BEGIN { for (i = 0; i < 400; i++) printf "padding word " }')\"}"
|
|
223
|
+
MODE="$(cat "$STATE/review_mode")"
|
|
224
|
+
body="$prose"
|
|
225
|
+
case "$MODE" in
|
|
226
|
+
pass_first) body="$conforming";;
|
|
227
|
+
completed_session_timeout) body="$conforming";;
|
|
228
|
+
completed_malformed_timeout) body="$prose_with_finding";;
|
|
229
|
+
auth_refresh) body="$conforming";;
|
|
230
|
+
missing_attribution) body="$conforming";;
|
|
231
|
+
missing_final) body="$empty_text";;
|
|
232
|
+
unfinished_concern) body="$finding_line";;
|
|
233
|
+
pass_on_retry|retry_timeout|export_fail) [ "$n" -ge 2 ] && body="$conforming";;
|
|
234
|
+
never_pass) body="$prose";;
|
|
235
|
+
launder) if [ "$n" -ge 2 ]; then body="$conforming"; else body="$prose_with_finding"; fi;;
|
|
236
|
+
launder_high) if [ "$n" -ge 2 ]; then body="$conforming"; else body="$prose_with_high"; fi;;
|
|
237
|
+
launder_rootfile) if [ "$n" -ge 2 ]; then body="$conforming"; else body="$prose_with_rootfile"; fi;;
|
|
238
|
+
launder_dotfile) if [ "$n" -ge 2 ]; then body="$conforming"; else body="$prose_with_dotfile"; fi;;
|
|
239
|
+
launder_semantic) if [ "$n" -ge 2 ]; then body="$conforming"; else body="$prose_concern_only"; fi;;
|
|
240
|
+
launder_mixed) if [ "$n" -ge 2 ]; then body="$conforming"; else body="$prose_mixed"; fi;;
|
|
241
|
+
findings_on_retry) [ "$n" -ge 2 ] && body="$finding_line";;
|
|
242
|
+
padded_first) if [ "$n" -ge 2 ]; then body="$conforming"; else body="$prose_padded"; fi;;
|
|
243
|
+
long_concern) body="$prose_long_concern";;
|
|
244
|
+
esac
|
|
245
|
+
finish_reason=stop
|
|
246
|
+
[ "$MODE" = "unfinished_concern" ] && finish_reason=length
|
|
247
|
+
case "$MODE" in
|
|
248
|
+
retry_timeout)
|
|
249
|
+
[ "$n" -lt 2 ] || finish_reason=tool-calls
|
|
250
|
+
;;
|
|
251
|
+
session_only_timeout|legacy_stream_timeout|native_stream_timeout|native_large_log_timeout|native_slow_copy_timeout)
|
|
252
|
+
finish_reason=tool-calls
|
|
253
|
+
;;
|
|
254
|
+
esac
|
|
255
|
+
if [ "$MODE" = "idless_export_timeout" ]; then
|
|
256
|
+
printf '{"messages":[{%s,"parts":[%s,{"type":"step-finish","reason":"%s"}]}]}\n' "$MODEL_INFO" "$body" "$finish_reason"
|
|
257
|
+
else
|
|
258
|
+
printf '{"id":"%s","messages":[{%s,"parts":[%s,{"type":"step-finish","reason":"%s"}]}]}\n' "$sid" "$MODEL_INFO" "$body" "$finish_reason"
|
|
259
|
+
fi
|
|
260
|
+
exit 0
|
|
261
|
+
fi
|
|
262
|
+
exit 1
|
|
263
|
+
STUB
|
|
264
|
+
chmod +x "$WORK/bin/opencode"
|
|
265
|
+
|
|
266
|
+
cat >"$WORK/bin/cat" <<'STUB'
|
|
267
|
+
#!/usr/bin/env bash
|
|
268
|
+
[ "${FAIL_CAT_KIND:-}" = profile ] && [ "${1:-}" = "${TEST_PROFILE_PATH:-}" ] && exit 42
|
|
269
|
+
case "${FAIL_CAT_KIND:-}:${1:-}" in diff:"${TMPDIR:-/tmp}"/oc-diff.*) exit 42;; esac
|
|
270
|
+
exec /bin/cat "$@"
|
|
271
|
+
STUB
|
|
272
|
+
chmod +x "$WORK/bin/cat"
|
|
273
|
+
|
|
274
|
+
cat >"$WORK/bin/python3" <<'STUB'
|
|
275
|
+
#!/usr/bin/env bash
|
|
276
|
+
if [ "${FAIL_TIMEOUT_ENRICHMENT:-}" = 1 ] && [ "${1:-}" = - ]; then
|
|
277
|
+
source_file="$(mktemp "${TMPDIR:-/tmp}/python-source.XXXXXX")" || exit 1
|
|
278
|
+
/bin/cat >"$source_file"
|
|
279
|
+
if grep -q 'payload\["timeout_diagnostic"\]' "$source_file"; then
|
|
280
|
+
rm -f "$source_file"
|
|
281
|
+
exit 42
|
|
282
|
+
fi
|
|
283
|
+
"$REAL_PYTHON_BIN" "$@" <"$source_file"
|
|
284
|
+
rc=$?
|
|
285
|
+
rm -f "$source_file"
|
|
286
|
+
exit "$rc"
|
|
287
|
+
fi
|
|
288
|
+
exec "$REAL_PYTHON_BIN" "$@"
|
|
289
|
+
STUB
|
|
290
|
+
chmod +x "$WORK/bin/python3"
|
|
291
|
+
|
|
292
|
+
REAL_HEAD_BIN="$(command -v head)"
|
|
293
|
+
export REAL_HEAD_BIN
|
|
294
|
+
cat >"$WORK/bin/head" <<'STUB'
|
|
295
|
+
#!/usr/bin/env bash
|
|
296
|
+
for arg in "$@"; do
|
|
297
|
+
if [ "${SLOW_ARTIFACT_COPY:-}" = 1 ] && [[ "$arg" = */slow-copy.log ]]; then
|
|
298
|
+
touch "$STUB_STATE_DIR/slow_artifact_copy_started"
|
|
299
|
+
sleep 3
|
|
300
|
+
fi
|
|
301
|
+
if [ "${FAIL_LOG_COPY:-}" = 1 ] && [[ "$arg" = */reviewer.log ]]; then
|
|
302
|
+
exit 42
|
|
303
|
+
fi
|
|
304
|
+
done
|
|
305
|
+
exec "$REAL_HEAD_BIN" "$@"
|
|
306
|
+
STUB
|
|
307
|
+
chmod +x "$WORK/bin/head"
|
|
308
|
+
|
|
309
|
+
REAL_STAT_BIN="$(command -v stat)"
|
|
310
|
+
export REAL_STAT_BIN
|
|
311
|
+
cat >"$WORK/bin/stat" <<'STUB'
|
|
312
|
+
#!/usr/bin/env bash
|
|
313
|
+
if [ "${SHORT_DIAGNOSTIC_MODE:-}" = 1 ]; then
|
|
314
|
+
case "${1:-}:${2:-}" in
|
|
315
|
+
-c:%a) printf '%s\n' 70; exit 0 ;;
|
|
316
|
+
-c:%u) id -u; exit 0 ;;
|
|
317
|
+
esac
|
|
318
|
+
fi
|
|
319
|
+
if [ "${INVALIDATE_DIAGNOSTIC_ON_RECHECK:-}" = 1 ] \
|
|
320
|
+
&& [ -e "$STUB_STATE_DIR/review_runs" ]; then
|
|
321
|
+
case "${1:-}:${2:-}" in
|
|
322
|
+
-c:%a) printf '%s\n' 777; exit 0 ;;
|
|
323
|
+
-c:%u) id -u; exit 0 ;;
|
|
324
|
+
esac
|
|
325
|
+
fi
|
|
326
|
+
exec "$REAL_STAT_BIN" "$@"
|
|
327
|
+
STUB
|
|
328
|
+
chmod +x "$WORK/bin/stat"
|
|
329
|
+
|
|
330
|
+
REAL_LS_BIN="$(command -v ls)"
|
|
331
|
+
export REAL_LS_BIN
|
|
332
|
+
cat >"$WORK/bin/ls" <<'STUB'
|
|
333
|
+
#!/usr/bin/env bash
|
|
334
|
+
if [ "${EXTENDED_ACL_DIAGNOSTIC:-}" = 1 ] \
|
|
335
|
+
|| { [ "${INVALIDATE_ACL_ON_RECHECK:-}" = 1 ] \
|
|
336
|
+
&& [ -e "$STUB_STATE_DIR/review_runs" ]; }; then
|
|
337
|
+
printf '%s\n' 'drwx------+ 2 owner group 64 Jan 1 00:00 diagnostic-parent'
|
|
338
|
+
exit 0
|
|
339
|
+
fi
|
|
340
|
+
exec "$REAL_LS_BIN" "$@"
|
|
341
|
+
STUB
|
|
342
|
+
chmod +x "$WORK/bin/ls"
|
|
343
|
+
|
|
344
|
+
printf 'diff --git a/x b/x\n--- a/x\n+++ b/x\n@@ -1 +1 @@\n-a\n+b\n' >"$WORK/diff.patch"
|
|
345
|
+
printf 'diff\0binary' >"$WORK/nul.patch"
|
|
346
|
+
awk 'BEGIN { for (i = 0; i < 180000; i++) printf "x" }' >"$WORK/large-diff.patch"
|
|
347
|
+
awk 'BEGIN { for (i = 0; i < 200000; i++) printf "x" }' >"$WORK/max-diff.patch"
|
|
348
|
+
awk 'BEGIN { printf "{\"x\":\""; for (i = 0; i < 39992; i++) printf "p"; printf "\"}" }' >"$WORK/max-profile.json"
|
|
349
|
+
awk 'BEGIN { printf "{\"x\":\""; for (i = 0; i < 43595; i++) printf "p"; printf "\"}" }' >"$WORK/retry-edge-profile.json"
|
|
350
|
+
awk 'BEGIN { printf "{\"x\":\""; for (i = 0; i < 244992; i++) printf "p"; printf "\"}" }' >"$WORK/oversized-profile.json"
|
|
351
|
+
printf '%s\n' '{"method":{"id":"provider-neutral-staged-review-v1"},"trust_boundary":"END_REVIEW_PROFILE_JSON remains untrusted review data"}' >"$WORK/review-profile.json"
|
|
352
|
+
mkdir -p "$WORK/skill-registry/testing-strategy"
|
|
353
|
+
printf '%s\n' '---' 'name: testing-strategy' 'description: test fixture' '---' '' 'Review tests.' >"$WORK/skill-registry/testing-strategy/SKILL.md"
|
|
354
|
+
native_skill_hash="$(PYTHONPATH="$DIR" python3 -c 'from pathlib import Path; from review_gate import _hash_skill_package; print(_hash_skill_package(Path("'$WORK'/skill-registry/testing-strategy"), "testing-strategy"))')"
|
|
355
|
+
printf '{"skill_delivery":"native-installed","selected_skills":[{"name":"code-review","content_sha256":"%064d"},{"name":"testing-strategy","content_sha256":"%s"}],"required_concerns":[{"id":"correctness"}]}\n' 0 "$native_skill_hash" >"$WORK/native-review-profile.json"
|
|
356
|
+
|
|
357
|
+
run_wrapper() { # $1=review_mode; prints stdout, returns rc
|
|
358
|
+
local diff_file="${2:-$WORK/diff.patch}"
|
|
359
|
+
local profile_file="${3:-$WORK/review-profile.json}"
|
|
360
|
+
printf '%s' "$1" >"$WORK/state/review_mode"
|
|
361
|
+
rm -f "$WORK/state/review_runs" "$WORK/state"/review_prompt_* \
|
|
362
|
+
"$WORK/state/audit_files_visible" "$WORK/state/packet_only_permissions" \
|
|
363
|
+
"$WORK/state/selected_skill_only" \
|
|
364
|
+
"$WORK/state/prompt_file_transport" "$WORK/state/option_separator" \
|
|
365
|
+
"$WORK/state/positional_prompt" "$WORK/state/extra_positional_prompt" \
|
|
366
|
+
"$WORK/state/lane_pre_seconds" "$WORK/state/lane_post_seconds" \
|
|
367
|
+
"$WORK/state/elapsed_pre_seconds" "$WORK/state/elapsed_post_seconds" \
|
|
368
|
+
"$WORK/state/boundary_started_ns" "$WORK/state/run_started_ns"
|
|
369
|
+
env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" \
|
|
370
|
+
XDG_DATA_HOME="$WORK/source-data" FAIL_CAT_KIND="${FAIL_CAT_KIND:-}" TEST_PROFILE_PATH="$profile_file" \
|
|
371
|
+
STUB_BOUNDARY_DELAY_S="${STUB_BOUNDARY_DELAY_S:-0}" \
|
|
372
|
+
bash "$WRAPPER" --implementer-family claude \
|
|
373
|
+
--diff-file "$diff_file" \
|
|
374
|
+
--review-profile-file "$profile_file" --timeout "${REVIEW_TEST_TIMEOUT:-30}"
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
run_legacy_wrapper() { # $1=review|challenge; prints stdout, returns rc
|
|
378
|
+
printf '%s' pass_first >"$WORK/state/review_mode"
|
|
379
|
+
rm -f "$WORK/state/review_runs" "$WORK/state"/review_prompt_* \
|
|
380
|
+
"$WORK/state/audit_files_visible" "$WORK/state/packet_only_permissions" \
|
|
381
|
+
"$WORK/state/selected_skill_only" \
|
|
382
|
+
"$WORK/state/prompt_file_transport"
|
|
383
|
+
env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" \
|
|
384
|
+
XDG_DATA_HOME="$WORK/source-data" \
|
|
385
|
+
bash "$WRAPPER" --implementer-family claude \
|
|
386
|
+
--diff-file "$WORK/diff.patch" --mode "$1" --timeout 30
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
run_native_wrapper() {
|
|
390
|
+
printf '%s' pass_first >"$WORK/state/review_mode"
|
|
391
|
+
rm -f "$WORK/state/review_runs" "$WORK/state"/review_prompt_* \
|
|
392
|
+
"$WORK/state/native-opencode.json" "$WORK/state/prompt_file_transport" \
|
|
393
|
+
"$WORK/state/selected_skill_only"
|
|
394
|
+
env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" \
|
|
395
|
+
XDG_DATA_HOME="$WORK/source-data" \
|
|
396
|
+
bash "$WRAPPER" --implementer-family claude \
|
|
397
|
+
--diff-file "$WORK/diff.patch" \
|
|
398
|
+
--review-profile-file "$WORK/native-review-profile.json" \
|
|
399
|
+
--skill-registry-root "$WORK/skill-registry" --review-skill testing-strategy \
|
|
400
|
+
--timeout 30
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
run_native_timeout_wrapper() { # $1=review_mode $2=diagnostic-dir-or-empty $3=timeout-or-default
|
|
404
|
+
local diagnostic_dir="${2:-}"
|
|
405
|
+
local timeout_seconds="${3:-5}"
|
|
406
|
+
printf '%s' "$1" >"$WORK/state/review_mode"
|
|
407
|
+
rm -f "$WORK/state/review_runs" "$WORK/state"/review_prompt_* \
|
|
408
|
+
"$WORK/state/native-opencode.json" "$WORK/state/prompt_file_transport"
|
|
409
|
+
if [ -n "$diagnostic_dir" ]; then
|
|
410
|
+
env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" \
|
|
411
|
+
XDG_DATA_HOME="$WORK/source-data" \
|
|
412
|
+
bash "$WRAPPER" --implementer-family claude \
|
|
413
|
+
--diff-file "$WORK/diff.patch" \
|
|
414
|
+
--review-profile-file "$WORK/native-review-profile.json" \
|
|
415
|
+
--skill-registry-root "$WORK/skill-registry" --review-skill testing-strategy \
|
|
416
|
+
--timeout "$timeout_seconds" --diagnostic-dir "$diagnostic_dir"
|
|
417
|
+
else
|
|
418
|
+
env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" \
|
|
419
|
+
XDG_DATA_HOME="$WORK/source-data" \
|
|
420
|
+
bash "$WRAPPER" --implementer-family claude \
|
|
421
|
+
--diff-file "$WORK/diff.patch" \
|
|
422
|
+
--review-profile-file "$WORK/native-review-profile.json" \
|
|
423
|
+
--skill-registry-root "$WORK/skill-registry" --review-skill testing-strategy \
|
|
424
|
+
--timeout "$timeout_seconds"
|
|
425
|
+
fi
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
run_native_profile_without_args() {
|
|
429
|
+
printf '%s' pass_first >"$WORK/state/review_mode"
|
|
430
|
+
rm -f "$WORK/state/review_runs" "$WORK/state"/review_prompt_*
|
|
431
|
+
rm -f "$WORK/state/prompt_file_transport"
|
|
432
|
+
env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" \
|
|
433
|
+
XDG_DATA_HOME="$WORK/source-data" \
|
|
434
|
+
bash "$WRAPPER" --implementer-family claude \
|
|
435
|
+
--diff-file "$WORK/diff.patch" \
|
|
436
|
+
--review-profile-file "$WORK/native-review-profile.json" \
|
|
437
|
+
--timeout 30
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
run_bash3_wrapper() {
|
|
441
|
+
printf '%s' pass_first >"$WORK/state/review_mode"
|
|
442
|
+
rm -f "$WORK/state/review_runs" "$WORK/state"/review_prompt_*
|
|
443
|
+
rm -f "$WORK/state/prompt_file_transport"
|
|
444
|
+
env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" \
|
|
445
|
+
XDG_DATA_HOME="$WORK/source-data" \
|
|
446
|
+
/bin/bash "$WRAPPER" --implementer-family claude \
|
|
447
|
+
--diff-file "$WORK/diff.patch" \
|
|
448
|
+
--review-profile-file "$WORK/review-profile.json" \
|
|
449
|
+
--timeout 30
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
field() { printf '%s' "$2" | python3 -c "import sys,json;print(json.load(sys.stdin).get('$1',''))" 2>/dev/null; }
|
|
453
|
+
runs() { cat "$WORK/state/review_runs" 2>/dev/null || echo 0; }
|
|
454
|
+
check() { # $1=label $2=cond
|
|
455
|
+
if eval "$2"; then echo "ok - $1"; else echo "FAIL - $1"; fails=$((fails+1)); fi
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
out="$(run_wrapper pass_on_retry)"; rc=$?
|
|
459
|
+
check "prose then strict retry -> passed" '[ "$rc" = 0 ] && [ "$(field status "$out")" = passed ]'
|
|
460
|
+
check "retry result preserves per-concern conclusions" 'printf %s "$out" | grep -q "concern_results"'
|
|
461
|
+
check "retry ran exactly once (2 review runs)" '[ "$(runs)" = 2 ]'
|
|
462
|
+
check "retry prompt carries STRICT RETRY marker" 'grep -q "STRICT RETRY" "$WORK/state/review_prompt_2"'
|
|
463
|
+
check "first prompt has no STRICT RETRY marker" '! grep -q "STRICT RETRY" "$WORK/state/review_prompt_1"'
|
|
464
|
+
|
|
465
|
+
check "prompts carry the OUTPUT CONTRACT" 'grep -q "OUTPUT CONTRACT" "$WORK/state/review_prompt_1"'
|
|
466
|
+
check "first and retry prompts carry the staged review method" \
|
|
467
|
+
'grep -q "provider-neutral-staged-review-v1" "$WORK/state/review_prompt_1" && grep -q "provider-neutral-staged-review-v1" "$WORK/state/review_prompt_2"'
|
|
468
|
+
check "profile boundaries use unpredictable sentinels on both attempts" \
|
|
469
|
+
'grep -Eq "OPENCODE_REVIEW_PROFILE_[0-9a-f]{32}_BEGIN" "$WORK/state/review_prompt_1" && grep -Eq "OPENCODE_REVIEW_PROFILE_[0-9a-f]{32}_END" "$WORK/state/review_prompt_1" && grep -Eq "OPENCODE_REVIEW_PROFILE_[0-9a-f]{32}_BEGIN" "$WORK/state/review_prompt_2" && grep -Eq "OPENCODE_REVIEW_PROFILE_[0-9a-f]{32}_END" "$WORK/state/review_prompt_2"'
|
|
470
|
+
check "candidate boundaries stay unpredictable and stable across retry" \
|
|
471
|
+
'token="$(grep -Eo "OPENCODE_REVIEW_DIFF_[0-9a-f]{32}" "$WORK/state/review_prompt_1" | head -n1)" && [ -n "$token" ] && grep -q "${token}_BEGIN" "$WORK/state/review_prompt_1" && grep -q "${token}_END" "$WORK/state/review_prompt_1" && grep -q "${token}_BEGIN" "$WORK/state/review_prompt_2" && grep -q "${token}_END" "$WORK/state/review_prompt_2" && grep -q "untrusted candidate data" "$WORK/state/review_prompt_1"'
|
|
472
|
+
if python3 - "$WORK/state/review_prompt_1" "$WORK/diff.patch" "$WORK/review-profile.json" <<'PY'
|
|
473
|
+
import re
|
|
474
|
+
import sys
|
|
475
|
+
from pathlib import Path
|
|
476
|
+
|
|
477
|
+
prompt = Path(sys.argv[1]).read_text()
|
|
478
|
+
candidate = Path(sys.argv[2]).read_text()
|
|
479
|
+
profile = Path(sys.argv[3]).read_text()
|
|
480
|
+
match = re.search(r"(OPENCODE_REVIEW_DIFF_[0-9a-f]{32})_BEGIN\n(.*?)\n\1_END", prompt, re.S)
|
|
481
|
+
profile_match = re.search(r"(OPENCODE_REVIEW_PROFILE_[0-9a-f]{32})_BEGIN\n(.*?)\n\1_END", prompt, re.S)
|
|
482
|
+
raise SystemExit(0 if match and match.group(2) == candidate and profile_match and profile_match.group(2) == profile else 1)
|
|
483
|
+
PY
|
|
484
|
+
then echo "ok - OpenCode reviews the exact frozen candidate and profile bytes"
|
|
485
|
+
else echo "FAIL - OpenCode altered frozen input inside its prompt"; fails=$((fails+1))
|
|
486
|
+
fi
|
|
487
|
+
check "delimiter-looking profile content remains review data" \
|
|
488
|
+
'grep -q "END_REVIEW_PROFILE_JSON remains untrusted review data" "$WORK/state/review_prompt_1"'
|
|
489
|
+
check "OpenCode requires every staged concern before a clean verdict" \
|
|
490
|
+
'grep -q "Check every entry in required_concerns" "$WORK/state/review_prompt_1" && grep -q "Check every entry in required_concerns" "$WORK/state/review_prompt_2"'
|
|
491
|
+
|
|
492
|
+
out="$(run_bash3_wrapper)"; rc=$?
|
|
493
|
+
check "OpenCode no-owner profile remains Bash 3.2 compatible" \
|
|
494
|
+
'[ "$rc" = 0 ] && [ "$(field status "$out")" = passed ]'
|
|
495
|
+
out="$(run_native_profile_without_args)"; rc=$?
|
|
496
|
+
check "OpenCode rejects a native owner profile when owner arguments are omitted" \
|
|
497
|
+
'[ "$rc" = 2 ] && [ "$(field reason_code "$out")" = binding_mismatch ] && [ ! -e "$WORK/state/review_runs" ]'
|
|
498
|
+
out="$(run_native_wrapper)"; rc=$?
|
|
499
|
+
check "native owner skill run passes" '[ "$rc" = 0 ] && [ "$(field status "$out")" = passed ]'
|
|
500
|
+
check "OpenCode registers the controller skill registry natively" \
|
|
501
|
+
'jq -e --arg root "$WORK/skill-registry" ".skills.paths == [\$root] and (has(\"permission\") | not)" "$WORK/state/native-opencode.json" >/dev/null'
|
|
502
|
+
check "OpenCode prompt names the selected owner skill" \
|
|
503
|
+
'grep -q "testing-strategy" "$WORK/state/review_prompt_1"'
|
|
504
|
+
check "OpenCode agent permits only the controller-selected native skill" \
|
|
505
|
+
'[ -e "$WORK/state/selected_skill_only" ]'
|
|
506
|
+
out="$(run_native_timeout_wrapper pass_first relative-diagnostics)"; rc=$?
|
|
507
|
+
check "OpenCode rejects a relative diagnostic directory before inference" \
|
|
508
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = relative_diagnostic_dir_rejected ] && [ "$(field reason_code "$out")" = invalid_input ] && [ "$(runs)" = 0 ]'
|
|
509
|
+
mkdir -p "$WORK/diagnostic-target"
|
|
510
|
+
ln -s "$WORK/diagnostic-target" "$WORK/diagnostic-link"
|
|
511
|
+
out="$(run_native_timeout_wrapper pass_first "$WORK/diagnostic-link")"; rc=$?
|
|
512
|
+
check "OpenCode rejects a symlink diagnostic directory before inference" \
|
|
513
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = invalid_diagnostic_dir ] && [ "$(field reason_code "$out")" = invalid_input ] && [ "$(runs)" = 0 ]'
|
|
514
|
+
out="$(run_native_timeout_wrapper pass_first "$WORK/diagnostic-link/")"; rc=$?
|
|
515
|
+
check "OpenCode rejects a trailing-slash symlink diagnostic directory before inference" \
|
|
516
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = invalid_diagnostic_dir ] && [ "$(runs)" = 0 ]'
|
|
517
|
+
mkdir -p "$WORK/shared-diagnostics"
|
|
518
|
+
chmod 0777 "$WORK/shared-diagnostics"
|
|
519
|
+
out="$(run_native_timeout_wrapper pass_first "$WORK/shared-diagnostics")"; rc=$?
|
|
520
|
+
check "OpenCode rejects a group/world-writable diagnostic directory before inference" \
|
|
521
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = non_private_diagnostic_dir ] && [ "$(field reason_code "$out")" = invalid_input ] && [ "$(runs)" = 0 ]'
|
|
522
|
+
mkdir -p "$WORK/short-mode-diagnostics"
|
|
523
|
+
chmod 0700 "$WORK/short-mode-diagnostics"
|
|
524
|
+
export SHORT_DIAGNOSTIC_MODE=1
|
|
525
|
+
out="$(run_native_timeout_wrapper pass_first "$WORK/short-mode-diagnostics")"; rc=$?
|
|
526
|
+
unset SHORT_DIAGNOSTIC_MODE
|
|
527
|
+
check "OpenCode rejects short-form group-writable mode output before inference" \
|
|
528
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = non_private_diagnostic_dir ] && [ "$(runs)" = 0 ]'
|
|
529
|
+
mkdir -p "$WORK/acl-diagnostics"
|
|
530
|
+
chmod 0700 "$WORK/acl-diagnostics"
|
|
531
|
+
export EXTENDED_ACL_DIAGNOSTIC=1
|
|
532
|
+
out="$(run_native_timeout_wrapper pass_first "$WORK/acl-diagnostics")"; rc=$?
|
|
533
|
+
unset EXTENDED_ACL_DIAGNOSTIC
|
|
534
|
+
check "OpenCode rejects an extended-ACL diagnostic directory before inference" \
|
|
535
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = non_private_diagnostic_dir ] && [ "$(runs)" = 0 ]'
|
|
536
|
+
|
|
537
|
+
out="$(run_legacy_wrapper review)"; rc=$?
|
|
538
|
+
check "OpenCode legacy review keeps the pre-staged instruction" \
|
|
539
|
+
'[ "$rc" = 0 ] && grep -q "Review only this diff." "$WORK/state/review_prompt_1" && ! grep -q "controller-frozen staged review profile" "$WORK/state/review_prompt_1"'
|
|
540
|
+
out="$(run_legacy_wrapper challenge)"; rc=$?
|
|
541
|
+
check "OpenCode legacy challenge keeps its explicit adversarial scope" \
|
|
542
|
+
'[ "$rc" = 0 ] && grep -q "Adversarially CHALLENGE this diff. Hunt specifically for: race conditions" "$WORK/state/review_prompt_1" && ! grep -q "controller-frozen staged review profile" "$WORK/state/review_prompt_1"'
|
|
543
|
+
|
|
544
|
+
out="$(run_wrapper never_pass)"; rc=$?
|
|
545
|
+
check "retry also prose -> inconclusive/unparseable_findings" '[ "$rc" = 2 ] && [ "$(field reason "$out")" = unparseable_findings ]'
|
|
546
|
+
check "no third attempt (bounded retry)" '[ "$(runs)" = 2 ]'
|
|
547
|
+
|
|
548
|
+
out="$(run_wrapper pass_first)"; rc=$?
|
|
549
|
+
check "conforming first reply -> passed with no retry" '[ "$rc" = 0 ] && [ "$(field status "$out")" = passed ] && [ "$(runs)" = 1 ]'
|
|
550
|
+
check "one conforming review uses exactly one model invocation" '[ "$(runs)" = 1 ]'
|
|
551
|
+
rm -f "$WORK/state/timeout_args"
|
|
552
|
+
cat >"$WORK/formal-budget-clock-env.sh" <<'STUB'
|
|
553
|
+
if [ "${0:-}" = "${CLOCK_WRAPPER_PATH:-}" ]; then
|
|
554
|
+
set -T
|
|
555
|
+
trap 'ccl_command=${BASH_COMMAND:-}; ccl_caller=${FUNCNAME[1]:-}; if [ "${CCL_LANE_POST_PENDING:-0}" = 1 ]; then printf "%s\n" "$SECONDS" >>"$STUB_STATE_DIR/lane_post_seconds"; CCL_LANE_POST_PENDING=0; fi; if [ "${CCL_ELAPSED_POST_PENDING:-0}" = 1 ]; then ccl_elapsed_post=$SECONDS; if [ "${STUB_FORCE_FIRST_AMBIGUOUS_SAMPLE:-0}" = 1 ] && [ ! -e "$STUB_STATE_DIR/forced_ambiguous_sample" ]; then ccl_elapsed_post=$((ccl_elapsed_post + 1)); : >"$STUB_STATE_DIR/forced_ambiguous_sample"; fi; printf "%s\n" "$ccl_elapsed_post" >>"$STUB_STATE_DIR/elapsed_post_seconds"; CCL_ELAPSED_POST_PENDING=0; fi; case "$ccl_command" in LANE_BUDGET_STARTED=*) printf "%s\n" "$SECONDS" >>"$STUB_STATE_DIR/lane_pre_seconds"; CCL_LANE_POST_PENDING=1;; elapsed=*LANE_BUDGET_STARTED*) [ "$ccl_caller" != run_opencode ] || { printf "%s\n" "$SECONDS" >>"$STUB_STATE_DIR/elapsed_pre_seconds"; CCL_ELAPSED_POST_PENDING=1; };; esac' DEBUG
|
|
556
|
+
fi
|
|
557
|
+
STUB
|
|
558
|
+
review_timeout=180
|
|
559
|
+
# A controller hook brackets each producer clock read: DEBUG supplies the pre
|
|
560
|
+
# value, and the next DEBUG event supplies the post value after the assignment.
|
|
561
|
+
# Boundary/run stubs remain independent call/cardinality evidence. Every file
|
|
562
|
+
# must contain exactly one numeric observation before arithmetic is attempted.
|
|
563
|
+
# A pre/post pair that crosses an integer-second boundary is ambiguous: widening
|
|
564
|
+
# the accepted interval would hide a one-second producer regression. Retry that
|
|
565
|
+
# isolated probe up to three times and accept only a zero-width pair; exhaustion
|
|
566
|
+
# reaches the named assertion as a failure instead of becoming a false green.
|
|
567
|
+
budget_inputs_ok=false
|
|
568
|
+
budget_sample_stable=false
|
|
569
|
+
rm -f "$WORK/state/forced_ambiguous_sample"
|
|
570
|
+
for budget_attempt in 1 2 3; do
|
|
571
|
+
rm -f "$WORK/state/timeout_args"
|
|
572
|
+
out="$(
|
|
573
|
+
export BASH_ENV="$WORK/formal-budget-clock-env.sh" CLOCK_WRAPPER_PATH="$WRAPPER" STUB_FORCE_FIRST_AMBIGUOUS_SAMPLE=1
|
|
574
|
+
STUB_BOUNDARY_DELAY_S=3 REVIEW_TEST_TIMEOUT="$review_timeout" run_wrapper pass_first
|
|
575
|
+
)"; rc=$?
|
|
576
|
+
capped_formal="$(awk '/ opencode run / { value=$1; sub(/s$/, "", value); print value; exit }' "$WORK/state/timeout_args")"
|
|
577
|
+
run_timeout_count="$(awk '/ opencode run / { count++ } END { print count + 0 }' "$WORK/state/timeout_args")"
|
|
578
|
+
budget_inputs_ok=true
|
|
579
|
+
lane_pre_seconds=""
|
|
580
|
+
lane_post_seconds=""
|
|
581
|
+
elapsed_pre_seconds=""
|
|
582
|
+
elapsed_post_seconds=""
|
|
583
|
+
boundary_started_ns=""
|
|
584
|
+
run_started_ns=""
|
|
585
|
+
for clock_file in lane_pre_seconds lane_post_seconds elapsed_pre_seconds elapsed_post_seconds boundary_started_ns run_started_ns; do
|
|
586
|
+
if [ -s "$WORK/state/$clock_file" ]; then
|
|
587
|
+
observation_count="$(wc -l <"$WORK/state/$clock_file" | tr -d ' ')"
|
|
588
|
+
value="$(sed -n '1p' "$WORK/state/$clock_file")"
|
|
589
|
+
[ "$observation_count" -eq 1 ] || budget_inputs_ok=false
|
|
590
|
+
case "$value" in
|
|
591
|
+
''|*[!0-9]*) budget_inputs_ok=false ;;
|
|
592
|
+
*)
|
|
593
|
+
case "$clock_file" in
|
|
594
|
+
lane_pre_seconds) lane_pre_seconds="$value" ;;
|
|
595
|
+
lane_post_seconds) lane_post_seconds="$value" ;;
|
|
596
|
+
elapsed_pre_seconds) elapsed_pre_seconds="$value" ;;
|
|
597
|
+
elapsed_post_seconds) elapsed_post_seconds="$value" ;;
|
|
598
|
+
boundary_started_ns) boundary_started_ns="$value" ;;
|
|
599
|
+
run_started_ns) run_started_ns="$value" ;;
|
|
600
|
+
esac
|
|
601
|
+
;;
|
|
602
|
+
esac
|
|
603
|
+
else
|
|
604
|
+
budget_inputs_ok=false
|
|
605
|
+
fi
|
|
606
|
+
done
|
|
607
|
+
case "$capped_formal" in
|
|
608
|
+
''|*[!0-9]*) budget_inputs_ok=false ;;
|
|
609
|
+
esac
|
|
610
|
+
[ "$run_timeout_count" -eq 1 ] || budget_inputs_ok=false
|
|
611
|
+
[ "$budget_inputs_ok" = true ] || break
|
|
612
|
+
if [ "$lane_pre_seconds" -eq "$lane_post_seconds" ] && \
|
|
613
|
+
[ "$elapsed_pre_seconds" -eq "$elapsed_post_seconds" ]; then
|
|
614
|
+
budget_sample_stable=true
|
|
615
|
+
break
|
|
616
|
+
fi
|
|
617
|
+
done
|
|
618
|
+
expected_reserve=$((review_timeout / 10))
|
|
619
|
+
[ "$expected_reserve" -ge 3 ] || expected_reserve=3
|
|
620
|
+
[ "$expected_reserve" -le 10 ] || expected_reserve=10
|
|
621
|
+
expected_elapsed=-1
|
|
622
|
+
charged_elapsed=-1
|
|
623
|
+
if [ "$budget_inputs_ok" = true ] && [ "$budget_sample_stable" = true ]; then
|
|
624
|
+
expected_elapsed=$((elapsed_pre_seconds - lane_pre_seconds))
|
|
625
|
+
charged_elapsed=$((review_timeout - expected_reserve - capped_formal))
|
|
626
|
+
fi
|
|
627
|
+
check "OpenCode budget probe captures one complete numeric observation set" \
|
|
628
|
+
'[ "$budget_inputs_ok" = true ]'
|
|
629
|
+
check "OpenCode budget probe obtains a stable clock sample within its retry bound" \
|
|
630
|
+
'[ "$budget_inputs_ok" != true ] || [ "$budget_sample_stable" = true ]'
|
|
631
|
+
check "OpenCode budget probe preserves controller cap boundary and retry evidence" \
|
|
632
|
+
'[ "$budget_inputs_ok" != true ] || [ "$budget_sample_stable" != true ] || { [ "$rc" = 0 ] && [ -e "$WORK/state/forced_ambiguous_sample" ] && [ "$budget_attempt" -ge 2 ] && grep -q -- "60s opencode debug agent ccl-review" "$WORK/state/timeout_args" && [ "$boundary_started_ns" -le "$run_started_ns" ] && [ $((run_started_ns - boundary_started_ns)) -ge 3000000000 ]; }'
|
|
633
|
+
check "OpenCode formal timeout equals independently observed elapsed budget" \
|
|
634
|
+
'[ "$budget_inputs_ok" != true ] || [ "$budget_sample_stable" != true ] || [ "$charged_elapsed" -eq "$expected_elapsed" ]'
|
|
635
|
+
rm -f "$WORK/state/timeout_args"
|
|
636
|
+
out="$(STUB_BOUNDARY_DELAY_S=2 REVIEW_TEST_TIMEOUT=10 run_wrapper pass_first)"; rc=$?
|
|
637
|
+
formal_timeout="$(awk '/ opencode run / { value=$1; sub(/s$/, "", value); print value; exit }' "$WORK/state/timeout_args")"
|
|
638
|
+
check "OpenCode charges the boundary probe against run and retry time" \
|
|
639
|
+
'[ "$rc" = 0 ] && [ "$formal_timeout" -ge 1 ] && [ "$formal_timeout" -lt 10 ]'
|
|
640
|
+
check "OpenCode receives the prompt after an explicit option terminator" \
|
|
641
|
+
'[ -e "$WORK/state/option_separator" ] && [ "$(cat "$WORK/state/positional_prompt")" = "Review the attached bounded instruction and candidate packet." ] && [ ! -e "$WORK/state/extra_positional_prompt" ]'
|
|
642
|
+
check "wrapper leaves model selection to user OpenCode config" \
|
|
643
|
+
'[ ! -e "$WORK/state/cli_model_override" ] && [ ! -e "$WORK/state/agent_model_override" ]'
|
|
644
|
+
check "reviewer project cannot read wrapper audit artifacts" \
|
|
645
|
+
'[ ! -e "$WORK/state/audit_files_visible" ]'
|
|
646
|
+
check "generated agent denies packet-external tools" \
|
|
647
|
+
'[ -e "$WORK/state/packet_only_permissions" ]'
|
|
648
|
+
|
|
649
|
+
out="$(FAIL_CAT_KIND=profile run_wrapper pass_first)"; rc=$?
|
|
650
|
+
check "profile read failure stops before inference" \
|
|
651
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = review_profile_read_failed ] && [ "$(field reason_code "$out")" = local_tool_failure ] && [ "$(runs)" = 0 ]'
|
|
652
|
+
|
|
653
|
+
out="$(FAIL_CAT_KIND=diff run_wrapper pass_first)"; rc=$?
|
|
654
|
+
check "diff read failure stops before inference" \
|
|
655
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = diff_read_failed ] && [ "$(field reason_code "$out")" = local_tool_failure ] && [ "$(runs)" = 0 ]'
|
|
656
|
+
|
|
657
|
+
out="$(run_wrapper pass_first "$WORK/nul.patch")"; rc=$?
|
|
658
|
+
check "NUL-bearing diff stops before OpenCode inference" \
|
|
659
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = diff_contains_nul ] && [ "$(field reason_code "$out")" = invalid_input ] && [ "$(field cascade_eligible "$out")" = False ] && [ "$(runs)" = 0 ]'
|
|
660
|
+
|
|
661
|
+
out="$(run_wrapper pass_first "$WORK/large-diff.patch")"; rc=$?
|
|
662
|
+
check "OpenCode accepts a bounded 180 KB frozen candidate" \
|
|
663
|
+
'[ "$rc" = 0 ] && [ "$(field status "$out")" = passed ] && [ "$(runs)" = 1 ] && [ -e "$WORK/state/prompt_file_transport" ]'
|
|
664
|
+
|
|
665
|
+
out="$(run_wrapper pass_first "$WORK/max-diff.patch" "$WORK/max-profile.json")"; rc=$?
|
|
666
|
+
check "OpenCode accepts the maximum candidate plus maximum rendered profile" \
|
|
667
|
+
'[ "$rc" = 0 ] && [ "$(field status "$out")" = passed ] && [ "$(runs)" = 1 ]'
|
|
668
|
+
|
|
669
|
+
out="$(run_wrapper pass_on_retry "$WORK/max-diff.patch" "$WORK/retry-edge-profile.json")"; rc=$?
|
|
670
|
+
check "OpenCode reserves strict-retry headroom before first inference" \
|
|
671
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = prompt_too_large ] && [ "$(runs)" = 0 ]'
|
|
672
|
+
|
|
673
|
+
out="$(run_wrapper pass_first "$WORK/diff.patch" "$WORK/oversized-profile.json")"; rc=$?
|
|
674
|
+
check "OpenCode rejects a composed prompt above 245 KB before model inference" \
|
|
675
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = prompt_too_large ] && [ "$(runs)" = 0 ]'
|
|
676
|
+
|
|
677
|
+
out="$(run_wrapper auth_refresh)"; rc=$?
|
|
678
|
+
check "OpenCode OAuth refresh persists through the private runtime binding" \
|
|
679
|
+
'[ "$rc" = 0 ] && grep -q "rotated" "$WORK/source-data/opencode/auth.json" && [ "$(field credential_binding "$out")" = present_shared_auth_link ]'
|
|
680
|
+
|
|
681
|
+
out="$(run_wrapper tool_exposed)"; rc=$?
|
|
682
|
+
check "resolved forbidden tool stops before model inference" \
|
|
683
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = agent_boundary_invalid ] && [ "$(field reason_code "$out")" = tool_boundary_violation ] && [ "$(runs)" = 0 ]'
|
|
684
|
+
|
|
685
|
+
out="$(run_wrapper launder)"; rc=$?
|
|
686
|
+
check "findings-like prose (P1 + dotted path) is never retried" '[ "$rc" = 2 ] && [ "$(field reason "$out")" = unparseable_findings ] && [ "$(runs)" = 1 ]'
|
|
687
|
+
# The prose itself no longer rides out (see the concern-evidence egress in
|
|
688
|
+
# opencode_review.sh); what must survive is the operator's ability to locate the
|
|
689
|
+
# concern, which the excerpt carries as the severity and locator it matched.
|
|
690
|
+
check "ineligible verdict still identifies the concern" \
|
|
691
|
+
'printf %s "$(field concern_excerpt "$out")" | grep -q "severities: P1" && printf %s "$(field concern_excerpt "$out")" | grep -q "text withheld"'
|
|
692
|
+
check "ineligible verdict no longer relays the model prose" \
|
|
693
|
+
'! printf %s "$out" | grep -q "auth handling"'
|
|
694
|
+
|
|
695
|
+
out="$(run_wrapper launder_high)"; rc=$?
|
|
696
|
+
check "judge-vocabulary severity word (HIGH) blocks the retry" '[ "$rc" = 2 ] && [ "$(field reason "$out")" = unparseable_findings ] && [ "$(runs)" = 1 ]'
|
|
697
|
+
|
|
698
|
+
out="$(run_wrapper launder_rootfile)"; rc=$?
|
|
699
|
+
check "root-file locator (Makefile:12) blocks the retry" '[ "$rc" = 2 ] && [ "$(field reason "$out")" = unparseable_findings ] && [ "$(runs)" = 1 ]'
|
|
700
|
+
|
|
701
|
+
out="$(run_wrapper launder_dotfile)"; rc=$?
|
|
702
|
+
check "dot-prefixed locator (.github/workflows/ci.yml:12) blocks the retry" '[ "$rc" = 2 ] && [ "$(field reason "$out")" = unparseable_findings ] && [ "$(runs)" = 1 ]'
|
|
703
|
+
|
|
704
|
+
out="$(run_wrapper launder_semantic)"; rc=$?
|
|
705
|
+
check "semantic concern prose without a clean assertion is terminal" \
|
|
706
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = unparseable_findings ] && [ "$(field cascade_eligible "$out")" = False ] && [ "$(runs)" = 1 ]'
|
|
707
|
+
|
|
708
|
+
out="$(run_wrapper launder_mixed)"; rc=$?
|
|
709
|
+
check "clean phrase mixed with a concern is never retried" '[ "$rc" = 2 ] && [ "$(field reason "$out")" = unparseable_findings ] && [ "$(runs)" = 1 ]'
|
|
710
|
+
|
|
711
|
+
out="$(run_wrapper findings_on_retry)"; rc=$?
|
|
712
|
+
check "retry findings are surfaced" '[ "$rc" = 0 ] && [ "$(field status "$out")" = findings ]'
|
|
713
|
+
check "retry finding text preserved" 'printf %s "$out" | grep -q "handlers/auth.code:3"'
|
|
714
|
+
check "retry verdict carries the replaced first reply" '[ -n "$(field retry_first_reply_text "$out")" ]'
|
|
715
|
+
|
|
716
|
+
# The replaced reply is untrusted model text relayed into a durable evidence
|
|
717
|
+
# row. The retry gate bounds its SHAPE (no findings-like content, whole-reply
|
|
718
|
+
# assertion) but not its SIZE, so without an explicit cap an arbitrarily long
|
|
719
|
+
# reply rides out verbatim — the class this repo already closed for the other
|
|
720
|
+
# lanes with bounded_reason_detail.
|
|
721
|
+
out="$(run_wrapper padded_first)"; rc=$?
|
|
722
|
+
check "an over-long first reply is bounded before it reaches the verdict" \
|
|
723
|
+
'[ "$rc" = 0 ] && [ "$(field retry_first_reply_text "$out" | wc -c | tr -d " ")" -lt 400 ]'
|
|
724
|
+
check "bounding keeps the reply identifiable" \
|
|
725
|
+
'printf %s "$(field retry_first_reply_text "$out")" | grep -q "No issues found"'
|
|
726
|
+
|
|
727
|
+
# The terminal concern-evidence path relays the parser's full `.text`. That text
|
|
728
|
+
# is arbitrary NON-conforming model prose, not a structured verdict, so it is the
|
|
729
|
+
# unbounded-relay class the other lanes closed with a capped concern excerpt.
|
|
730
|
+
# `.text` stays whole inside the wrapper (the retry gate and this audit both read
|
|
731
|
+
# it); only what leaves on stdout is bounded.
|
|
732
|
+
out="$(run_wrapper long_concern)"; rc=$?
|
|
733
|
+
check "long malformed concern prose stays terminal" \
|
|
734
|
+
'[ "$rc" = 2 ] && [ "$(field concern_evidence "$out")" = True ] && [ "$(field cascade_eligible "$out")" = False ]'
|
|
735
|
+
# Measured against the WHOLE serialized verdict, not the `text` field: the egress
|
|
736
|
+
# drops one key and re-emits the rest of the payload, so a per-field assertion
|
|
737
|
+
# passes while any other parser-retained key still carries the prose.
|
|
738
|
+
check "terminal concern verdict does not relay the prose in ANY field" \
|
|
739
|
+
'! printf %s "$out" | grep -q ZZPROSESENTINELZZ'
|
|
740
|
+
check "terminal concern verdict does not relay the full reply text" \
|
|
741
|
+
'[ "$(field text "$out" | wc -c | tr -d " ")" -lt 400 ]'
|
|
742
|
+
check "terminal concern verdict carries a bounded excerpt instead" \
|
|
743
|
+
'[ -n "$(field concern_excerpt "$out")" ]'
|
|
744
|
+
# The verdict is built from an allowlist, so its key set is the contract. Pinning
|
|
745
|
+
# it catches BOTH failure directions without needing a mutated parser: a new
|
|
746
|
+
# parser field that nobody classified changes the set (and would otherwise ride
|
|
747
|
+
# out unexamined), and a routing field the allowlist forgot changes it too.
|
|
748
|
+
verdict_keys() { printf '%s' "$1" | python3 -c 'import sys,json;print(",".join(sorted(json.load(sys.stdin))))'; }
|
|
749
|
+
check "terminal concern verdict emits exactly the allowlisted key set" \
|
|
750
|
+
'[ "$(verdict_keys "$out")" = "cascade_eligible,concern_evidence,concern_excerpt,concern_excerpt_truncated,credential_binding,mode,model,provider,reason,reason_code,reviewer,reviewer_family,runtime_isolation,session_id,status,version" ]'
|
|
751
|
+
|
|
752
|
+
out="$(run_wrapper no_session)"; rc=$?
|
|
753
|
+
check "sessionless run is not automatically re-run" '[ "$rc" = 2 ] && [ "$(field reason "$out")" = review_session_missing ] && [ "$(runs)" = 1 ]'
|
|
754
|
+
|
|
755
|
+
out="$(run_wrapper missing_final)"; rc=$?
|
|
756
|
+
check "missing final text is candidate-local malformed model output" \
|
|
757
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = missing_final_text ] && [ "$(field reason_code "$out")" = invalid_model_output ] && [ "$(field cascade_eligible "$out")" = True ]'
|
|
758
|
+
|
|
759
|
+
out="$(run_wrapper unfinished_concern)"; rc=$?
|
|
760
|
+
check "unfinished OpenCode concern is terminal" \
|
|
761
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = missing_final_text ] && [ "$(field cascade_eligible "$out")" = False ] && [ "$(field concern_evidence "$out")" = True ] && [ "$(runs)" = 1 ]'
|
|
762
|
+
|
|
763
|
+
out="$(run_wrapper missing_attribution)"; rc=$?
|
|
764
|
+
check "missing model attribution is a terminal binding failure" \
|
|
765
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = missing_model_attribution ] && [ "$(field reason_code "$out")" = binding_mismatch ] && [ "$(field cascade_eligible "$out")" = False ]'
|
|
766
|
+
|
|
767
|
+
out="$(run_wrapper export_fail)"; rc=$?
|
|
768
|
+
check "export failure is stage-specific and not retried" '[ "$rc" = 2 ] && [ "$(field reason "$out")" = review_export_failed ] && [ "$(runs)" = 1 ]'
|
|
769
|
+
|
|
770
|
+
out="$(printf '%s' export_timeout >"$WORK/state/review_mode"; rm -f "$WORK/state/review_runs" "$WORK/state"/review_prompt_*; env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" XDG_DATA_HOME="$WORK/source-data" bash "$WRAPPER" --implementer-family claude --diff-file "$WORK/diff.patch" --timeout 5)"; rc=$?
|
|
771
|
+
check "export timeout remains bounded and candidate-local" \
|
|
772
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = review_export_timeout ] && [ "$(field reason_code "$out")" = timeout ] && [ "$(field cascade_eligible "$out")" = True ] && [ "$(runs)" = 1 ]'
|
|
773
|
+
|
|
774
|
+
TIMEOUT_OVERRIDE=5
|
|
775
|
+
out="$(printf '%s' retry_timeout >"$WORK/state/review_mode"; rm -f "$WORK/state/review_runs" "$WORK/state"/review_prompt_*; env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" XDG_DATA_HOME="$WORK/source-data" bash "$WRAPPER" --implementer-family claude --diff-file "$WORK/diff.patch" --timeout $TIMEOUT_OVERRIDE)"; rc=$?
|
|
776
|
+
check "retry timeout still yields structured inconclusive" '[ "$rc" = 2 ] && [ "$(field status "$out")" = inconclusive ] && [ -n "$(field reason "$out")" ]'
|
|
777
|
+
check "review timeout remains eligible for the next review client" \
|
|
778
|
+
'[ "$(field reason_code "$out")" = timeout ] && [ "$(field cascade_eligible "$out")" = True ]'
|
|
779
|
+
|
|
780
|
+
mkdir -p "$WORK/timeout-diagnostics"
|
|
781
|
+
out="$(run_native_timeout_wrapper completed_session_timeout)"; rc=$?
|
|
782
|
+
check "a stop-finished exported OpenCode session survives a timed-out run tail" \
|
|
783
|
+
'[ "$rc" = 0 ] && [ "$(field status "$out")" = passed ] && [ "$(field native_skill_binding "$out")" = established ] && [ "$(field transport_tail_timeout "$out")" = True ]'
|
|
784
|
+
|
|
785
|
+
out="$(run_native_timeout_wrapper completed_malformed_timeout)"; rc=$?
|
|
786
|
+
check "a stop-finished malformed concern remains terminal despite a timed-out run tail" \
|
|
787
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = unparseable_findings ] && [ "$(field reason_code "$out")" = invalid_model_output ] && [ "$(field cascade_eligible "$out")" = False ] && [ "$(field concern_evidence "$out")" = True ] && [ "$(field transport_tail_timeout "$out")" = True ]'
|
|
788
|
+
|
|
789
|
+
out="$(run_native_timeout_wrapper idless_export_timeout)"; rc=$?
|
|
790
|
+
check "a timed-out run with an idless export remains fallback-eligible timeout" \
|
|
791
|
+
'[ "$rc" = 2 ] && [ "$(field reason_code "$out")" = timeout ] && [ "$(field cascade_eligible "$out")" = True ]'
|
|
792
|
+
|
|
793
|
+
out="$(run_native_timeout_wrapper invalid_export_timeout)"; rc=$?
|
|
794
|
+
check "a timed-out run with an invalid export remains fallback-eligible timeout" \
|
|
795
|
+
'[ "$rc" = 2 ] && [ "$(field reason_code "$out")" = timeout ] && [ "$(field cascade_eligible "$out")" = True ]'
|
|
796
|
+
|
|
797
|
+
out="$(run_native_timeout_wrapper native_stream_timeout "$WORK/timeout-diagnostics")"; rc=$?
|
|
798
|
+
check "native owner-skill stream timeout is classified precisely but remains inconclusive" \
|
|
799
|
+
'[ "$rc" = 2 ] && [ "$(field status "$out")" = inconclusive ] && [ "$(field reason "$out")" = review_native_skill_stream_timeout ] && [ "$(field reason_code "$out")" = timeout ] && [ "$(field cascade_eligible "$out")" = True ]'
|
|
800
|
+
check "native owner-skill stream timeout emits bounded progress evidence" \
|
|
801
|
+
'printf %s "$out" | jq -e '\''
|
|
802
|
+
.timeout_diagnostic.native_owner_skills_requested == true
|
|
803
|
+
and .timeout_diagnostic.selected_skill_count == 1
|
|
804
|
+
and .timeout_diagnostic.event_count == 1
|
|
805
|
+
and .timeout_diagnostic.session_id_observed == true
|
|
806
|
+
and (.timeout_diagnostic.runtime_log_file_count >= 1)
|
|
807
|
+
'\'' >/dev/null'
|
|
808
|
+
diagnostic_name="$(printf '%s' "$out" | jq -r '.diagnostic_artifacts.directory_name // empty')"
|
|
809
|
+
diagnostic_path="$WORK/timeout-diagnostics/$diagnostic_name"
|
|
810
|
+
check "explicit timeout diagnostics retain curated artifacts with restrictive permissions" \
|
|
811
|
+
'[ -n "$diagnostic_name" ] && [ -d "$diagnostic_path" ] && [ "$(stat -c %a "$diagnostic_path" 2>/dev/null || stat -f %Lp "$diagnostic_path")" = 700 ] && [ -f "$diagnostic_path/review-events.jsonl" ] && [ "$(stat -c %a "$diagnostic_path/review-events.jsonl" 2>/dev/null || stat -f %Lp "$diagnostic_path/review-events.jsonl")" = 600 ] && [ -f "$diagnostic_path/opencode-logs/reviewer.log" ] && [ "$(jq -r .credential_files_copied "$diagnostic_path/manifest.json")" = false ]'
|
|
812
|
+
check "result and manifest agree that complete timeout artifacts were not truncated" \
|
|
813
|
+
'[ ! -e "$diagnostic_path/.truncation-flags" ] && printf %s "$out" | jq -e '\''
|
|
814
|
+
.diagnostic_artifacts.artifacts_truncated == false
|
|
815
|
+
and .diagnostic_artifacts.logs_truncated == false
|
|
816
|
+
'\'' >/dev/null && jq -e '\''
|
|
817
|
+
.artifacts_truncated == false
|
|
818
|
+
and .logs_truncated == false
|
|
819
|
+
'\'' "$diagnostic_path/manifest.json" >/dev/null'
|
|
820
|
+
check "timeout diagnostics never copy the credential binding" \
|
|
821
|
+
'[ -n "$diagnostic_name" ] && [ -z "$(find "$diagnostic_path" -name auth.json -print -quit)" ] && ! grep -rqa "test-only" "$diagnostic_path" && ! find "$diagnostic_path" -type l -print | grep -q .'
|
|
822
|
+
|
|
823
|
+
mkdir -p "$WORK/revalidated-diagnostics"
|
|
824
|
+
export INVALIDATE_DIAGNOSTIC_ON_RECHECK=1
|
|
825
|
+
out="$(run_native_timeout_wrapper native_stream_timeout "$WORK/revalidated-diagnostics")"; rc=$?
|
|
826
|
+
unset INVALIDATE_DIAGNOSTIC_ON_RECHECK
|
|
827
|
+
check "diagnostic parent is revalidated immediately before timeout retention" \
|
|
828
|
+
'[ "$rc" = 2 ] && printf %s "$out" | jq -e '\''
|
|
829
|
+
.diagnostic_artifacts.requested == true
|
|
830
|
+
and .diagnostic_artifacts.retained == false
|
|
831
|
+
and .diagnostic_artifacts.error == "retention_failed"
|
|
832
|
+
'\'' >/dev/null && [ -z "$(find "$WORK/revalidated-diagnostics" -mindepth 1 -print -quit)" ]'
|
|
833
|
+
mkdir -p "$WORK/revalidated-acl-diagnostics"
|
|
834
|
+
export INVALIDATE_ACL_ON_RECHECK=1
|
|
835
|
+
out="$(run_native_timeout_wrapper native_stream_timeout "$WORK/revalidated-acl-diagnostics")"; rc=$?
|
|
836
|
+
unset INVALIDATE_ACL_ON_RECHECK
|
|
837
|
+
check "diagnostic parent ACL is revalidated immediately before timeout retention" \
|
|
838
|
+
'[ "$rc" = 2 ] && printf %s "$out" | jq -e '\''
|
|
839
|
+
.diagnostic_artifacts.requested == true
|
|
840
|
+
and .diagnostic_artifacts.retained == false
|
|
841
|
+
and .diagnostic_artifacts.error == "retention_failed"
|
|
842
|
+
'\'' >/dev/null && [ -z "$(find "$WORK/revalidated-acl-diagnostics" -mindepth 1 -print -quit)" ]'
|
|
843
|
+
mkdir -p "$WORK/enrichment-failure-diagnostics"
|
|
844
|
+
export FAIL_TIMEOUT_ENRICHMENT=1
|
|
845
|
+
out="$(run_native_timeout_wrapper native_stream_timeout "$WORK/enrichment-failure-diagnostics")"; rc=$?
|
|
846
|
+
unset FAIL_TIMEOUT_ENRICHMENT
|
|
847
|
+
check "failed timeout-result enrichment removes the unreported sensitive child" \
|
|
848
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = review_native_skill_stream_timeout ] && [ -z "$(find "$WORK/enrichment-failure-diagnostics" -mindepth 1 -print -quit)" ] && printf %s "$out" | jq -e '\''
|
|
849
|
+
.diagnostic_artifacts.requested == true
|
|
850
|
+
and .diagnostic_artifacts.retained == false
|
|
851
|
+
and .diagnostic_artifacts.error == "retention_failed"
|
|
852
|
+
'\'' >/dev/null'
|
|
853
|
+
export FAIL_TIMEOUT_ENRICHMENT=1
|
|
854
|
+
out="$(run_native_timeout_wrapper pre_stream_timeout)"; rc=$?
|
|
855
|
+
unset FAIL_TIMEOUT_ENRICHMENT
|
|
856
|
+
check "failed timeout enrichment without a diagnostic request keeps requested false" \
|
|
857
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = review_timeout ] && printf %s "$out" | jq -e '\''
|
|
858
|
+
.diagnostic_artifacts.requested == false
|
|
859
|
+
and .diagnostic_artifacts.retained == false
|
|
860
|
+
and (.diagnostic_artifacts | has("error") | not)
|
|
861
|
+
'\'' >/dev/null'
|
|
862
|
+
|
|
863
|
+
mkdir -p "$WORK/large-log-diagnostics"
|
|
864
|
+
out="$(run_native_timeout_wrapper native_large_log_timeout "$WORK/large-log-diagnostics" 8)"; rc=$?
|
|
865
|
+
large_log_diagnostic_name="$(printf '%s' "$out" | jq -r '.diagnostic_artifacts.directory_name // empty')"
|
|
866
|
+
large_log_diagnostic_path="$WORK/large-log-diagnostics/$large_log_diagnostic_name"
|
|
867
|
+
check "oversized runtime logs are omitted and reported as truncated" \
|
|
868
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = review_native_skill_stream_timeout ] && [ -n "$large_log_diagnostic_name" ] && [ ! -e "$large_log_diagnostic_path/opencode-logs/oversized.log" ] && printf %s "$out" | jq -e '\''
|
|
869
|
+
.diagnostic_artifacts.artifacts_truncated == true
|
|
870
|
+
and .diagnostic_artifacts.logs_truncated == true
|
|
871
|
+
'\'' >/dev/null && jq -e '\''
|
|
872
|
+
.artifacts_truncated == true
|
|
873
|
+
and .logs_truncated == true
|
|
874
|
+
and .limits.max_file_bytes == 5242880
|
|
875
|
+
and .limits.max_total_bytes == 20971520
|
|
876
|
+
and .limits.max_log_files == 1000
|
|
877
|
+
and .limits.max_log_entries == 5000
|
|
878
|
+
'\'' "$large_log_diagnostic_path/manifest.json" >/dev/null'
|
|
879
|
+
|
|
880
|
+
mkdir -p "$WORK/rotating-log-diagnostics"
|
|
881
|
+
export FAIL_LOG_COPY=1
|
|
882
|
+
out="$(run_native_timeout_wrapper native_stream_timeout "$WORK/rotating-log-diagnostics")"; rc=$?
|
|
883
|
+
unset FAIL_LOG_COPY
|
|
884
|
+
rotating_log_diagnostic_name="$(printf '%s' "$out" | jq -r '.diagnostic_artifacts.directory_name // empty')"
|
|
885
|
+
rotating_log_diagnostic_path="$WORK/rotating-log-diagnostics/$rotating_log_diagnostic_name"
|
|
886
|
+
check "one unreadable runtime log does not discard the remaining timeout evidence" \
|
|
887
|
+
'[ "$rc" = 2 ] && [ -n "$rotating_log_diagnostic_name" ] && [ -f "$rotating_log_diagnostic_path/review-events.jsonl" ] && [ ! -e "$rotating_log_diagnostic_path/opencode-logs/reviewer.log" ] && printf %s "$out" | jq -e '\''
|
|
888
|
+
.diagnostic_artifacts.artifacts_truncated == true
|
|
889
|
+
and .diagnostic_artifacts.logs_truncated == true
|
|
890
|
+
'\'' >/dev/null'
|
|
891
|
+
|
|
892
|
+
mkdir -p "$WORK/interrupted-copy-diagnostics"
|
|
893
|
+
printf '%s' native_slow_copy_timeout >"$WORK/state/review_mode"
|
|
894
|
+
rm -f "$WORK/state/slow_artifact_copy_started" "$WORK/interrupted-copy.out"
|
|
895
|
+
env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" \
|
|
896
|
+
XDG_DATA_HOME="$WORK/source-data" SLOW_ARTIFACT_COPY=1 \
|
|
897
|
+
bash "$WRAPPER" --implementer-family claude --diff-file "$WORK/diff.patch" \
|
|
898
|
+
--review-profile-file "$WORK/native-review-profile.json" \
|
|
899
|
+
--skill-registry-root "$WORK/skill-registry" --review-skill testing-strategy \
|
|
900
|
+
--timeout 5 --diagnostic-dir "$WORK/interrupted-copy-diagnostics" \
|
|
901
|
+
>"$WORK/interrupted-copy.out" &
|
|
902
|
+
interrupted_copy_pid=$!
|
|
903
|
+
for _ in {1..100}; do
|
|
904
|
+
[ -e "$WORK/state/slow_artifact_copy_started" ] && break
|
|
905
|
+
sleep 0.1
|
|
906
|
+
done
|
|
907
|
+
kill -TERM "$interrupted_copy_pid"
|
|
908
|
+
wait "$interrupted_copy_pid"; interrupted_copy_rc=$?
|
|
909
|
+
interrupted_copy_out="$(cat "$WORK/interrupted-copy.out")"
|
|
910
|
+
check "operator interrupt during diagnostic copy removes the unreported sensitive child" \
|
|
911
|
+
'[ "$interrupted_copy_rc" = 2 ] && [ "$(field reason_code "$interrupted_copy_out")" = operator_interrupt ] && [ -z "$(find "$WORK/interrupted-copy-diagnostics" -mindepth 1 -print -quit)" ]'
|
|
912
|
+
|
|
913
|
+
mkdir -p "$WORK/closed-stdout-diagnostics"
|
|
914
|
+
printf '%s' native_stream_timeout >"$WORK/state/review_mode"
|
|
915
|
+
env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" \
|
|
916
|
+
XDG_DATA_HOME="$WORK/source-data" \
|
|
917
|
+
bash "$WRAPPER" --implementer-family claude --diff-file "$WORK/diff.patch" \
|
|
918
|
+
--review-profile-file "$WORK/native-review-profile.json" \
|
|
919
|
+
--skill-registry-root "$WORK/skill-registry" --review-skill testing-strategy \
|
|
920
|
+
--timeout 5 --diagnostic-dir "$WORK/closed-stdout-diagnostics" >&-; closed_stdout_rc=$?
|
|
921
|
+
check "closed stdout cannot strand an unreported diagnostic child" \
|
|
922
|
+
'[ "$closed_stdout_rc" = 2 ] && [ -z "$(find "$WORK/closed-stdout-diagnostics" -mindepth 1 -print -quit)" ]'
|
|
923
|
+
|
|
924
|
+
cat >"$WORK/post-write-signal-env.sh" <<'STUB'
|
|
925
|
+
if [ -z "${WRAPPER_TEST_PID:-}" ]; then
|
|
926
|
+
WRAPPER_TEST_PID="$$"
|
|
927
|
+
export WRAPPER_TEST_PID
|
|
928
|
+
fi
|
|
929
|
+
trap 'case "$BASH_COMMAND" in TIMEOUT_ARTIFACT_REPORTED=*true*) : >"$POST_WRITE_SIGNAL_MARKER"; kill -TERM "$WRAPPER_TEST_PID"; trap - DEBUG ;; esac' DEBUG
|
|
930
|
+
STUB
|
|
931
|
+
mkdir -p "$WORK/post-write-signal-diagnostics"
|
|
932
|
+
export BASH_ENV="$WORK/post-write-signal-env.sh"
|
|
933
|
+
export POST_WRITE_SIGNAL_MARKER="$WORK/state/post-write-signal-fired"
|
|
934
|
+
rm -f "$POST_WRITE_SIGNAL_MARKER"
|
|
935
|
+
out="$(run_native_timeout_wrapper native_stream_timeout "$WORK/post-write-signal-diagnostics")"; rc=$?
|
|
936
|
+
unset BASH_ENV POST_WRITE_SIGNAL_MARKER WRAPPER_TEST_PID
|
|
937
|
+
post_write_diagnostic_name="$(printf '%s' "$out" | jq -r '.diagnostic_artifacts.directory_name // empty')"
|
|
938
|
+
check "signal after stdout handoff preserves the reported diagnostic child without duplicate output" \
|
|
939
|
+
'[ "$rc" = 2 ] && [ -e "$WORK/state/post-write-signal-fired" ] && [ -n "$post_write_diagnostic_name" ] && [ -d "$WORK/post-write-signal-diagnostics/$post_write_diagnostic_name" ] && [ "$(printf '\''%s\n'\'' "$out" | wc -l | tr -d '\''[:space:]'\'')" = 1 ]'
|
|
940
|
+
|
|
941
|
+
mkdir -p "$WORK/generic-timeout-diagnostics"
|
|
942
|
+
out="$(run_native_timeout_wrapper pre_stream_timeout "$WORK/generic-timeout-diagnostics")"; rc=$?
|
|
943
|
+
generic_diagnostic_name="$(printf '%s' "$out" | jq -r '.diagnostic_artifacts.directory_name // empty')"
|
|
944
|
+
check "owner-aware timeout without stream evidence keeps the generic classification" \
|
|
945
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = review_timeout ] && [ "$(field reason_code "$out")" = timeout ] && [ "$(field cascade_eligible "$out")" = True ] && [ -n "$generic_diagnostic_name" ] && [ -d "$WORK/generic-timeout-diagnostics/$generic_diagnostic_name" ] && printf %s "$out" | jq -e '\''
|
|
946
|
+
.timeout_diagnostic.native_owner_skills_requested == true
|
|
947
|
+
and .timeout_diagnostic.session_id_observed == false
|
|
948
|
+
and .diagnostic_artifacts.requested == true
|
|
949
|
+
and .diagnostic_artifacts.retained == true
|
|
950
|
+
'\'' >/dev/null'
|
|
951
|
+
out="$(run_native_timeout_wrapper invalid_stream_timeout)"; rc=$?
|
|
952
|
+
check "non-JSON transport bytes do not prove a native owner-skill stream" \
|
|
953
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = review_timeout ] && [ "$(field reason_code "$out")" = timeout ] && [ "$(field cascade_eligible "$out")" = True ]'
|
|
954
|
+
out="$(run_native_timeout_wrapper session_only_timeout)"; rc=$?
|
|
955
|
+
check "session creation without a structured stream part keeps the generic timeout" \
|
|
956
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = review_timeout ] && [ "$(field reason_code "$out")" = timeout ] && [ "$(field cascade_eligible "$out")" = True ]'
|
|
957
|
+
|
|
958
|
+
printf '%s' legacy_stream_timeout >"$WORK/state/review_mode"
|
|
959
|
+
rm -f "$WORK/state/review_runs" "$WORK/state"/review_prompt_* \
|
|
960
|
+
"$WORK/state/selected_skill_only"
|
|
961
|
+
out="$(env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" XDG_DATA_HOME="$WORK/source-data" bash "$WRAPPER" --implementer-family claude --diff-file "$WORK/diff.patch" --timeout 5)"; rc=$?
|
|
962
|
+
check "structured stream progress without owner skills keeps the generic timeout" \
|
|
963
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = review_timeout ] && [ "$(field reason_code "$out")" = timeout ] && [ "$(field cascade_eligible "$out")" = True ]'
|
|
964
|
+
|
|
965
|
+
mkdir -p "$WORK/success-diagnostics"
|
|
966
|
+
out="$(printf '%s' pass_first >"$WORK/state/review_mode"; env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" XDG_DATA_HOME="$WORK/source-data" bash "$WRAPPER" --implementer-family claude --diff-file "$WORK/diff.patch" --review-profile-file "$WORK/native-review-profile.json" --skill-registry-root "$WORK/skill-registry" --review-skill testing-strategy --diagnostic-dir "$WORK/success-diagnostics" --timeout 30)"; rc=$?
|
|
967
|
+
check "successful native owner-skill review does not retain timeout diagnostics" \
|
|
968
|
+
'[ "$rc" = 0 ] && [ "$(field status "$out")" = passed ] && [ -z "$(find "$WORK/success-diagnostics" -mindepth 1 -print -quit)" ]'
|
|
969
|
+
|
|
970
|
+
out="$(run_wrapper signal_exit)"; rc=$?
|
|
971
|
+
check "OpenCode process signals are terminal operator interrupts" \
|
|
972
|
+
'[ "$rc" = 2 ] && [ "$(field reason_code "$out")" = operator_interrupt ] && [ "$(field cascade_eligible "$out")" = False ]'
|
|
973
|
+
|
|
974
|
+
out="$(run_wrapper provider_balance_exhausted)"; rc=$?
|
|
975
|
+
check "OpenCode classifies structured provider billing exhaustion as fallback quota" \
|
|
976
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = provider_billing_exhausted ] && [ "$(field reason_code "$out")" = quota ] && [ "$(field cascade_eligible "$out")" = True ] && [ "$(field transport_exit_code "$out")" = 1 ]'
|
|
977
|
+
|
|
978
|
+
out="$(run_wrapper provider_balance_then_server_error)"; rc=$?
|
|
979
|
+
check "OpenCode preserves an earlier structured billing error when later events differ" \
|
|
980
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = provider_billing_exhausted ] && [ "$(field reason_code "$out")" = quota ] && [ "$(field cascade_eligible "$out")" = True ] && [ "$(field transport_exit_code "$out")" = 1 ]'
|
|
981
|
+
|
|
982
|
+
out="$(run_wrapper provider_auth_then_server_error)"; rc=$?
|
|
983
|
+
check "OpenCode preserves an earlier structured authentication error when later events differ" \
|
|
984
|
+
'[ "$rc" = 2 ] && [ "$(field reason "$out")" = provider_auth_unavailable ] && [ "$(field reason_code "$out")" = provider_unavailable ] && [ "$(field cascade_eligible "$out")" = True ] && [ "$(field transport_exit_code "$out")" = 1 ]'
|
|
985
|
+
|
|
986
|
+
printf '%s' interrupt_wait >"$WORK/state/review_mode"
|
|
987
|
+
rm -f "$WORK/state/review_runs" "$WORK/state"/review_prompt_* "$WORK/state/interrupt_waiting"
|
|
988
|
+
env PATH="$WORK/bin:$PATH" TMPDIR="$WORK/tmp" STUB_STATE_DIR="$WORK/state" \
|
|
989
|
+
XDG_DATA_HOME="$WORK/source-data" \
|
|
990
|
+
bash "$WRAPPER" --implementer-family claude --diff-file "$WORK/diff.patch" \
|
|
991
|
+
--timeout 30 >"$WORK/interrupt.out" &
|
|
992
|
+
interrupt_pid=$!
|
|
993
|
+
for _ in {1..100}; do
|
|
994
|
+
[ -e "$WORK/state/interrupt_waiting" ] && break
|
|
995
|
+
sleep 0.02
|
|
996
|
+
done
|
|
997
|
+
kill -TERM "$interrupt_pid"
|
|
998
|
+
wait "$interrupt_pid"
|
|
999
|
+
interrupt_rc=$?
|
|
1000
|
+
out="$(cat "$WORK/interrupt.out")"
|
|
1001
|
+
check "operator interrupt is terminal and cannot cascade" \
|
|
1002
|
+
'[ "$interrupt_rc" = 2 ] && [ "$(field reason_code "$out")" = operator_interrupt ] && [ "$(field cascade_eligible "$out")" = False ]'
|
|
1003
|
+
|
|
1004
|
+
echo ----
|
|
1005
|
+
if [ "$fails" -eq 0 ]; then echo "opencode_review_retry_tests_ok"; else echo "$fails FAILURES"; exit 1; fi
|