@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,401 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# F4 Tier-2 routing compatibility eval (cheap-LLM grader over a frozen task bank).
|
|
5
|
+
#
|
|
6
|
+
# Measures whether the current skill descriptions make a cheap model route a fixed
|
|
7
|
+
# set of utterances to the expected skill. This is a ROUTING-COMPATIBILITY signal,
|
|
8
|
+
# NOT a truth oracle — the grader can be wrong. Advisory dashboard: it never blocks
|
|
9
|
+
# a merge and is not wired into check-ccl-skills.sh.
|
|
10
|
+
#
|
|
11
|
+
# Anti-game: each task carries frozen_at_sha; `root` resolves to the repository
|
|
12
|
+
# root commit, while an explicit SHA must be an ancestor of HEAD. The runner also
|
|
13
|
+
# flags when the same change touches both the bank and skill
|
|
14
|
+
# descriptions (so "fix skill + rewrite test to pass" is visible).
|
|
15
|
+
#
|
|
16
|
+
# Usage:
|
|
17
|
+
# eval-routing-bank.rb <repo-root> [--bank <path>] [--model <name>] [--limit N]
|
|
18
|
+
# [--dry-run] [--json <path>] [--baseline <path>] [--timeout S]
|
|
19
|
+
# [--desc-budget-chars N] [--with-bootstrap]
|
|
20
|
+
#
|
|
21
|
+
# --desc-budget-chars N simulates a consumer that truncates each skill description
|
|
22
|
+
# to its first N characters before routing (e.g. Codex compresses the skill listing
|
|
23
|
+
# under a ~2%-of-context budget, 8000 chars when the window is unknown, shortening
|
|
24
|
+
# descriptions first). Run the bank once plain and once with a budget to see which
|
|
25
|
+
# routes only survive on the description tail — those triggers need front-loading.
|
|
26
|
+
# Exit: 0 = ran (advisory); 2 = usage error; 3 = grader entirely unavailable.
|
|
27
|
+
|
|
28
|
+
require "yaml"
|
|
29
|
+
require "json"
|
|
30
|
+
require "open3"
|
|
31
|
+
require "shellwords"
|
|
32
|
+
require "timeout"
|
|
33
|
+
require "digest"
|
|
34
|
+
|
|
35
|
+
def arg(flag, default = nil)
|
|
36
|
+
i = ARGV.index(flag)
|
|
37
|
+
i ? ARGV[i + 1] : default
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
root = ARGV[0]
|
|
41
|
+
if root.nil? || root.start_with?("-")
|
|
42
|
+
warn "usage: eval-routing-bank.rb <repo-root> [--bank p] [--model m] [--limit N] [--dry-run] [--json p] [--baseline p] [--timeout S] [--desc-budget-chars N]"
|
|
43
|
+
exit 2
|
|
44
|
+
end
|
|
45
|
+
bank_path = arg("--bank", File.join(root, "eval", "routing-tasks.jsonl"))
|
|
46
|
+
model = arg("--model", "claude-haiku-4-5")
|
|
47
|
+
limit = (l = arg("--limit")) ? l.to_i : nil
|
|
48
|
+
dry_run = ARGV.include?("--dry-run")
|
|
49
|
+
json_path = arg("--json")
|
|
50
|
+
baseline_path = arg("--baseline")
|
|
51
|
+
desc_budget = nil
|
|
52
|
+
if ARGV.include?("--desc-budget-chars")
|
|
53
|
+
if ARGV.count("--desc-budget-chars") > 1
|
|
54
|
+
warn "--desc-budget-chars given more than once; pass it a single time"
|
|
55
|
+
exit 2
|
|
56
|
+
end
|
|
57
|
+
b = arg("--desc-budget-chars")
|
|
58
|
+
# Strict: a missing value (flag last / next token is another flag) or a
|
|
59
|
+
# non-integer must fail loudly, or the truncation arm silently becomes the
|
|
60
|
+
# baseline arm (to_i coerces "200x" -> 200, nil -> 0).
|
|
61
|
+
unless b && b =~ /\A[1-9]\d*\z/
|
|
62
|
+
warn "--desc-budget-chars requires a positive integer value, got #{b.inspect}"
|
|
63
|
+
exit 2
|
|
64
|
+
end
|
|
65
|
+
desc_budget = b.to_i
|
|
66
|
+
end
|
|
67
|
+
timeout_s = (t = arg("--timeout")) ? t.to_i : 60
|
|
68
|
+
|
|
69
|
+
unless File.file?(bank_path)
|
|
70
|
+
warn "eval_bank_missing: #{bank_path}"
|
|
71
|
+
exit 2
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# ONE immutable snapshot of the bank: the tasks are parsed from, and every
|
|
75
|
+
# bank-derived hash below is computed from, the SAME bytes — so grading and the
|
|
76
|
+
# report's self-identification cannot diverge if the file changes mid-run.
|
|
77
|
+
bank_bytes = File.binread(bank_path)
|
|
78
|
+
tasks = []
|
|
79
|
+
bank_bytes.dup.force_encoding(Encoding::UTF_8).each_line.with_index(1) do |line, n|
|
|
80
|
+
line = line.strip
|
|
81
|
+
next if line.empty?
|
|
82
|
+
begin
|
|
83
|
+
tasks << JSON.parse(line)
|
|
84
|
+
rescue JSON::ParserError => e
|
|
85
|
+
warn "eval_bank_parse_error: line #{n}: #{e.message}"
|
|
86
|
+
exit 2
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
tasks = tasks.first(limit) if limit
|
|
90
|
+
|
|
91
|
+
# Schema validation: a task must be answerable, and must not be self-contradictory.
|
|
92
|
+
tasks.each do |t|
|
|
93
|
+
id = t["id"] || "(no id)"
|
|
94
|
+
if t["utterance"].to_s.strip.empty? || t["expected_skill"].to_s.strip.empty?
|
|
95
|
+
warn "eval_bank_invalid_task: #{id}: utterance and expected_skill are required"
|
|
96
|
+
exit 2
|
|
97
|
+
end
|
|
98
|
+
if (t["must_not_route_to"] || []).include?(t["expected_skill"])
|
|
99
|
+
warn "eval_bank_invalid_task: #{id}: expected_skill is also in must_not_route_to (impossible)"
|
|
100
|
+
exit 2
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# --- anti-game ---------------------------------------------------------------
|
|
105
|
+
def ancestor?(root, sha)
|
|
106
|
+
return false if sha.nil? || sha.empty?
|
|
107
|
+
system("git", "-C", root, "merge-base", "--is-ancestor", sha, "HEAD",
|
|
108
|
+
out: File::NULL, err: File::NULL)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Working-tree co-change: does the branch diff touch BOTH the bank and any
|
|
112
|
+
# SKILL.md description? (advisory governance warning). If the base ref cannot be
|
|
113
|
+
# resolved the check is UNAVAILABLE — surfaced explicitly, never silently false.
|
|
114
|
+
base = ENV["CCL_SKILL_BASE_REF"].to_s.strip
|
|
115
|
+
base = "origin/main" if base.empty?
|
|
116
|
+
changed, diff_status = Open3.capture2e("git", "-C", root, "diff", base, "HEAD", "--name-only")
|
|
117
|
+
co_change_check_ok = diff_status.success?
|
|
118
|
+
changed_files = co_change_check_ok ? changed.lines.map(&:strip) : []
|
|
119
|
+
bank_changed = changed_files.any? { |f| f.include?("routing-tasks.jsonl") }
|
|
120
|
+
desc_changed = changed_files.any? { |f| f.end_with?("/SKILL.md") }
|
|
121
|
+
co_change = bank_changed && desc_changed
|
|
122
|
+
|
|
123
|
+
# --- build skill routing surface (the same descriptions the agent routes on) -
|
|
124
|
+
catalog = Dir[File.join(root, "skills", "*", "SKILL.md")].sort.map do |path|
|
|
125
|
+
name = File.basename(File.dirname(path))
|
|
126
|
+
m = File.read(path).match(/\A---\s*\n(.*?)\n---\s*\n/m)
|
|
127
|
+
next unless m
|
|
128
|
+
desc = (YAML.safe_load(m[1]) rescue {})["description"].to_s.strip
|
|
129
|
+
next if desc.empty?
|
|
130
|
+
desc = desc[0, desc_budget] if desc_budget && desc.length > desc_budget
|
|
131
|
+
"### #{name}\n#{desc}"
|
|
132
|
+
end.compact.join("\n\n")
|
|
133
|
+
|
|
134
|
+
# --- optional always-on entry-routing layer -----------------------------------
|
|
135
|
+
# The catalog above is the description-only surface. Hosts ALSO inject
|
|
136
|
+
# agent-context/session-start.md into every session, and that layer carries
|
|
137
|
+
# cross-skill discrimination rules the descriptions do not. Without this flag the
|
|
138
|
+
# bank cannot tell whether a routing miss is fixed by the injected layer, so every
|
|
139
|
+
# "this skill must be in the always-on layer" claim stayed unfalsifiable — and the
|
|
140
|
+
# layer has a hard zero-net-growth budget, which makes that claim expensive.
|
|
141
|
+
# Run the bank twice (plain, then --with-bootstrap) to measure what the layer buys.
|
|
142
|
+
bootstrap_layer = nil
|
|
143
|
+
if ARGV.include?("--with-bootstrap")
|
|
144
|
+
bpath = File.join(root, "agent-context", "session-start.md")
|
|
145
|
+
unless File.file?(bpath)
|
|
146
|
+
warn "eval-routing-bank: --with-bootstrap given but #{bpath} is missing"
|
|
147
|
+
exit 2
|
|
148
|
+
end
|
|
149
|
+
bootstrap_layer = File.read(bpath)[/ccl:entry-routing:start -->(.*?)<!-- ccl:entry-routing:end/m, 1]&.strip
|
|
150
|
+
if bootstrap_layer.nil? || bootstrap_layer.empty?
|
|
151
|
+
warn "eval-routing-bank: --with-bootstrap given but no ccl:entry-routing region in #{bpath}"
|
|
152
|
+
exit 2
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# --- routing-surface self-identification -------------------------------------
|
|
157
|
+
# Every emitted report names the exact surface it graded, so a round artifact
|
|
158
|
+
# can never be attributed to the wrong wording by operator assertion alone.
|
|
159
|
+
# descriptions_sha256 mirrors the binding wrapper's surface_hash byte-for-byte
|
|
160
|
+
# (dir-name-tagged RAW description lines of every skills/*/SKILL.md in sorted
|
|
161
|
+
# glob order — grep semantics, YAML unparsed, trailing newline included — plus
|
|
162
|
+
# the bank file bytes), so a sidecar recomputing the same quantity externally
|
|
163
|
+
# is an independent check of this claim. per_skill maps each description line
|
|
164
|
+
# to its own hash; catalog_sha256 identifies the GRADED catalog text (post
|
|
165
|
+
# YAML-parse, post desc-budget truncation), which is what the model actually
|
|
166
|
+
# saw. Grading semantics are untouched: nothing below feeds the prompt or the
|
|
167
|
+
# verdicts.
|
|
168
|
+
surface_parts = +"".b
|
|
169
|
+
per_skill_desc_sha = {}
|
|
170
|
+
Dir[File.join(root, "skills", "*", "SKILL.md")].sort.each do |path|
|
|
171
|
+
name = File.basename(File.dirname(path))
|
|
172
|
+
line = File.open(path, "rb") { |f| f.each_line.find { |l| l.start_with?("description:") } }
|
|
173
|
+
next unless line
|
|
174
|
+
surface_parts << name.b << "\t".b << line.b
|
|
175
|
+
per_skill_desc_sha[name] = Digest::SHA256.hexdigest(line)
|
|
176
|
+
end
|
|
177
|
+
routing_surface = {
|
|
178
|
+
descriptions_sha256: Digest::SHA256.hexdigest(surface_parts + bank_bytes),
|
|
179
|
+
per_skill_description_line_sha256: per_skill_desc_sha,
|
|
180
|
+
catalog_sha256: Digest::SHA256.hexdigest(catalog),
|
|
181
|
+
bank_sha256: Digest::SHA256.hexdigest(bank_bytes),
|
|
182
|
+
bootstrap_layer_sha256: bootstrap_layer ? Digest::SHA256.hexdigest(bootstrap_layer) : nil
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
def build_prompt(catalog, utterance, bootstrap_layer = nil)
|
|
186
|
+
<<~PROMPT
|
|
187
|
+
You are a routing classifier for a CCL engineering skill system. Given a
|
|
188
|
+
user utterance and the catalog of skills (name + description), pick the SINGLE
|
|
189
|
+
best skill that should handle it. Use only the catalog; route by the
|
|
190
|
+
descriptions' Use-when / Proactively / Skip rules.
|
|
191
|
+
|
|
192
|
+
Output ONLY a JSON object on one line, no other text:
|
|
193
|
+
{"selected_skill": "<exact skill name from the catalog>", "confidence": <0.0-1.0>, "rationale_short": "<one short clause>"}
|
|
194
|
+
|
|
195
|
+
#{bootstrap_layer ? "== ALWAYS-ON ENTRY ROUTING LAYER (injected into every session; takes precedence for entry routing) ==\n#{bootstrap_layer}\n" : ""}
|
|
196
|
+
== SKILL CATALOG ==
|
|
197
|
+
#{catalog}
|
|
198
|
+
|
|
199
|
+
== UTTERANCE ==
|
|
200
|
+
#{utterance}
|
|
201
|
+
PROMPT
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# Extract the first BALANCED top-level JSON object (string/escape aware) so extra
|
|
205
|
+
# braces, markdown fences, or trailing prose after the object do not corrupt it.
|
|
206
|
+
def extract_json(text)
|
|
207
|
+
start = text.index("{")
|
|
208
|
+
return nil unless start
|
|
209
|
+
depth = 0
|
|
210
|
+
in_str = false
|
|
211
|
+
esc = false
|
|
212
|
+
text[start..-1].each_char.with_index do |c, i|
|
|
213
|
+
if in_str
|
|
214
|
+
if esc then esc = false
|
|
215
|
+
elsif c == "\\" then esc = true
|
|
216
|
+
elsif c == '"' then in_str = false
|
|
217
|
+
end
|
|
218
|
+
elsif c == '"' then in_str = true
|
|
219
|
+
elsif c == "{" then depth += 1
|
|
220
|
+
elsif c == "}"
|
|
221
|
+
depth -= 1
|
|
222
|
+
if depth.zero?
|
|
223
|
+
return (JSON.parse(text[start, i + 1]) rescue nil)
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
nil
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Run the grader with a portable hard timeout (pure Ruby — does not depend on a
|
|
231
|
+
# GNU `timeout` binary being present).
|
|
232
|
+
def grade(model, timeout_s, prompt)
|
|
233
|
+
cmd = ["claude", "--print", "--tools", "", "--model", model]
|
|
234
|
+
out = +""
|
|
235
|
+
err = +""
|
|
236
|
+
status = nil
|
|
237
|
+
Open3.popen3(*cmd) do |stdin, stdout, stderr, wait_thr|
|
|
238
|
+
# Drain stdout/stderr in threads BEFORE writing so claude can never block on a
|
|
239
|
+
# full output pipe; keep the write+close+wait all under one hard timeout so a
|
|
240
|
+
# stalled or early-exited grader cannot hang or crash the runner.
|
|
241
|
+
#
|
|
242
|
+
# The readers must absorb their own pipe being closed: the timeout path below
|
|
243
|
+
# closes these pipes underneath them on purpose, and a reader that dies of
|
|
244
|
+
# that IOError gets it re-raised by join/value — aborting the whole eval
|
|
245
|
+
# (exit 1, no JSON report) at the exact moment the guard is supposed to
|
|
246
|
+
# report grader_timeout_Ns.
|
|
247
|
+
drain = lambda do |io|
|
|
248
|
+
Thread.new do
|
|
249
|
+
Thread.current.report_on_exception = false
|
|
250
|
+
begin
|
|
251
|
+
io.read
|
|
252
|
+
rescue IOError, SystemCallError
|
|
253
|
+
nil
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
out_t = drain.call(stdout)
|
|
258
|
+
err_t = drain.call(stderr)
|
|
259
|
+
begin
|
|
260
|
+
Timeout.timeout(timeout_s) do
|
|
261
|
+
begin
|
|
262
|
+
stdin.write(prompt)
|
|
263
|
+
rescue Errno::EPIPE, IOError
|
|
264
|
+
# claude closed stdin early; its exit status / stderr will explain
|
|
265
|
+
ensure
|
|
266
|
+
stdin.close rescue nil
|
|
267
|
+
end
|
|
268
|
+
status = wait_thr.value
|
|
269
|
+
# Collect reader output INSIDE the timeout: a grader that exits while a
|
|
270
|
+
# child/grandchild still holds the pipe open keeps stdout from reaching
|
|
271
|
+
# EOF, so out_t.value would otherwise hang forever past the guard.
|
|
272
|
+
out = out_t.value.to_s
|
|
273
|
+
err = err_t.value.to_s
|
|
274
|
+
end
|
|
275
|
+
rescue Timeout::Error
|
|
276
|
+
Process.kill("KILL", wait_thr.pid) rescue nil
|
|
277
|
+
stdout.close rescue nil # force the blocked readers to unblock
|
|
278
|
+
stderr.close rescue nil
|
|
279
|
+
out_t.join(1)
|
|
280
|
+
err_t.join(1)
|
|
281
|
+
return [nil, "grader_timeout_#{timeout_s}s"]
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
diagnostic = err.strip.empty? ? out.strip : err.strip
|
|
285
|
+
return [nil, "grader_exit_#{status.exitstatus}: #{diagnostic[0, 200]}"] unless status&.success?
|
|
286
|
+
obj = extract_json(out)
|
|
287
|
+
return [nil, "no_json_in_output: #{out.strip[0, 120]}"] unless obj
|
|
288
|
+
[obj, nil]
|
|
289
|
+
rescue Errno::ENOENT
|
|
290
|
+
[nil, "claude_not_found"]
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
# --- run ---------------------------------------------------------------------
|
|
295
|
+
if dry_run
|
|
296
|
+
puts build_prompt(catalog, tasks.first["utterance"], bootstrap_layer)
|
|
297
|
+
exit 0
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
# Grader availability is decided up front (not via a mid-loop exit code, which a
|
|
301
|
+
# `timeout` wrapper would mask as 127). claude missing => advisory skip, exit 0.
|
|
302
|
+
if (`command -v claude 2>/dev/null`.strip rescue "").empty?
|
|
303
|
+
puts "eval-routing-bank: grader unavailable (claude CLI not found) — skipped (advisory)"
|
|
304
|
+
exit 0
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
results = []
|
|
308
|
+
grader_available = true
|
|
309
|
+
tasks.each do |t|
|
|
310
|
+
exp = t["expected_skill"]
|
|
311
|
+
must_not = t["must_not_route_to"] || []
|
|
312
|
+
frozen_ref = t["frozen_at_sha"] == "root" ? `git -C #{Shellwords.escape(root)} rev-list --max-parents=0 HEAD`.lines.first.to_s.strip : t["frozen_at_sha"]
|
|
313
|
+
frozen_ok = ancestor?(root, frozen_ref)
|
|
314
|
+
prompt = build_prompt(catalog, t["utterance"], bootstrap_layer)
|
|
315
|
+
parsed, error = grade(model, timeout_s, prompt)
|
|
316
|
+
# A task that produced no observation contributes nothing to the totals, and an
|
|
317
|
+
# unmeasured task is indistinguishable from a routing failure in the numbers
|
|
318
|
+
# this bank reports. Both recoverable causes are sampling accidents rather than
|
|
319
|
+
# verdicts — a hard timeout is usually machine load, and unparseable output is
|
|
320
|
+
# usually one stray quote in a generated rationale — so each gets one retry.
|
|
321
|
+
# Repairing malformed output instead of re-asking for it was tried and removed:
|
|
322
|
+
# interpreting text that is by definition malformed has no natural boundary,
|
|
323
|
+
# and three review rounds each found a different shape that a repair would read
|
|
324
|
+
# as a verdict. Re-asking needs no such interpretation. Nothing else is retried:
|
|
325
|
+
# an auth failure and a missing CLI do reproduce on a second call.
|
|
326
|
+
if error&.start_with?("grader_timeout_") || error&.start_with?("no_json_in_output")
|
|
327
|
+
parsed, retry_error = grade(model, timeout_s, prompt)
|
|
328
|
+
error = parsed ? nil : retry_error
|
|
329
|
+
end
|
|
330
|
+
if error == "claude_not_found"
|
|
331
|
+
grader_available = false
|
|
332
|
+
break
|
|
333
|
+
end
|
|
334
|
+
selected = parsed && parsed["selected_skill"]
|
|
335
|
+
confidence = parsed && parsed["confidence"]
|
|
336
|
+
status =
|
|
337
|
+
if error then "ERROR"
|
|
338
|
+
elsif selected == exp && !must_not.include?(selected) then "PASS"
|
|
339
|
+
else "FAIL"
|
|
340
|
+
end
|
|
341
|
+
results << {
|
|
342
|
+
id: t["id"], utterance: t["utterance"], expected: exp, selected: selected,
|
|
343
|
+
confidence: confidence, must_not_route_to: must_not, status: status,
|
|
344
|
+
error: error, frozen_at_sha_is_ancestor: frozen_ok
|
|
345
|
+
}
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
unless grader_available
|
|
349
|
+
puts "eval-routing-bank: grader unavailable (claude CLI not found) — skipped (advisory)"
|
|
350
|
+
exit 0
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
passes = results.count { |r| r[:status] == "PASS" }
|
|
354
|
+
fails = results.select { |r| r[:status] == "FAIL" }
|
|
355
|
+
errors = results.select { |r| r[:status] == "ERROR" }
|
|
356
|
+
drift = results.reject { |r| r[:frozen_at_sha_is_ancestor] }
|
|
357
|
+
|
|
358
|
+
# baseline diff (newly failed / newly passed). The baseline is a prior report
|
|
359
|
+
# (a hash with a "results" array) or a bare results array.
|
|
360
|
+
newly_failed = []
|
|
361
|
+
newly_passed = []
|
|
362
|
+
if baseline_path && File.file?(baseline_path)
|
|
363
|
+
base_json = JSON.parse(File.read(baseline_path))
|
|
364
|
+
base_results = base_json.is_a?(Hash) ? (base_json["results"] || []) : base_json
|
|
365
|
+
base_status = base_results.to_h { |r| [r["id"], r["status"]] }
|
|
366
|
+
results.each do |r|
|
|
367
|
+
was = base_status[r[:id]]
|
|
368
|
+
newly_failed << r[:id] if was == "PASS" && r[:status] == "FAIL"
|
|
369
|
+
newly_passed << r[:id] if was == "FAIL" && r[:status] == "PASS"
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
report = {
|
|
374
|
+
model: model, tasks: results.size, pass: passes, fail: fails.size, error: errors.size,
|
|
375
|
+
desc_budget_chars: desc_budget, routing_surface: routing_surface,
|
|
376
|
+
co_change_bank_and_descriptions: co_change, co_change_check_available: co_change_check_ok,
|
|
377
|
+
frozen_drift: drift.map { |r| r[:id] },
|
|
378
|
+
newly_failed: newly_failed, newly_passed: newly_passed, results: results
|
|
379
|
+
}
|
|
380
|
+
File.write(json_path, JSON.pretty_generate(report)) if json_path
|
|
381
|
+
|
|
382
|
+
puts "eval-routing-bank (#{model}): #{passes}/#{results.size} pass, #{fails.size} fail, #{errors.size} grader-error"
|
|
383
|
+
puts " arm: desc-budget-chars=#{desc_budget}" if desc_budget
|
|
384
|
+
puts " ⚠ co-change check unavailable: base ref #{base.inspect} not resolvable — could not verify bank/description co-change" unless co_change_check_ok
|
|
385
|
+
puts " ⚠ co-change: this change touches BOTH the bank and a SKILL.md description (verify the bank was not edited to pass)" if co_change
|
|
386
|
+
puts " ⚠ frozen-drift (not ancestor of HEAD, excluded from regression judgment): #{drift.map { |r| r[:id] }.join(', ')}" unless drift.empty?
|
|
387
|
+
unless fails.empty?
|
|
388
|
+
puts " FAIL:"
|
|
389
|
+
fails.each { |r| puts " - #{r[:id]}: expected #{r[:expected]} got #{r[:selected].inspect} (conf #{r[:confidence]})" }
|
|
390
|
+
end
|
|
391
|
+
unless errors.empty?
|
|
392
|
+
puts " GRADER-ERROR:"
|
|
393
|
+
errors.each { |r| puts " - #{r[:id]}: #{r[:error]}" }
|
|
394
|
+
end
|
|
395
|
+
unless newly_failed.empty? && newly_passed.empty?
|
|
396
|
+
puts " vs baseline: newly_failed=#{newly_failed.join(',')} newly_passed=#{newly_passed.join(',')}"
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
# Advisory: never block on a routing miss. Only signal grader-infra breakage.
|
|
400
|
+
exit 3 if !results.empty? && errors.size == results.size
|
|
401
|
+
exit 0
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# F4 Tier-1 static routing analyzer (deterministic, no LLM).
|
|
5
|
+
#
|
|
6
|
+
# Parses every skills/*/SKILL.md FRONTMATTER `description` (never the body — the
|
|
7
|
+
# `->`/`→` arrow also appears in prose) and flags routing-surface defects:
|
|
8
|
+
#
|
|
9
|
+
# BLOCKING (objective, deterministic):
|
|
10
|
+
# - dangling redirect: a backticked `skill-ref` redirect target that is not an installed skill
|
|
11
|
+
# - exact trigger collision: an identical normalized trigger claimed by >=2 skills with
|
|
12
|
+
# no mutual skip/redirect disambiguation between them
|
|
13
|
+
#
|
|
14
|
+
# ADVISORY (fuzzy / not ground truth — never blocks):
|
|
15
|
+
# - fuzzy collision: one skill's full trigger is a substring of another skill's trigger
|
|
16
|
+
# - asymmetric redirect: A redirects to B but B neither redirects back nor shares the trigger
|
|
17
|
+
# - prose redirect target: a Skip redirect that names an "owner"/"reviewer" but resolves
|
|
18
|
+
# to no backticked installed skill (an unresolvable prose dead-end an agent can't route)
|
|
19
|
+
#
|
|
20
|
+
# Usage:
|
|
21
|
+
# eval-routing.rb <repo-root> [--json <path>] [--quiet]
|
|
22
|
+
# Exit: 0 = no blocking findings; 1 = blocking findings; 2 = usage/parse error.
|
|
23
|
+
|
|
24
|
+
require "yaml"
|
|
25
|
+
require "json"
|
|
26
|
+
require "set"
|
|
27
|
+
|
|
28
|
+
root = ARGV[0]
|
|
29
|
+
if root.nil? || root.empty?
|
|
30
|
+
warn "usage: eval-routing.rb <repo-root> [--json <path>] [--quiet]"
|
|
31
|
+
exit 2
|
|
32
|
+
end
|
|
33
|
+
json_path = nil
|
|
34
|
+
if (i = ARGV.index("--json"))
|
|
35
|
+
json_path = ARGV[i + 1]
|
|
36
|
+
if json_path.nil? || json_path.start_with?("-")
|
|
37
|
+
warn "usage: --json requires a following path"
|
|
38
|
+
exit 2
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
quiet = ARGV.include?("--quiet")
|
|
42
|
+
|
|
43
|
+
skill_files = Dir[File.join(root, "skills", "*", "SKILL.md")].sort
|
|
44
|
+
if skill_files.empty?
|
|
45
|
+
warn "eval_routing_no_skills: no skills/*/SKILL.md under #{root}"
|
|
46
|
+
exit 2
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
installed = skill_files.map { |p| File.basename(File.dirname(p)) }.to_set
|
|
50
|
+
|
|
51
|
+
# --- parse each skill's routing surface -------------------------------------
|
|
52
|
+
# claims[skill] => [{trigger:, norm:, kind: use|proactive}]
|
|
53
|
+
# redirects[skill]=> [{target:, backticked:, in_skip:}]
|
|
54
|
+
claims = Hash.new { |h, k| h[k] = [] }
|
|
55
|
+
redirects = Hash.new { |h, k| h[k] = [] }
|
|
56
|
+
parse_errors = []
|
|
57
|
+
prose_findings = []
|
|
58
|
+
|
|
59
|
+
skill_files.each do |path|
|
|
60
|
+
name = File.basename(File.dirname(path))
|
|
61
|
+
text = File.read(path)
|
|
62
|
+
m = text.match(/\A---\s*\n(.*?)\n---\s*\n/m)
|
|
63
|
+
unless m
|
|
64
|
+
parse_errors << "#{name}: no YAML frontmatter"
|
|
65
|
+
next
|
|
66
|
+
end
|
|
67
|
+
begin
|
|
68
|
+
fm = YAML.safe_load(m[1])
|
|
69
|
+
rescue StandardError => e
|
|
70
|
+
parse_errors << "#{name}: #{e.message}"
|
|
71
|
+
next
|
|
72
|
+
end
|
|
73
|
+
desc = fm.is_a?(Hash) ? fm["description"].to_s : ""
|
|
74
|
+
next if desc.strip.empty?
|
|
75
|
+
|
|
76
|
+
# Section the description: claim triggers come from the "Use when" and
|
|
77
|
+
# "Proactively invoke" segments; redirects come from the "Skip" segment.
|
|
78
|
+
# The Skip boundary is anchored to a SENTENCE-INITIAL capitalized "Skip" label
|
|
79
|
+
# so a trigger phrase like "skip tests" mid-sentence does not split the section.
|
|
80
|
+
skip_m = desc.match(/(?:\A|[.;。\n])[ \t]*(Skip\b.*)\z/m)
|
|
81
|
+
skip_seg = skip_m ? skip_m[1] : ""
|
|
82
|
+
pre_skip = skip_m ? desc[0...skip_m.begin(1)] : desc
|
|
83
|
+
use_seg = pre_skip[/use\s+when(.*?)(?=proactively\s+invoke|\z)/im, 1].to_s
|
|
84
|
+
proactive_seg = pre_skip[/proactively\s+invoke(.*)\z/im, 1].to_s
|
|
85
|
+
|
|
86
|
+
[[use_seg, "use"], [proactive_seg, "proactive"]].each do |seg, kind|
|
|
87
|
+
seg.scan(/"([^"]+)"/).flatten.each do |q|
|
|
88
|
+
norm = q.strip.downcase
|
|
89
|
+
next if norm.empty?
|
|
90
|
+
claims[name] << { trigger: q.strip, norm: norm, kind: kind }
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Redirect targets: a skill token immediately after an arrow, backticked or bare.
|
|
95
|
+
# Bare targets that are not installed skills are treated as generic English
|
|
96
|
+
# ("-> stack skill") and ignored; only a backticked unknown is a dangling defect.
|
|
97
|
+
# Allow leading whitespace and any opening bracket/quote (ASCII + fullwidth +
|
|
98
|
+
# CJK) after the arrow, e.g. "→ (`missing-skill`)" / "→ [`x`]" / "→ 「x」".
|
|
99
|
+
skip_seg.scan(/(?:->|→)[\s(([【「『\[{"']*(`?)([a-z][a-z0-9-]+)\1/).each do |bt, target|
|
|
100
|
+
backticked = bt == "`"
|
|
101
|
+
redirects[name] << { target: target, backticked: backticked, in_skip: true }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Prose redirect target (ADVISORY): a Skip redirect whose target clause names a
|
|
105
|
+
# routing "owner"/"reviewer" but contains NO backticked installed skill — an
|
|
106
|
+
# unresolvable prose dead-end an agent cannot deterministically route to
|
|
107
|
+
# (e.g. "→ the adversarial or delete-code review owner"). Clause runs from the
|
|
108
|
+
# arrow to the next arrow / sentence terminator (the tempered `(?!->|→)` stops
|
|
109
|
+
# the clause at the next arrow so a later backticked skill in a CHAINED redirect
|
|
110
|
+
# cannot suppress an earlier prose dead-end). Never blocks.
|
|
111
|
+
skip_seg.scan(/(?:->|→)((?:(?!->|→)[^\n;。.])*)/).each do |clause,|
|
|
112
|
+
clause = clause.to_s
|
|
113
|
+
next unless clause.match?(/\bowner\b|\breviewer\b/i)
|
|
114
|
+
has_installed = clause.scan(/`([a-z][a-z0-9-]+)`/).flatten.any? { |t| installed.include?(t) }
|
|
115
|
+
next if has_installed
|
|
116
|
+
prose_findings << {
|
|
117
|
+
type: "prose_redirect_target",
|
|
118
|
+
detail: "#{name} skip redirect \"→#{clause.strip}\" names an owner/reviewer but no resolvable `skill-name`"
|
|
119
|
+
}
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# --- build trigger index ----------------------------------------------------
|
|
124
|
+
# norm_trigger => {skill => [original phrases]}
|
|
125
|
+
index = Hash.new { |h, k| h[k] = Hash.new { |hh, kk| hh[kk] = [] } }
|
|
126
|
+
claims.each do |skill, list|
|
|
127
|
+
list.each { |c| index[c[:norm]][skill] << c[:trigger] }
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def redirects_between?(redirects, from, to)
|
|
131
|
+
# read-only: must not insert a default [] for a missing key (we iterate `redirects`)
|
|
132
|
+
list = redirects.key?(from) ? redirects[from] : []
|
|
133
|
+
list.any? { |r| r[:target] == to }
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
blocking = []
|
|
137
|
+
advisory = []
|
|
138
|
+
|
|
139
|
+
# Dangling redirect (BLOCKING): backticked skill-ref that is not installed.
|
|
140
|
+
redirects.each do |skill, list|
|
|
141
|
+
list.each do |r|
|
|
142
|
+
next unless r[:backticked]
|
|
143
|
+
target = r[:target]
|
|
144
|
+
next if target == skill
|
|
145
|
+
next if installed.include?(target)
|
|
146
|
+
blocking << {
|
|
147
|
+
type: "dangling_redirect",
|
|
148
|
+
skill: skill,
|
|
149
|
+
detail: "Skip redirect to `#{target}` but no such installed skill"
|
|
150
|
+
}
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# Exact trigger collision (BLOCKING unless EVERY claiming pair is disambiguated).
|
|
155
|
+
# Pairwise: a pair (a,b) is disambiguated iff a redirects to b or b redirects to a.
|
|
156
|
+
# One unrelated redirect must not clear a 3+ collision while a pair stays ambiguous.
|
|
157
|
+
index.each do |norm, by_skill|
|
|
158
|
+
skills = by_skill.keys.sort
|
|
159
|
+
next if skills.length < 2
|
|
160
|
+
undisambiguated = skills.combination(2).reject do |a, b|
|
|
161
|
+
redirects_between?(redirects, a, b) || redirects_between?(redirects, b, a)
|
|
162
|
+
end
|
|
163
|
+
if undisambiguated.empty?
|
|
164
|
+
advisory << {
|
|
165
|
+
type: "exact_trigger_collision_disambiguated",
|
|
166
|
+
trigger: norm,
|
|
167
|
+
skills: skills,
|
|
168
|
+
detail: "trigger #{norm.inspect} claimed by #{skills.join(', ')} (all pairs disambiguated)"
|
|
169
|
+
}
|
|
170
|
+
else
|
|
171
|
+
blocking << {
|
|
172
|
+
type: "exact_trigger_collision",
|
|
173
|
+
trigger: norm,
|
|
174
|
+
skills: skills,
|
|
175
|
+
detail: "trigger #{norm.inspect} claimed by #{skills.join(', ')}; " \
|
|
176
|
+
"undisambiguated pair(s): #{undisambiguated.map { |a, b| "#{a}~#{b}" }.join(', ')}"
|
|
177
|
+
}
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Fuzzy collision (ADVISORY): one full trigger is a substring of another skill's trigger.
|
|
182
|
+
norms = index.keys
|
|
183
|
+
norms.each do |a|
|
|
184
|
+
next if a.length < 4 # too short to be meaningful
|
|
185
|
+
norms.each do |b|
|
|
186
|
+
next if a == b
|
|
187
|
+
next unless b.include?(a)
|
|
188
|
+
a_skills = index[a].keys
|
|
189
|
+
b_skills = index[b].keys
|
|
190
|
+
cross = b_skills - a_skills
|
|
191
|
+
next if cross.empty?
|
|
192
|
+
advisory << {
|
|
193
|
+
type: "fuzzy_collision",
|
|
194
|
+
detail: "trigger #{a.inspect} (#{a_skills.sort.join(',')}) is a substring of #{b.inspect} (#{b_skills.sort.join(',')})"
|
|
195
|
+
}
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
# Possible dangling (ADVISORY): a BARE (un-backticked) redirect target that looks
|
|
200
|
+
# like a skill name (kebab with a hyphen) but is not installed — likely a renamed
|
|
201
|
+
# or removed skill referenced without backticks. Single-word bare targets are
|
|
202
|
+
# treated as generic English ("-> stack skill") and ignored. (One-way A->B
|
|
203
|
+
# redirects are NOT flagged: hub->leaf routing is correct, not a defect.)
|
|
204
|
+
redirects.each do |skill, list|
|
|
205
|
+
list.uniq { |r| r[:target] }.each do |r|
|
|
206
|
+
target = r[:target]
|
|
207
|
+
next if r[:backticked] # backticked unknowns are BLOCKING above
|
|
208
|
+
next unless target.include?("-") # hyphen => looks like a skill ref, not English
|
|
209
|
+
next if installed.include?(target)
|
|
210
|
+
advisory << {
|
|
211
|
+
type: "possible_dangling",
|
|
212
|
+
detail: "#{skill} bare redirect to #{target} (hyphenated, not installed — renamed/removed skill?)"
|
|
213
|
+
}
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
advisory.concat(prose_findings)
|
|
218
|
+
advisory.uniq!
|
|
219
|
+
|
|
220
|
+
report = {
|
|
221
|
+
root: root,
|
|
222
|
+
skills_scanned: installed.size,
|
|
223
|
+
parse_errors: parse_errors,
|
|
224
|
+
blocking: blocking,
|
|
225
|
+
advisory: advisory
|
|
226
|
+
}
|
|
227
|
+
File.write(json_path, JSON.pretty_generate(report)) if json_path
|
|
228
|
+
|
|
229
|
+
unless quiet
|
|
230
|
+
puts "eval-routing: scanned #{installed.size} skills"
|
|
231
|
+
unless parse_errors.empty?
|
|
232
|
+
puts " parse errors:"
|
|
233
|
+
parse_errors.each { |e| puts " - #{e}" }
|
|
234
|
+
end
|
|
235
|
+
if blocking.empty?
|
|
236
|
+
puts " blocking: none"
|
|
237
|
+
else
|
|
238
|
+
puts " BLOCKING (#{blocking.size}):"
|
|
239
|
+
blocking.each { |f| puts " - [#{f[:type]}] #{f[:detail]}" }
|
|
240
|
+
end
|
|
241
|
+
puts " advisory (#{advisory.size}):"
|
|
242
|
+
advisory.first(50).each { |f| puts " - [#{f[:type]}] #{f[:detail]}" }
|
|
243
|
+
puts " … #{advisory.size - 50} more" if advisory.size > 50
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
# Parse failures (bad/absent frontmatter) are a usage/parse error per the contract.
|
|
247
|
+
exit 2 unless parse_errors.empty?
|
|
248
|
+
exit(blocking.empty? ? 0 : 1)
|