@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.
Files changed (561) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +49 -0
  3. package/dist/assets/marketplace/.agents/plugins/marketplace.json +12 -0
  4. package/dist/assets/marketplace/.claude-plugin/marketplace.json +13 -0
  5. package/dist/assets/marketplace/marketplace-manifest.json +12 -0
  6. package/dist/assets/marketplace/plugins/ccl-skills/.claude-plugin/marketplace.json +16 -0
  7. package/dist/assets/marketplace/plugins/ccl-skills/.claude-plugin/plugin.json +5 -0
  8. package/dist/assets/marketplace/plugins/ccl-skills/.codex-plugin/plugin.json +5 -0
  9. package/dist/assets/marketplace/plugins/ccl-skills/.worktree-only +3 -0
  10. package/dist/assets/marketplace/plugins/ccl-skills/agent-context/session-start.md +45 -0
  11. package/dist/assets/marketplace/plugins/ccl-skills/agent-context/subagent-start.md +12 -0
  12. package/dist/assets/marketplace/plugins/ccl-skills/hooks/AGENTS.md +19 -0
  13. package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-delegation-owner.sh +125 -0
  14. package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-edit-isolation.sh +102 -0
  15. package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-merge-authorization.sh +1156 -0
  16. package/dist/assets/marketplace/plugins/ccl-skills/hooks/hooks.json +131 -0
  17. package/dist/assets/marketplace/plugins/ccl-skills/hooks/merge-authorization-prompt.sh +142 -0
  18. package/dist/assets/marketplace/plugins/ccl-skills/hooks/owner-dispatch-guard.sh +12 -0
  19. package/dist/assets/marketplace/plugins/ccl-skills/hooks/owner-dispatch-stop.sh +13 -0
  20. package/dist/assets/marketplace/plugins/ccl-skills/hooks/remind-post-merge-cleanup.sh +144 -0
  21. package/dist/assets/marketplace/plugins/ccl-skills/hooks/session-context.sh +87 -0
  22. package/dist/assets/marketplace/plugins/ccl-skills/hooks/session-start.sh +86 -0
  23. package/dist/assets/marketplace/plugins/ccl-skills/hooks/skill-extraction-gate-stop.sh +69 -0
  24. package/dist/assets/marketplace/plugins/ccl-skills/hooks/subagent-start.sh +26 -0
  25. package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_delegation_owner.sh +329 -0
  26. package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_edit_isolation.sh +322 -0
  27. package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_merge_authorization.sh +902 -0
  28. package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_merge_authorization_prompt.sh +178 -0
  29. package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_remind_post_merge_cleanup.sh +121 -0
  30. package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_session_start.sh +170 -0
  31. package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/AGENTS.md +17 -0
  32. package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/ccl-skills.ts +564 -0
  33. package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-install-skills.md +14 -0
  34. package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-update-skills.md +44 -0
  35. package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-verify-skills.md +109 -0
  36. package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-worktree-check.md +36 -0
  37. package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/AGENTS.md +28 -0
  38. package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/README.md +276 -0
  39. package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/owner-dispatch.example.json +10 -0
  40. package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/owner-dispatch.sh +1307 -0
  41. package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/test.sh +941 -0
  42. package/dist/assets/marketplace/plugins/ccl-skills/skills/agents-file-coverage-gate/SKILL.md +45 -0
  43. package/dist/assets/marketplace/plugins/ccl-skills/skills/agents-file-coverage-gate/agents/openai.yaml +4 -0
  44. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/SKILL.md +188 -0
  45. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/agents/openai.yaml +4 -0
  46. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/android-dev.md +92 -0
  47. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/flutter-dev.md +80 -0
  48. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/ios-dev.md +72 -0
  49. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/kotlin-multiplatform.md +93 -0
  50. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-platform-boundaries.md +77 -0
  51. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-quality-release.md +77 -0
  52. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/source-evidence-map.md +64 -0
  53. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/SKILL.md +353 -0
  54. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/agents/openai.yaml +4 -0
  55. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/client-routing.md +419 -0
  56. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/manual-invocation-and-prompts.md +126 -0
  57. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md +197 -0
  58. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/timeout-auth-and-capabilities.md +179 -0
  59. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/AGENTS.md +98 -0
  60. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/classify_envelope.py +93 -0
  61. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/classify_timeout_exit.sh +15 -0
  62. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/claude_review.sh +1438 -0
  63. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/codex_review.sh +324 -0
  64. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/concern_excerpt.py +295 -0
  65. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/egress_schema.py +214 -0
  66. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/init_policy_matrix.py +642 -0
  67. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_packet_mcp.py +181 -0
  68. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_review.sh +1165 -0
  69. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/opencode_review.sh +1190 -0
  70. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_cli_review.py +946 -0
  71. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_opencode_review.py +474 -0
  72. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_probe_result.py +1899 -0
  73. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_review_json.py +200 -0
  74. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py +2845 -0
  75. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.sh +6 -0
  76. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/run_claude_capture.py +71 -0
  77. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/runtime-surface-verification-design.md +53 -0
  78. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_classify_envelope.sh +68 -0
  79. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_claude_review_probe.sh +2311 -0
  80. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_cli_review_wrappers.sh +1832 -0
  81. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_code_review_identity.sh +73 -0
  82. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_concern_excerpt.sh +245 -0
  83. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_egress_schema.sh +177 -0
  84. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_init_policy_matrix.sh +272 -0
  85. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_kimi_packet_mcp.py +195 -0
  86. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_opencode_review_concurrency.sh +120 -0
  87. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_opencode_review_retry.sh +1005 -0
  88. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_opencode_review.sh +258 -0
  89. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_probe_result.sh +574 -0
  90. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_review_json.sh +349 -0
  91. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_compat.py +434 -0
  92. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_order.sh +264 -0
  93. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +2412 -0
  94. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/verify_native_skill_binding.py +123 -0
  95. package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/SKILL.md +153 -0
  96. package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/agents/openai.yaml +4 -0
  97. package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/references/diagnosis-playbook.md +54 -0
  98. package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/references/prevention-routing.md +36 -0
  99. package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/SKILL.md +69 -0
  100. package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/agents/openai.yaml +4 -0
  101. package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/references/security-review-gate.md +41 -0
  102. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/SKILL.md +165 -0
  103. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/agents/openai.yaml +4 -0
  104. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/api-security-boundaries.md +47 -0
  105. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/architecture-playbook.md +160 -0
  106. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/artifact-generation-architecture.md +37 -0
  107. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/audit-history-architecture.md +29 -0
  108. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/bulk-workflow-architecture.md +33 -0
  109. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/config-rule-routing-architecture.md +34 -0
  110. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/cross-cutting-concerns.md +72 -0
  111. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/data-modeling-and-migrations.md +79 -0
  112. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/data-platform-architecture.md +210 -0
  113. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/dependency-platform.md +105 -0
  114. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/developer-tooling-architecture.md +38 -0
  115. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/error-contract-architecture.md +36 -0
  116. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/event-driven-architecture.md +260 -0
  117. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/http-gateway-architecture.md +74 -0
  118. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/mq-consumer-architecture.md +38 -0
  119. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/multi-tenant-isolation.md +275 -0
  120. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/notification-architecture.md +25 -0
  121. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/ops-checklist.md +57 -0
  122. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/performance-capacity-architecture.md +38 -0
  123. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/protobuf-contract-architecture.md +119 -0
  124. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/redis-cache-coordination.md +93 -0
  125. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/release-runtime-readiness.md +65 -0
  126. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/replay-comparison-architecture.md +26 -0
  127. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/runtime-observability.md +94 -0
  128. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/service-scaffold.md +76 -0
  129. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/source-evidence-map.md +55 -0
  130. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/workflow-state-architecture.md +38 -0
  131. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/SKILL.md +159 -0
  132. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/agents/openai.yaml +4 -0
  133. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/artifact-generation-patterns.md +37 -0
  134. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/audit-history-patterns.md +28 -0
  135. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/bulk-import-export-patterns.md +56 -0
  136. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/config-rule-routing-patterns.md +38 -0
  137. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/data-access-patterns.md +55 -0
  138. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/db-schema-and-dal-patterns.md +109 -0
  139. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/dependency-client-patterns.md +130 -0
  140. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/developer-tooling-patterns.md +70 -0
  141. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/domain-feature-patterns.md +78 -0
  142. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/engineering-patterns.md +119 -0
  143. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/error-contract-patterns.md +55 -0
  144. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/feature-playbook.md +61 -0
  145. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/http-gateway-client-patterns.md +76 -0
  146. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/mq-consumer-patterns.md +55 -0
  147. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/notification-patterns.md +42 -0
  148. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/observability-implementation-patterns.md +101 -0
  149. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/performance-capacity-patterns.md +44 -0
  150. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/protobuf-contract-patterns.md +72 -0
  151. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/public-api-integration-patterns.md +56 -0
  152. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/quality-and-testing-patterns.md +91 -0
  153. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/redis-cache-lock-patterns.md +123 -0
  154. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/release-ops-patterns.md +112 -0
  155. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/reliability-patterns.md +83 -0
  156. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/replay-comparison-patterns.md +32 -0
  157. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/scaffold-and-codegen.md +86 -0
  158. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/source-evidence-map.md +54 -0
  159. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/state-machine-task-patterns.md +45 -0
  160. package/dist/assets/marketplace/plugins/ccl-skills/skills/grill-me/SKILL.md +80 -0
  161. package/dist/assets/marketplace/plugins/ccl-skills/skills/grill-me/agents/openai.yaml +4 -0
  162. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/SKILL.md +117 -0
  163. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/agents/openai.yaml +4 -0
  164. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-approval-auto-reviewer.md +106 -0
  165. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-command-sandbox.md +441 -0
  166. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-context-freshness.md +47 -0
  167. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-credentials-auth.md +13 -0
  168. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-extensions-skills.md +13 -0
  169. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-file-edit-protocol.md +129 -0
  170. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-ide-integration.md +5 -0
  171. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-input-ingestion.md +13 -0
  172. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-instruction-composition.md +13 -0
  173. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-lifecycle-hooks.md +92 -0
  174. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-messaging.md +5 -0
  175. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-runtime-bootstrap.md +5 -0
  176. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-session-persistence.md +448 -0
  177. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-task-orchestration.md +13 -0
  178. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-tool-dispatch.md +123 -0
  179. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-turn-lifecycle.md +131 -0
  180. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/inference-capacity-operations.md +162 -0
  181. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/llm-client-gateway.md +156 -0
  182. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/model-prompt-evaluation.md +146 -0
  183. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/retrieval-agent-safety.md +273 -0
  184. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/SKILL.md +202 -0
  185. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/agents/openai.yaml +4 -0
  186. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/contracts-and-state.md +62 -0
  187. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/cross-stack-alignment.md +94 -0
  188. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/framework-choice.md +76 -0
  189. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/online-practice-uptake.md +56 -0
  190. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/platform-capabilities.md +91 -0
  191. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/product-page-checklist.md +40 -0
  192. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/qa-release.md +72 -0
  193. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/source-evidence-map.md +82 -0
  194. package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/SKILL.md +103 -0
  195. package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/agents/openai.yaml +5 -0
  196. package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/references/multi-agent-delegation-playbook.md +100 -0
  197. package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/SKILL.md +70 -0
  198. package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/agents/openai.yaml +4 -0
  199. package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/public-data-acquisition.md +549 -0
  200. package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/public-disclosure-channels.md +97 -0
  201. package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/research-prompts.md +66 -0
  202. package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/scripts/AGENTS.md +32 -0
  203. package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/scripts/test-public-data-acquisition-recipes.sh +379 -0
  204. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/SKILL.md +244 -0
  205. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/agents/openai.yaml +4 -0
  206. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/alerting-and-on-call.md +76 -0
  207. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/framework-middleware-checklist.md +142 -0
  208. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/infra-component-deployment.md +268 -0
  209. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/log-correlation-recipe.md +124 -0
  210. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/log-schema-canonical.md +208 -0
  211. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/metrics-conventions.md +105 -0
  212. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/obs-stack-architecture.md +107 -0
  213. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/sli-slo-design.md +95 -0
  214. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/source-register.md +11 -0
  215. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/SKILL.md +303 -0
  216. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/agents/openai.yaml +4 -0
  217. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/canary-and-rollout-strategy.md +163 -0
  218. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/config-center-via-etcd.md +245 -0
  219. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/custom-control-plane-boundary.md +298 -0
  220. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/deploy-cli-concrete-recipe.md +312 -0
  221. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/deploy-pipeline.md +165 -0
  222. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/env-and-lane-matrix.md +126 -0
  223. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/lane-orchestration-control-plane.md +383 -0
  224. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/multi-region-and-cluster.md +135 -0
  225. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/promotion-gate-and-review.md +149 -0
  226. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/python-package-registry-release.md +462 -0
  227. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/rollback-playbook.md +123 -0
  228. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/secret-and-config-management.md +231 -0
  229. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/version-authority-and-deprecation.md +21 -0
  230. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/SKILL.md +276 -0
  231. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/agents/openai.yaml +4 -0
  232. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/dual-sidecar-and-traffic-config-center.md +127 -0
  233. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/framework-middleware.md +143 -0
  234. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/grpc-authority-workaround.md +90 -0
  235. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/http-response-envelope-contract.md +24 -0
  236. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/mesh-architecture.md +127 -0
  237. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/multi-env-routing.md +192 -0
  238. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/protobuf-http-contract-signals.md +64 -0
  239. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/retry-timeout-circuit-breaker.md +124 -0
  240. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/rpc-framework-recipe.md +494 -0
  241. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-choice.md +113 -0
  242. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-migration-playbook.md +231 -0
  243. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-recipe.md +131 -0
  244. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +235 -0
  245. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/agents/openai.yaml +4 -0
  246. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/adr-convention.md +146 -0
  247. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-checklist.md +30 -0
  248. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-evaluation-report-template.md +25 -0
  249. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-execution-spec.md +108 -0
  250. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-sop.md +457 -0
  251. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-templates.md +24 -0
  252. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/artifact-egress-confidentiality.md +58 -0
  253. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/code-review-checklist.md +86 -0
  254. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/cross-repo-coordination.md +46 -0
  255. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/delivery-lifecycle.md +192 -0
  256. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-review-gate-mechanics.md +62 -0
  257. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-routing-and-readiness.md +45 -0
  258. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/diagnostic-spec-match-gate.md +36 -0
  259. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/dispatch-owner-skills.md +35 -0
  260. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/dormant-code-activation.md +47 -0
  261. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/existing-project-assessment-report.md +223 -0
  262. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/external-skill-augmentation.md +46 -0
  263. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/feature-deprecation-cascade.md +15 -0
  264. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/high-risk-resilience-gates.md +73 -0
  265. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/implementation-completeness-and-minimality.md +120 -0
  266. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/implementation-entry-reentry-gate.md +122 -0
  267. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/modular-monolith-heuristic.md +105 -0
  268. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/pre-final-continuation-gate.md +115 -0
  269. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/problem-resolution-and-learning.md +62 -0
  270. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/quality-attributes.md +112 -0
  271. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/quality-remediation-program.md +88 -0
  272. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/rd-standards-doc-family-checklist.md +27 -0
  273. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/refactoring-discipline.md +52 -0
  274. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/review-reception.md +34 -0
  275. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/shared-gate-artifact-classification.md +76 -0
  276. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/source-evidence-map.md +31 -0
  277. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/status-tracker-sync.md +77 -0
  278. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/sync-spec-repo-contract.md +25 -0
  279. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/verify-developer-experience.md +34 -0
  280. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/worktree-mechanics.md +55 -0
  281. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/scripts/AGENTS.md +18 -0
  282. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh +213 -0
  283. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/SKILL.md +136 -0
  284. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/agents/openai.yaml +9 -0
  285. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/analytics-visualization-interactions.md +206 -0
  286. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/behavioral-aesthetic-logic.md +108 -0
  287. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/complex-creation-interactions.md +194 -0
  288. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-execution-checklist.md +214 -0
  289. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-impl-naming-and-versioning.md +53 -0
  290. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-intake-and-acceptance.md +129 -0
  291. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-system-source-of-truth.md +97 -0
  292. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/external-ui-ux-quality-benchmarks.md +79 -0
  293. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/frontend-code-evidence-map.md +63 -0
  294. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/interaction-design-patterns.md +146 -0
  295. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/layout-recipes-and-screenshot-acceptance.md +250 -0
  296. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-project-token-consistency.md +237 -0
  297. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-stack-strategy.md +65 -0
  298. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/operational-processing-workflows.md +237 -0
  299. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-mobile-patterns.md +324 -0
  300. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-web-desktop-patterns.md +456 -0
  301. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-lifecycle-acceptance-and-iteration.md +114 -0
  302. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-surface-patterns.md +79 -0
  303. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/resource-management-interactions.md +113 -0
  304. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/scenario-community-patterns.md +133 -0
  305. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/source-map.md +130 -0
  306. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/tokens-and-components.md +47 -0
  307. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/trust-sensitive-ai-and-data-patterns.md +96 -0
  308. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-audit.md +106 -0
  309. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-design-development.md +176 -0
  310. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/visual-craft.md +111 -0
  311. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/SKILL.md +157 -0
  312. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/agents/openai.yaml +4 -0
  313. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/ai-service-integration-boundaries.md +57 -0
  314. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/api-contract-and-schema.md +62 -0
  315. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/api-security-boundaries.md +39 -0
  316. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/architecture-playbook.md +46 -0
  317. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/async-execution-model.md +24 -0
  318. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/background-jobs-and-scheduling.md +18 -0
  319. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/batch-and-pipeline-architecture.md +11 -0
  320. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/config-secrets-runtime.md +22 -0
  321. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/data-modeling-and-migrations.md +64 -0
  322. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/data-platform-architecture.md +211 -0
  323. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/event-driven-architecture.md +263 -0
  324. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/multi-tenant-isolation.md +281 -0
  325. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/observability-and-ops.md +26 -0
  326. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/packaging-runtime-readiness.md +20 -0
  327. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/redis-cache-coordination.md +41 -0
  328. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/reliability-and-error-contract.md +17 -0
  329. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/source-evidence-map.md +55 -0
  330. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/web-framework-boundaries.md +26 -0
  331. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/SKILL.md +143 -0
  332. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/agents/openai.yaml +4 -0
  333. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/ai-service-wiring-patterns.md +16 -0
  334. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/async-and-worker-patterns.md +24 -0
  335. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/background-job-patterns.md +18 -0
  336. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/batch-and-artifact-patterns.md +13 -0
  337. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/dependency-client-patterns.md +39 -0
  338. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/error-handling-patterns.md +26 -0
  339. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/feature-playbook.md +43 -0
  340. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/observability-implementation-patterns.md +31 -0
  341. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/project-structure-and-tooling.md +24 -0
  342. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/public-api-security-patterns.md +52 -0
  343. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/redis-cache-lock-patterns.md +78 -0
  344. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/schema-and-validation-patterns.md +23 -0
  345. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/source-evidence-map.md +56 -0
  346. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/sqlalchemy-and-migrations-patterns.md +99 -0
  347. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/testing-and-quality-patterns.md +61 -0
  348. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/web-framework-patterns.md +35 -0
  349. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/SKILL.md +91 -0
  350. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/agents/openai.yaml +4 -0
  351. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/config-runtime-readback.md +20 -0
  352. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/mr-merge-authorization.md +31 -0
  353. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/post-release-env-reset.md +31 -0
  354. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/release-closeout-evidence.md +20 -0
  355. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/release-scope-confirmation.md +21 -0
  356. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/tag-and-prod-pipeline-gate.md +20 -0
  357. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/test-scope-prompt.md +24 -0
  358. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/watcher-discipline.md +14 -0
  359. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/SKILL.md +64 -0
  360. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/agents/openai.yaml +4 -0
  361. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/comment-safe-release-doc.md +19 -0
  362. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/release-evidence-workflow.md +23 -0
  363. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/release-testing-scope-section.md +15 -0
  364. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-baseline/SKILL.md +87 -0
  365. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-baseline/agents/openai.yaml +4 -0
  366. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/SKILL.md +130 -0
  367. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/agents/openai.yaml +4 -0
  368. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/prd-composition-contract.md +35 -0
  369. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/requirement-closure-contract.md +86 -0
  370. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/security-four-questions.md +38 -0
  371. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-intent/SKILL.md +91 -0
  372. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-intent/agents/openai.yaml +4 -0
  373. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-scope/SKILL.md +88 -0
  374. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-scope/agents/openai.yaml +4 -0
  375. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +337 -0
  376. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/agents/openai.yaml +4 -0
  377. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/analysis-parse-fix-test-challenge-replay.md +47 -0
  378. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/attribution-verification.md +69 -0
  379. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/bootstrap-slim-c3-obligation-table.md +112 -0
  380. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/coverage-exhaustion-traps.md +45 -0
  381. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/description-authoring.md +162 -0
  382. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +507 -0
  383. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/eval-routing.md +86 -0
  384. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/evidence-card-template.md +51 -0
  385. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/example-domain-preselect.md +79 -0
  386. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/external-practice-controls.md +57 -0
  387. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-lifecycle-handoff.md +65 -0
  388. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +194 -0
  389. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/firing-point-placement.md +75 -0
  390. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/harness-patterns-and-eval.md +286 -0
  391. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/incident-postmortem-extraction.md +190 -0
  392. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/l0-l1-l2-routing.md +114 -0
  393. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/online-skill-review.md +47 -0
  394. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/parallel-stack-references-pattern.md +164 -0
  395. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/r0-leakage-audit.md +90 -0
  396. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/recurring-anti-patterns-checklist.md +320 -0
  397. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/resume-paused-delivery.md +16 -0
  398. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-feedback-mining.md +33 -0
  399. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-finding-standards.md +57 -0
  400. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-rubric.md +40 -0
  401. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/rule-consolidation.md +118 -0
  402. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/skill-listing-budget.md +19 -0
  403. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +254 -0
  404. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +658 -0
  405. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/two-source-extraction-pattern.md +167 -0
  406. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-judgment-extraction.md +179 -0
  407. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-routing-map.md +51 -0
  408. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md +180 -0
  409. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/AGENTS.md +18 -0
  410. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +1452 -0
  411. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-evidence-card-leak.sh +491 -0
  412. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-mr-target-freshness.sh +173 -0
  413. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-size-budget.sh +488 -0
  414. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-sync-pointers.sh +419 -0
  415. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-golden-trace.rb +197 -0
  416. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-health.rb +327 -0
  417. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing-bank.rb +401 -0
  418. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing.rb +248 -0
  419. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/generic-r0-leak-scan.sh +282 -0
  420. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/governing-chain-diff.py +321 -0
  421. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +964 -0
  422. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/register-firing-path-resolution.rb +708 -0
  423. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/skill-behavior-eval.py +540 -0
  424. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/source-register-lifecycle.rb +51 -0
  425. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/source-register-pending-status.rb +55 -0
  426. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_ai_coding_implementation_gates.sh +829 -0
  427. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh +1203 -0
  428. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_r0_status.sh +75 -0
  429. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_register_pending_exclusion.sh +137 -0
  430. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +173 -0
  431. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_route_drift.sh +377 -0
  432. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_size_budget.sh +833 -0
  433. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_skill_catalog.sh +491 -0
  434. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_source_register_lifecycle.sh +114 -0
  435. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_mr_target_freshness.sh +261 -0
  436. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_sync_pointers.sh +538 -0
  437. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_controlled_escalation_pins.sh +154 -0
  438. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_grader_diagnostics.sh +190 -0
  439. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_surface_binding.sh +178 -0
  440. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_prose_target.sh +86 -0
  441. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_generic_r0_leak_scan.sh +131 -0
  442. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_git_identity_predicate_gate.sh +243 -0
  443. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_governing_chain_diff.sh +419 -0
  444. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_dateless_host.sh +120 -0
  445. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_resolution.sh +724 -0
  446. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_wiring.sh +414 -0
  447. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_regression_runner_registration.sh +34 -0
  448. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_bank_integrity.sh +205 -0
  449. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_pointer_integrity.sh +194 -0
  450. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_credential_cwd.sh +61 -0
  451. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_cross_refs.sh +111 -0
  452. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_root_depth.sh +53 -0
  453. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate-skill.sh +257 -0
  454. package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/SKILL.md +98 -0
  455. package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/agents/openai.yaml +4 -0
  456. package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/input-state-machines.md +36 -0
  457. package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/streaming-rich-output.md +130 -0
  458. package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/terminal-side-channels.md +96 -0
  459. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/SKILL.md +408 -0
  460. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/agents/openai.yaml +4 -0
  461. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/AGENTS.md +18 -0
  462. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/bitable-setup.md +573 -0
  463. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/README.md +120 -0
  464. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/github-actions.yml +119 -0
  465. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/gitlab-ci.yml +76 -0
  466. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/jenkins.Jenkinsfile +106 -0
  467. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/classical-test-design-techniques.md +279 -0
  468. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/gen_report.py +2807 -0
  469. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/makefile-template.md +200 -0
  470. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/report-config-schema.md +272 -0
  471. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/run_pytestless.py +475 -0
  472. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/source-to-case-workflows.md +258 -0
  473. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc-marker-conventions.md +316 -0
  474. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc-review-and-prioritization.md +145 -0
  475. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/AGENTS.md +16 -0
  476. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.dart +129 -0
  477. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.go +197 -0
  478. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.py +135 -0
  479. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.ts +285 -0
  480. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/test_gen_report.py +2144 -0
  481. package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/update-lifecycle.md +62 -0
  482. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md +212 -0
  483. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/agents/openai.yaml +4 -0
  484. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/ci-fixtures-and-flake-control.md +75 -0
  485. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/client-runtime-test-matrices.md +50 -0
  486. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/data-and-workflow-testing.md +34 -0
  487. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/design-closed-contract-oracles.md +31 -0
  488. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/e2e-real-flow-testing.md +71 -0
  489. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/fitness-functions.md +240 -0
  490. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/integration-contract-testing.md +235 -0
  491. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/non-functional-specialized-scenarios.md +296 -0
  492. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/rd-testing-standard-template.md +126 -0
  493. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/run-killing-mutation-walk.md +43 -0
  494. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/scenario-testing.md +136 -0
  495. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/source-evidence-map.md +59 -0
  496. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/structured-tc-input-translation.md +67 -0
  497. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-code-authoring-patterns.md +392 -0
  498. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-data-and-determinism.md +39 -0
  499. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-topology-and-commands.md +92 -0
  500. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/unit-testing.md +46 -0
  501. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/vendored-contract-drift-checklist.md +64 -0
  502. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/verify-enforcement-mechanisms.md +18 -0
  503. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/AGENTS.md +17 -0
  504. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/client-terminal-ansi-check.py +140 -0
  505. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/client-terminal-ansi-check.test.sh +75 -0
  506. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-ast-check.py +170 -0
  507. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-ast-check.test.sh +87 -0
  508. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-go-check.go +198 -0
  509. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-go-check.test.sh +109 -0
  510. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/test_mutation_backup_recipe.sh +237 -0
  511. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/SKILL.md +184 -0
  512. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/agents/openai.yaml +4 -0
  513. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/comment-safe-feishu.md +93 -0
  514. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/cross-model-co-review.md +3 -0
  515. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/delivery-face-closeout.md +60 -0
  516. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/doc-charter-first.md +17 -0
  517. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/session-vantage-leakage.md +58 -0
  518. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/SKILL.md +126 -0
  519. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/agents/openai.yaml +4 -0
  520. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/complex-workspace-patterns.md +47 -0
  521. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/embedded-h5-in-host.md +87 -0
  522. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/react-architecture.md +194 -0
  523. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/source-evidence-map.md +60 -0
  524. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-quality-release.md +190 -0
  525. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-ui-quality.md +83 -0
  526. package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/SKILL.md +179 -0
  527. package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/agents/openai.yaml +4 -0
  528. package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/references/shared-branch-rebase.md +25 -0
  529. package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/AGENTS.md +23 -0
  530. package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/test_worktree_status.sh +207 -0
  531. package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/test_worktree_sweep.sh +481 -0
  532. package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/worktree-status.sh +325 -0
  533. package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/worktree-sweep.sh +245 -0
  534. package/dist/assets/release.json +2797 -0
  535. package/dist/claude-adapter.d.ts +9 -0
  536. package/dist/claude-adapter.js +240 -0
  537. package/dist/cli-worker.d.ts +1 -0
  538. package/dist/cli-worker.js +32 -0
  539. package/dist/cli.d.ts +22 -0
  540. package/dist/cli.js +214 -0
  541. package/dist/codex-host.d.ts +30 -0
  542. package/dist/codex-host.js +162 -0
  543. package/dist/fs-safe.d.ts +21 -0
  544. package/dist/fs-safe.js +241 -0
  545. package/dist/index.d.ts +2 -0
  546. package/dist/index.js +1 -0
  547. package/dist/manifest.d.ts +8 -0
  548. package/dist/manifest.js +135 -0
  549. package/dist/opencode-adapter.d.ts +10 -0
  550. package/dist/opencode-adapter.js +416 -0
  551. package/dist/operations.d.ts +3 -0
  552. package/dist/operations.js +956 -0
  553. package/dist/paths.d.ts +20 -0
  554. package/dist/paths.js +4 -0
  555. package/dist/types.d.ts +58 -0
  556. package/dist/types.js +1 -0
  557. package/dist/unified.d.ts +4 -0
  558. package/dist/unified.js +64 -0
  559. package/dist/version.d.ts +2 -0
  560. package/dist/version.js +5 -0
  561. package/package.json +35 -0
