@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,173 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# MR target-branch freshness gate.
|
|
3
|
+
#
|
|
4
|
+
# Failure class this blocks: a delivery branched off — and an MR targeted at — an
|
|
5
|
+
# integration branch that is no longer live. The observed instance: `dev` sat at
|
|
6
|
+
# 0 commits ahead of `main` and 279 behind, still carried the pre-slimming
|
|
7
|
+
# entrypoints, and ran an ADVISORY copy of the size gate that `main` runs as
|
|
8
|
+
# BLOCKING. An MR merged there is invisible on the real integration branch and
|
|
9
|
+
# silently bypasses whatever gates the default branch has since tightened.
|
|
10
|
+
#
|
|
11
|
+
# Predicate (decidable from git alone — no repo-policy knowledge, no API):
|
|
12
|
+
# target is NOT the default branch
|
|
13
|
+
# AND target is 0 commits AHEAD of the default branch (carries nothing of its own)
|
|
14
|
+
# AND target is >= STALE_BEHIND_MIN commits BEHIND it (meaningfully abandoned)
|
|
15
|
+
#
|
|
16
|
+
# Both conjuncts matter. "Behind the default branch" alone would flag every
|
|
17
|
+
# legitimate long-lived target; the 0-ahead conjunct is what makes it precise:
|
|
18
|
+
# - release/x.y while it carries cherry-picks or version bumps the default
|
|
19
|
+
# lacks => ahead > 0 => never fires. A maintained release branch whose
|
|
20
|
+
# patches have ALL been merged forward is legitimately 0-ahead and topology
|
|
21
|
+
# cannot distinguish it from an abandoned mirror — that case is what
|
|
22
|
+
# MR_TARGET_FRESHNESS_ALLOW exists for — a declared exemption, not an
|
|
23
|
+
# authority check (see the enforcement boundary below).
|
|
24
|
+
# - promote/* cut off the default — ahead-or-equal by construction, not behind
|
|
25
|
+
# => never fires.
|
|
26
|
+
# - a stacked MR targeting another feature branch — that branch has its own
|
|
27
|
+
# commits => never fires.
|
|
28
|
+
# - a dead mirror like `dev` — 0 ahead, far behind => fires.
|
|
29
|
+
# Scored against every remote branch in this repo when the gate was written:
|
|
30
|
+
# only the genuinely dead ones matched.
|
|
31
|
+
#
|
|
32
|
+
# Not an MR pipeline => no-op. Refs unresolvable, default branch undetermined,
|
|
33
|
+
# fork MR, or STALE_BEHIND_MIN malformed => fail CLOSED (exit 1): a gate that
|
|
34
|
+
# paints the job green while printing "not a pass" is the false-green this whole
|
|
35
|
+
# gate exists to prevent.
|
|
36
|
+
#
|
|
37
|
+
# ENFORCEMENT BOUNDARY — read before trusting this as a control.
|
|
38
|
+
# A merge-request pipeline runs the `.gitlab-ci.yml` of the SOURCE branch, and
|
|
39
|
+
# the merge request owns that file. Two consequences, both verified:
|
|
40
|
+
# 1. A branch cut from a stale base carries that base's CI config. `dev` has no
|
|
41
|
+
# `check-mr-target-freshness` job at all, so an MR sourced from a dev-based
|
|
42
|
+
# branch never creates this job — which is exactly the shape that motivated
|
|
43
|
+
# the gate (MR !510). This script CANNOT catch that case.
|
|
44
|
+
# 2. EVERY input it reads can be overridden from candidate-owned YAML —
|
|
45
|
+
# `CI_DEFAULT_BRANCH`, `MR_TARGET_FRESHNESS_ALLOW`, `STALE_BEHIND_MIN`,
|
|
46
|
+
# `CI_MERGE_REQUEST_TARGET_BRANCH_NAME`, and both project-ID variables the
|
|
47
|
+
# fork check reads. So the target and fork predicates are candidate-
|
|
48
|
+
# influenced too, not just the allowlist and the threshold. No shell script
|
|
49
|
+
# can establish that a variable came from a maintainer.
|
|
50
|
+
# So this is DEFENCE IN DEPTH, not an enforceable gate. What it does buy: a
|
|
51
|
+
# branch cut from a current base that is then mis-targeted at a dead branch gets
|
|
52
|
+
# caught, and the failure class becomes visible in CI output instead of being
|
|
53
|
+
# noticed only in review. Actually closing the class needs enforcement the merge
|
|
54
|
+
# request cannot replace — a project- or group-level required/compliance
|
|
55
|
+
# pipeline, or a server-side merge rule — which is a maintainer setting outside
|
|
56
|
+
# this repository's files. Do not describe this script as closing the class.
|
|
57
|
+
set -euo pipefail
|
|
58
|
+
|
|
59
|
+
root="${1:-$(pwd)}"
|
|
60
|
+
cd "$root"
|
|
61
|
+
|
|
62
|
+
target="${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-}"
|
|
63
|
+
if [ -z "$target" ]; then
|
|
64
|
+
echo "mr_target_freshness_skipped: not a merge-request pipeline"
|
|
65
|
+
exit 0
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
default="${CI_DEFAULT_BRANCH:-}"
|
|
69
|
+
if [ -z "$default" ]; then
|
|
70
|
+
default="$(git symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null | sed 's|^origin/||' || true)"
|
|
71
|
+
fi
|
|
72
|
+
if [ -z "$default" ]; then
|
|
73
|
+
# Guessing "main" here would compare against a branch that may not be the
|
|
74
|
+
# default at all. An undetermined default branch is an unevaluated gate.
|
|
75
|
+
echo "mr_target_freshness_unevaluated: default branch is undetermined (CI_DEFAULT_BRANCH unset and origin/HEAD unresolvable) — this is NOT a pass" >&2
|
|
76
|
+
exit 1
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# A fork MR's `origin` is the fork; the target branch lives in the upstream
|
|
80
|
+
# project, so same-named refs here would measure an unrelated branch.
|
|
81
|
+
src_pid="${CI_MERGE_REQUEST_SOURCE_PROJECT_ID:-}"
|
|
82
|
+
tgt_pid="${CI_MERGE_REQUEST_PROJECT_ID:-}"
|
|
83
|
+
if [ -n "$src_pid" ] || [ -n "$tgt_pid" ]; then
|
|
84
|
+
if [ -z "$src_pid" ] || [ -z "$tgt_pid" ]; then
|
|
85
|
+
# One present and one missing means the fork question cannot be answered;
|
|
86
|
+
# treating that as same-project would be fail-open.
|
|
87
|
+
echo "mr_target_freshness_unevaluated: incomplete merge-request project metadata (source='$src_pid' target='$tgt_pid') — cannot determine whether this is a fork; this is NOT a pass" >&2
|
|
88
|
+
exit 1
|
|
89
|
+
fi
|
|
90
|
+
if [ "$src_pid" != "$tgt_pid" ]; then
|
|
91
|
+
echo "mr_target_freshness_unevaluated: fork merge request (source project $src_pid != target project $tgt_pid) — origin is the fork, so its branches are not the target project's; this is NOT a pass" >&2
|
|
92
|
+
exit 1
|
|
93
|
+
fi
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
if [ "$target" = "$default" ]; then
|
|
97
|
+
echo "mr_target_freshness_ok: target=$target is the default branch"
|
|
98
|
+
exit 0
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
# A live integration target that is legitimately 0-ahead — e.g. a maintained
|
|
102
|
+
# release branch whose hotfixes have all been merged forward — cannot be told
|
|
103
|
+
# apart from an abandoned mirror by topology alone, so it needs a declared
|
|
104
|
+
# exemption. Intended to be set as a project CI variable; note that nothing
|
|
105
|
+
# here can enforce that, because candidate-owned YAML can set it too (see the
|
|
106
|
+
# enforcement boundary above). It is a declaration, not an authority check.
|
|
107
|
+
# `set -f` so a branch name is compared literally: an unquoted expansion would
|
|
108
|
+
# glob against the working tree and silently change allowlist membership.
|
|
109
|
+
set -f
|
|
110
|
+
for allowed in ${MR_TARGET_FRESHNESS_ALLOW:-}; do
|
|
111
|
+
if [ "$target" = "$allowed" ]; then
|
|
112
|
+
set +f
|
|
113
|
+
echo "mr_target_freshness_ok: target=$target is in MR_TARGET_FRESHNESS_ALLOW (maintainer-declared live integration branch)"
|
|
114
|
+
exit 0
|
|
115
|
+
fi
|
|
116
|
+
done
|
|
117
|
+
set +f
|
|
118
|
+
|
|
119
|
+
stale_behind_min="${STALE_BEHIND_MIN:-50}"
|
|
120
|
+
case "$stale_behind_min" in
|
|
121
|
+
'' | *[!0-9]*)
|
|
122
|
+
echo "mr_target_freshness_misconfigured: STALE_BEHIND_MIN='$stale_behind_min' is not a non-negative integer — refusing to run rather than silently passing" >&2
|
|
123
|
+
exit 1
|
|
124
|
+
;;
|
|
125
|
+
esac
|
|
126
|
+
# Digits alone are not enough: a value wider than a machine integer makes the
|
|
127
|
+
# `-ge` test abort with "integer expected", and because that abort happens in an
|
|
128
|
+
# `if` condition it is exempt from `set -e` and falls through to the ok path.
|
|
129
|
+
if [ "${#stale_behind_min}" -gt 9 ]; then
|
|
130
|
+
echo "mr_target_freshness_misconfigured: STALE_BEHIND_MIN='$stale_behind_min' exceeds 9 digits — refusing rather than risking the numeric comparison aborting into a pass (not every such value overflows; 9 digits is a conservative bound, well above any real commit count)" >&2
|
|
131
|
+
exit 1
|
|
132
|
+
fi
|
|
133
|
+
|
|
134
|
+
# ALWAYS force-fetch both refs. A reused runner checkout can carry a stale
|
|
135
|
+
# origin/<branch>, and measuring against historical topology is how a
|
|
136
|
+
# now-dead target would score as healthy.
|
|
137
|
+
# One fetch for both refspecs: two sequential fetches can observe two different
|
|
138
|
+
# moments. This narrows the window; it does not close it — a push to either
|
|
139
|
+
# branch after measurement can still leave a stale verdict, which is why this
|
|
140
|
+
# gate is a check on the MR as opened, not a merge-time invariant.
|
|
141
|
+
fetch_ok=1
|
|
142
|
+
git fetch --quiet --no-tags --force origin \
|
|
143
|
+
"+refs/heads/$target:refs/remotes/origin/$target" \
|
|
144
|
+
"+refs/heads/$default:refs/remotes/origin/$default" 2>/dev/null || fetch_ok=0
|
|
145
|
+
|
|
146
|
+
if [ "$fetch_ok" -eq 0 ] \
|
|
147
|
+
|| ! git rev-parse --verify --quiet "refs/remotes/origin/$target" >/dev/null \
|
|
148
|
+
|| ! git rev-parse --verify --quiet "refs/remotes/origin/$default" >/dev/null; then
|
|
149
|
+
# Fail CLOSED. Exiting 0 here would paint the job green while the log says
|
|
150
|
+
# "not a pass", which is the false-green this gate exists to prevent. This
|
|
151
|
+
# repo clones with GIT_DEPTH: "0", so both refs are reachable in a healthy
|
|
152
|
+
# pipeline; an unresolvable ref is a real problem, not routine noise.
|
|
153
|
+
echo "mr_target_freshness_unevaluated: could not resolve origin/$target or origin/$default — this is NOT a pass, and the gate fails closed" >&2
|
|
154
|
+
echo " if the target genuinely lives in another project (fork MR), fetch it explicitly or declare it in MR_TARGET_FRESHNESS_ALLOW" >&2
|
|
155
|
+
exit 1
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
ahead="$(git rev-list --count "origin/$default..origin/$target")"
|
|
159
|
+
behind="$(git rev-list --count "origin/$target..origin/$default")"
|
|
160
|
+
|
|
161
|
+
echo "mr_target_freshness: target=$target default=$default ahead=$ahead behind=$behind threshold=$stale_behind_min"
|
|
162
|
+
|
|
163
|
+
if [ "$ahead" -eq 0 ] && [ "$behind" -ge "$stale_behind_min" ]; then
|
|
164
|
+
{
|
|
165
|
+
echo "mr_target_freshness_stale: target branch '$target' carries nothing the default branch '$default' lacks (ahead=0) and is $behind commits behind it"
|
|
166
|
+
echo " why this blocks: merging here does not reach '$default', and '$target' may still run older/weaker versions of the repo's gates than '$default' does"
|
|
167
|
+
echo " fix: retarget this MR to '$default', and rebase or re-cut the source branch off '$default'"
|
|
168
|
+
echo " if '$target' really is a live integration branch that is legitimately 0-ahead (all its patches merged forward), a maintainer declares it in MR_TARGET_FRESHNESS_ALLOW"
|
|
169
|
+
} >&2
|
|
170
|
+
exit 1
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
echo "mr_target_freshness_ok"
|
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Entrypoint size gate: machine-readable anti-regrowth signal PLUS delta-blocking.
|
|
3
|
+
#
|
|
4
|
+
# Blocking (delta-scoped, per changed skills/*/SKILL.md):
|
|
5
|
+
# - a changed entrypoint that is NEW or CROSSES over 50000 bytes (base was not
|
|
6
|
+
# severe) => block ("new severe entrypoint")
|
|
7
|
+
# - a changed entrypoint already over 50000 bytes in base that GREW
|
|
8
|
+
# (head_bytes > base_bytes) => block ("severe entrypoint grew")
|
|
9
|
+
# Existing severe files may be edited and shrunk — only growth blocks. Files at or
|
|
10
|
+
# under 50000 bytes may grow freely up to the threshold. This delta shape stops
|
|
11
|
+
# the monotonic-growth bleeding without retroactively gating every edit of the
|
|
12
|
+
# three legacy mega-entrypoints, and without rewarding a rush to pre-shrink.
|
|
13
|
+
#
|
|
14
|
+
# Blocking (delta-scoped, agent-context/session-start.md — the every-session injection):
|
|
15
|
+
# - a CHANGED agent-context/session-start.md whose head_bytes > base_bytes => block ("agent-context/session-start.md
|
|
16
|
+
# grew"); it may always shrink or be edited at the same size. The always-on
|
|
17
|
+
# layer is permanently in the severe class: every net growth must be offset by
|
|
18
|
+
# equal compression, and a fixed byte tripwire cannot express that (the layer
|
|
19
|
+
# already exceeds any achievable fixed number at its zero-loss floor, so a
|
|
20
|
+
# fixed tripwire either false-reds or degrades to a permanently-firing
|
|
21
|
+
# advisory = no signal). A agent-context/session-start.md absent from base is treated as a NEW
|
|
22
|
+
# every-session injection and blocks like a new severe entrypoint.
|
|
23
|
+
#
|
|
24
|
+
# Advisory (never blocks on its own): the recommended-band body-char debt
|
|
25
|
+
# counters, severe-debt counters, per-file deltas, and the agent-context/session-start.md 13000B
|
|
26
|
+
# byte tripwire BAND remain VISIBILITY / DEBT-MANAGEMENT only (the band flags the
|
|
27
|
+
# zero-loss floor overshoot; the NET-GROWTH delta above is what blocks), and the
|
|
28
|
+
# legacy ok markers are printed on clean verdicts (on a block/partial the last
|
|
29
|
+
# token is always the failure marker, never an ok). Exceeding the recommended
|
|
30
|
+
# band is NOT a clean-landing waiver and NOT authorization to keep growing an
|
|
31
|
+
# entrypoint; a new/expanded large entrypoint must still record its rationale
|
|
32
|
+
# and a split plan.
|
|
33
|
+
#
|
|
34
|
+
# Two metrics, two thresholds (kept distinct on purpose):
|
|
35
|
+
# - entrypoint body CHARS > 5000 => "debt" (over the recommended 1k–5k body band)
|
|
36
|
+
# - whole-file BYTES > 50000 => "severe debt" (historical mega-entrypoint)
|
|
37
|
+
# A third metric is blocking for changed entrypoints:
|
|
38
|
+
# - entrypoint body WORDS > 5000 => block for new/within-limit files; a
|
|
39
|
+
# historical over-limit file may stay level or shrink, but may not grow.
|
|
40
|
+
# The word metric excludes YAML frontmatter. It counts Unicode letter/number
|
|
41
|
+
# runs as words and each Han ideograph as one deterministic word-equivalent unit.
|
|
42
|
+
# The anti-bypass guarantee is therefore calibrated for space-delimited scripts
|
|
43
|
+
# plus Han; other unspaced scripts remain one Unicode letter/number run.
|
|
44
|
+
# The canonical validator separately parses frontmatter as YAML and rejects a
|
|
45
|
+
# description longer than 800 chars. Other frontmatter keys are outside this
|
|
46
|
+
# body-word gate and are not claimed to have a length cap here.
|
|
47
|
+
# Body chars are measured after stripping YAML frontmatter (the recommended-band
|
|
48
|
+
# metric the B0 checklist uses); whole-file bytes are the LC_ALL=C-equivalent size
|
|
49
|
+
# (Ruby File.size returns bytes), matching the legacy `wc -c` 50KB advisory.
|
|
50
|
+
#
|
|
51
|
+
# agent-context/session-start.md (the every-session injection) keeps its own BYTE tripwire band
|
|
52
|
+
# (advisory) PLUS the net-growth delta block above; other always-injected
|
|
53
|
+
# surfaces (AGENTS.md, hooks) are NOT claimed here. The trailing
|
|
54
|
+
# `size_budget_advisory_(ok|partial)` marker is stateful — `_partial` if bootstrap
|
|
55
|
+
# was missing/unreadable — so it is never false "complete" evidence; the legacy
|
|
56
|
+
# markers (`size_budget_advisory_*`, `size_budget_info:`) are preserved for existing
|
|
57
|
+
# consumers on clean verdicts, and the machine tokens are added alongside them.
|
|
58
|
+
#
|
|
59
|
+
# Base requirement: the delta gate evaluates files changed vs a resolvable base
|
|
60
|
+
# (CCL_SKILL_BASE_REF, upstream, origin/main, or main — CI always exports it
|
|
61
|
+
# for pull requests). Uncommitted changes are always covered; a
|
|
62
|
+
# committed-only change with NO resolvable base is invisible by design — in that
|
|
63
|
+
# state an uncommitted severe file still fails closed (partial), and committed
|
|
64
|
+
# state is the caller's pipeline responsibility. Because that state evaluates
|
|
65
|
+
# nothing, it prints `entrypoint_size_blocking_unevaluated` rather than
|
|
66
|
+
# `entrypoint_size_blocking_ok`: a base-less run is never a pass, and a consumer
|
|
67
|
+
# that gates on the ok token must not be able to earn it by losing its base.
|
|
68
|
+
#
|
|
69
|
+
# Invoked by check-ccl-skills.sh (which fails the gate when this script exits
|
|
70
|
+
# non-zero) and exercised directly by test_check_ccl_size_budget.sh.
|
|
71
|
+
set -uo pipefail
|
|
72
|
+
|
|
73
|
+
root="${1:-.}"
|
|
74
|
+
|
|
75
|
+
if [[ ! -d "$root/skills" ]]; then
|
|
76
|
+
echo "size_budget_advisory: no skills/ directory under $root — size check skipped (advisory, not blocking)" >&2
|
|
77
|
+
echo "size_budget_advisory_partial"
|
|
78
|
+
echo "entrypoint_size_budget_advisory_ok"
|
|
79
|
+
exit 0
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
ruby -e '# encoding: UTF-8
|
|
83
|
+
begin
|
|
84
|
+
root = ARGV.fetch(0)
|
|
85
|
+
size_state = "ok"
|
|
86
|
+
|
|
87
|
+
# --- agent-context/session-start.md every-session-injection byte tripwire band (advisory) -----
|
|
88
|
+
budget_raw = ENV.fetch("BOOTSTRAP_BYTE_TRIPWIRE", "").strip
|
|
89
|
+
if budget_raw.empty?
|
|
90
|
+
budget = 13000
|
|
91
|
+
elsif budget_raw.match?(/\A\d+\z/)
|
|
92
|
+
budget = budget_raw.to_i
|
|
93
|
+
else
|
|
94
|
+
warn "size_budget_advisory: BOOTSTRAP_BYTE_TRIPWIRE not numeric — using 13000"
|
|
95
|
+
budget = 13000
|
|
96
|
+
end
|
|
97
|
+
bootstrap = File.join(root, "agent-context/session-start.md")
|
|
98
|
+
if File.readable?(bootstrap) && File.file?(bootstrap)
|
|
99
|
+
bb = File.size(bootstrap)
|
|
100
|
+
if bb > budget
|
|
101
|
+
warn "size_budget_advisory: agent-context/session-start.md is #{bb}B (> #{budget}B advisory tripwire band) — it injects into EVERY session; the band is visibility only, the blocking rule is NET GROWTH vs base (delta verdict below): before adding, consolidate an existing rule or move detail into an owner skill"
|
|
102
|
+
end
|
|
103
|
+
else
|
|
104
|
+
size_state = "partial"
|
|
105
|
+
warn "size_budget_advisory: agent-context/session-start.md missing or unreadable — size check skipped (advisory, not blocking)"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# --- entrypoint body-char/word debt + whole-file byte severe-debt -----------
|
|
109
|
+
def strip_frontmatter(text)
|
|
110
|
+
text.sub(/\A---\r?\n.*?\r?\n---\r?\n/m, "")
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
WORD_BUDGET_MAX = 5000
|
|
114
|
+
WORD_TOKEN_PATTERN = /\p{Han}|\uFFFD|(?:(?!\p{Han})[\p{L}\p{N}])+(?:[\u0027\u2019_-](?:(?!\p{Han})[\p{L}\p{N}])+)*/u
|
|
115
|
+
|
|
116
|
+
Metric = Struct.new(:body_chars, :body_words, :bytes, keyword_init: true)
|
|
117
|
+
|
|
118
|
+
def metric_for_text(text)
|
|
119
|
+
raw = text.b
|
|
120
|
+
text = raw.dup.force_encoding(Encoding::UTF_8).scrub { |invalid| "\uFFFD" * invalid.bytesize }
|
|
121
|
+
body = strip_frontmatter(text)
|
|
122
|
+
Metric.new(body_chars: body.length, body_words: body.scan(WORD_TOKEN_PATTERN).length, bytes: raw.bytesize)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def metric_for_file(path)
|
|
126
|
+
metric_for_text(File.binread(path))
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def debt_count(metrics)
|
|
130
|
+
metrics.count { |m| m.body_chars > 5000 }
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def severe_count(metrics)
|
|
134
|
+
metrics.count { |m| m.bytes > 50000 }
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def word_over_limit_count(metrics)
|
|
138
|
+
metrics.count { |m| m.body_words > WORD_BUDGET_MAX }
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def git_success?(*args, root:)
|
|
142
|
+
system("git", "-C", root, *args, out: File::NULL, err: File::NULL)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def git_lines(*args, root:)
|
|
146
|
+
IO.popen(["git", "-C", root, *args], err: File::NULL, &:read).lines.map(&:strip).reject(&:empty?)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def git_text(*args, root:)
|
|
150
|
+
IO.popen(["git", "-C", root, *args], err: File::NULL, &:read)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def resolve_base(root)
|
|
154
|
+
return [nil, "not-a-git-worktree"] unless git_success?("rev-parse", "--is-inside-work-tree", root: root)
|
|
155
|
+
|
|
156
|
+
candidates = []
|
|
157
|
+
env_base = ENV.fetch("CCL_SKILL_BASE_REF", "").strip
|
|
158
|
+
candidates << [env_base, "CCL_SKILL_BASE_REF"] unless env_base.empty?
|
|
159
|
+
if env_base.empty?
|
|
160
|
+
upstream_ref = git_text("rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{upstream}", root: root).strip
|
|
161
|
+
candidates << [upstream_ref, "upstream"] unless upstream_ref.empty?
|
|
162
|
+
candidates << ["origin/main", "origin/main"]
|
|
163
|
+
candidates << ["main", "main"]
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
candidates.each do |candidate, source|
|
|
167
|
+
merge_base = git_text("merge-base", candidate, "HEAD", root: root).strip
|
|
168
|
+
return [merge_base, source] unless merge_base.empty?
|
|
169
|
+
end
|
|
170
|
+
[nil, env_base.empty? ? "merge-base-unavailable" : "CCL_SKILL_BASE_REF-unavailable"]
|
|
171
|
+
rescue StandardError => e
|
|
172
|
+
[nil, "#{e.class.name}:#{e.message.lines.first.to_s.strip}"]
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def base_skill_metrics(root, base)
|
|
176
|
+
paths = git_lines("ls-tree", "-r", "--name-only", base, "--", "skills", root: root).grep(%r{\Askills/[^/]+/SKILL\.md\z})
|
|
177
|
+
metrics = {}
|
|
178
|
+
paths.each do |rel|
|
|
179
|
+
text = git_text("show", "#{base}:#{rel}", root: root)
|
|
180
|
+
next if text.empty? && !git_success?("cat-file", "-e", "#{base}:#{rel}", root: root)
|
|
181
|
+
metrics[rel] = metric_for_text(text)
|
|
182
|
+
end
|
|
183
|
+
metrics
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def base_metric_for_path(root, base, rel)
|
|
187
|
+
return :unknown if base.nil?
|
|
188
|
+
return :missing unless git_success?("cat-file", "-e", "#{base}:#{rel}", root: root)
|
|
189
|
+
metric_for_text(git_text("show", "#{base}:#{rel}", root: root))
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def head_metric_for_path(root, rel)
|
|
193
|
+
full = File.join(root, rel)
|
|
194
|
+
return :missing unless File.file?(full)
|
|
195
|
+
metric_for_file(full)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def fmt_metric_value(metric, field)
|
|
199
|
+
case metric
|
|
200
|
+
when :unknown then "unknown"
|
|
201
|
+
when :missing then "missing"
|
|
202
|
+
else metric.public_send(field).to_s
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def fmt_delta(base_metric, head_metric, field)
|
|
207
|
+
return "unknown" unless base_metric.is_a?(Metric) && head_metric.is_a?(Metric)
|
|
208
|
+
delta = head_metric.public_send(field) - base_metric.public_send(field)
|
|
209
|
+
format("%+d", delta)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
skill_files = Dir[File.join(root, "skills", "*", "SKILL.md")].sort
|
|
213
|
+
severe_lines = []
|
|
214
|
+
head_metrics = {}
|
|
215
|
+
skill_files.each do |path|
|
|
216
|
+
rel = path.start_with?(root + "/") ? path[(root.length + 1)..] : path.sub(%r{\A\./}, "")
|
|
217
|
+
metric = metric_for_file(path)
|
|
218
|
+
head_metrics[rel] = metric
|
|
219
|
+
if metric.bytes > 50000
|
|
220
|
+
severe_lines << " entrypoint_size_severe_debt: #{rel} bytes=#{metric.bytes} hard_advisory_max=50000"
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
head_debt_count = debt_count(head_metrics.values)
|
|
224
|
+
head_severe_count = severe_count(head_metrics.values)
|
|
225
|
+
head_word_over_limit_count = word_over_limit_count(head_metrics.values)
|
|
226
|
+
|
|
227
|
+
base, base_source = resolve_base(root)
|
|
228
|
+
base_metrics = nil
|
|
229
|
+
if base
|
|
230
|
+
begin
|
|
231
|
+
base_metrics = base_skill_metrics(root, base)
|
|
232
|
+
rescue StandardError => e
|
|
233
|
+
warn "entrypoint_size_trend_partial: base=unknown reason=#{e.class.name} #{e.message.lines.first.to_s.strip}"
|
|
234
|
+
end
|
|
235
|
+
else
|
|
236
|
+
puts "entrypoint_size_trend_partial: base=unknown reason=#{base_source}"
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
base_debt_count = base_metrics ? debt_count(base_metrics.values) : nil
|
|
240
|
+
base_severe_count = base_metrics ? severe_count(base_metrics.values) : nil
|
|
241
|
+
base_word_over_limit_count = base_metrics ? word_over_limit_count(base_metrics.values) : nil
|
|
242
|
+
|
|
243
|
+
# --- changed skills/*/SKILL.md (diff-scoped; same detection shape the validator
|
|
244
|
+
# uses elsewhere) get a STABLE per-file token at edit time ----------------
|
|
245
|
+
changed = []
|
|
246
|
+
begin
|
|
247
|
+
if system("git", "-C", root, "rev-parse", "--is-inside-work-tree", out: File::NULL, err: File::NULL)
|
|
248
|
+
paths = []
|
|
249
|
+
paths.concat(git_lines("diff", "--name-only", base, "HEAD", "--", "skills/*/SKILL.md", root: root)) if base
|
|
250
|
+
paths.concat(git_lines("diff", "--name-only", "--", "skills/*/SKILL.md", root: root))
|
|
251
|
+
paths.concat(git_lines("diff", "--cached", "--name-only", "--", "skills/*/SKILL.md", root: root))
|
|
252
|
+
paths.concat(git_lines("ls-files", "--others", "--exclude-standard", "--", "skills/*/SKILL.md", root: root))
|
|
253
|
+
changed = paths.map { |p| p[%r{\Askills/[^/]+/SKILL\.md\z}] }.compact.uniq
|
|
254
|
+
end
|
|
255
|
+
rescue StandardError => e
|
|
256
|
+
warn "changed_entrypoint_size_scan_skipped: #{e.class.name} #{e.message.lines.first.to_s.strip}"
|
|
257
|
+
end
|
|
258
|
+
# agent-context/session-start.md gets the same changed-detection shape (committed vs base, staged,
|
|
259
|
+
# unstaged, untracked) for its own net-growth delta verdict below. A probe
|
|
260
|
+
# failure must not silently read as "unchanged" — that would false-green a real
|
|
261
|
+
# growth on the newly-blocking rule, so it fails closed as a partial below.
|
|
262
|
+
bootstrap_changed = false
|
|
263
|
+
bootstrap_scan_error = nil
|
|
264
|
+
begin
|
|
265
|
+
if system("git", "-C", root, "rev-parse", "--is-inside-work-tree", out: File::NULL, err: File::NULL)
|
|
266
|
+
bpaths = []
|
|
267
|
+
bpaths.concat(git_lines("diff", "--name-only", base, "HEAD", "--", "agent-context/session-start.md", root: root)) if base
|
|
268
|
+
bpaths.concat(git_lines("diff", "--name-only", "--", "agent-context/session-start.md", root: root))
|
|
269
|
+
bpaths.concat(git_lines("diff", "--cached", "--name-only", "--", "agent-context/session-start.md", root: root))
|
|
270
|
+
bpaths.concat(git_lines("ls-files", "--others", "--exclude-standard", "--", "agent-context/session-start.md", root: root))
|
|
271
|
+
bootstrap_changed = bpaths.include?("agent-context/session-start.md")
|
|
272
|
+
end
|
|
273
|
+
rescue StandardError => e
|
|
274
|
+
bootstrap_scan_error = "#{e.class.name} #{e.message.lines.first.to_s.strip}"
|
|
275
|
+
warn "changed_bootstrap_size_scan_skipped: #{bootstrap_scan_error}"
|
|
276
|
+
end
|
|
277
|
+
changed.sort.each do |rel|
|
|
278
|
+
full = File.join(root, rel)
|
|
279
|
+
head_metric = head_metric_for_path(root, rel)
|
|
280
|
+
if head_metric.is_a?(Metric)
|
|
281
|
+
if head_metric.body_chars > 5000
|
|
282
|
+
puts "changed_entrypoint_above_recommended: #{rel} body_chars=#{head_metric.body_chars} recommended_max=5000"
|
|
283
|
+
elsif head_metric.body_chars < 1000
|
|
284
|
+
puts "changed_entrypoint_below_recommended: #{rel} body_chars=#{head_metric.body_chars} recommended_min=1000 verify_trigger_owner_hardstop_pointer_do_not_pad"
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
base_metric = base_metric_for_path(root, base, rel)
|
|
288
|
+
puts "changed_entrypoint_size_delta: #{rel} base_body_chars=#{fmt_metric_value(base_metric, :body_chars)} head_body_chars=#{fmt_metric_value(head_metric, :body_chars)} delta_body_chars=#{fmt_delta(base_metric, head_metric, :body_chars)} base_bytes=#{fmt_metric_value(base_metric, :bytes)} head_bytes=#{fmt_metric_value(head_metric, :bytes)} delta_bytes=#{fmt_delta(base_metric, head_metric, :bytes)}"
|
|
289
|
+
puts "changed_entrypoint_word_delta: #{rel} base_body_words=#{fmt_metric_value(base_metric, :body_words)} head_body_words=#{fmt_metric_value(head_metric, :body_words)} delta_body_words=#{fmt_delta(base_metric, head_metric, :body_words)}"
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
unless severe_lines.empty?
|
|
293
|
+
puts "size_budget_info: SKILL.md over 50KB (advisory — obligation-bound gate registries; collapse ONLY verified reference-duplication, never inline-only gates):"
|
|
294
|
+
severe_lines.each { |l| puts l }
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# Machine-readable debt counters (visibility/debt-management, NOT a clean-landing
|
|
298
|
+
# waiver and NOT authorization to keep growing entrypoints).
|
|
299
|
+
puts "entrypoint_size_debt_count=#{head_debt_count}"
|
|
300
|
+
puts "entrypoint_size_severe_debt_count=#{head_severe_count}"
|
|
301
|
+
puts "entrypoint_size_debt_count_base=#{base_debt_count.nil? ? "unknown" : base_debt_count}"
|
|
302
|
+
puts "entrypoint_size_debt_count_head=#{head_debt_count}"
|
|
303
|
+
puts "entrypoint_size_debt_count_delta=#{base_debt_count.nil? ? "unknown" : format("%+d", head_debt_count - base_debt_count)}"
|
|
304
|
+
puts "entrypoint_size_severe_debt_count_base=#{base_severe_count.nil? ? "unknown" : base_severe_count}"
|
|
305
|
+
puts "entrypoint_size_severe_debt_count_head=#{head_severe_count}"
|
|
306
|
+
puts "entrypoint_size_severe_debt_count_delta=#{base_severe_count.nil? ? "unknown" : format("%+d", head_severe_count - base_severe_count)}"
|
|
307
|
+
puts "entrypoint_word_budget_over_limit_count_base=#{base_word_over_limit_count.nil? ? "unknown" : base_word_over_limit_count}"
|
|
308
|
+
puts "entrypoint_word_budget_over_limit_count_head=#{head_word_over_limit_count}"
|
|
309
|
+
puts "entrypoint_word_budget_over_limit_count_delta=#{base_word_over_limit_count.nil? ? "unknown" : format("%+d", head_word_over_limit_count - base_word_over_limit_count)}"
|
|
310
|
+
puts "size_budget_visibility_note: counts above are visibility/debt-management only — NOT a clean-landing waiver and NOT authorization to keep growing entrypoints; a new or expanded large entrypoint must record its rationale and split plan."
|
|
311
|
+
|
|
312
|
+
# --- delta-blocking verdict ---------------------------------------------------
|
|
313
|
+
# Word-over-limit entrypoints follow the baseline-freeze rule described above.
|
|
314
|
+
# New/crossing severe entrypoints and growth of existing severe entrypoints block.
|
|
315
|
+
# Base unknown => the growth check is unavailable; say so (partial), never silent.
|
|
316
|
+
# Move map: a git-detected RENAME (R with similarity >= 90) from a severe old
|
|
317
|
+
# path covers its OWN new path — never a sibling file, and never when the new
|
|
318
|
+
# file also grew (move+growth blocks as severe growth). `changed` collapses
|
|
319
|
+
# renames into the new path only, so R pairs are gathered from --name-status.
|
|
320
|
+
move_map = {}
|
|
321
|
+
begin
|
|
322
|
+
if system("git", "-C", root, "rev-parse", "--is-inside-work-tree", out: File::NULL, err: File::NULL)
|
|
323
|
+
status_args = []
|
|
324
|
+
status_args << ["diff", "--name-status", base, "HEAD"] if base
|
|
325
|
+
status_args << ["diff", "--name-status", "--cached"]
|
|
326
|
+
status_args << ["diff", "--name-status"]
|
|
327
|
+
status_args.each do |cmd|
|
|
328
|
+
git_lines(*cmd, "--", "skills/*/SKILL.md", root: root).each do |line|
|
|
329
|
+
status, *paths = line.split(" ")
|
|
330
|
+
next unless status.start_with?("R") && paths.length >= 2
|
|
331
|
+
next unless status[1..].to_i >= 90
|
|
332
|
+
old_rel = paths[0][%r{\Askills/[^/]+/SKILL\.md\z}]
|
|
333
|
+
new_rel = paths[1][%r{\Askills/[^/]+/SKILL\.md\z}]
|
|
334
|
+
move_map[new_rel] = old_rel if old_rel && new_rel
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
rescue StandardError => e
|
|
339
|
+
warn "move_pair_scan_skipped: #{e.class.name}"
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
blocks = []
|
|
343
|
+
partials = []
|
|
344
|
+
word_blocks = []
|
|
345
|
+
word_partials = []
|
|
346
|
+
partials << "agent-context/session-start.md: changed-detection failed (#{bootstrap_scan_error}) — net-growth check unavailable (fail-closed)" if bootstrap_scan_error && File.file?(File.join(root, "agent-context/session-start.md"))
|
|
347
|
+
changed.sort.each do |rel|
|
|
348
|
+
begin
|
|
349
|
+
head_metric = head_metric_for_path(root, rel)
|
|
350
|
+
rescue StandardError => e
|
|
351
|
+
partials << "#{rel}: head metric unreadable (#{e.class.name}) — size check unavailable (fail-closed)"
|
|
352
|
+
next
|
|
353
|
+
end
|
|
354
|
+
next if head_metric == :missing # deleted entrypoint: nothing left to size-gate
|
|
355
|
+
unless head_metric.is_a?(Metric)
|
|
356
|
+
partials << "#{rel}: head metric unavailable (#{head_metric}) — size check unavailable (fail-closed)"
|
|
357
|
+
next
|
|
358
|
+
end
|
|
359
|
+
base_metric = base_metric_for_path(root, base, rel)
|
|
360
|
+
|
|
361
|
+
if head_metric.body_words > WORD_BUDGET_MAX
|
|
362
|
+
if base_metric == :unknown
|
|
363
|
+
word_partials << "#{rel}: base unknown — historical word allowance unavailable (fail-closed)"
|
|
364
|
+
elsif base_metric == :missing || base_metric.body_words <= WORD_BUDGET_MAX
|
|
365
|
+
source_rel = move_map[rel]
|
|
366
|
+
source_metric = source_rel ? base_metric_for_path(root, base, source_rel) : nil
|
|
367
|
+
if source_metric.is_a?(Metric) && source_metric.body_words > WORD_BUDGET_MAX
|
|
368
|
+
if head_metric.body_words <= source_metric.body_words
|
|
369
|
+
puts "entrypoint_word_budget_move_ok: #{rel} head_body_words=#{head_metric.body_words} allowed_body_words=#{source_metric.body_words} moved_from=#{source_rel}"
|
|
370
|
+
else
|
|
371
|
+
word_blocks << "#{rel}: base_body_words=#{source_metric.body_words} head_body_words=#{head_metric.body_words} allowed_body_words=#{source_metric.body_words} moved_from=#{source_rel} — moved historical over-limit entrypoint grew; keep it level, shrink it, or move detail into references/"
|
|
372
|
+
end
|
|
373
|
+
else
|
|
374
|
+
word_blocks << "#{rel}: base_body_words=#{fmt_metric_value(base_metric, :body_words)} head_body_words=#{head_metric.body_words} allowed_body_words=#{WORD_BUDGET_MAX} — new or within-limit entrypoint exceeds the uniform body-word budget; move detail into references/"
|
|
375
|
+
end
|
|
376
|
+
elsif head_metric.body_words > base_metric.body_words
|
|
377
|
+
word_blocks << "#{rel}: base_body_words=#{base_metric.body_words} head_body_words=#{head_metric.body_words} allowed_body_words=#{base_metric.body_words} — historical over-limit entrypoint grew; keep it level, shrink it, or move detail into references/"
|
|
378
|
+
else
|
|
379
|
+
puts "entrypoint_word_budget_legacy_ok: #{rel} base_body_words=#{base_metric.body_words} head_body_words=#{head_metric.body_words} allowed_body_words=#{base_metric.body_words}"
|
|
380
|
+
end
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
if head_metric.bytes > 50000
|
|
384
|
+
if base_metric == :unknown
|
|
385
|
+
partials << "#{rel}: base unknown — severe-growth check unavailable (fail-closed)"
|
|
386
|
+
elsif base_metric == :missing || base_metric.bytes <= 50000
|
|
387
|
+
source_rel = move_map[rel]
|
|
388
|
+
source_metric = source_rel ? base_metric_for_path(root, base, source_rel) : nil
|
|
389
|
+
if source_metric.is_a?(Metric) && source_metric.bytes > 50000 && head_metric.bytes <= source_metric.bytes
|
|
390
|
+
puts "entrypoint_size_move_ok: #{rel} bytes=#{head_metric.bytes} — moved from #{source_rel} without growing"
|
|
391
|
+
else
|
|
392
|
+
blocks << "#{rel}: new severe entrypoint bytes=#{head_metric.bytes} (> 50000) — split into references before landing"
|
|
393
|
+
end
|
|
394
|
+
elsif head_metric.bytes > base_metric.bytes
|
|
395
|
+
blocks << "#{rel}: severe entrypoint grew base_bytes=#{base_metric.bytes} head_bytes=#{head_metric.bytes} — consolidate an existing rule or move detail into references/ (there is no exempt marker or waiver flag); a rule set must not grow monotonically"
|
|
396
|
+
end
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
# agent-context/session-start.md net-growth verdict: the always-on layer is permanently severe —
|
|
401
|
+
# ANY net growth blocks; shrink and same-size edits stay landable. Only a
|
|
402
|
+
# CHANGED agent-context/session-start.md is evaluated (an untouched over-band file must not
|
|
403
|
+
# hard-red unrelated MRs; the advisory band already reports that debt).
|
|
404
|
+
if bootstrap_changed
|
|
405
|
+
b_head = begin
|
|
406
|
+
head_metric_for_path(root, "agent-context/session-start.md")
|
|
407
|
+
rescue StandardError => e
|
|
408
|
+
partials << "agent-context/session-start.md: head metric unreadable (#{e.class.name}) — size check unavailable (fail-closed)"
|
|
409
|
+
:unreadable
|
|
410
|
+
end
|
|
411
|
+
if b_head.is_a?(Metric)
|
|
412
|
+
# The baseline is the SAME path at base, and nothing else. There is
|
|
413
|
+
# deliberately no way to nominate a different file as the yardstick: any such
|
|
414
|
+
# mechanism is a way for the candidate to choose its own budget. Relocating
|
|
415
|
+
# the always-on layer therefore reads as a new every-session injection and
|
|
416
|
+
# blocks — that is intended, not a gap. A relocation is a rare, deliberate,
|
|
417
|
+
# human-reviewed event; letting it through automatically costs more than it
|
|
418
|
+
# saves, and two rounds of independent review plus adversarial challenge
|
|
419
|
+
# broke every automatic recogniser tried here: git rename pairing (similarity
|
|
420
|
+
# is not identity, so an unrelated blob can be imported as the baseline), and
|
|
421
|
+
# parsing the BOOTSTRAP assignment out of the hook (export, eval, and
|
|
422
|
+
# same-line overrides defeat any regex; shell is not safely readable by one).
|
|
423
|
+
# NOTE: no apostrophes in this block — the whole program is a single-quoted
|
|
424
|
+
# shell string, so one would terminate it and break the script.
|
|
425
|
+
b_base = base_metric_for_path(root, base, "agent-context/session-start.md")
|
|
426
|
+
puts "changed_bootstrap_size_delta: agent-context/session-start.md base_bytes=#{fmt_metric_value(b_base, :bytes)} head_bytes=#{fmt_metric_value(b_head, :bytes)} delta_bytes=#{fmt_delta(b_base, b_head, :bytes)}"
|
|
427
|
+
if b_base == :unknown
|
|
428
|
+
partials << "agent-context/session-start.md: base unknown — every-session-injection growth check unavailable (fail-closed)"
|
|
429
|
+
elsif b_base == :missing
|
|
430
|
+
blocks << "agent-context/session-start.md: new every-session-injection file bytes=#{b_head.bytes} — it injects into EVERY session; record its rationale and keep it minimal (there is no exempt marker or waiver flag)"
|
|
431
|
+
elsif b_head.bytes > b_base.bytes
|
|
432
|
+
blocks << "agent-context/session-start.md grew base_bytes=#{b_base.bytes} head_bytes=#{b_head.bytes} — it injects into EVERY session; net growth must be offset by equal compression (consolidate an existing rule or move detail into an owner skill; there is no exempt marker or waiver flag)"
|
|
433
|
+
else
|
|
434
|
+
puts "bootstrap_size_delta_ok: agent-context/session-start.md base_bytes=#{b_base.bytes} head_bytes=#{b_head.bytes} — no net growth"
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
# :missing (deleted) => nothing left to size-gate, same as a deleted entrypoint
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
# Advisory markers only when the blocking verdict is clean — a consumer reading
|
|
441
|
+
# the preserved legacy token must never see ok next to a block.
|
|
442
|
+
#
|
|
443
|
+
# With no resolvable base the delta gate cannot see committed-only changes at all
|
|
444
|
+
# (`changed` then holds only uncommitted/untracked paths, whose severe members
|
|
445
|
+
# already fail closed above). A clean tree in that state therefore reaches here
|
|
446
|
+
# having evaluated NOTHING, so it must not claim `entrypoint_size_blocking_ok`:
|
|
447
|
+
# a consumer grepping for that token would read an un-run gate as a pass. The
|
|
448
|
+
# exit code stays 0 — this script is also run outside a git worktree and on
|
|
449
|
+
# checkouts without an upstream, and reddening those states is a caller-side
|
|
450
|
+
# pipeline decision (CI always exports CCL_SKILL_BASE_REF)
|
|
451
|
+
# — but the token says un-evaluated, not ok.
|
|
452
|
+
# NOTE: this comment lives inside the single-quoted `ruby -e` program; an
|
|
453
|
+
# apostrophe here terminates the shell quote and breaks the script.
|
|
454
|
+
if blocks.empty? && partials.empty? && word_blocks.empty? && word_partials.empty?
|
|
455
|
+
puts "size_budget_advisory_#{size_state}"
|
|
456
|
+
puts "entrypoint_size_budget_advisory_ok"
|
|
457
|
+
if base.nil?
|
|
458
|
+
puts "entrypoint_size_blocking_unevaluated: base=unknown — committed changes were NOT delta-checked; this is not a pass"
|
|
459
|
+
puts "entrypoint_word_budget_blocking_unevaluated: base=unknown — committed changes were NOT delta-checked; this is not a pass"
|
|
460
|
+
if File.file?(File.join(root, "agent-context/session-start.md"))
|
|
461
|
+
puts "bootstrap_size_delta_unevaluated: base=unknown — agent-context/session-start.md committed changes were NOT delta-checked; this is not a pass"
|
|
462
|
+
end
|
|
463
|
+
else
|
|
464
|
+
puts "entrypoint_size_blocking_ok"
|
|
465
|
+
puts "entrypoint_word_budget_blocking_ok"
|
|
466
|
+
end
|
|
467
|
+
exit 0
|
|
468
|
+
end
|
|
469
|
+
blocks.each { |b| warn "entrypoint_size_block: #{b}" }
|
|
470
|
+
partials.each { |b| warn "entrypoint_size_block_partial: #{b}" }
|
|
471
|
+
word_blocks.each { |b| warn "entrypoint_word_budget_block: #{b}" }
|
|
472
|
+
word_partials.each { |b| warn "entrypoint_word_budget_block_partial: #{b}" }
|
|
473
|
+
puts "entrypoint_word_budget_blocking_failed" unless word_blocks.empty? && word_partials.empty?
|
|
474
|
+
# Legacy aggregate token for every blocking verdict owned by this size-budget
|
|
475
|
+
# script, including the body-word rule. Keep it unconditional so existing
|
|
476
|
+
# consumers cannot miss a new word-only failure.
|
|
477
|
+
puts "entrypoint_size_blocking_failed"
|
|
478
|
+
exit 1
|
|
479
|
+
rescue StandardError, ScriptError => e
|
|
480
|
+
warn "entrypoint_size_gate_error: #{e.class.name}: #{e.message.lines.first.to_s.strip}"
|
|
481
|
+
exit 3
|
|
482
|
+
end
|
|
483
|
+
' "$root"
|
|
484
|
+
|
|
485
|
+
# Verdict contract: 0 = clean, 1 = delta-block/partial (gate fails as blocking),
|
|
486
|
+
# 2+/127 = the gate could not run (infra failure, reported separately).
|
|
487
|
+
rc=$?
|
|
488
|
+
exit "$rc"
|