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