@@ -0,0 +1,1203 @@
1
+ #!/usr/bin/env bash
2
+ # Regression tests for the impact-chain gate: owner-path coverage, required
3
+ # behavioral evidence, observed-failure firing paths, and upstream-owner routing.
4
+ # An upstream owner's references/ and scripts/ ship decision-surface / operational
5
+ # behavior just like its SKILL.md, so editing them must also require a complete
6
+ # source-register impact-chain row.
7
+ #
8
+ # Clones this repo into a throwaway worktree, then drives deterministic diffs on
9
+ # per-case branches so unrelated local edits do not affect the assertions while the
10
+ # current checker under test is still used.
11
+ set -euo pipefail
12
+
13
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
14
+ CHECK_SCRIPT="${CHECK_SCRIPT_UNDER_TEST:-$SCRIPT_DIR/check-ccl-skills.sh}"
15
+ [ -f "$CHECK_SCRIPT" ] || { echo "FAIL: checker not found: $CHECK_SCRIPT" >&2; exit 1; }
16
+ CHECK_SCRIPT_DIR="$(ruby -e 'puts File.dirname(File.realpath(ARGV.fetch(0)))' "$CHECK_SCRIPT")"
17
+ GATE_SCRIPT="$CHECK_SCRIPT_DIR/impact-chain-gate.rb"
18
+ [ -f "$GATE_SCRIPT" ] || { echo "FAIL: impact-chain gate not found: $GATE_SCRIPT" >&2; exit 1; }
19
+ ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd -P)"
20
+
21
+ TMP="$(mktemp -d "${TMPDIR:-/tmp}/icrefscripts.XXXXXX")"
22
+ # Preserve the script's exit status across cleanup: on macOS bash 3.2 a bare
23
+ # `rm -rf` EXIT trap OVERWRITES a set -u/-e abort status with 0, turning a
24
+ # mid-suite crash into a false green.
25
+ trap 'rc=$?; rm -rf "$TMP"; exit $rc' EXIT
26
+
27
+ fail() { echo "FAIL: $*" >&2; exit 1; }
28
+ assert_rc() { [ "$1" = "$2" ] || fail "expected rc=$2 got rc=$1${3:+ ($3)}"; }
29
+ assert_contains() { case "$2" in *"$1"*) : ;; *) fail "expected output to contain: $1${3:+ ($3)}";; esac; }
30
+ assert_not_contains() { case "$2" in *"$1"*) fail "expected output NOT to contain: $1${3:+ ($3)}";; *) : ;; esac; }
31
+
32
+ REPO="$TMP/repo"
33
+ git clone -q "$ROOT" "$REPO"
34
+ git -C "$REPO" config user.email test@example.invalid
35
+ git -C "$REPO" config user.name "Test User"
36
+ # A throwaway upstream-owner reference committed to the base, so a later case can
37
+ # MOVE it out of skills/ (the rename/move-out bypass). Nothing else references it,
38
+ # so moving it does not trip the broken-.md-reference check.
39
+ MOVEOUT_REL="skills/product-rd-workflow/references/zz-fixture-moveout.md"
40
+ printf '# fixture move-out reference\n\nNeutral placeholder content for the impact-chain move-out test.\n' > "$REPO/$MOVEOUT_REL"
41
+ # A committed (unchanged-in-cases) sentence for the stale-anchor case: long
42
+ # enough to pass the 16-char minimum, so that case tests added-line binding.
43
+ printf '\n- Stale anchor fixture sentence must stay unchanged for coverage.\n' >> "$REPO/skills/product-rd-workflow/references/adr-convention.md"
44
+ # A file whose NAME carries the owner's slug, so a later case can rename the owner
45
+ # and its slug-named file together the way a real rename does.
46
+ printf '# fixture slug-named reference\n\nNeutral placeholder for the inner-rename test.\n' > "$REPO/skills/platform-observability/references/platform-observability-playbook.md"
47
+ # A script mentioning the renameable slug, so a later case can retarget it PURELY
48
+ # and isolate the prose-only guard from the reproduction check.
49
+ printf '# fixture slug mention: platform-observability\n' >> "$REPO/skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh"
50
+ printf '\nFixture eligible sibling mention: platform-observability.\n' >> "$REPO/skills/product-rd-workflow/references/adr-convention.md"
51
+ git -C "$REPO" add -A
52
+ git -C "$REPO" commit -qm "seed throwaway upstream reference"
53
+ git -C "$REPO" branch fixture-base HEAD
54
+ fixture_base_revision="$(git -C "$REPO" rev-parse fixture-base)"
55
+
56
+ REGISTER="$REPO/skills/skill-extraction-workflow/references/source-register.md"
57
+ UPSTREAM_REF="skills/product-rd-workflow/references/adr-convention.md" # an upstream owner's reference
58
+ UPSTREAM_SCRIPT="skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh" # an upstream owner's script
59
+ [ -f "$REPO/$UPSTREAM_REF" ] || fail "fixture reference missing: $UPSTREAM_REF"
60
+ [ -f "$REPO/$UPSTREAM_SCRIPT" ] || fail "fixture script missing: $UPSTREAM_SCRIPT"
61
+
62
+ # Fresh per-case branch off fixture-base, with upstream set so the checker's
63
+ # base-ref detection resolves to a stable local ref (independent of a detached CI
64
+ # checkout head).
65
+ new_case() {
66
+ git -C "$REPO" switch -q -C "$1" fixture-base
67
+ git -C "$REPO" branch --set-upstream-to=fixture-base "$1" >/dev/null 2>&1
68
+ }
69
+ commit_case() { git -C "$REPO" add -A; git -C "$REPO" commit -qm "$1"; }
70
+ full_check_runs=0
71
+ gate_runs=0
72
+ run_full_check() {
73
+ full_check_runs=$((full_check_runs + 1))
74
+ set +e
75
+ out="$(env -u ALIAS_AUDIT_CMD -u CCL_SKILL_BASE_REF bash "$CHECK_SCRIPT" "$REPO" 2>&1)"
76
+ rc=$?
77
+ set -e
78
+ }
79
+ # A real rename retargets EVERY mention, including the agents/ overlay's prompt
80
+ # token. Leaving one behind is what a stale-reference bug looks like, and the
81
+ # identifier-rename class is supposed to refuse it, so the fixture must retarget
82
+ # as completely as the real thing does.
83
+ retarget_all() {
84
+ for target in "$@"; do
85
+ find "$target" -type f -exec perl -pi -e 's/platform-observability/platform-signal-evidence/g' {} +
86
+ done
87
+ }
88
+ run_gate() {
89
+ gate_runs=$((gate_runs + 1))
90
+ set +e
91
+ out="$(env -u ALIAS_AUDIT_CMD -u CCL_SKILL_BASE_REF ruby "$GATE_SCRIPT" "$REPO" 2>&1)"
92
+ rc=$?
93
+ set -e
94
+ }
95
+
96
+ # Case 1: an upstream owner's REFERENCE changed with NO impact-chain row -> block.
97
+ new_case case-ref-no-row
98
+ printf '\nFixture reference edit for the impact-chain refscripts gate.\n' >> "$REPO/$UPSTREAM_REF"
99
+ commit_case "ref edit, no impact-chain row"
100
+ run_full_check
101
+ assert_rc "$rc" 1 "reference edit without a row must fail the gate"
102
+ assert_contains "impact_chain_gate_missing" "$out" "checker should name the missing-row cause"
103
+ assert_contains "product-rd-workflow/SKILL.md" "$out" "diagnostic should name the changed upstream owner"
104
+ assert_contains "references/ and scripts/" "$out" "diagnostic should explain reference/scripts now count"
105
+
106
+ # Case 2: a matching impact-chain row without behavioral evidence is still
107
+ # incomplete. The previous gate accepted the row because it only checked the
108
+ # owner path, so "the rule is already covered" could close with no replay or
109
+ # firing-path proof.
110
+ new_case case-ref-row-without-behavior-evidence
111
+ printf '\nFixture reference edit for the impact-chain behavior-evidence gate.\n' >> "$REPO/$UPSTREAM_REF"
112
+ printf '| Fixture row without behavior evidence | `downstream-executor` | Executor applies the reference behavior | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
113
+ commit_case "ref edit with row but no behavior evidence"
114
+ run_gate
115
+ assert_rc "$rc" 1 "an impact-chain row without behavioral evidence must fail"
116
+ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should require the behavior-evidence record"
117
+
118
+
119
+ # A genuinely normative rule phrased with "Never" (not in the older verb list)
120
+ # must be accepted as an enforcing firing-path line.
121
+ new_case case-ref-never-verb-firing-path
122
+ printf '\n- Never bypass the fixture upstream rule for this gate.\n' >> "$REPO/$UPSTREAM_REF"
123
+ printf '| Fixture never-verb rule | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Never bypass the fixture upstream rule | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
124
+ commit_case "never-verb normative firing path"
125
+ run_gate
126
+ assert_not_contains "impact_chain_firing_path_missing" "$out" "a never-phrased normative rule should satisfy the firing-path gate"
127
+ assert_rc "$rc" 0 "a never-phrased normative list rule must be accepted"
128
+
129
+ # A purely DESCRIPTIVE list line ("always exposes" — no imperative/prohibitive
130
+ # verb) is not an enforcing rule; the widened verb list must not admit it.
131
+ new_case case-ref-descriptive-always-firing-path
132
+ printf '\n- The host always exposes this delegation capability surface.\n' >> "$REPO/$UPSTREAM_REF"
133
+ printf '| Fixture descriptive always line | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#always exposes this delegation capability | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
134
+ commit_case "descriptive always line as firing path"
135
+ run_gate
136
+ assert_rc "$rc" 1 "a descriptive list line must not satisfy the firing-path gate"
137
+ assert_contains "impact_chain_firing_path_missing" "$out" "checker should reject a descriptive (non-normative) anchor line"
138
+
139
+ # An HTML comment can smuggle normative vocabulary past the verb heuristic; a
140
+ # comment-carrying anchor line is never an enforcing rule surface.
141
+ new_case case-ref-html-comment-firing-path
142
+ printf '\n- <!-- must enforce this hidden fixture directive --> bookkeeping note.\n' >> "$REPO/$UPSTREAM_REF"
143
+ printf '| Fixture html-comment firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#must enforce this hidden fixture directive | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
144
+ commit_case "html-comment line as firing path"
145
+ run_gate
146
+ assert_rc "$rc" 1 "an HTML-comment anchor line must not satisfy the firing-path gate"
147
+ assert_contains "impact_chain_firing_path_missing" "$out" "checker should reject comment-smuggled normative vocabulary"
148
+
149
+ # A changed executable-bit file without a shebang (e.g. a chmod'ed Markdown
150
+ # file) is not an executable firing surface.
151
+ new_case case-ref-noshebang-command-firing-path
152
+ printf '\nFixture reference edit for the shebang command gate.\n' >> "$REPO/$UPSTREAM_REF"
153
+ printf '# fixture executable-bit markdown\n' > "$REPO/skills/product-rd-workflow/scripts/zz-fixture-noshebang.md"
154
+ chmod +x "$REPO/skills/product-rd-workflow/scripts/zz-fixture-noshebang.md"
155
+ printf '| Fixture no-shebang command | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: command:skills/product-rd-workflow/scripts/zz-fixture-noshebang.md | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
156
+ commit_case "executable-bit file without shebang as firing path"
157
+ run_gate
158
+ assert_rc "$rc" 1 "a shebang-less executable-bit file must not satisfy a command firing path"
159
+ assert_contains "impact_chain_firing_path_missing" "$out" "checker should require a shebang on command firing surfaces"
160
+
161
+ # Positive command-locator coverage: a genuinely changed 100755 shebang script
162
+ # under the owner must be ACCEPTED as a firing surface (rejection-only coverage
163
+ # would let an implementation that refuses every command: locator pass).
164
+ new_case case-ref-command-firing-path-accepted
165
+ printf '\nFixture reference edit for the accepted command firing path.\n' >> "$REPO/$UPSTREAM_REF"
166
+ printf '#!/usr/bin/env bash\nprintf "fixture owner enforcement script\\n"\n' > "$REPO/skills/product-rd-workflow/scripts/zz-fixture-owner-command.sh"
167
+ chmod +x "$REPO/skills/product-rd-workflow/scripts/zz-fixture-owner-command.sh"
168
+ printf '| Fixture accepted command firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: command:skills/product-rd-workflow/scripts/zz-fixture-owner-command.sh | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
169
+ commit_case "changed shebang owner executable as firing path"
170
+ run_gate
171
+ assert_not_contains "impact_chain_firing_path_missing" "$out" "a changed shebang owner executable should satisfy the firing-path gate"
172
+ assert_rc "$rc" 0 "a complete RED row with a changed owner executable must pass"
173
+
174
+ # A malformed impact-chain-looking row (wrong cell count) is warned but stays
175
+ # advisory: hard-blocking would false-positive on the register's many other
176
+ # legitimate table shapes, and deliberate mangling is outside the trust model
177
+ # (review owns that residual). The complete sibling row satisfies the gate.
178
+ new_case case-ref-malformed-row-advisory
179
+ printf '\n- MUST enforce Fixture reference edit for the malformed-row gate.\n' >> "$REPO/$UPSTREAM_REF"
180
+ printf '| Fixture complete sibling row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
181
+ printf '| Fixture malformed row | `downstream-executor` | prose with an unescaped | pipe inside a cell | `updated` | `product-rd-workflow/SKILL.md` second disposition |\n' >> "$REGISTER"
182
+ commit_case "complete row plus malformed sibling row"
183
+ run_gate
184
+ assert_contains "impact_chain_row_malformed" "$out" "checker should warn about the malformed row"
185
+ assert_rc "$rc" 0 "a malformed row stays advisory when a complete sibling row satisfies the gate"
186
+
187
+ # A semantic-control label alone cannot close a non-wording owner diff: the
188
+ # owner package needs at least one RED-baseline row, else an author could
189
+ # label every change "stable" and self-clear the package.
190
+ new_case case-ref-semantic-control-alone
191
+ printf '\n- MUST enforce Fixture reference edit for semantic-control firing-path coverage.\n' >> "$REPO/$UPSTREAM_REF"
192
+ printf '| Fixture semantic control self-adjudication | `downstream-executor` | behavioral-evidence: semantic-control; observed-failure: no; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
193
+ commit_case "semantic control label alone"
194
+ run_gate
195
+ assert_rc "$rc" 1 "a semantic-control-only owner package must fail"
196
+ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should require at least one RED-baseline row per non-wording owner"
197
+
198
+ # A stable semantic-control row may supplement a RED-baseline row for the same
199
+ # non-wording owner; the RED row satisfies the owner-level floor.
200
+ new_case case-ref-semantic-control-with-owner-red
201
+ printf '\n- MUST enforce Fixture reference edit for semantic-control plus owner RED validation.\n' >> "$REPO/$UPSTREAM_REF"
202
+ printf '| Fixture stable semantic control | `downstream-executor` | behavioral-evidence: semantic-control; observed-failure: no; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` stable control |\n' >> "$REGISTER"
203
+ printf '| Fixture owner behavior delta | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` changed behavior |\n' >> "$REGISTER"
204
+ commit_case "semantic control supplemented by owner RED"
205
+ run_gate
206
+ assert_not_contains "impact_chain_behavior_evidence_missing" "$out" "valid owner RED should permit a supplementary stable semantic-control row"
207
+ assert_rc "$rc" 0 "semantic-control plus a valid owner RED row should pass"
208
+
209
+ # Case 2a: an observed failure with RED evidence but no named firing path is not
210
+ # closed. This is the exact "rule existed but did not execute" regression.
211
+ new_case case-ref-observed-without-firing-path
212
+ printf '\nFixture reference edit for the impact-chain firing-path gate.\n' >> "$REPO/$UPSTREAM_REF"
213
+ printf '| Fixture observed failure without firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
214
+ commit_case "ref edit with observed failure but no firing path"
215
+ run_gate
216
+ assert_rc "$rc" 1 "an observed failure without a firing path must fail"
217
+ assert_contains "impact_chain_firing_path_missing" "$out" "checker should name the missing firing-path proof"
218
+
219
+ # Whitespace is not a firing path either.
220
+ new_case case-ref-observed-with-empty-firing-path
221
+ printf '\nFixture reference edit for the empty firing-path gate.\n' >> "$REPO/$UPSTREAM_REF"
222
+ printf '| Fixture observed failure with empty firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: ; | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
223
+ commit_case "ref edit with empty firing path"
224
+ run_gate
225
+ assert_rc "$rc" 1 "an empty firing path must fail"
226
+ assert_contains "impact_chain_firing_path_missing" "$out" "checker should reject whitespace-only firing paths"
227
+
228
+ # Non-placeholder prose is still not a resolvable firing mechanism.
229
+ new_case case-ref-observed-with-unresolvable-firing-path
230
+ printf '\nFixture reference edit for the resolvable firing-path gate.\n' >> "$REPO/$UPSTREAM_REF"
231
+ printf '| Fixture observed failure with prose firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: the existing rule | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
232
+ commit_case "ref edit with unresolvable firing path"
233
+ run_gate
234
+ assert_rc "$rc" 1 "an arbitrary prose firing path must fail"
235
+ assert_contains "impact_chain_firing_path_missing" "$out" "checker should require a resolvable firing mechanism"
236
+
237
+ # A real executable in another owner's directory is not this owner's firing
238
+ # mechanism, even though it exists and is changed by the checker under test.
239
+ new_case case-ref-cross-owner-firing-path
240
+ printf '\nFixture reference edit for owner-scoped firing paths.\n' >> "$REPO/$UPSTREAM_REF"
241
+ mkdir -p "$REPO/skills/grill-me/scripts"
242
+ printf '#!/usr/bin/env bash\nprintf "fixture cross-owner executable\\n"\n' > "$REPO/skills/grill-me/scripts/zz-fixture-crossowner.sh"
243
+ chmod +x "$REPO/skills/grill-me/scripts/zz-fixture-crossowner.sh"
244
+ printf '| Fixture cross-owner firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: command:skills/grill-me/scripts/zz-fixture-crossowner.sh | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
245
+ commit_case "ref edit with cross-owner firing path"
246
+ run_gate
247
+ assert_rc "$rc" 1 "a cross-owner firing mechanism must fail"
248
+ assert_contains "impact_chain_firing_path_missing" "$out" "checker should bind firing paths to the changed owner"
249
+
250
+ # Merely adding a uniquely-addressable prose bullet under the owner is still the
251
+ # original content-without-enforcement failure. A file firing path must land on a
252
+ # normative numbered/list rule, not decorative bookkeeping text.
253
+ new_case case-ref-decorative-owner-prose-firing-path
254
+ printf '\nFixture reference edit for enforcing firing-path coverage.\n' >> "$REPO/$UPSTREAM_REF"
255
+ printf '\n- This row is recorded for ledger bookkeeping only.\n' >> "$REPO/skills/product-rd-workflow/SKILL.md"
256
+ printf '| Fixture decorative firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#This row is recorded for ledger bookkeeping only | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
257
+ commit_case "ref edit with decorative owner prose firing path"
258
+ run_gate
259
+ assert_rc "$rc" 1 "decorative owner prose must not satisfy a firing path"
260
+ assert_contains "impact_chain_firing_path_missing" "$out" "checker should require an enforcing checklist or rule line"
261
+
262
+ # A token that exists only in old content is not a newly landed firing point.
263
+ new_case case-ref-stale-anchor-firing-path
264
+ printf '\nFixture reference edit for changed-anchor coverage.\n' >> "$REPO/$UPSTREAM_REF"
265
+ printf '| Fixture stale-anchor firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Stale anchor fixture sentence must stay unchanged | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
266
+ commit_case "ref edit with stale anchor firing path"
267
+ run_gate
268
+ assert_rc "$rc" 1 "an unchanged anchor must fail"
269
+ assert_contains "impact_chain_firing_path_missing" "$out" "checker should require a changed-line anchor"
270
+
271
+ # Case 2b: same reference change WITH a complete matching impact-chain row ->
272
+ # gate satisfied.
273
+ new_case case-ref-with-row
274
+ printf '\n- MUST enforce Fixture reference edit for the impact-chain refscripts gate.\n' >> "$REPO/$UPSTREAM_REF"
275
+ printf '| Fixture reference-path rule | `downstream-executor` | Executor applies the reference behavior; behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
276
+ commit_case "ref edit with matching impact-chain row"
277
+ run_gate
278
+ assert_not_contains "impact_chain_gate_missing" "$out" "a matching row must satisfy the gate for a reference edit"
279
+ assert_not_contains "impact_chain_behavior_evidence_missing" "$out" "complete behavior evidence must satisfy the gate"
280
+ assert_not_contains "impact_chain_firing_path_missing" "$out" "a named firing path must satisfy the observed-failure gate"
281
+ assert_rc "$rc" 0 "reference edit with a valid row should pass"
282
+
283
+ # Every added row must be complete. One boilerplate-complete row must not mask a
284
+ # second bare disposition for the same owner.
285
+ new_case case-ref-complete-row-masks-incomplete-row
286
+ printf '\n- MUST enforce Fixture reference edit for per-row behavior evidence.\n' >> "$REPO/$UPSTREAM_REF"
287
+ printf '| Fixture complete row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
288
+ printf '| Fixture incomplete sibling row | `downstream-executor` | Bare owner citation only | `updated` | `product-rd-workflow/SKILL.md` second disposition |\n' >> "$REGISTER"
289
+ commit_case "one complete row cannot mask one incomplete row"
290
+ run_gate
291
+ assert_rc "$rc" 1 "every added row for an owner must carry complete behavior evidence"
292
+ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should reject the incomplete sibling row"
293
+
294
+ # Case 3: an upstream owner's SCRIPT changed with NO impact-chain row -> block.
295
+ new_case case-script-no-row
296
+ printf '\n# fixture script edit for the impact-chain refscripts gate\n' >> "$REPO/$UPSTREAM_SCRIPT"
297
+ commit_case "script edit, no impact-chain row"
298
+ run_gate
299
+ assert_rc "$rc" 1 "script edit without a row must fail the gate"
300
+ assert_contains "impact_chain_gate_missing" "$out" "checker should name the missing-row cause for a script edit"
301
+ assert_contains "product-rd-workflow/SKILL.md" "$out" "diagnostic should name the changed upstream owner"
302
+
303
+ # Case 2c: an INDENTED impact-chain evidence row (valid Markdown, ≤3 leading
304
+ # spaces) must still count — it must not be falsely blocked. Guards the parser
305
+ # normalization that keeps item-1 and item-2 consistent.
306
+ new_case case-ref-indented-row
307
+ UPSTREAM_REF2="skills/test-artifact-management/references/gen_report.py" # a NON-.md upstream reference
308
+ [ -f "$REPO/$UPSTREAM_REF2" ] || fail "fixture non-md reference missing: $UPSTREAM_REF2"
309
+ printf '\n- MUST enforce Fixture reference edit for the impact-chain refscripts gate.\n' >> "$REPO/$UPSTREAM_REF"
310
+ printf ' | Fixture indented row | `downstream-executor` | Executor applies the reference behavior; behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
311
+ commit_case "ref edit with an indented (valid) impact-chain row"
312
+ run_gate
313
+ assert_not_contains "impact_chain_gate_missing" "$out" "an indented but valid evidence row must count"
314
+ assert_rc "$rc" 0 "indented valid row should pass"
315
+
316
+ # Deterministically wording-only rows are the sole no-firing-path exception.
317
+ new_case case-ref-wording-only-row
318
+ printf '\n' >> "$REPO/$UPSTREAM_REF"
319
+ printf '| Fixture formatting-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no | `updated` | `product-rd-workflow/SKILL.md` formatting-only edit |\n' >> "$REGISTER"
320
+ commit_case "formatting-only edit with explicit evidence"
321
+ run_gate
322
+ assert_not_contains "impact_chain_behavior_evidence_missing" "$out" "wording-only row with artifact should satisfy behavior record"
323
+ assert_not_contains "impact_chain_firing_path_missing" "$out" "wording-only row does not need a firing path"
324
+ assert_rc "$rc" 0 "deterministically wording-only row should pass"
325
+
326
+ # A substantive change cannot self-label as wording-only to skip the firing path.
327
+ new_case case-ref-substantive-mislabeled-wording-only
328
+ printf '\nSubstantive fixture behavior change.\n' >> "$REPO/$UPSTREAM_REF"
329
+ printf '| Fixture mislabeled wording-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no | `updated` | `product-rd-workflow/SKILL.md` substantive edit |\n' >> "$REGISTER"
330
+ commit_case "substantive edit mislabeled wording-only"
331
+ run_gate
332
+ assert_rc "$rc" 1 "a substantive edit mislabeled wording-only must fail"
333
+ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should reject self-adjudicated wording-only classification"
334
+
335
+ # Adding a firing-path string does not rescue the false classification; a real
336
+ # non-wording change must use RED-baseline or semantic-control.
337
+ new_case case-ref-substantive-mislabeled-wording-only-with-path
338
+ printf '\nAnother substantive fixture behavior change.\n' >> "$REPO/$UPSTREAM_REF"
339
+ printf '| Fixture mislabeled wording-only row with path | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` substantive edit |\n' >> "$REGISTER"
340
+ commit_case "substantive edit mislabeled wording-only with path"
341
+ run_gate
342
+ assert_rc "$rc" 1 "a firing path must not rescue a false wording-only label"
343
+ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should require a non-wording behavioral status"
344
+
345
+ # Wording-only is computed across every changed file in the owner package. A
346
+ # blank-only reference hunk cannot hide a substantive SKILL.md hunk.
347
+ new_case case-owner-multifile-substantive-mislabeled-wording-only
348
+ printf '\n' >> "$REPO/$UPSTREAM_REF"
349
+ printf '\nSubstantive multi-file owner behavior change.\n' >> "$REPO/skills/product-rd-workflow/SKILL.md"
350
+ printf '| Fixture multi-file mislabeled wording-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no | `updated` | `product-rd-workflow/SKILL.md` multi-file substantive edit |\n' >> "$REGISTER"
351
+ commit_case "multi-file substantive owner edit mislabeled wording-only"
352
+ run_gate
353
+ assert_rc "$rc" 1 "wording-only must be false when any owner file has letter or digit deltas"
354
+ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should aggregate the full owner package diff"
355
+
356
+ # The wording-only class applies only to Markdown prose: a punctuation-only
357
+ # edit in a runnable non-.md reference can change behavior (a deleted paren),
358
+ # so it must not be classifiable as wording-only.
359
+ new_case case-ref-nonmd-punctuation-mislabeled-wording-only
360
+ printf '\n#\n' >> "$REPO/$UPSTREAM_REF2"
361
+ printf '| Fixture non-md punctuation wording-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; observed-failure: no | `updated` | `test-artifact-management/SKILL.md` runnable reference edit |\n' >> "$REGISTER"
362
+ commit_case "punctuation-only edit to a runnable reference mislabeled wording-only"
363
+ run_gate
364
+ assert_rc "$rc" 1 "a non-md owner file change must never classify as wording-only"
365
+ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should restrict wording-only to Markdown prose"
366
+
367
+ # A declaration key embedded mid-prose is not a declaration: each field must
368
+ # start its own semicolon-delimited fragment.
369
+ new_case case-ref-embedded-declaration-key
370
+ printf '\n- MUST enforce Fixture reference edit for the embedded-key gate.\n' >> "$REPO/$UPSTREAM_REF"
371
+ printf '| Fixture embedded key row | `downstream-executor` | there is no behavioral-evidence: RED-baseline here; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
372
+ commit_case "declaration key embedded in prose"
373
+ run_gate
374
+ assert_rc "$rc" 1 "an embedded declaration key must not parse as a declaration"
375
+ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should require fragment-anchored declarations"
376
+
377
+ # A failing git diff must FAIL CLOSED: empty output from a broken subprocess
378
+ # must never read as "no changed owners".
379
+ new_case case-git-diff-failure-fails-closed
380
+ printf '\nFixture reference edit for the git fail-closed gate.\n' >> "$REPO/$UPSTREAM_REF"
381
+ commit_case "ref edit behind a failing git diff"
382
+ GIT_SHIM_DIR="$TMP/git-shim"
383
+ mkdir -p "$GIT_SHIM_DIR"
384
+ REAL_GIT="$(command -v git)"
385
+ printf '#!/usr/bin/env bash\ncase "$*" in *"--no-renames -z"*) exit 1 ;; esac\nexec "%s" "$@"\n' "$REAL_GIT" > "$GIT_SHIM_DIR/git"
386
+ chmod +x "$GIT_SHIM_DIR/git"
387
+ set +e
388
+ gate_runs=$((gate_runs + 1))
389
+ out="$(env -u ALIAS_AUDIT_CMD -u CCL_SKILL_BASE_REF PATH="$GIT_SHIM_DIR:$PATH" ruby "$GATE_SCRIPT" "$REPO" 2>&1)"
390
+ rc=$?
391
+ set -e
392
+ assert_rc "$rc" 1 "a failing changed-path diff must fail the gate closed"
393
+ assert_contains "impact_chain_git_failed" "$out" "checker should name the failed git subprocess"
394
+
395
+ # Case 2d: multi-perspective-research is an upstream evidence/coverage owner.
396
+ # Editing it without an impact-chain row must not bypass the gate.
397
+ new_case case-research-owner-no-row
398
+ printf '\nFixture research-owner edit for impact-chain coverage.\n' >> "$REPO/skills/multi-perspective-research/SKILL.md"
399
+ commit_case "research owner edit, no impact-chain row"
400
+ run_gate
401
+ assert_rc "$rc" 1 "a research-owner edit without an impact-chain row must fail"
402
+ assert_contains "impact_chain_gate_missing" "$out" "research evidence owner must trigger the impact-chain gate"
403
+ assert_contains "multi-perspective-research/SKILL.md" "$out" "diagnostic should name the research owner"
404
+
405
+ # skill-extraction-workflow is itself an upstream owner. Its checker/rules cannot
406
+ # escape the same impact-chain row requirement that they impose on other owners.
407
+ new_case case-extraction-owner-no-row
408
+ printf '\n- MUST enforce fixture extraction-owner behavior.\n' >> "$REPO/skills/skill-extraction-workflow/SKILL.md"
409
+ commit_case "skill-extraction owner edit, no impact-chain row"
410
+ run_gate
411
+ assert_rc "$rc" 1 "the extraction owner must require its own impact-chain row"
412
+ assert_contains "impact_chain_gate_missing" "$out" "extraction owner must trigger the impact-chain gate"
413
+ assert_contains "skill-extraction-workflow/SKILL.md" "$out" "diagnostic should name the extraction owner"
414
+
415
+ # Case 3a2: a NON-.md file under an upstream owner's references/ (e.g. a runnable
416
+ # helper) also ships behavior and must require a row. Guards the references/.+ fix.
417
+ new_case case-nonmd-ref-no-row
418
+ printf '\n# fixture edit to a non-md upstream reference helper\n' >> "$REPO/$UPSTREAM_REF2"
419
+ commit_case "non-md reference edit, no impact-chain row"
420
+ run_gate
421
+ assert_rc "$rc" 1 "a non-.md reference edit without a row must fail the gate"
422
+ assert_contains "impact_chain_gate_missing" "$out" "non-.md reference edits must not bypass the gate"
423
+ assert_contains "test-artifact-management/SKILL.md" "$out" "diagnostic should name the owner of the non-md reference"
424
+
425
+ # Case 3b: MOVING an upstream owner's reference OUT of skills/ (a rename git would
426
+ # otherwise collapse to the destination) must still trigger the gate via the old
427
+ # path. Guards the --no-renames fix.
428
+ new_case case-ref-moveout
429
+ git -C "$REPO" mv "$MOVEOUT_REL" "docs/zz-fixture-moveout.md"
430
+ commit_case "move an upstream reference out of skills/ with no row"
431
+ run_gate
432
+ assert_rc "$rc" 1 "moving an upstream reference out of skills/ without a row must fail"
433
+ assert_contains "impact_chain_gate_missing" "$out" "a move-out must not evade the gate"
434
+ assert_contains "product-rd-workflow/SKILL.md" "$out" "diagnostic should name the owner whose reference moved out"
435
+
436
+ # Deleting an owner reference can close when a changed surviving rule provides
437
+ # the firing path — legitimate rule replacement stays possible while the
438
+ # move-out itself still demands a row.
439
+ new_case case-ref-moveout-with-replacement-row
440
+ git -C "$REPO" mv "$MOVEOUT_REL" "docs/zz-fixture-moveout.md"
441
+ printf '\n- MUST enforce Fixture replacement rule after deleting an owner reference.\n' >> "$REPO/skills/product-rd-workflow/SKILL.md"
442
+ printf '| Fixture move-out replacement row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#Fixture replacement rule after deleting an owner reference | `updated` | `product-rd-workflow/SKILL.md` replacement rule |\n' >> "$REGISTER"
443
+ commit_case "move an upstream reference out with replacement evidence"
444
+ run_gate
445
+ assert_not_contains "impact_chain_behavior_evidence_missing" "$out" "a deletion covered by a surviving changed firing path should validate"
446
+ assert_not_contains "impact_chain_firing_path_missing" "$out" "replacement rule should provide the changed firing path"
447
+ assert_rc "$rc" 0 "move-out with complete deleted-subject evidence should pass"
448
+
449
+ # Case 4: the source-register itself is the ledger and is EXCLUDED — appending a
450
+ # row to it (with no other upstream change) must NOT demand a self-referential row.
451
+ new_case case-register-only
452
+ printf '\n<!-- fixture: benign ledger note, no upstream change -->\n' >> "$REGISTER"
453
+ commit_case "register-only edit is excluded"
454
+ run_gate
455
+ assert_not_contains "impact_chain_gate_missing" "$out" "editing only the ledger must not trigger the gate"
456
+ assert_rc "$rc" 0 "register-only edit should pass"
457
+
458
+ # The exact shared ledger path is excluded even when the upstream owner is
459
+ # skill-extraction-workflow itself; the surviving owner SKILL remains bound.
460
+ new_case case-extraction-owner-ledger-exclusion
461
+ printf '\n- MUST enforce Fixture extraction owner ledger exclusion.\n' >> "$REPO/skills/skill-extraction-workflow/SKILL.md"
462
+ printf '| Fixture extraction ledger exclusion | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/skill-extraction-workflow/SKILL.md#Fixture extraction owner ledger exclusion | `updated` | `skill-extraction-workflow/SKILL.md` fixture rule |\n' >> "$REGISTER"
463
+ git -C "$REPO" add -A
464
+ git -C "$REPO" commit -qm "extraction owner ledger exclusion"
465
+ run_gate
466
+ assert_not_contains "impact_chain_behavior_evidence_missing" "$out" "shared ledger should be excluded from extraction-owner subjects"
467
+ assert_rc "$rc" 0 "extraction owner change plus ledger row should pass"
468
+
469
+ # Case 5: RENAMING a whole upstream owner package. --no-renames surfaces the old
470
+ # package path as a delete, so the subject set used to demand a row for an owner
471
+ # whose SKILL.md no longer exists — while the evidence check rejects any row that
472
+ # cites a missing SKILL.md. The gate asked for exactly the row it refused, leaving
473
+ # a rename with no honest way to pass. The surviving name carries the row instead.
474
+ new_case case-owner-package-renamed
475
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
476
+ printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
477
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
478
+ commit_case "rename an upstream owner package with a row on the surviving name"
479
+ run_gate
480
+ assert_not_contains "platform-observability/SKILL.md" "$out" "the renamed-away path must not be demanded as a row subject"
481
+ assert_not_contains "impact_chain_gate_missing" "$out" "a renamed owner covered on its surviving name must not block"
482
+ assert_rc "$rc" 0 "renaming an owner package with a row on the new name should pass"
483
+
484
+ # The exclusion is scoped to packages that are actually gone: a LIVE owner still
485
+ # owes its row, so the rename fix cannot be reused to skip a normal edit.
486
+ new_case case-owner-package-renamed-live-owner-still-bound
487
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
488
+ printf '\nFixture reference edit alongside an unrelated owner rename.\n' >> "$REPO/$UPSTREAM_REF"
489
+ commit_case "rename one owner while editing another owner's reference, no row"
490
+ run_gate
491
+ assert_rc "$rc" 1 "a live owner's reference edit must still demand a row"
492
+ assert_contains "impact_chain_gate_missing" "$out" "the live owner must still be named"
493
+ assert_contains "product-rd-workflow/SKILL.md" "$out" "diagnostic should name the live owner"
494
+ assert_not_contains "platform-observability/SKILL.md" "$out" "the renamed-away path must stay out of the subject set"
495
+
496
+ # Case 6: an owner that only RETARGETS its pointers at a renamed skill. Its diff
497
+ # is reproduced byte-for-byte by applying the rename to the base bytes, so there
498
+ # is no observed delta to declare and no changed normative rule to anchor a
499
+ # firing path on. The RED floor used to demand one anyway, which only a fabricated
500
+ # row could satisfy.
501
+ new_case case-identifier-rename-retarget
502
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
503
+ retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis"
504
+ printf '| Fixture retarget row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
505
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
506
+ commit_case "retarget a pointer at a renamed skill"
507
+ run_gate
508
+ assert_rc "$rc" 1 "the renamed owner itself must not take the no-behaviour class"
509
+ assert_contains "platform-signal-evidence/SKILL.md" "$out" "the rename destination owes real evidence"
510
+ assert_not_contains "defect-diagnosis/SKILL.md" "$out" "a dependent owner that only retargets pointers still qualifies"
511
+
512
+ # The killing mutation: smuggle ONE unrelated line in alongside the retarget. The
513
+ # base bytes no longer reproduce HEAD, so the class must be refused and the
514
+ # normal evidence bar must reappear. Without this, the class would be a waiver.
515
+ new_case case-identifier-rename-smuggled-content
516
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
517
+ retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis"
518
+ printf '\n- Smuggled fixture rule that must never ride in on a rename.\n' >> "$REPO/skills/defect-diagnosis/SKILL.md"
519
+ printf '| Fixture smuggled row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
520
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
521
+ commit_case "smuggle content alongside a retarget"
522
+ run_gate
523
+ assert_rc "$rc" 1 "content smuggled alongside a retarget must lose the class"
524
+ assert_contains "defect-diagnosis/SKILL.md" "$out" "the smuggling owner must be named"
525
+
526
+ # Declaring the class when nothing was renamed at all must not pass either: with
527
+ # no rename pairs there is no transform that could reproduce the bytes.
528
+ new_case case-identifier-rename-declared-without-any-rename
529
+ printf '\n- Fixture rule added with no rename anywhere in the diff.\n' >> "$REPO/skills/defect-diagnosis/SKILL.md"
530
+ printf '| Fixture bogus rename row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` no rename happened |\n' >> "$REGISTER"
531
+ commit_case "declare identifier-rename with no rename in the diff"
532
+ run_gate
533
+ assert_rc "$rc" 1 "the class must be refused when the diff contains no rename"
534
+
535
+ # DELETING an upstream owner outright is not the rename case and must still demand
536
+ # a declaration. Excluding every missing path would let removal of a decision owner
537
+ # — the larger change of the two — pass with no ledger row at all: a hole the old
538
+ # self-contradicting gate did not have, because that one failed closed.
539
+ new_case case-owner-package-deleted-still-bound
540
+ git -C "$REPO" rm -rq skills/platform-observability
541
+ commit_case "delete an upstream owner package outright with no row"
542
+ run_gate
543
+ assert_rc "$rc" 1 "deleting an upstream owner without a row must still block"
544
+ assert_contains "platform-observability/SKILL.md" "$out" "the deleted owner must stay a subject"
545
+
546
+ # The bijection must bite on a DEPENDENT owner, which is the only kind that can
547
+ # still hold the class. Retarget its pointers cleanly but delete one of its files:
548
+ # the changed set names only the edited file, so without comparing the complete
549
+ # package the deletion is invisible and every surviving file still reproduces.
550
+ new_case case-identifier-rename-dependent-drops-a-file
551
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
552
+ retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis"
553
+ rm -f "$REPO/skills/defect-diagnosis/agents/openai.yaml"
554
+ # The destination owes real evidence now, so give it a valid owner-scoped anchor;
555
+ # otherwise the gate stops on that row and never reaches the dependent owner.
556
+ printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
557
+ printf '| Fixture dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
558
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
559
+ commit_case "a dependent owner drops a file while retargeting"
560
+ run_gate
561
+ assert_rc "$rc" 1 "a dependent owner that drops a package file must lose the class"
562
+ assert_contains "defect-diagnosis/SKILL.md" "$out" "the dependent owner must be named as incomplete"
563
+
564
+ # Dropping the renamed-away path is only sound when the SUCCESSOR is a selected
565
+ # subject. Renaming a curated owner to a slug absent from the curated list leaves
566
+ # neither name selected, so the rename of a decision owner would escape entirely.
567
+ new_case case-rename-to-unselected-slug-still-bound
568
+ git -C "$REPO" mv skills/tighten-doc skills/zz-fixture-unselected
569
+ find "$REPO/skills/zz-fixture-unselected" -type f -exec perl -pi -e 's/tighten-doc/zz-fixture-unselected/g' {} +
570
+ commit_case "rename a curated owner to a slug nobody added to the curated list"
571
+ run_gate
572
+ assert_rc "$rc" 1 "a curated owner renamed out of the curated list must not escape the gate"
573
+ assert_contains "tighten-doc/SKILL.md" "$out" "the curated source name must stay a subject when its successor is unselected"
574
+
575
+ # Contents and names alone are not the package's identity. Drop the executable bit
576
+ # from a dependent owner's script and every byte still reproduces, yet a gate or
577
+ # hook that silently stops being runnable is exactly the behaviour change this
578
+ # class must never certify.
579
+ new_case case-identifier-rename-dependent-drops-exec-bit
580
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
581
+ retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/product-rd-workflow"
582
+ chmod -x "$REPO/$UPSTREAM_SCRIPT"
583
+ printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
584
+ printf '| Fixture exec-bit row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `product-rd-workflow/SKILL.md` pointer retarget |\n' >> "$REGISTER"
585
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
586
+ commit_case "a dependent owner loses a script's executable bit while retargeting"
587
+ run_gate
588
+ assert_rc "$rc" 1 "dropping an executable bit must lose the class"
589
+ assert_contains "product-rd-workflow/SKILL.md" "$out" "the owner whose script stopped being runnable must be named"
590
+
591
+ # A package may legitimately track a blob that is not valid UTF-8. Comparing bytes
592
+ # must not depend on decoding them, or one stray byte crashes the gate mid-run.
593
+ new_case case-identifier-rename-binary-blob-in-package
594
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
595
+ retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis"
596
+ printf '\377\376 not utf-8 \377' > "$REPO/skills/defect-diagnosis/zz-fixture-binary.bin"
597
+ printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
598
+ printf '| Fixture binary row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
599
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
600
+ commit_case "a dependent owner package tracks a non-UTF-8 blob"
601
+ run_gate
602
+ assert_not_contains "invalid byte sequence" "$out" "a non-UTF-8 blob must not crash the comparison"
603
+ assert_rc "$rc" 1 "an added binary file is not a pure retarget, so the class is refused cleanly"
604
+
605
+ # A rename usually carries filenames with it — a skill's own playbook reference is
606
+ # named after the skill. Mapping only the directory would leave those paths
607
+ # unmatched, so an honest rename would look like a changed file set and lose the
608
+ # drop the whole class depends on.
609
+ new_case case-identifier-rename-with-renamed-inner-file
610
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
611
+ git -C "$REPO" mv skills/platform-signal-evidence/references/platform-observability-playbook.md \
612
+ skills/platform-signal-evidence/references/platform-signal-evidence-playbook.md
613
+ retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis"
614
+ printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
615
+ printf '| Fixture inner-rename dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
616
+ printf '| Fixture inner-rename owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
617
+ commit_case "rename an owner whose inner filename carries the slug"
618
+ run_gate
619
+ assert_not_contains "platform-observability/SKILL.md" "$out" "an inner filename carrying the slug must not break the move proof"
620
+ assert_rc "$rc" 0 "a rename that also renames a slug-named inner file should still land"
621
+
622
+ # A routing-surface-only change edits the frontmatter `description` and nothing
623
+ # else, so it has no changed numbered/list rule for the firing-path anchor to bind
624
+ # to. It is NOT exempted: a description edit decides which requests reach the skill,
625
+ # so it keeps the RED-baseline bar and the anchor is allowed to land on the changed
626
+ # description entry instead. Exempting it would drop the evidence requirement from
627
+ # the class carrying the most behaviour.
628
+ new_case case-routing-surface-description-anchor
629
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' \
630
+ "$REPO/skills/product-rd-workflow/SKILL.md"
631
+ printf '| Fixture routing-surface row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description-only |\n' >> "$REGISTER"
632
+ commit_case "routing-surface: anchor bound to the changed description"
633
+ run_gate
634
+ assert_not_contains "impact_chain_firing_path_missing" "$out" "a changed description must be an anchorable firing path when it is the owner's whole change"
635
+ assert_rc "$rc" 0 "a description-only owner may anchor its firing path on the changed description"
636
+
637
+ # The widening is bounded by the same byte-exact predicate. The moment anything
638
+ # rides along — body content, a sibling file in the package, or a second
639
+ # frontmatter key — the owner keeps the ORDINARY anchor bar, which that
640
+ # description line cannot meet. Each case varies exactly one of the three arms;
641
+ # without the third, the non-description frontmatter comparison stays unmeasured.
642
+ new_case case-routing-surface-anchor-refused-with-body-edit
643
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' \
644
+ "$REPO/skills/product-rd-workflow/SKILL.md"
645
+ printf '\n- Never skip the smuggled fixture body rule for this gate.\n' >> "$REPO/skills/product-rd-workflow/SKILL.md"
646
+ printf '| Fixture routing-surface body row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus body |\n' >> "$REGISTER"
647
+ commit_case "routing-surface: body content beside the description"
648
+ run_gate
649
+ assert_rc "$rc" 1 "a body edit riding along must take back the ordinary anchor bar"
650
+
651
+ new_case case-routing-surface-anchor-refused-with-reference-edit
652
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' \
653
+ "$REPO/skills/product-rd-workflow/SKILL.md"
654
+ printf '\n- Never skip the smuggled fixture reference rule for this gate.\n' >> "$REPO/$UPSTREAM_REF"
655
+ printf '| Fixture routing-surface reference row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus reference |\n' >> "$REGISTER"
656
+ commit_case "routing-surface: sibling reference beside the description"
657
+ run_gate
658
+ assert_rc "$rc" 1 "a sibling reference edit must take back the ordinary anchor bar"
659
+
660
+ new_case case-routing-surface-anchor-refused-with-frontmatter-key
661
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' \
662
+ "$REPO/skills/product-rd-workflow/SKILL.md"
663
+ perl -0pi -e 's/^(name: product-rd-workflow)$/$1\nfixture_extra_key: smuggled/m' \
664
+ "$REPO/skills/product-rd-workflow/SKILL.md"
665
+ printf '| Fixture routing-surface frontmatter row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus another frontmatter key |\n' >> "$REGISTER"
666
+ commit_case "routing-surface: second frontmatter key beside the description"
667
+ run_gate
668
+ assert_rc "$rc" 1 "a second frontmatter key must take back the ordinary anchor bar"
669
+
670
+ # A folded/block scalar spreads one description value over continuation lines.
671
+ # The predicate accepts it (one entry, same body, same other keys), so the anchor
672
+ # must be able to land on a continuation line too — requiring the `description:`
673
+ # prefix would leave exactly these owners unanchorable, which is the problem this
674
+ # widening exists to solve.
675
+ new_case case-routing-surface-anchor-on-continuation-line
676
+ perl -0pi -e 's/^description: (.+)$/description: >-\n $1\n Fixture routing-surface trigger clause./m' \
677
+ "$REPO/skills/product-rd-workflow/SKILL.md"
678
+ printf '| Fixture routing-surface folded row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` folded description |\n' >> "$REGISTER"
679
+ commit_case "routing-surface: anchor on a folded-scalar continuation line"
680
+ run_gate
681
+ assert_rc "$rc" 0 "an anchor inside a folded description entry must bind"
682
+
683
+ # A change that only DELETES a continuation line adds no line at all. The base
684
+ # must therefore ALREADY carry the folded description, or the diff still contains
685
+ # the additions and the case would not test what it claims.
686
+ git -C "$REPO" switch -q -C fixture-folded fixture-base
687
+ perl -0pi -e 's/^description: (.+)$/description: >-\n $1\n Fixture routing-surface trigger clause.\n Fixture routing-surface second clause./m' \
688
+ "$REPO/skills/product-rd-workflow/SKILL.md"
689
+ git -C "$REPO" add -A; git -C "$REPO" commit -qm "seed folded description base"
690
+ git -C "$REPO" switch -q -C case-routing-surface-anchor-after-deletion fixture-folded
691
+ git -C "$REPO" branch --set-upstream-to=fixture-folded case-routing-surface-anchor-after-deletion >/dev/null 2>&1
692
+ perl -0pi -e 's/\n Fixture routing-surface second clause\.//' "$REPO/skills/product-rd-workflow/SKILL.md"
693
+ [ -z "$(git -C "$REPO" diff fixture-folded -- skills/product-rd-workflow/SKILL.md | grep -E '^\+[^+]')" ] \
694
+ || fail "deletion fixture must add no line to the owner entrypoint"
695
+ printf '| Fixture routing-surface deletion row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` deleted continuation line |\n' >> "$REGISTER"
696
+ commit_case "routing-surface: continuation line deleted, nothing added"
697
+ run_gate
698
+ assert_rc "$rc" 0 "a description change that only deletes a continuation line must still qualify"
699
+
700
+ # Turning the description into a nested MAPPING would let arbitrary frontmatter
701
+ # ride inside the entry — and even carry the anchor — if the entry boundary were
702
+ # the only check. The value must still be a string.
703
+ new_case case-routing-surface-nested-mapping-refused
704
+ perl -0pi -e 's/^description: .+$/description:\n hidden_key: Fixture routing-surface trigger clause/m' \
705
+ "$REPO/skills/product-rd-workflow/SKILL.md"
706
+ printf '| Fixture routing-surface nested row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` nested description |\n' >> "$REGISTER"
707
+ commit_case "routing-surface: description turned into a nested mapping"
708
+ run_gate
709
+ assert_rc "$rc" 1 "a description that is not a string must lose the anchor widening"
710
+
711
+ # A folded scalar may contain a blank line between paragraphs. Stopping the entry
712
+ # at the blank line would push the later paragraph into the "other keys" set and
713
+ # refuse an ordinary description edit.
714
+ new_case case-routing-surface-blank-line-in-folded-description
715
+ perl -0pi -e 's/^description: (.+)$/description: >-\n $1\n\n Fixture routing-surface trigger clause./m' \
716
+ "$REPO/skills/product-rd-workflow/SKILL.md"
717
+ printf '| Fixture routing-surface blank-line row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` folded description with blank line |\n' >> "$REGISTER"
718
+ commit_case "routing-surface: folded description containing a blank line"
719
+ run_gate
720
+ assert_rc "$rc" 0 "a blank line inside a folded description must not break the entry boundary"
721
+
722
+ # The locator for this class is the canonical field name. A free-text substring
723
+ # that merely SURVIVED the edit identifies nothing, so it must not be accepted.
724
+ new_case case-routing-surface-surviving-substring-locator-refused
725
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' \
726
+ "$REPO/skills/product-rd-workflow/SKILL.md"
727
+ printf '| Fixture routing-surface substring row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#Fixture routing-surface trigger clause | `updated` | `product-rd-workflow/SKILL.md` substring locator |\n' >> "$REGISTER"
728
+ commit_case "routing-surface: free-text substring locator"
729
+ run_gate
730
+ assert_rc "$rc" 1 "a free-text substring must not serve as the locator for this class"
731
+
732
+ # A quoted top-level key is valid YAML; refusing it would block a legitimate
733
+ # description-only change with no satisfiable anchor.
734
+ new_case case-routing-surface-quoted-key
735
+ perl -0pi -e 's/^description: (.+)$/"description": $1 Fixture routing-surface trigger clause./m' \
736
+ "$REPO/skills/product-rd-workflow/SKILL.md"
737
+ printf '| Fixture routing-surface quoted row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` quoted description key |\n' >> "$REGISTER"
738
+ commit_case "routing-surface: quoted description key"
739
+ run_gate
740
+ assert_rc "$rc" 0 "a quoted description key must still qualify"
741
+
742
+ # A sibling frontmatter key that deserializes to a Date (or uses an alias) must
743
+ # not refuse the class: this check cares only about the description value.
744
+ new_case case-routing-surface-date-sibling-key
745
+ perl -0pi -e 's/^(name: product-rd-workflow)$/$1\nreleased: 2026-08-11/m' "$REPO/skills/product-rd-workflow/SKILL.md"
746
+ git -C "$REPO" add -A; git -C "$REPO" commit -qm "seed date sibling key"
747
+ git -C "$REPO" branch -f fixture-dated HEAD
748
+ git -C "$REPO" switch -q -C case-routing-surface-date-sibling-key fixture-dated
749
+ git -C "$REPO" branch --set-upstream-to=fixture-dated case-routing-surface-date-sibling-key >/dev/null 2>&1
750
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
751
+ printf '| Fixture routing-surface dated row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside a date key |\n' >> "$REGISTER"
752
+ commit_case "routing-surface: date-valued sibling frontmatter key"
753
+ run_gate
754
+ assert_rc "$rc" 0 "a date-valued sibling key must not refuse the class"
755
+
756
+ # A date-less host must not change any verdict. On hosts where `require "yaml"`
757
+ # leaves Date undefined (apt ruby 3.2 / psych <= 5.2.5: psych loads date lazily
758
+ # or not at all), a gate that rides on psych's transitive load raises NameError
759
+ # at `permitted_classes: [Date, Time]`, which `rescue StandardError` folds into
760
+ # "not a scalar description" — silently refusing the routing-surface class on
761
+ # one host while granting it on another. The gate must declare `require "date"`
762
+ # itself. The shim reproduces that host class on any modern ruby: it blocks
763
+ # psych's transitive date require while letting explicit ones through.
764
+ DATELESS_SHIM="$TMP/dateless-require-shim.rb"
765
+ cat > "$DATELESS_SHIM" <<'RUBY'
766
+ module DatelessRequireShim
767
+ def require(name)
768
+ if name == "date" && caller.any? { |frame| frame.include?("/psych") || frame.include?("psych.rb") }
769
+ return false
770
+ end
771
+ super
772
+ end
773
+ end
774
+ Object.prepend(DatelessRequireShim)
775
+ RUBY
776
+ run_gate_dateless() {
777
+ gate_runs=$((gate_runs + 1))
778
+ set +e
779
+ out="$(env -u ALIAS_AUDIT_CMD -u CCL_SKILL_BASE_REF RUBYOPT="-r$DATELESS_SHIM" ruby "$GATE_SCRIPT" "$REPO" 2>&1)"
780
+ rc=$?
781
+ set -e
782
+ }
783
+ new_case case-routing-surface-dateless-host
784
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
785
+ printf '| Fixture routing-surface dateless row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description judged on a date-less host |\n' >> "$REGISTER"
786
+ commit_case "routing-surface: description-only change judged on a date-less host"
787
+ run_gate_dateless
788
+ assert_rc "$rc" 0 "a date-less host must not refuse the routing-surface class"
789
+
790
+ # Mutation attribution for the property this case names: strip the gate's own
791
+ # `require "date"` and the same fixture must show the date-less refusal. The
792
+ # cmp guard proves the mutation actually removed a line — if the require is
793
+ # ever renamed or dropped, this fails loudly instead of running a no-op
794
+ # differential that would false-green a broken shim or a regressed gate.
795
+ GATE_DATELESS_MUTANT="$TMP/impact-chain-gate-dateless-mutant.rb"
796
+ grep -v '^require "date"$' "$GATE_SCRIPT" > "$GATE_DATELESS_MUTANT"
797
+ cmp -s "$GATE_SCRIPT" "$GATE_DATELESS_MUTANT" && fail "dateless mutation is a no-op: the gate no longer contains its require \"date\" line"
798
+ run_gate_dateless_mutant() {
799
+ gate_runs=$((gate_runs + 1))
800
+ set +e
801
+ out="$(env -u ALIAS_AUDIT_CMD -u CCL_SKILL_BASE_REF RUBYOPT="-r$DATELESS_SHIM" ruby "$GATE_DATELESS_MUTANT" "$REPO" 2>&1)"
802
+ rc=$?
803
+ set -e
804
+ }
805
+ run_gate_dateless_mutant
806
+ assert_rc "$rc" 1 "without its own require-date the gate must show the date-less refusal this case guards against"
807
+ assert_contains "impact_chain_firing_path_missing" "$out" "the mutant must fail for the guarded reason, not some other error"
808
+ assert_contains "product-rd-workflow/SKILL.md" "$out" "the mutant must name the refused owner"
809
+
810
+ # The deepest Date-dependent path on a date-less host: safe_load must actually
811
+ # instantiate a Date for the sibling key, so this proves the explicit require
812
+ # makes the constant real, not merely referenceable.
813
+ git -C "$REPO" switch -q -C case-routing-surface-dateless-dated-sibling fixture-dated
814
+ git -C "$REPO" branch --set-upstream-to=fixture-dated case-routing-surface-dateless-dated-sibling >/dev/null 2>&1
815
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
816
+ printf '| Fixture routing-surface dateless dated row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` dated sibling on a date-less host |\n' >> "$REGISTER"
817
+ commit_case "routing-surface: date-valued sibling judged on a date-less host"
818
+ run_gate_dateless
819
+ assert_rc "$rc" 0 "parsing a date-valued sibling on a date-less host must still qualify"
820
+
821
+ # A file MOVED OUT of the owner package must take back the ordinary bar: the diff
822
+ # is read with --no-renames, so the vacated path still counts as an owner change.
823
+ new_case case-routing-surface-file-moved-out
824
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
825
+ mkdir -p "$REPO/docs"
826
+ git -C "$REPO" mv "$MOVEOUT_REL" docs/zz-fixture-moveout.md
827
+ printf '| Fixture routing-surface moveout row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus a file moved out |\n' >> "$REGISTER"
828
+ commit_case "routing-surface: owner file moved out of the package"
829
+ run_gate
830
+ assert_rc "$rc" 1 "a file moved out of the package must take back the ordinary bar"
831
+
832
+ # The entrypoint's MODE is part of its identity: bytes alone would let a chmod
833
+ # ride along with a description edit and still read as description-only.
834
+ new_case case-routing-surface-mode-change-refused
835
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
836
+ chmod +x "$REPO/skills/product-rd-workflow/SKILL.md"
837
+ printf '| Fixture routing-surface mode row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus mode change |\n' >> "$REGISTER"
838
+ commit_case "routing-surface: entrypoint mode changed alongside the description"
839
+ run_gate
840
+ assert_rc "$rc" 1 "a mode change riding along must take back the ordinary bar"
841
+
842
+ # An owner whose entrypoint changed only its description, while the REST of its
843
+ # package changed only by a rename retarget, still carries exactly one behaviour:
844
+ # the description. The retarget is already a machine-proven no-behaviour class, so
845
+ # refusing the locator here would refuse an owner with nothing else to evidence —
846
+ # and on an integration branch that accumulates rounds, that is the normal shape.
847
+ new_case case-routing-surface-with-retargeted-sibling
848
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
849
+ git -C "$REPO" mv skills/platform-signal-evidence/references/platform-observability-playbook.md \
850
+ skills/platform-signal-evidence/references/platform-signal-evidence-playbook.md
851
+ retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis" "$REPO/skills/product-rd-workflow"
852
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
853
+ printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
854
+ printf '| Fixture retargeted-sibling row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside retargeted references |\n' >> "$REGISTER"
855
+ printf '| Fixture retargeted-sibling dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
856
+ printf '| Fixture retargeted-sibling owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
857
+ # Keep this case's only script untouched so it varies exactly one thing.
858
+ git -C "$REPO" checkout fixture-base -- skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh
859
+ [ -n "$(git -C "$REPO" diff --name-only fixture-base -- 'skills/product-rd-workflow/references/*.md')" ] \
860
+ || fail "positive case must actually retarget an eligible .md sibling"
861
+ commit_case "routing-surface: description beside a pure rename retarget in the same package"
862
+ run_gate
863
+ assert_rc "$rc" 0 "a package whose non-entrypoint changes are a proven retarget must not lose the locator"
864
+
865
+ # The composition is bounded by the SAME byte-exact reproduction: a sibling file
866
+ # carrying real content beside the retarget still takes the locator away.
867
+ new_case case-routing-surface-retarget-plus-real-edit
868
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
869
+ git -C "$REPO" mv skills/platform-signal-evidence/references/platform-observability-playbook.md \
870
+ skills/platform-signal-evidence/references/platform-signal-evidence-playbook.md
871
+ retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis" "$REPO/skills/product-rd-workflow"
872
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
873
+ printf '\n- Never skip the smuggled fixture rule beside the retarget.\n' >> "$REPO/$UPSTREAM_REF"
874
+ printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
875
+ printf '| Fixture retarget-plus-edit row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus a real sibling edit |\n' >> "$REGISTER"
876
+ printf '| Fixture retarget-plus-edit dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
877
+ printf '| Fixture retarget-plus-edit owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
878
+ # Keep this case's only script untouched so it varies exactly one thing.
879
+ git -C "$REPO" checkout fixture-base -- skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh
880
+ commit_case "routing-surface: real sibling edit beside the retarget"
881
+ run_gate
882
+ assert_rc "$rc" 1 "real content beside the retarget must still take the locator away"
883
+
884
+ # A script reproducing under the substitution proves nothing about whether
885
+ # rewriting that identifier was safe there — some occurrences of an old slug are
886
+ # deliberately kept. Prose only.
887
+ new_case case-routing-surface-retargeted-script-refused
888
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
889
+ git -C "$REPO" mv skills/platform-signal-evidence/references/platform-observability-playbook.md \
890
+ skills/platform-signal-evidence/references/platform-signal-evidence-playbook.md
891
+ retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis" "$REPO/skills/product-rd-workflow"
892
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
893
+ printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
894
+ printf '| Fixture retargeted-script row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside a changed script |\n' >> "$REGISTER"
895
+ printf '| Fixture retargeted-script dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
896
+ printf '| Fixture retargeted-script owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
897
+ commit_case "routing-surface: a changed script in the package"
898
+ run_gate
899
+ assert_rc "$rc" 1 "a changed script must take the locator away even under a retarget"
900
+
901
+ # A `.md` SYMLINK's blob is its target, so a retargeted target reproduces under
902
+ # the substitution while what the path resolves to changes. Regular files only.
903
+ git -C "$REPO" switch -q -C fixture-symlink fixture-base
904
+ ln -s ../../platform-observability/SKILL.md "$REPO/skills/product-rd-workflow/references/zz-fixture-link.md"
905
+ git -C "$REPO" add -A; git -C "$REPO" commit -qm "seed pre-rename symlink"
906
+ git -C "$REPO" switch -q -C case-routing-surface-retargeted-symlink-refused fixture-symlink
907
+ git -C "$REPO" branch --set-upstream-to=fixture-symlink case-routing-surface-retargeted-symlink-refused >/dev/null 2>&1
908
+ rm -f "$REPO/skills/product-rd-workflow/references/zz-fixture-link.md"
909
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
910
+ git -C "$REPO" mv skills/platform-signal-evidence/references/platform-observability-playbook.md \
911
+ skills/platform-signal-evidence/references/platform-signal-evidence-playbook.md
912
+ retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis" "$REPO/skills/product-rd-workflow"
913
+ git -C "$REPO" checkout fixture-base -- skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh
914
+ ln -s ../../platform-signal-evidence/SKILL.md "$REPO/skills/product-rd-workflow/references/zz-fixture-link.md"
915
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
916
+ printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
917
+ printf '| Fixture symlink row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside a retargeted symlink |\n' >> "$REGISTER"
918
+ printf '| Fixture symlink dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
919
+ printf '| Fixture symlink owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
920
+ commit_case "routing-surface: a retargeted .md symlink in the package"
921
+ run_gate
922
+ assert_rc "$rc" 1 "a retargeted .md symlink must take the locator away"
923
+
924
+ # --- Round scoping -----------------------------------------------------------
925
+ # Every case above lands in ONE commit, so it exercises a single round and cannot
926
+ # see the defect these two cover: the classifiers used to read the whole
927
+ # base..HEAD range while each row is authored against one round's diff. Both
928
+ # cases below FAIL against the range-scoped gate and pass against the
929
+ # round-scoped one, which is what makes them a baseline rather than a restatement.
930
+
931
+ # Round scoping 1: a row's verdict must not move after it lands. Round 1 is a
932
+ # genuinely punctuation-only edit declared `not-required wording-only`; round 2
933
+ # then edits the SAME owner substantively. Judged against the accumulating range
934
+ # the round-1 row turns red retroactively, which is what forced the ledger's
935
+ # superseded-row notes.
936
+ new_case case-round-scope-verdict-stability
937
+ printf '\n***\n' >> "$REPO/$UPSTREAM_REF"
938
+ printf '| Fixture round-1 punctuation edit | `downstream-executor` | behavioral-evidence: not-required wording-only; observed-failure: no | `updated` | `product-rd-workflow/SKILL.md` punctuation-only round |\n' >> "$REGISTER"
939
+ commit_case "round 1: punctuation-only edit declared wording-only"
940
+ printf '\n- Never bypass the fixture round-scope rule for this gate.\n' >> "$REPO/$UPSTREAM_REF"
941
+ printf '| Fixture round-2 substantive edit | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Never bypass the fixture round-scope rule | `updated` | `product-rd-workflow/SKILL.md` substantive round |\n' >> "$REGISTER"
942
+ commit_case "round 2: substantive edit to the same owner"
943
+ run_gate
944
+ assert_rc "$rc" 0 "a landed wording-only row must not be re-judged against a later round"
945
+ assert_not_contains "impact_chain_behavior_evidence_missing" "$out" "the round-1 row stays valid in its own round"
946
+
947
+ # Round scoping 2: a description-only round must keep its locator even when an
948
+ # EARLIER round edited the same owner's body. Against the accumulating range the
949
+ # routing-surface class sees a changed body and refuses the anchor, which is why
950
+ # a real round had to drop its product-rd-workflow row before landing.
951
+ new_case case-round-scope-description-after-body
952
+ printf '\n- Never skip the fixture body-round rule for this gate.\n' >> "$REPO/skills/product-rd-workflow/SKILL.md"
953
+ printf '| Fixture body round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#Never skip the fixture body-round rule | `updated` | `product-rd-workflow/SKILL.md` body round |\n' >> "$REGISTER"
954
+ commit_case "round 1: body rule added to the entrypoint"
955
+ perl -0pi -e 's/^(description: .+)$/$1 Fixture round-scope routing clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
956
+ printf '| Fixture description round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description-only round |\n' >> "$REGISTER"
957
+ commit_case "round 2: description-only edit to the same owner"
958
+ run_gate
959
+ assert_rc "$rc" 0 "a description-only round keeps its locator after an earlier body round"
960
+ assert_not_contains "impact_chain_firing_path_missing" "$out" "the description anchor must bind in its own round"
961
+
962
+ # Round scoping 3: the narrowing must not become a laundering route. Owner work
963
+ # committed AFTER the last ledger append sits in the trailing round, which holds
964
+ # no rows — an earlier round's row must not cover it.
965
+ new_case case-round-scope-trailing-work-uncovered
966
+ printf '\n- Never skip the fixture trailing rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
967
+ printf '| Fixture trailing round 1 | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture trailing rule | `updated` | `platform-observability/SKILL.md` declared round |\n' >> "$REGISTER"
968
+ commit_case "round 1: declared owner change"
969
+ printf '\nFixture undeclared trailing edit that no row covers.\n' >> "$REPO/skills/platform-observability/references/platform-observability-playbook.md"
970
+ commit_case "trailing round: owner edit with no ledger append"
971
+ run_gate
972
+ assert_rc "$rc" 1 "owner work in the trailing round must not ride on an earlier round's row"
973
+
974
+ # Round scoping 4: a row must SURVIVE at HEAD to count. Round scoping alone reads
975
+ # each round's added lines, so a row appended in round 1 and deleted in round 2
976
+ # still looked "added" — the cumulative read this replaced saw a net zero and
977
+ # failed closed. Without this the narrowing becomes an append-then-drop laundering
978
+ # route, which is the shape a loosening change has to be checked hardest for.
979
+ new_case case-round-scope-deleted-row-does-not-count
980
+ printf '\n- Never skip the fixture survival rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
981
+ printf '| Fixture survival row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture survival rule | `updated` | `platform-observability/SKILL.md` declared round |\n' >> "$REGISTER"
982
+ commit_case "round 1: owner change with its row"
983
+ perl -ni -e 'print unless /Fixture survival row/' "$REGISTER"
984
+ commit_case "round 2: delete the row that vouched for it"
985
+ run_gate
986
+ assert_rc "$rc" 1 "a row deleted in a later round must not still vouch for the owner"
987
+ assert_contains "impact_chain_gate_missing" "$out" "a deleted row leaves the owner undeclared"
988
+
989
+ # Round scoping 5: survival is a MULTISET, not a set. When the row text ALREADY
990
+ # exists at base, appending a duplicate in the round that needs a row and dropping
991
+ # one copy in a later ledger-only round leaves the ledger byte-identical — a
992
+ # net-zero the cumulative read rejected. A boolean "text exists at HEAD" check
993
+ # would read the transient duplicate as surviving, so the budget is HEAD's
994
+ # occurrence count minus base's.
995
+ new_case case-round-scope-duplicate-row-laundering
996
+ printf '| Fixture duplicate row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture duplicate rule | `updated` | `platform-observability/SKILL.md` pre-existing row |\n' >> "$REGISTER"
997
+ printf '\n- Never skip the fixture duplicate rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
998
+ commit_case "base: an owner change and its row, both already landed"
999
+ git -C "$REPO" branch -q -f dup-base HEAD
1000
+ git -C "$REPO" branch --set-upstream-to=dup-base case-round-scope-duplicate-row-laundering >/dev/null 2>&1
1001
+ printf '\nFixture second substantive edit that owes its own row.\n' >> "$REPO/skills/platform-observability/references/platform-observability-playbook.md"
1002
+ printf '| Fixture duplicate row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture duplicate rule | `updated` | `platform-observability/SKILL.md` pre-existing row |\n' >> "$REGISTER"
1003
+ commit_case "round 1: new owner bytes plus a duplicate of the existing row"
1004
+ perl -ni -e 'BEGIN{$n=0} if (/Fixture duplicate row/) { $n++; next if $n == 1 } print' "$REGISTER"
1005
+ commit_case "round 2: drop one copy so the ledger ends unchanged"
1006
+ run_gate
1007
+ assert_rc "$rc" 1 "a duplicated-then-dropped row must not vouch for new owner bytes"
1008
+ assert_contains "impact_chain_gate_missing" "$out" "the net-zero ledger leaves the owner undeclared"
1009
+
1010
+ # Round scoping 6: the partition's central claim is that ONE MERGED worktree round
1011
+ # is ONE boundary — and this repo's integration branch is nothing but merge commits,
1012
+ # so a linear-only fixture set proves nothing about the shape the gate actually runs
1013
+ # on. `git rev-list --first-parent -- <path>` applies history simplification, so the
1014
+ # merge is a boundary only when it is not TREESAME to its first parent. These two
1015
+ # cases pin that behaviour instead of asserting it in a comment.
1016
+ new_case case-round-scope-merged-worktree-round
1017
+ git -C "$REPO" switch -q -c feature-round-merged
1018
+ printf '\n- Never skip the fixture merged-round rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1019
+ commit_case "worktree round: owner work"
1020
+ printf '| Fixture merged round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture merged-round rule | `updated` | `platform-observability/SKILL.md` merged round |\n' >> "$REGISTER"
1021
+ commit_case "worktree round: its ledger append"
1022
+ git -C "$REPO" switch -q case-round-scope-merged-worktree-round
1023
+ git -C "$REPO" merge -q --no-ff -m "Merge branch 'feature-round-merged': one worktree round" feature-round-merged
1024
+ run_gate
1025
+ assert_rc "$rc" 0 "a merged worktree round must resolve to one boundary covering its own work"
1026
+
1027
+ # The same shape, with undeclared work committed AFTER the merge: the trailing round
1028
+ # holds no rows, so the merged round's row must not reach forward to cover it.
1029
+ new_case case-round-scope-after-merged-round
1030
+ git -C "$REPO" switch -q -c feature-round-merged-2
1031
+ printf '\n- Never skip the fixture merged-round rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1032
+ printf '| Fixture merged round 2 | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture merged-round rule | `updated` | `platform-observability/SKILL.md` merged round |\n' >> "$REGISTER"
1033
+ commit_case "worktree round: owner work and its ledger append"
1034
+ git -C "$REPO" switch -q case-round-scope-after-merged-round
1035
+ git -C "$REPO" merge -q --no-ff -m "Merge branch 'feature-round-merged-2': one worktree round" feature-round-merged-2
1036
+ printf '\nFixture undeclared edit committed after the merged round.\n' >> "$REPO/skills/platform-observability/references/platform-observability-playbook.md"
1037
+ commit_case "after the merge: undeclared owner edit"
1038
+ run_gate
1039
+ assert_rc "$rc" 1 "work committed after a merged round must not ride on that round's row"
1040
+
1041
+ # Round scoping 7: a renamed-away owner must not escape the rounds BEFORE its
1042
+ # rename. Round 1 substantively changes an owner and a ledger append closes that
1043
+ # round with no row for it; round 2 renames the owner away with a row on the
1044
+ # surviving name. The cumulative pass rightly excuses the old name for the
1045
+ # RENAME round — but the pre-rename round still owes the row, and since the
1046
+ # evidence check reads each row against its own round head that row was never
1047
+ # impossible to write.
1048
+ new_case case-round-scope-renamed-away-pre-rename-round
1049
+ printf '\n- Never skip the fixture pre-rename rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1050
+ commit_case "round 1: owner work with no row"
1051
+ printf 'Fixture ledger note closing round one without the owner row.\n' >> "$REGISTER"
1052
+ commit_case "round 1 boundary: ledger append without the owner row"
1053
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1054
+ printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1055
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1056
+ commit_case "round 2: rename the owner with a row on the surviving name"
1057
+ run_gate
1058
+ assert_rc "$rc" 1 "owner work in a pre-rename round must not escape with the later rename"
1059
+ assert_contains "impact_chain_gate_missing" "$out" "the pre-rename round's work is undeclared"
1060
+ assert_contains "platform-observability/SKILL.md" "$out" "the missing row must name the owner under its pre-rename name"
1061
+
1062
+ # The legitimate counterpart: the pre-rename round DID carry its row, citing the
1063
+ # owner name that existed at that round's head. The rename must not retroactively
1064
+ # invalidate it — rejecting it would demand a row no honest author could write.
1065
+ new_case case-round-scope-renamed-away-row-at-round-head
1066
+ printf '\n- Never skip the fixture pre-rename declared rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1067
+ printf '| Fixture pre-rename declared row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture pre-rename declared rule | `updated` | `platform-observability/SKILL.md` pre-rename round |\n' >> "$REGISTER"
1068
+ commit_case "round 1: owner work with its row"
1069
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1070
+ printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1071
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1072
+ commit_case "round 2: rename the owner with a row on the surviving name"
1073
+ run_gate
1074
+ assert_rc "$rc" 0 "a pre-rename round declared against its own round head must pass"
1075
+ assert_not_contains "impact_chain_evidence_missing_file" "$out" "a row citing the name that existed at its round head is valid evidence"
1076
+
1077
+ # Round scoping 8: the --first-parent discriminator. On the branch the ledger
1078
+ # append lands BEFORE the owner work; first-parent collapses the merged branch
1079
+ # to one boundary (the merge), so row and work share a round. A full walk would
1080
+ # instead cut the round at the branch's ledger commit, stranding the work in a
1081
+ # rowless later round — so this fixture goes red if --first-parent is dropped,
1082
+ # which is what proves the flag load-bearing.
1083
+ new_case case-round-scope-merged-row-before-work
1084
+ git -C "$REPO" switch -q -c feature-round-row-first
1085
+ printf '| Fixture row-first merged round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture row-first rule | `updated` | `platform-observability/SKILL.md` merged round |\n' >> "$REGISTER"
1086
+ commit_case "worktree round: ledger append first"
1087
+ printf '\n- Never skip the fixture row-first rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1088
+ commit_case "worktree round: owner work after the append"
1089
+ git -C "$REPO" switch -q case-round-scope-merged-row-before-work
1090
+ git -C "$REPO" merge -q --no-ff -m "Merge branch 'feature-round-row-first': one worktree round" feature-round-row-first
1091
+ run_gate
1092
+ assert_rc "$rc" 0 "a merged worktree round collapses to one boundary even when the row precedes the work"
1093
+
1094
+ # Round scoping 9: a TRANSIENT intermediate rename hop must not launder work.
1095
+ # X renames to Y (declared), a later round substantively changes Y with no row,
1096
+ # then Y renames to Z (declared). The cumulative diff sees only X and Z, so Y is
1097
+ # in neither the cumulative selection nor the excused set — selection must follow
1098
+ # the rename lineage through each round's own pairs, or the Y round escapes.
1099
+ new_case case-round-scope-transient-rename-hop-undeclared
1100
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1101
+ printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1102
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1103
+ commit_case "round A: rename X to Y with a row on the surviving name"
1104
+ printf '\n- Never skip the fixture transient-hop rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1105
+ printf 'Fixture ledger note closing the transient round without the owner row.\n' >> "$REGISTER"
1106
+ commit_case "round B: substantive Y edit closed with no Y row"
1107
+ git -C "$REPO" mv skills/platform-signal-evidence skills/platform-telemetry-evidence
1108
+ printf '\n- MUST enforce Fixture final renamed owner rule.\n' >> "$REPO/skills/platform-telemetry-evidence/SKILL.md"
1109
+ printf '| Fixture final renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-telemetry-evidence/SKILL.md#Fixture final renamed owner rule | `updated` | `platform-telemetry-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1110
+ commit_case "round C: rename Y to Z with a row on the surviving name"
1111
+ run_gate
1112
+ assert_rc "$rc" 1 "a substantive round on a transient rename hop must not escape undeclared"
1113
+ assert_contains "impact_chain_gate_missing" "$out" "the transient-hop round's work is undeclared"
1114
+ assert_contains "platform-signal-evidence/SKILL.md" "$out" "the missing row must name the transient owner"
1115
+
1116
+ # The declared counterpart: the transient-hop round carries its own row citing
1117
+ # the name that existed at that round's head; the whole chain must pass.
1118
+ new_case case-round-scope-transient-rename-hop-declared
1119
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1120
+ printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1121
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1122
+ commit_case "round A: rename X to Y with a row on the surviving name"
1123
+ printf '\n- Never skip the fixture transient-hop rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1124
+ printf '| Fixture transient hop row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture transient-hop rule | `updated` | `platform-signal-evidence/SKILL.md` transient round |\n' >> "$REGISTER"
1125
+ commit_case "round B: substantive Y edit with its own Y row"
1126
+ git -C "$REPO" mv skills/platform-signal-evidence skills/platform-telemetry-evidence
1127
+ printf '\n- MUST enforce Fixture final renamed owner rule.\n' >> "$REPO/skills/platform-telemetry-evidence/SKILL.md"
1128
+ printf '| Fixture final renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-telemetry-evidence/SKILL.md#Fixture final renamed owner rule | `updated` | `platform-telemetry-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1129
+ commit_case "round C: rename Y to Z with a row on the surviving name"
1130
+ run_gate
1131
+ assert_rc "$rc" 0 "a declared transient-hop chain must pass end to end"
1132
+ assert_not_contains "impact_chain_evidence_missing_file" "$out" "rows citing each hop's round-head name are valid evidence"
1133
+
1134
+ # Round scoping 10: deleting an owner in one round and recreating a lookalike
1135
+ # under a new name in a LATER round must stay a deletion, not become a rename.
1136
+ # The cumulative endpoints pair the delete with the later add, but no single
1137
+ # round's own pairs contain the source — the excuse requires an atomic in-round
1138
+ # rename, so the cross-round split keeps the deletion fail-closed.
1139
+ new_case case-round-scope-delete-then-recreate-lookalike
1140
+ cp -R "$REPO/skills/platform-observability" "$TMP/stash-lookalike"
1141
+ git -C "$REPO" rm -qr skills/platform-observability
1142
+ printf 'Fixture ledger note closing the deletion round without the owner row.\n' >> "$REGISTER"
1143
+ commit_case "round A: delete the owner with no row"
1144
+ cp -R "$TMP/stash-lookalike" "$REPO/skills/platform-signal-evidence"
1145
+ retarget_all "$REPO/skills/platform-signal-evidence"
1146
+ printf '\n- MUST enforce Fixture recreated owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1147
+ printf '| Fixture recreated owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture recreated owner rule | `updated` | `platform-signal-evidence/SKILL.md` recreated owner |\n' >> "$REGISTER"
1148
+ commit_case "round B: recreate a lookalike under a new name with its own row"
1149
+ run_gate
1150
+ assert_rc "$rc" 1 "a cross-round delete-then-recreate must stay an undeclared deletion"
1151
+ assert_contains "platform-observability/SKILL.md" "$out" "the deleted owner must stay a subject"
1152
+
1153
+ # Round scoping 11: a declared rename CYCLE (A to B, then B back to A) is an
1154
+ # honest, fully-declared shape — each round's row cites the name that existed at
1155
+ # its own round head. Demanding an A row in the round that renamed A away would
1156
+ # ask for a row the evidence check must then refuse.
1157
+ new_case case-round-scope-declared-rename-cycle
1158
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1159
+ printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1160
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1161
+ commit_case "round 1: rename A to B with a row on the surviving name"
1162
+ git -C "$REPO" mv skills/platform-signal-evidence skills/platform-observability
1163
+ printf '\n- MUST enforce Fixture reverted owner rule.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1164
+ printf '| Fixture reverted owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Fixture reverted owner rule | `updated` | `platform-observability/SKILL.md` reverted owner |\n' >> "$REGISTER"
1165
+ commit_case "round 2: rename B back to A with a row on the surviving name"
1166
+ run_gate
1167
+ assert_rc "$rc" 0 "a fully-declared rename cycle must pass"
1168
+ assert_not_contains "impact_chain_evidence_missing_file" "$out" "each round's row cites the name real at its own head"
1169
+
1170
+ # The undeclared half of the cycle: no row for B in the round that created it.
1171
+ new_case case-round-scope-undeclared-rename-cycle
1172
+ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1173
+ printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1174
+ printf 'Fixture ledger note closing the outbound rename round without a row.\n' >> "$REGISTER"
1175
+ commit_case "round 1: rename A to B with no row"
1176
+ git -C "$REPO" mv skills/platform-signal-evidence skills/platform-observability
1177
+ printf '\n- MUST enforce Fixture reverted owner rule.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1178
+ printf '| Fixture reverted owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Fixture reverted owner rule | `updated` | `platform-observability/SKILL.md` reverted owner |\n' >> "$REGISTER"
1179
+ commit_case "round 2: rename B back to A with a row on the surviving name"
1180
+ run_gate
1181
+ assert_rc "$rc" 1 "the round that created the transient name still owes its row"
1182
+ assert_contains "platform-signal-evidence/SKILL.md" "$out" "the undeclared transient name must be demanded"
1183
+
1184
+ # Round scoping 12: a DIRECTORY masquerading as SKILL.md must read as absence.
1185
+ # `git show ref:path` succeeds for a tree, so replacing the entrypoint with a
1186
+ # same-named directory and vouching through a nested-file anchor would let a
1187
+ # row certify an owner whose entrypoint was effectively deleted — existence at
1188
+ # a round head must mean a regular blob, and everything else falls through to
1189
+ # the deletion fail-closed path.
1190
+ new_case case-round-scope-skillmd-directory-masquerade
1191
+ git -C "$REPO" rm -q skills/platform-observability/SKILL.md
1192
+ mkdir -p "$REPO/skills/platform-observability/SKILL.md"
1193
+ printf -- '- MUST enforce Fixture masquerade rule.\n' > "$REPO/skills/platform-observability/SKILL.md/rules.md"
1194
+ printf '| Fixture masquerade row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md/rules.md#Fixture masquerade rule | `updated` | `platform-observability/SKILL.md` masquerade |\n' >> "$REGISTER"
1195
+ commit_case "replace the entrypoint with a same-named directory and vouch via a nested anchor"
1196
+ run_gate
1197
+ assert_rc "$rc" 1 "a directory masquerading as SKILL.md must not read as a present entrypoint"
1198
+ assert_contains "platform-observability/SKILL.md" "$out" "the masqueraded owner must be named"
1199
+
1200
+ assert_rc "$full_check_runs" 1 "fixture suite must retain exactly one full checker wiring case"
1201
+ assert_rc "$gate_runs" 80 "all remaining impact-chain fixtures must run the standalone gate"
1202
+
1203
+ echo "test_check_ccl_impact_chain_refscripts: ok"