@mc-and-his-agents/loom-installer 0.1.1

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 (856) hide show
  1. package/README.md +47 -0
  2. package/dist/src/claude.js +157 -0
  3. package/dist/src/cli.js +35 -0
  4. package/dist/src/codex.js +191 -0
  5. package/dist/src/index.js +175 -0
  6. package/dist/src/payload.js +42 -0
  7. package/dist/src/types.js +1 -0
  8. package/dist/src/utils.js +84 -0
  9. package/dist/test/installer.test.js +167 -0
  10. package/package.json +46 -0
  11. package/payload/manifest.json +4294 -0
  12. package/payload/plugin/loom/.codex-plugin/plugin.json +37 -0
  13. package/payload/plugin/loom/skills/README.md +128 -0
  14. package/payload/plugin/loom/skills/distribution-and-adapter-contract.md +359 -0
  15. package/payload/plugin/loom/skills/install-layout.json +91 -0
  16. package/payload/plugin/loom/skills/loom-adopt/SKILL.md +80 -0
  17. package/payload/plugin/loom/skills/loom-adopt/agents/openai.yaml +4 -0
  18. package/payload/plugin/loom/skills/loom-adopt/contract.json +45 -0
  19. package/payload/plugin/loom/skills/loom-adopt/references/input-signals.md +17 -0
  20. package/payload/plugin/loom/skills/loom-adopt/references/output-contract.md +17 -0
  21. package/payload/plugin/loom/skills/loom-adopt/scripts/loom-adopt.py +14 -0
  22. package/payload/plugin/loom/skills/loom-handoff/SKILL.md +23 -0
  23. package/payload/plugin/loom/skills/loom-handoff/agents/openai.yaml +4 -0
  24. package/payload/plugin/loom/skills/loom-handoff/contract.json +53 -0
  25. package/payload/plugin/loom/skills/loom-handoff/references/input-signals.md +7 -0
  26. package/payload/plugin/loom/skills/loom-handoff/references/output-contract.md +42 -0
  27. package/payload/plugin/loom/skills/loom-handoff/scripts/loom-handoff.py +14 -0
  28. package/payload/plugin/loom/skills/loom-init/SKILL.md +246 -0
  29. package/payload/plugin/loom/skills/loom-init/agents/openai.yaml +4 -0
  30. package/payload/plugin/loom/skills/loom-init/contract.json +76 -0
  31. package/payload/plugin/loom/skills/loom-init/references/input-signals.md +16 -0
  32. package/payload/plugin/loom/skills/loom-init/references/intake-signals.md +155 -0
  33. package/payload/plugin/loom/skills/loom-init/references/output-contract.md +208 -0
  34. package/payload/plugin/loom/skills/loom-init/scripts/loom-init.py +14 -0
  35. package/payload/plugin/loom/skills/loom-merge-ready/SKILL.md +23 -0
  36. package/payload/plugin/loom/skills/loom-merge-ready/agents/openai.yaml +4 -0
  37. package/payload/plugin/loom/skills/loom-merge-ready/contract.json +49 -0
  38. package/payload/plugin/loom/skills/loom-merge-ready/references/input-signals.md +7 -0
  39. package/payload/plugin/loom/skills/loom-merge-ready/references/output-contract.md +34 -0
  40. package/payload/plugin/loom/skills/loom-merge-ready/scripts/loom-merge-ready.py +14 -0
  41. package/payload/plugin/loom/skills/loom-pre-review/SKILL.md +69 -0
  42. package/payload/plugin/loom/skills/loom-pre-review/agents/openai.yaml +4 -0
  43. package/payload/plugin/loom/skills/loom-pre-review/contract.json +41 -0
  44. package/payload/plugin/loom/skills/loom-pre-review/references/input-signals.md +14 -0
  45. package/payload/plugin/loom/skills/loom-pre-review/references/output-contract.md +20 -0
  46. package/payload/plugin/loom/skills/loom-pre-review/scripts/loom-pre-review.py +14 -0
  47. package/payload/plugin/loom/skills/loom-resume/SKILL.md +72 -0
  48. package/payload/plugin/loom/skills/loom-resume/agents/openai.yaml +4 -0
  49. package/payload/plugin/loom/skills/loom-resume/contract.json +47 -0
  50. package/payload/plugin/loom/skills/loom-resume/references/input-signals.md +15 -0
  51. package/payload/plugin/loom/skills/loom-resume/references/output-contract.md +58 -0
  52. package/payload/plugin/loom/skills/loom-resume/scripts/loom-resume.py +14 -0
  53. package/payload/plugin/loom/skills/loom-retire/SKILL.md +26 -0
  54. package/payload/plugin/loom/skills/loom-retire/agents/openai.yaml +4 -0
  55. package/payload/plugin/loom/skills/loom-retire/contract.json +41 -0
  56. package/payload/plugin/loom/skills/loom-retire/references/input-signals.md +7 -0
  57. package/payload/plugin/loom/skills/loom-retire/references/output-contract.md +13 -0
  58. package/payload/plugin/loom/skills/loom-retire/scripts/loom-retire.py +14 -0
  59. package/payload/plugin/loom/skills/loom-review/SKILL.md +95 -0
  60. package/payload/plugin/loom/skills/loom-review/agents/openai.yaml +4 -0
  61. package/payload/plugin/loom/skills/loom-review/contract.json +49 -0
  62. package/payload/plugin/loom/skills/loom-review/references/input-signals.md +15 -0
  63. package/payload/plugin/loom/skills/loom-review/references/output-contract.md +57 -0
  64. package/payload/plugin/loom/skills/loom-review/scripts/loom-review.py +14 -0
  65. package/payload/plugin/loom/skills/registry.json +64 -0
  66. package/payload/plugin/loom/skills/route-matrix.md +63 -0
  67. package/payload/plugin/loom/skills/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
  68. package/payload/plugin/loom/skills/shared/assets/review/loom-review-result-schema.json +93 -0
  69. package/payload/plugin/loom/skills/shared/assets/templates/scaffold/plan.md +51 -0
  70. package/payload/plugin/loom/skills/shared/assets/templates/scaffold/spec.md +48 -0
  71. package/payload/plugin/loom/skills/shared/references/adoption/deep-existing-repo-default.md +64 -0
  72. package/payload/plugin/loom/skills/shared/references/adoption/lightweight-retrofit-default.md +71 -0
  73. package/payload/plugin/loom/skills/shared/references/adoption/routing-and-checkpoints.md +88 -0
  74. package/payload/plugin/loom/skills/shared/references/governance/host-object-taxonomy.md +148 -0
  75. package/payload/plugin/loom/skills/shared/references/governance/issue-model.md +127 -0
  76. package/payload/plugin/loom/skills/shared/references/governance/maturity-and-closing.md +69 -0
  77. package/payload/plugin/loom/skills/shared/references/governance/principles.md +180 -0
  78. package/payload/plugin/loom/skills/shared/references/governance/review-model.md +109 -0
  79. package/payload/plugin/loom/skills/shared/references/governance/state-machine.md +163 -0
  80. package/payload/plugin/loom/skills/shared/references/governance/truth-and-sync-boundary.md +161 -0
  81. package/payload/plugin/loom/skills/shared/references/harness/automation-frontload.md +139 -0
  82. package/payload/plugin/loom/skills/shared/references/harness/closeout-gate.md +97 -0
  83. package/payload/plugin/loom/skills/shared/references/harness/execution-chain.md +56 -0
  84. package/payload/plugin/loom/skills/shared/references/harness/execution-context.md +71 -0
  85. package/payload/plugin/loom/skills/shared/references/harness/fact-chain-contract.md +160 -0
  86. package/payload/plugin/loom/skills/shared/references/harness/host-action-contract.md +128 -0
  87. package/payload/plugin/loom/skills/shared/references/harness/host-issue-binding.md +90 -0
  88. package/payload/plugin/loom/skills/shared/references/harness/host-lifecycle-boundary.md +56 -0
  89. package/payload/plugin/loom/skills/shared/references/harness/merge-checkpoint.md +95 -0
  90. package/payload/plugin/loom/skills/shared/references/harness/reconciliation-audit.md +64 -0
  91. package/payload/plugin/loom/skills/shared/references/harness/recovery-model.md +101 -0
  92. package/payload/plugin/loom/skills/shared/references/harness/review-execution.md +99 -0
  93. package/payload/plugin/loom/skills/shared/references/harness/runtime-state.md +103 -0
  94. package/payload/plugin/loom/skills/shared/references/harness/status-surface.md +121 -0
  95. package/payload/plugin/loom/skills/shared/references/harness/work-item-contract.md +104 -0
  96. package/payload/plugin/loom/skills/shared/references/harness/workspace-and-purity.md +73 -0
  97. package/payload/plugin/loom/skills/shared/references/harness/workspace-model.md +56 -0
  98. package/payload/plugin/loom/skills/shared/references/templates/pull-request.md +44 -0
  99. package/payload/plugin/loom/skills/shared/references/templates/review-record.md +35 -0
  100. package/payload/plugin/loom/skills/shared/references/templates/spec-suite.md +57 -0
  101. package/payload/plugin/loom/skills/shared/scripts/fact_chain_support.py +509 -0
  102. package/payload/plugin/loom/skills/shared/scripts/governance_surface.py +869 -0
  103. package/payload/plugin/loom/skills/shared/scripts/loom_check.py +4724 -0
  104. package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +5390 -0
  105. package/payload/plugin/loom/skills/shared/scripts/loom_init.py +1966 -0
  106. package/payload/plugin/loom/skills/shared/scripts/runtime_paths.py +116 -0
  107. package/payload/plugin/loom/skills/shared/scripts/runtime_state.py +405 -0
  108. package/payload/plugin/loom/skills/upgrade-contract.json +29 -0
  109. package/payload/skills/loom-adopt/.loom-runtime/install-layout.json +77 -0
  110. package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/SKILL.md +80 -0
  111. package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/agents/openai.yaml +4 -0
  112. package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/contract.json +45 -0
  113. package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/references/input-signals.md +17 -0
  114. package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/references/output-contract.md +17 -0
  115. package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/scripts/loom-adopt.py +14 -0
  116. package/payload/skills/loom-adopt/.loom-runtime/loom-init/references/input-signals.md +16 -0
  117. package/payload/skills/loom-adopt/.loom-runtime/loom-init/references/intake-signals.md +155 -0
  118. package/payload/skills/loom-adopt/.loom-runtime/loom-init/references/output-contract.md +208 -0
  119. package/payload/skills/loom-adopt/.loom-runtime/registry.json +15 -0
  120. package/payload/skills/loom-adopt/.loom-runtime/route-matrix.md +63 -0
  121. package/payload/skills/loom-adopt/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
  122. package/payload/skills/loom-adopt/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
  123. package/payload/skills/loom-adopt/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
  124. package/payload/skills/loom-adopt/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
  125. package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
  126. package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
  127. package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
  128. package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
  129. package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/issue-model.md +127 -0
  130. package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
  131. package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/principles.md +180 -0
  132. package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/review-model.md +109 -0
  133. package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/state-machine.md +163 -0
  134. package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
  135. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
  136. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
  137. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
  138. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/execution-context.md +71 -0
  139. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
  140. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
  141. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
  142. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
  143. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
  144. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
  145. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
  146. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/review-execution.md +99 -0
  147. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
  148. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/status-surface.md +121 -0
  149. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
  150. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
  151. package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
  152. package/payload/skills/loom-adopt/.loom-runtime/shared/references/templates/pull-request.md +44 -0
  153. package/payload/skills/loom-adopt/.loom-runtime/shared/references/templates/review-record.md +35 -0
  154. package/payload/skills/loom-adopt/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
  155. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
  156. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py +879 -0
  157. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +4683 -0
  158. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
  159. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py +1966 -0
  160. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
  161. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/runtime_state.py +405 -0
  162. package/payload/skills/loom-adopt/.loom-runtime/upgrade-contract.json +29 -0
  163. package/payload/skills/loom-adopt/SKILL.md +80 -0
  164. package/payload/skills/loom-adopt/agents/openai.yaml +4 -0
  165. package/payload/skills/loom-adopt/contract.json +45 -0
  166. package/payload/skills/loom-adopt/references/input-signals.md +17 -0
  167. package/payload/skills/loom-adopt/references/loom-init/input-signals.md +16 -0
  168. package/payload/skills/loom-adopt/references/loom-init/intake-signals.md +155 -0
  169. package/payload/skills/loom-adopt/references/loom-init/output-contract.md +208 -0
  170. package/payload/skills/loom-adopt/references/output-contract.md +17 -0
  171. package/payload/skills/loom-adopt/references/route-matrix.md +63 -0
  172. package/payload/skills/loom-adopt/references/shared/adoption/deep-existing-repo-default.md +64 -0
  173. package/payload/skills/loom-adopt/references/shared/adoption/lightweight-retrofit-default.md +71 -0
  174. package/payload/skills/loom-adopt/references/shared/adoption/routing-and-checkpoints.md +88 -0
  175. package/payload/skills/loom-adopt/references/shared/governance/host-object-taxonomy.md +148 -0
  176. package/payload/skills/loom-adopt/references/shared/governance/issue-model.md +127 -0
  177. package/payload/skills/loom-adopt/references/shared/governance/maturity-and-closing.md +69 -0
  178. package/payload/skills/loom-adopt/references/shared/governance/principles.md +180 -0
  179. package/payload/skills/loom-adopt/references/shared/governance/review-model.md +109 -0
  180. package/payload/skills/loom-adopt/references/shared/governance/state-machine.md +163 -0
  181. package/payload/skills/loom-adopt/references/shared/governance/truth-and-sync-boundary.md +161 -0
  182. package/payload/skills/loom-adopt/references/shared/harness/automation-frontload.md +139 -0
  183. package/payload/skills/loom-adopt/references/shared/harness/closeout-gate.md +97 -0
  184. package/payload/skills/loom-adopt/references/shared/harness/execution-chain.md +56 -0
  185. package/payload/skills/loom-adopt/references/shared/harness/execution-context.md +71 -0
  186. package/payload/skills/loom-adopt/references/shared/harness/fact-chain-contract.md +160 -0
  187. package/payload/skills/loom-adopt/references/shared/harness/host-action-contract.md +128 -0
  188. package/payload/skills/loom-adopt/references/shared/harness/host-issue-binding.md +90 -0
  189. package/payload/skills/loom-adopt/references/shared/harness/host-lifecycle-boundary.md +56 -0
  190. package/payload/skills/loom-adopt/references/shared/harness/merge-checkpoint.md +95 -0
  191. package/payload/skills/loom-adopt/references/shared/harness/reconciliation-audit.md +64 -0
  192. package/payload/skills/loom-adopt/references/shared/harness/recovery-model.md +101 -0
  193. package/payload/skills/loom-adopt/references/shared/harness/review-execution.md +99 -0
  194. package/payload/skills/loom-adopt/references/shared/harness/runtime-state.md +103 -0
  195. package/payload/skills/loom-adopt/references/shared/harness/status-surface.md +121 -0
  196. package/payload/skills/loom-adopt/references/shared/harness/work-item-contract.md +104 -0
  197. package/payload/skills/loom-adopt/references/shared/harness/workspace-and-purity.md +73 -0
  198. package/payload/skills/loom-adopt/references/shared/harness/workspace-model.md +56 -0
  199. package/payload/skills/loom-adopt/references/shared/templates/pull-request.md +44 -0
  200. package/payload/skills/loom-adopt/references/shared/templates/review-record.md +35 -0
  201. package/payload/skills/loom-adopt/references/shared/templates/spec-suite.md +57 -0
  202. package/payload/skills/loom-adopt/scripts/loom-adopt.py +16 -0
  203. package/payload/skills/loom-handoff/.loom-runtime/install-layout.json +77 -0
  204. package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/SKILL.md +23 -0
  205. package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/agents/openai.yaml +4 -0
  206. package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/contract.json +53 -0
  207. package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/references/input-signals.md +7 -0
  208. package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/references/output-contract.md +42 -0
  209. package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/scripts/loom-handoff.py +14 -0
  210. package/payload/skills/loom-handoff/.loom-runtime/loom-init/references/input-signals.md +16 -0
  211. package/payload/skills/loom-handoff/.loom-runtime/loom-init/references/intake-signals.md +155 -0
  212. package/payload/skills/loom-handoff/.loom-runtime/loom-init/references/output-contract.md +208 -0
  213. package/payload/skills/loom-handoff/.loom-runtime/registry.json +15 -0
  214. package/payload/skills/loom-handoff/.loom-runtime/route-matrix.md +63 -0
  215. package/payload/skills/loom-handoff/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
  216. package/payload/skills/loom-handoff/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
  217. package/payload/skills/loom-handoff/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
  218. package/payload/skills/loom-handoff/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
  219. package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
  220. package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
  221. package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
  222. package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
  223. package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/issue-model.md +127 -0
  224. package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
  225. package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/principles.md +180 -0
  226. package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/review-model.md +109 -0
  227. package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/state-machine.md +163 -0
  228. package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
  229. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
  230. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
  231. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
  232. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/execution-context.md +71 -0
  233. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
  234. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
  235. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
  236. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
  237. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
  238. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
  239. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
  240. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/review-execution.md +99 -0
  241. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
  242. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/status-surface.md +121 -0
  243. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
  244. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
  245. package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
  246. package/payload/skills/loom-handoff/.loom-runtime/shared/references/templates/pull-request.md +44 -0
  247. package/payload/skills/loom-handoff/.loom-runtime/shared/references/templates/review-record.md +35 -0
  248. package/payload/skills/loom-handoff/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
  249. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
  250. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py +879 -0
  251. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +4683 -0
  252. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
  253. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py +1966 -0
  254. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
  255. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/runtime_state.py +405 -0
  256. package/payload/skills/loom-handoff/.loom-runtime/upgrade-contract.json +29 -0
  257. package/payload/skills/loom-handoff/SKILL.md +23 -0
  258. package/payload/skills/loom-handoff/agents/openai.yaml +4 -0
  259. package/payload/skills/loom-handoff/contract.json +53 -0
  260. package/payload/skills/loom-handoff/references/input-signals.md +7 -0
  261. package/payload/skills/loom-handoff/references/loom-init/input-signals.md +16 -0
  262. package/payload/skills/loom-handoff/references/loom-init/intake-signals.md +155 -0
  263. package/payload/skills/loom-handoff/references/loom-init/output-contract.md +208 -0
  264. package/payload/skills/loom-handoff/references/output-contract.md +42 -0
  265. package/payload/skills/loom-handoff/references/route-matrix.md +63 -0
  266. package/payload/skills/loom-handoff/references/shared/adoption/deep-existing-repo-default.md +64 -0
  267. package/payload/skills/loom-handoff/references/shared/adoption/lightweight-retrofit-default.md +71 -0
  268. package/payload/skills/loom-handoff/references/shared/adoption/routing-and-checkpoints.md +88 -0
  269. package/payload/skills/loom-handoff/references/shared/governance/host-object-taxonomy.md +148 -0
  270. package/payload/skills/loom-handoff/references/shared/governance/issue-model.md +127 -0
  271. package/payload/skills/loom-handoff/references/shared/governance/maturity-and-closing.md +69 -0
  272. package/payload/skills/loom-handoff/references/shared/governance/principles.md +180 -0
  273. package/payload/skills/loom-handoff/references/shared/governance/review-model.md +109 -0
  274. package/payload/skills/loom-handoff/references/shared/governance/state-machine.md +163 -0
  275. package/payload/skills/loom-handoff/references/shared/governance/truth-and-sync-boundary.md +161 -0
  276. package/payload/skills/loom-handoff/references/shared/harness/automation-frontload.md +139 -0
  277. package/payload/skills/loom-handoff/references/shared/harness/closeout-gate.md +97 -0
  278. package/payload/skills/loom-handoff/references/shared/harness/execution-chain.md +56 -0
  279. package/payload/skills/loom-handoff/references/shared/harness/execution-context.md +71 -0
  280. package/payload/skills/loom-handoff/references/shared/harness/fact-chain-contract.md +160 -0
  281. package/payload/skills/loom-handoff/references/shared/harness/host-action-contract.md +128 -0
  282. package/payload/skills/loom-handoff/references/shared/harness/host-issue-binding.md +90 -0
  283. package/payload/skills/loom-handoff/references/shared/harness/host-lifecycle-boundary.md +56 -0
  284. package/payload/skills/loom-handoff/references/shared/harness/merge-checkpoint.md +95 -0
  285. package/payload/skills/loom-handoff/references/shared/harness/reconciliation-audit.md +64 -0
  286. package/payload/skills/loom-handoff/references/shared/harness/recovery-model.md +101 -0
  287. package/payload/skills/loom-handoff/references/shared/harness/review-execution.md +99 -0
  288. package/payload/skills/loom-handoff/references/shared/harness/runtime-state.md +103 -0
  289. package/payload/skills/loom-handoff/references/shared/harness/status-surface.md +121 -0
  290. package/payload/skills/loom-handoff/references/shared/harness/work-item-contract.md +104 -0
  291. package/payload/skills/loom-handoff/references/shared/harness/workspace-and-purity.md +73 -0
  292. package/payload/skills/loom-handoff/references/shared/harness/workspace-model.md +56 -0
  293. package/payload/skills/loom-handoff/references/shared/templates/pull-request.md +44 -0
  294. package/payload/skills/loom-handoff/references/shared/templates/review-record.md +35 -0
  295. package/payload/skills/loom-handoff/references/shared/templates/spec-suite.md +57 -0
  296. package/payload/skills/loom-handoff/scripts/loom-handoff.py +16 -0
  297. package/payload/skills/loom-init/.loom-runtime/install-layout.json +77 -0
  298. package/payload/skills/loom-init/.loom-runtime/loom-init/SKILL.md +246 -0
  299. package/payload/skills/loom-init/.loom-runtime/loom-init/agents/openai.yaml +4 -0
  300. package/payload/skills/loom-init/.loom-runtime/loom-init/contract.json +76 -0
  301. package/payload/skills/loom-init/.loom-runtime/loom-init/references/input-signals.md +16 -0
  302. package/payload/skills/loom-init/.loom-runtime/loom-init/references/intake-signals.md +155 -0
  303. package/payload/skills/loom-init/.loom-runtime/loom-init/references/output-contract.md +208 -0
  304. package/payload/skills/loom-init/.loom-runtime/loom-init/scripts/loom-init.py +14 -0
  305. package/payload/skills/loom-init/.loom-runtime/registry.json +15 -0
  306. package/payload/skills/loom-init/.loom-runtime/route-matrix.md +63 -0
  307. package/payload/skills/loom-init/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
  308. package/payload/skills/loom-init/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
  309. package/payload/skills/loom-init/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
  310. package/payload/skills/loom-init/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
  311. package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
  312. package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
  313. package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
  314. package/payload/skills/loom-init/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
  315. package/payload/skills/loom-init/.loom-runtime/shared/references/governance/issue-model.md +127 -0
  316. package/payload/skills/loom-init/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
  317. package/payload/skills/loom-init/.loom-runtime/shared/references/governance/principles.md +180 -0
  318. package/payload/skills/loom-init/.loom-runtime/shared/references/governance/review-model.md +109 -0
  319. package/payload/skills/loom-init/.loom-runtime/shared/references/governance/state-machine.md +163 -0
  320. package/payload/skills/loom-init/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
  321. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
  322. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
  323. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
  324. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/execution-context.md +71 -0
  325. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
  326. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
  327. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
  328. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
  329. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
  330. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
  331. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
  332. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/review-execution.md +99 -0
  333. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
  334. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/status-surface.md +121 -0
  335. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
  336. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
  337. package/payload/skills/loom-init/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
  338. package/payload/skills/loom-init/.loom-runtime/shared/references/templates/pull-request.md +44 -0
  339. package/payload/skills/loom-init/.loom-runtime/shared/references/templates/review-record.md +35 -0
  340. package/payload/skills/loom-init/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
  341. package/payload/skills/loom-init/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
  342. package/payload/skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py +879 -0
  343. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +4683 -0
  344. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
  345. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_init.py +1966 -0
  346. package/payload/skills/loom-init/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
  347. package/payload/skills/loom-init/.loom-runtime/shared/scripts/runtime_state.py +405 -0
  348. package/payload/skills/loom-init/.loom-runtime/upgrade-contract.json +29 -0
  349. package/payload/skills/loom-init/SKILL.md +246 -0
  350. package/payload/skills/loom-init/agents/openai.yaml +4 -0
  351. package/payload/skills/loom-init/contract.json +76 -0
  352. package/payload/skills/loom-init/references/input-signals.md +16 -0
  353. package/payload/skills/loom-init/references/intake-signals.md +155 -0
  354. package/payload/skills/loom-init/references/output-contract.md +208 -0
  355. package/payload/skills/loom-init/references/route-matrix.md +63 -0
  356. package/payload/skills/loom-init/references/shared/adoption/deep-existing-repo-default.md +64 -0
  357. package/payload/skills/loom-init/references/shared/adoption/lightweight-retrofit-default.md +71 -0
  358. package/payload/skills/loom-init/references/shared/adoption/routing-and-checkpoints.md +88 -0
  359. package/payload/skills/loom-init/references/shared/governance/host-object-taxonomy.md +148 -0
  360. package/payload/skills/loom-init/references/shared/governance/issue-model.md +127 -0
  361. package/payload/skills/loom-init/references/shared/governance/maturity-and-closing.md +69 -0
  362. package/payload/skills/loom-init/references/shared/governance/principles.md +180 -0
  363. package/payload/skills/loom-init/references/shared/governance/review-model.md +109 -0
  364. package/payload/skills/loom-init/references/shared/governance/state-machine.md +163 -0
  365. package/payload/skills/loom-init/references/shared/governance/truth-and-sync-boundary.md +161 -0
  366. package/payload/skills/loom-init/references/shared/harness/automation-frontload.md +139 -0
  367. package/payload/skills/loom-init/references/shared/harness/closeout-gate.md +97 -0
  368. package/payload/skills/loom-init/references/shared/harness/execution-chain.md +56 -0
  369. package/payload/skills/loom-init/references/shared/harness/execution-context.md +71 -0
  370. package/payload/skills/loom-init/references/shared/harness/fact-chain-contract.md +160 -0
  371. package/payload/skills/loom-init/references/shared/harness/host-action-contract.md +128 -0
  372. package/payload/skills/loom-init/references/shared/harness/host-issue-binding.md +90 -0
  373. package/payload/skills/loom-init/references/shared/harness/host-lifecycle-boundary.md +56 -0
  374. package/payload/skills/loom-init/references/shared/harness/merge-checkpoint.md +95 -0
  375. package/payload/skills/loom-init/references/shared/harness/reconciliation-audit.md +64 -0
  376. package/payload/skills/loom-init/references/shared/harness/recovery-model.md +101 -0
  377. package/payload/skills/loom-init/references/shared/harness/review-execution.md +99 -0
  378. package/payload/skills/loom-init/references/shared/harness/runtime-state.md +103 -0
  379. package/payload/skills/loom-init/references/shared/harness/status-surface.md +121 -0
  380. package/payload/skills/loom-init/references/shared/harness/work-item-contract.md +104 -0
  381. package/payload/skills/loom-init/references/shared/harness/workspace-and-purity.md +73 -0
  382. package/payload/skills/loom-init/references/shared/harness/workspace-model.md +56 -0
  383. package/payload/skills/loom-init/references/shared/templates/pull-request.md +44 -0
  384. package/payload/skills/loom-init/references/shared/templates/review-record.md +35 -0
  385. package/payload/skills/loom-init/references/shared/templates/spec-suite.md +57 -0
  386. package/payload/skills/loom-init/scripts/loom-init.py +16 -0
  387. package/payload/skills/loom-merge-ready/.loom-runtime/install-layout.json +77 -0
  388. package/payload/skills/loom-merge-ready/.loom-runtime/loom-init/references/input-signals.md +16 -0
  389. package/payload/skills/loom-merge-ready/.loom-runtime/loom-init/references/intake-signals.md +155 -0
  390. package/payload/skills/loom-merge-ready/.loom-runtime/loom-init/references/output-contract.md +208 -0
  391. package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/SKILL.md +23 -0
  392. package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/agents/openai.yaml +4 -0
  393. package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/contract.json +49 -0
  394. package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/references/input-signals.md +7 -0
  395. package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/references/output-contract.md +34 -0
  396. package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/scripts/loom-merge-ready.py +14 -0
  397. package/payload/skills/loom-merge-ready/.loom-runtime/registry.json +15 -0
  398. package/payload/skills/loom-merge-ready/.loom-runtime/route-matrix.md +63 -0
  399. package/payload/skills/loom-merge-ready/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
  400. package/payload/skills/loom-merge-ready/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
  401. package/payload/skills/loom-merge-ready/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
  402. package/payload/skills/loom-merge-ready/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
  403. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
  404. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
  405. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
  406. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
  407. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/issue-model.md +127 -0
  408. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
  409. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/principles.md +180 -0
  410. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/review-model.md +109 -0
  411. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/state-machine.md +163 -0
  412. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
  413. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
  414. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
  415. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
  416. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/execution-context.md +71 -0
  417. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
  418. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
  419. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
  420. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
  421. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
  422. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
  423. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
  424. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/review-execution.md +99 -0
  425. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
  426. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/status-surface.md +121 -0
  427. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
  428. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
  429. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
  430. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/templates/pull-request.md +44 -0
  431. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/templates/review-record.md +35 -0
  432. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
  433. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
  434. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py +879 -0
  435. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +4683 -0
  436. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
  437. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py +1966 -0
  438. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
  439. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/runtime_state.py +405 -0
  440. package/payload/skills/loom-merge-ready/.loom-runtime/upgrade-contract.json +29 -0
  441. package/payload/skills/loom-merge-ready/SKILL.md +23 -0
  442. package/payload/skills/loom-merge-ready/agents/openai.yaml +4 -0
  443. package/payload/skills/loom-merge-ready/contract.json +49 -0
  444. package/payload/skills/loom-merge-ready/references/input-signals.md +7 -0
  445. package/payload/skills/loom-merge-ready/references/loom-init/input-signals.md +16 -0
  446. package/payload/skills/loom-merge-ready/references/loom-init/intake-signals.md +155 -0
  447. package/payload/skills/loom-merge-ready/references/loom-init/output-contract.md +208 -0
  448. package/payload/skills/loom-merge-ready/references/output-contract.md +34 -0
  449. package/payload/skills/loom-merge-ready/references/route-matrix.md +63 -0
  450. package/payload/skills/loom-merge-ready/references/shared/adoption/deep-existing-repo-default.md +64 -0
  451. package/payload/skills/loom-merge-ready/references/shared/adoption/lightweight-retrofit-default.md +71 -0
  452. package/payload/skills/loom-merge-ready/references/shared/adoption/routing-and-checkpoints.md +88 -0
  453. package/payload/skills/loom-merge-ready/references/shared/governance/host-object-taxonomy.md +148 -0
  454. package/payload/skills/loom-merge-ready/references/shared/governance/issue-model.md +127 -0
  455. package/payload/skills/loom-merge-ready/references/shared/governance/maturity-and-closing.md +69 -0
  456. package/payload/skills/loom-merge-ready/references/shared/governance/principles.md +180 -0
  457. package/payload/skills/loom-merge-ready/references/shared/governance/review-model.md +109 -0
  458. package/payload/skills/loom-merge-ready/references/shared/governance/state-machine.md +163 -0
  459. package/payload/skills/loom-merge-ready/references/shared/governance/truth-and-sync-boundary.md +161 -0
  460. package/payload/skills/loom-merge-ready/references/shared/harness/automation-frontload.md +139 -0
  461. package/payload/skills/loom-merge-ready/references/shared/harness/closeout-gate.md +97 -0
  462. package/payload/skills/loom-merge-ready/references/shared/harness/execution-chain.md +56 -0
  463. package/payload/skills/loom-merge-ready/references/shared/harness/execution-context.md +71 -0
  464. package/payload/skills/loom-merge-ready/references/shared/harness/fact-chain-contract.md +160 -0
  465. package/payload/skills/loom-merge-ready/references/shared/harness/host-action-contract.md +128 -0
  466. package/payload/skills/loom-merge-ready/references/shared/harness/host-issue-binding.md +90 -0
  467. package/payload/skills/loom-merge-ready/references/shared/harness/host-lifecycle-boundary.md +56 -0
  468. package/payload/skills/loom-merge-ready/references/shared/harness/merge-checkpoint.md +95 -0
  469. package/payload/skills/loom-merge-ready/references/shared/harness/reconciliation-audit.md +64 -0
  470. package/payload/skills/loom-merge-ready/references/shared/harness/recovery-model.md +101 -0
  471. package/payload/skills/loom-merge-ready/references/shared/harness/review-execution.md +99 -0
  472. package/payload/skills/loom-merge-ready/references/shared/harness/runtime-state.md +103 -0
  473. package/payload/skills/loom-merge-ready/references/shared/harness/status-surface.md +121 -0
  474. package/payload/skills/loom-merge-ready/references/shared/harness/work-item-contract.md +104 -0
  475. package/payload/skills/loom-merge-ready/references/shared/harness/workspace-and-purity.md +73 -0
  476. package/payload/skills/loom-merge-ready/references/shared/harness/workspace-model.md +56 -0
  477. package/payload/skills/loom-merge-ready/references/shared/templates/pull-request.md +44 -0
  478. package/payload/skills/loom-merge-ready/references/shared/templates/review-record.md +35 -0
  479. package/payload/skills/loom-merge-ready/references/shared/templates/spec-suite.md +57 -0
  480. package/payload/skills/loom-merge-ready/scripts/loom-merge-ready.py +16 -0
  481. package/payload/skills/loom-pre-review/.loom-runtime/install-layout.json +77 -0
  482. package/payload/skills/loom-pre-review/.loom-runtime/loom-init/references/input-signals.md +16 -0
  483. package/payload/skills/loom-pre-review/.loom-runtime/loom-init/references/intake-signals.md +155 -0
  484. package/payload/skills/loom-pre-review/.loom-runtime/loom-init/references/output-contract.md +208 -0
  485. package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/SKILL.md +69 -0
  486. package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/agents/openai.yaml +4 -0
  487. package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/contract.json +41 -0
  488. package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/references/input-signals.md +14 -0
  489. package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/references/output-contract.md +20 -0
  490. package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/scripts/loom-pre-review.py +14 -0
  491. package/payload/skills/loom-pre-review/.loom-runtime/registry.json +15 -0
  492. package/payload/skills/loom-pre-review/.loom-runtime/route-matrix.md +63 -0
  493. package/payload/skills/loom-pre-review/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
  494. package/payload/skills/loom-pre-review/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
  495. package/payload/skills/loom-pre-review/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
  496. package/payload/skills/loom-pre-review/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
  497. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
  498. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
  499. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
  500. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
  501. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/issue-model.md +127 -0
  502. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
  503. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/principles.md +180 -0
  504. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/review-model.md +109 -0
  505. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/state-machine.md +163 -0
  506. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
  507. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
  508. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
  509. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
  510. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/execution-context.md +71 -0
  511. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
  512. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
  513. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
  514. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
  515. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
  516. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
  517. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
  518. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/review-execution.md +99 -0
  519. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
  520. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/status-surface.md +121 -0
  521. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
  522. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
  523. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
  524. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/templates/pull-request.md +44 -0
  525. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/templates/review-record.md +35 -0
  526. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
  527. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
  528. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py +879 -0
  529. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +4683 -0
  530. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
  531. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py +1966 -0
  532. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
  533. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/runtime_state.py +405 -0
  534. package/payload/skills/loom-pre-review/.loom-runtime/upgrade-contract.json +29 -0
  535. package/payload/skills/loom-pre-review/SKILL.md +69 -0
  536. package/payload/skills/loom-pre-review/agents/openai.yaml +4 -0
  537. package/payload/skills/loom-pre-review/contract.json +41 -0
  538. package/payload/skills/loom-pre-review/references/input-signals.md +14 -0
  539. package/payload/skills/loom-pre-review/references/loom-init/input-signals.md +16 -0
  540. package/payload/skills/loom-pre-review/references/loom-init/intake-signals.md +155 -0
  541. package/payload/skills/loom-pre-review/references/loom-init/output-contract.md +208 -0
  542. package/payload/skills/loom-pre-review/references/output-contract.md +20 -0
  543. package/payload/skills/loom-pre-review/references/route-matrix.md +63 -0
  544. package/payload/skills/loom-pre-review/references/shared/adoption/deep-existing-repo-default.md +64 -0
  545. package/payload/skills/loom-pre-review/references/shared/adoption/lightweight-retrofit-default.md +71 -0
  546. package/payload/skills/loom-pre-review/references/shared/adoption/routing-and-checkpoints.md +88 -0
  547. package/payload/skills/loom-pre-review/references/shared/governance/host-object-taxonomy.md +148 -0
  548. package/payload/skills/loom-pre-review/references/shared/governance/issue-model.md +127 -0
  549. package/payload/skills/loom-pre-review/references/shared/governance/maturity-and-closing.md +69 -0
  550. package/payload/skills/loom-pre-review/references/shared/governance/principles.md +180 -0
  551. package/payload/skills/loom-pre-review/references/shared/governance/review-model.md +109 -0
  552. package/payload/skills/loom-pre-review/references/shared/governance/state-machine.md +163 -0
  553. package/payload/skills/loom-pre-review/references/shared/governance/truth-and-sync-boundary.md +161 -0
  554. package/payload/skills/loom-pre-review/references/shared/harness/automation-frontload.md +139 -0
  555. package/payload/skills/loom-pre-review/references/shared/harness/closeout-gate.md +97 -0
  556. package/payload/skills/loom-pre-review/references/shared/harness/execution-chain.md +56 -0
  557. package/payload/skills/loom-pre-review/references/shared/harness/execution-context.md +71 -0
  558. package/payload/skills/loom-pre-review/references/shared/harness/fact-chain-contract.md +160 -0
  559. package/payload/skills/loom-pre-review/references/shared/harness/host-action-contract.md +128 -0
  560. package/payload/skills/loom-pre-review/references/shared/harness/host-issue-binding.md +90 -0
  561. package/payload/skills/loom-pre-review/references/shared/harness/host-lifecycle-boundary.md +56 -0
  562. package/payload/skills/loom-pre-review/references/shared/harness/merge-checkpoint.md +95 -0
  563. package/payload/skills/loom-pre-review/references/shared/harness/reconciliation-audit.md +64 -0
  564. package/payload/skills/loom-pre-review/references/shared/harness/recovery-model.md +101 -0
  565. package/payload/skills/loom-pre-review/references/shared/harness/review-execution.md +99 -0
  566. package/payload/skills/loom-pre-review/references/shared/harness/runtime-state.md +103 -0
  567. package/payload/skills/loom-pre-review/references/shared/harness/status-surface.md +121 -0
  568. package/payload/skills/loom-pre-review/references/shared/harness/work-item-contract.md +104 -0
  569. package/payload/skills/loom-pre-review/references/shared/harness/workspace-and-purity.md +73 -0
  570. package/payload/skills/loom-pre-review/references/shared/harness/workspace-model.md +56 -0
  571. package/payload/skills/loom-pre-review/references/shared/templates/pull-request.md +44 -0
  572. package/payload/skills/loom-pre-review/references/shared/templates/review-record.md +35 -0
  573. package/payload/skills/loom-pre-review/references/shared/templates/spec-suite.md +57 -0
  574. package/payload/skills/loom-pre-review/scripts/loom-pre-review.py +16 -0
  575. package/payload/skills/loom-resume/.loom-runtime/install-layout.json +77 -0
  576. package/payload/skills/loom-resume/.loom-runtime/loom-init/references/input-signals.md +16 -0
  577. package/payload/skills/loom-resume/.loom-runtime/loom-init/references/intake-signals.md +155 -0
  578. package/payload/skills/loom-resume/.loom-runtime/loom-init/references/output-contract.md +208 -0
  579. package/payload/skills/loom-resume/.loom-runtime/loom-resume/SKILL.md +72 -0
  580. package/payload/skills/loom-resume/.loom-runtime/loom-resume/agents/openai.yaml +4 -0
  581. package/payload/skills/loom-resume/.loom-runtime/loom-resume/contract.json +47 -0
  582. package/payload/skills/loom-resume/.loom-runtime/loom-resume/references/input-signals.md +15 -0
  583. package/payload/skills/loom-resume/.loom-runtime/loom-resume/references/output-contract.md +58 -0
  584. package/payload/skills/loom-resume/.loom-runtime/loom-resume/scripts/loom-resume.py +14 -0
  585. package/payload/skills/loom-resume/.loom-runtime/registry.json +15 -0
  586. package/payload/skills/loom-resume/.loom-runtime/route-matrix.md +63 -0
  587. package/payload/skills/loom-resume/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
  588. package/payload/skills/loom-resume/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
  589. package/payload/skills/loom-resume/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
  590. package/payload/skills/loom-resume/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
  591. package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
  592. package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
  593. package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
  594. package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
  595. package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/issue-model.md +127 -0
  596. package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
  597. package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/principles.md +180 -0
  598. package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/review-model.md +109 -0
  599. package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/state-machine.md +163 -0
  600. package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
  601. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
  602. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
  603. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
  604. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/execution-context.md +71 -0
  605. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
  606. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
  607. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
  608. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
  609. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
  610. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
  611. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
  612. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/review-execution.md +99 -0
  613. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
  614. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/status-surface.md +121 -0
  615. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
  616. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
  617. package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
  618. package/payload/skills/loom-resume/.loom-runtime/shared/references/templates/pull-request.md +44 -0
  619. package/payload/skills/loom-resume/.loom-runtime/shared/references/templates/review-record.md +35 -0
  620. package/payload/skills/loom-resume/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
  621. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
  622. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py +879 -0
  623. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +4683 -0
  624. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
  625. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py +1966 -0
  626. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
  627. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/runtime_state.py +405 -0
  628. package/payload/skills/loom-resume/.loom-runtime/upgrade-contract.json +29 -0
  629. package/payload/skills/loom-resume/SKILL.md +72 -0
  630. package/payload/skills/loom-resume/agents/openai.yaml +4 -0
  631. package/payload/skills/loom-resume/contract.json +47 -0
  632. package/payload/skills/loom-resume/references/input-signals.md +15 -0
  633. package/payload/skills/loom-resume/references/loom-init/input-signals.md +16 -0
  634. package/payload/skills/loom-resume/references/loom-init/intake-signals.md +155 -0
  635. package/payload/skills/loom-resume/references/loom-init/output-contract.md +208 -0
  636. package/payload/skills/loom-resume/references/output-contract.md +58 -0
  637. package/payload/skills/loom-resume/references/route-matrix.md +63 -0
  638. package/payload/skills/loom-resume/references/shared/adoption/deep-existing-repo-default.md +64 -0
  639. package/payload/skills/loom-resume/references/shared/adoption/lightweight-retrofit-default.md +71 -0
  640. package/payload/skills/loom-resume/references/shared/adoption/routing-and-checkpoints.md +88 -0
  641. package/payload/skills/loom-resume/references/shared/governance/host-object-taxonomy.md +148 -0
  642. package/payload/skills/loom-resume/references/shared/governance/issue-model.md +127 -0
  643. package/payload/skills/loom-resume/references/shared/governance/maturity-and-closing.md +69 -0
  644. package/payload/skills/loom-resume/references/shared/governance/principles.md +180 -0
  645. package/payload/skills/loom-resume/references/shared/governance/review-model.md +109 -0
  646. package/payload/skills/loom-resume/references/shared/governance/state-machine.md +163 -0
  647. package/payload/skills/loom-resume/references/shared/governance/truth-and-sync-boundary.md +161 -0
  648. package/payload/skills/loom-resume/references/shared/harness/automation-frontload.md +139 -0
  649. package/payload/skills/loom-resume/references/shared/harness/closeout-gate.md +97 -0
  650. package/payload/skills/loom-resume/references/shared/harness/execution-chain.md +56 -0
  651. package/payload/skills/loom-resume/references/shared/harness/execution-context.md +71 -0
  652. package/payload/skills/loom-resume/references/shared/harness/fact-chain-contract.md +160 -0
  653. package/payload/skills/loom-resume/references/shared/harness/host-action-contract.md +128 -0
  654. package/payload/skills/loom-resume/references/shared/harness/host-issue-binding.md +90 -0
  655. package/payload/skills/loom-resume/references/shared/harness/host-lifecycle-boundary.md +56 -0
  656. package/payload/skills/loom-resume/references/shared/harness/merge-checkpoint.md +95 -0
  657. package/payload/skills/loom-resume/references/shared/harness/reconciliation-audit.md +64 -0
  658. package/payload/skills/loom-resume/references/shared/harness/recovery-model.md +101 -0
  659. package/payload/skills/loom-resume/references/shared/harness/review-execution.md +99 -0
  660. package/payload/skills/loom-resume/references/shared/harness/runtime-state.md +103 -0
  661. package/payload/skills/loom-resume/references/shared/harness/status-surface.md +121 -0
  662. package/payload/skills/loom-resume/references/shared/harness/work-item-contract.md +104 -0
  663. package/payload/skills/loom-resume/references/shared/harness/workspace-and-purity.md +73 -0
  664. package/payload/skills/loom-resume/references/shared/harness/workspace-model.md +56 -0
  665. package/payload/skills/loom-resume/references/shared/templates/pull-request.md +44 -0
  666. package/payload/skills/loom-resume/references/shared/templates/review-record.md +35 -0
  667. package/payload/skills/loom-resume/references/shared/templates/spec-suite.md +57 -0
  668. package/payload/skills/loom-resume/scripts/loom-resume.py +16 -0
  669. package/payload/skills/loom-retire/.loom-runtime/install-layout.json +77 -0
  670. package/payload/skills/loom-retire/.loom-runtime/loom-init/references/input-signals.md +16 -0
  671. package/payload/skills/loom-retire/.loom-runtime/loom-init/references/intake-signals.md +155 -0
  672. package/payload/skills/loom-retire/.loom-runtime/loom-init/references/output-contract.md +208 -0
  673. package/payload/skills/loom-retire/.loom-runtime/loom-retire/SKILL.md +26 -0
  674. package/payload/skills/loom-retire/.loom-runtime/loom-retire/agents/openai.yaml +4 -0
  675. package/payload/skills/loom-retire/.loom-runtime/loom-retire/contract.json +41 -0
  676. package/payload/skills/loom-retire/.loom-runtime/loom-retire/references/input-signals.md +7 -0
  677. package/payload/skills/loom-retire/.loom-runtime/loom-retire/references/output-contract.md +13 -0
  678. package/payload/skills/loom-retire/.loom-runtime/loom-retire/scripts/loom-retire.py +14 -0
  679. package/payload/skills/loom-retire/.loom-runtime/registry.json +15 -0
  680. package/payload/skills/loom-retire/.loom-runtime/route-matrix.md +63 -0
  681. package/payload/skills/loom-retire/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
  682. package/payload/skills/loom-retire/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
  683. package/payload/skills/loom-retire/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
  684. package/payload/skills/loom-retire/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
  685. package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
  686. package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
  687. package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
  688. package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
  689. package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/issue-model.md +127 -0
  690. package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
  691. package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/principles.md +180 -0
  692. package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/review-model.md +109 -0
  693. package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/state-machine.md +163 -0
  694. package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
  695. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
  696. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
  697. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
  698. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/execution-context.md +71 -0
  699. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
  700. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
  701. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
  702. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
  703. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
  704. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
  705. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
  706. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/review-execution.md +99 -0
  707. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
  708. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/status-surface.md +121 -0
  709. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
  710. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
  711. package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
  712. package/payload/skills/loom-retire/.loom-runtime/shared/references/templates/pull-request.md +44 -0
  713. package/payload/skills/loom-retire/.loom-runtime/shared/references/templates/review-record.md +35 -0
  714. package/payload/skills/loom-retire/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
  715. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
  716. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py +879 -0
  717. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +4683 -0
  718. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
  719. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py +1966 -0
  720. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
  721. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/runtime_state.py +405 -0
  722. package/payload/skills/loom-retire/.loom-runtime/upgrade-contract.json +29 -0
  723. package/payload/skills/loom-retire/SKILL.md +26 -0
  724. package/payload/skills/loom-retire/agents/openai.yaml +4 -0
  725. package/payload/skills/loom-retire/contract.json +41 -0
  726. package/payload/skills/loom-retire/references/input-signals.md +7 -0
  727. package/payload/skills/loom-retire/references/loom-init/input-signals.md +16 -0
  728. package/payload/skills/loom-retire/references/loom-init/intake-signals.md +155 -0
  729. package/payload/skills/loom-retire/references/loom-init/output-contract.md +208 -0
  730. package/payload/skills/loom-retire/references/output-contract.md +13 -0
  731. package/payload/skills/loom-retire/references/route-matrix.md +63 -0
  732. package/payload/skills/loom-retire/references/shared/adoption/deep-existing-repo-default.md +64 -0
  733. package/payload/skills/loom-retire/references/shared/adoption/lightweight-retrofit-default.md +71 -0
  734. package/payload/skills/loom-retire/references/shared/adoption/routing-and-checkpoints.md +88 -0
  735. package/payload/skills/loom-retire/references/shared/governance/host-object-taxonomy.md +148 -0
  736. package/payload/skills/loom-retire/references/shared/governance/issue-model.md +127 -0
  737. package/payload/skills/loom-retire/references/shared/governance/maturity-and-closing.md +69 -0
  738. package/payload/skills/loom-retire/references/shared/governance/principles.md +180 -0
  739. package/payload/skills/loom-retire/references/shared/governance/review-model.md +109 -0
  740. package/payload/skills/loom-retire/references/shared/governance/state-machine.md +163 -0
  741. package/payload/skills/loom-retire/references/shared/governance/truth-and-sync-boundary.md +161 -0
  742. package/payload/skills/loom-retire/references/shared/harness/automation-frontload.md +139 -0
  743. package/payload/skills/loom-retire/references/shared/harness/closeout-gate.md +97 -0
  744. package/payload/skills/loom-retire/references/shared/harness/execution-chain.md +56 -0
  745. package/payload/skills/loom-retire/references/shared/harness/execution-context.md +71 -0
  746. package/payload/skills/loom-retire/references/shared/harness/fact-chain-contract.md +160 -0
  747. package/payload/skills/loom-retire/references/shared/harness/host-action-contract.md +128 -0
  748. package/payload/skills/loom-retire/references/shared/harness/host-issue-binding.md +90 -0
  749. package/payload/skills/loom-retire/references/shared/harness/host-lifecycle-boundary.md +56 -0
  750. package/payload/skills/loom-retire/references/shared/harness/merge-checkpoint.md +95 -0
  751. package/payload/skills/loom-retire/references/shared/harness/reconciliation-audit.md +64 -0
  752. package/payload/skills/loom-retire/references/shared/harness/recovery-model.md +101 -0
  753. package/payload/skills/loom-retire/references/shared/harness/review-execution.md +99 -0
  754. package/payload/skills/loom-retire/references/shared/harness/runtime-state.md +103 -0
  755. package/payload/skills/loom-retire/references/shared/harness/status-surface.md +121 -0
  756. package/payload/skills/loom-retire/references/shared/harness/work-item-contract.md +104 -0
  757. package/payload/skills/loom-retire/references/shared/harness/workspace-and-purity.md +73 -0
  758. package/payload/skills/loom-retire/references/shared/harness/workspace-model.md +56 -0
  759. package/payload/skills/loom-retire/references/shared/templates/pull-request.md +44 -0
  760. package/payload/skills/loom-retire/references/shared/templates/review-record.md +35 -0
  761. package/payload/skills/loom-retire/references/shared/templates/spec-suite.md +57 -0
  762. package/payload/skills/loom-retire/scripts/loom-retire.py +16 -0
  763. package/payload/skills/loom-review/.loom-runtime/install-layout.json +77 -0
  764. package/payload/skills/loom-review/.loom-runtime/loom-init/references/input-signals.md +16 -0
  765. package/payload/skills/loom-review/.loom-runtime/loom-init/references/intake-signals.md +155 -0
  766. package/payload/skills/loom-review/.loom-runtime/loom-init/references/output-contract.md +208 -0
  767. package/payload/skills/loom-review/.loom-runtime/loom-review/SKILL.md +95 -0
  768. package/payload/skills/loom-review/.loom-runtime/loom-review/agents/openai.yaml +4 -0
  769. package/payload/skills/loom-review/.loom-runtime/loom-review/contract.json +49 -0
  770. package/payload/skills/loom-review/.loom-runtime/loom-review/references/input-signals.md +15 -0
  771. package/payload/skills/loom-review/.loom-runtime/loom-review/references/output-contract.md +57 -0
  772. package/payload/skills/loom-review/.loom-runtime/loom-review/scripts/loom-review.py +14 -0
  773. package/payload/skills/loom-review/.loom-runtime/registry.json +15 -0
  774. package/payload/skills/loom-review/.loom-runtime/route-matrix.md +63 -0
  775. package/payload/skills/loom-review/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
  776. package/payload/skills/loom-review/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
  777. package/payload/skills/loom-review/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
  778. package/payload/skills/loom-review/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
  779. package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
  780. package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
  781. package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
  782. package/payload/skills/loom-review/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
  783. package/payload/skills/loom-review/.loom-runtime/shared/references/governance/issue-model.md +127 -0
  784. package/payload/skills/loom-review/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
  785. package/payload/skills/loom-review/.loom-runtime/shared/references/governance/principles.md +180 -0
  786. package/payload/skills/loom-review/.loom-runtime/shared/references/governance/review-model.md +109 -0
  787. package/payload/skills/loom-review/.loom-runtime/shared/references/governance/state-machine.md +163 -0
  788. package/payload/skills/loom-review/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
  789. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
  790. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
  791. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
  792. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/execution-context.md +71 -0
  793. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
  794. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
  795. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
  796. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
  797. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
  798. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
  799. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
  800. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/review-execution.md +99 -0
  801. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
  802. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/status-surface.md +121 -0
  803. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
  804. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
  805. package/payload/skills/loom-review/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
  806. package/payload/skills/loom-review/.loom-runtime/shared/references/templates/pull-request.md +44 -0
  807. package/payload/skills/loom-review/.loom-runtime/shared/references/templates/review-record.md +35 -0
  808. package/payload/skills/loom-review/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
  809. package/payload/skills/loom-review/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
  810. package/payload/skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py +879 -0
  811. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +4683 -0
  812. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
  813. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_init.py +1966 -0
  814. package/payload/skills/loom-review/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
  815. package/payload/skills/loom-review/.loom-runtime/shared/scripts/runtime_state.py +405 -0
  816. package/payload/skills/loom-review/.loom-runtime/upgrade-contract.json +29 -0
  817. package/payload/skills/loom-review/SKILL.md +95 -0
  818. package/payload/skills/loom-review/agents/openai.yaml +4 -0
  819. package/payload/skills/loom-review/contract.json +49 -0
  820. package/payload/skills/loom-review/references/input-signals.md +15 -0
  821. package/payload/skills/loom-review/references/loom-init/input-signals.md +16 -0
  822. package/payload/skills/loom-review/references/loom-init/intake-signals.md +155 -0
  823. package/payload/skills/loom-review/references/loom-init/output-contract.md +208 -0
  824. package/payload/skills/loom-review/references/output-contract.md +57 -0
  825. package/payload/skills/loom-review/references/route-matrix.md +63 -0
  826. package/payload/skills/loom-review/references/shared/adoption/deep-existing-repo-default.md +64 -0
  827. package/payload/skills/loom-review/references/shared/adoption/lightweight-retrofit-default.md +71 -0
  828. package/payload/skills/loom-review/references/shared/adoption/routing-and-checkpoints.md +88 -0
  829. package/payload/skills/loom-review/references/shared/governance/host-object-taxonomy.md +148 -0
  830. package/payload/skills/loom-review/references/shared/governance/issue-model.md +127 -0
  831. package/payload/skills/loom-review/references/shared/governance/maturity-and-closing.md +69 -0
  832. package/payload/skills/loom-review/references/shared/governance/principles.md +180 -0
  833. package/payload/skills/loom-review/references/shared/governance/review-model.md +109 -0
  834. package/payload/skills/loom-review/references/shared/governance/state-machine.md +163 -0
  835. package/payload/skills/loom-review/references/shared/governance/truth-and-sync-boundary.md +161 -0
  836. package/payload/skills/loom-review/references/shared/harness/automation-frontload.md +139 -0
  837. package/payload/skills/loom-review/references/shared/harness/closeout-gate.md +97 -0
  838. package/payload/skills/loom-review/references/shared/harness/execution-chain.md +56 -0
  839. package/payload/skills/loom-review/references/shared/harness/execution-context.md +71 -0
  840. package/payload/skills/loom-review/references/shared/harness/fact-chain-contract.md +160 -0
  841. package/payload/skills/loom-review/references/shared/harness/host-action-contract.md +128 -0
  842. package/payload/skills/loom-review/references/shared/harness/host-issue-binding.md +90 -0
  843. package/payload/skills/loom-review/references/shared/harness/host-lifecycle-boundary.md +56 -0
  844. package/payload/skills/loom-review/references/shared/harness/merge-checkpoint.md +95 -0
  845. package/payload/skills/loom-review/references/shared/harness/reconciliation-audit.md +64 -0
  846. package/payload/skills/loom-review/references/shared/harness/recovery-model.md +101 -0
  847. package/payload/skills/loom-review/references/shared/harness/review-execution.md +99 -0
  848. package/payload/skills/loom-review/references/shared/harness/runtime-state.md +103 -0
  849. package/payload/skills/loom-review/references/shared/harness/status-surface.md +121 -0
  850. package/payload/skills/loom-review/references/shared/harness/work-item-contract.md +104 -0
  851. package/payload/skills/loom-review/references/shared/harness/workspace-and-purity.md +73 -0
  852. package/payload/skills/loom-review/references/shared/harness/workspace-model.md +56 -0
  853. package/payload/skills/loom-review/references/shared/templates/pull-request.md +44 -0
  854. package/payload/skills/loom-review/references/shared/templates/review-record.md +35 -0
  855. package/payload/skills/loom-review/references/shared/templates/spec-suite.md +57 -0
  856. package/payload/skills/loom-review/scripts/loom-review.py +16 -0
@@ -0,0 +1,879 @@
1
+ #!/usr/bin/env python3
2
+ """Shared governance-surface detection for Loom bootstrap, route, and resume."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import json
7
+ import re
8
+ import subprocess
9
+ from pathlib import Path
10
+ from typing import Any
11
+
12
+ from runtime_paths import installed_skill_script
13
+
14
+
15
+ def installed_skill_script_or_unknown(skill_id: str) -> Path | None:
16
+ try:
17
+ return installed_skill_script(__file__, skill_id)
18
+ except RuntimeError:
19
+ return None
20
+
21
+ CARRIER_KEYS = (
22
+ "work_item",
23
+ "recovery",
24
+ "review",
25
+ "status_surface",
26
+ "spec_path",
27
+ "plan_path",
28
+ )
29
+
30
+ PLANNED_LOCATORS = {
31
+ "work_item": ".loom/work-items/INIT-0001.md",
32
+ "recovery": ".loom/progress/INIT-0001.md",
33
+ "review": ".loom/reviews/INIT-0001.json",
34
+ "status_surface": ".loom/status/current.md",
35
+ "spec_path": ".loom/specs/INIT-0001/spec.md",
36
+ "plan_path": ".loom/specs/INIT-0001/plan.md",
37
+ }
38
+
39
+ REPO_INTERFACE_SURFACES = ("review", "merge_ready", "closeout")
40
+ REPO_INTERFACE_AVAILABILITY = {"absent", "companion_docs_only", "incomplete", "present"}
41
+ REPO_INTERFACE_MANIFEST_SCHEMA = "loom-repo-companion-manifest/v1"
42
+ REPO_INTERFACE_V1_SCHEMA = "loom-repo-interface/v1"
43
+ REPO_INTERFACE_V2_SCHEMA = "loom-repo-interface/v2"
44
+ REPO_INTERFACE_SCHEMAS = {REPO_INTERFACE_V1_SCHEMA, REPO_INTERFACE_V2_SCHEMA}
45
+ REPO_INTERFACE_ENFORCEMENT = {"blocking", "advisory"}
46
+ REPO_INTERFACE_GATE_TYPES = {
47
+ "admission",
48
+ "pre_review",
49
+ "review",
50
+ "build",
51
+ "merge_ready",
52
+ "closeout",
53
+ }
54
+ REPO_INTERFACE_CONTEXT_TYPES = {"string", "integer", "number", "boolean"}
55
+ REPO_INTERFACE_MANIFEST_KEYS = {"schema_version", "companion_entry", "repo_interface"}
56
+ REPO_INTERFACE_V1_KEYS = {"schema_version", "companion_entry", "repo_specific_requirements", "specialized_gates"}
57
+ REPO_INTERFACE_V2_KEYS = REPO_INTERFACE_V1_KEYS | {"metadata_contract", "context_schema"}
58
+ REPO_INTEROP_AVAILABILITY = {"absent", "incomplete", "present"}
59
+ REPO_INTEROP_SCHEMA = "loom-repo-interop/v1"
60
+ REPO_INTEROP_KEYS = {"schema_version", "host_adapters", "repo_native_carriers", "shadow_surfaces"}
61
+ REPO_INTEROP_COLLECTION_SURFACES = {
62
+ "admission",
63
+ "pre_review",
64
+ "review",
65
+ "build",
66
+ "merge_ready",
67
+ "closeout",
68
+ }
69
+ REPO_INTEROP_SHADOW_SURFACES = ("admission", "review", "merge_ready", "closeout")
70
+
71
+
72
+ def run_process(args: list[str], cwd: Path) -> subprocess.CompletedProcess[str]:
73
+ return subprocess.run(args, cwd=cwd, check=False, capture_output=True, text=True)
74
+
75
+
76
+ def file_exists(root: Path, relative: str) -> bool:
77
+ return (root / relative).exists()
78
+
79
+
80
+ def relative_locator(path: Path, root: Path) -> str:
81
+ try:
82
+ return str(path.relative_to(root))
83
+ except ValueError:
84
+ return str(path)
85
+
86
+
87
+ def safe_read_json(path: Path) -> dict[str, Any] | None:
88
+ if not path.exists():
89
+ return None
90
+ try:
91
+ payload = json.loads(path.read_text(encoding="utf-8"))
92
+ except (OSError, json.JSONDecodeError):
93
+ return None
94
+ return payload if isinstance(payload, dict) else None
95
+
96
+
97
+ def command_prefix(root: Path, tool_name: str) -> str:
98
+ loom_tool = root / ".loom/bin" / tool_name
99
+ if loom_tool.exists():
100
+ return f"python3 .loom/bin/{tool_name}"
101
+ if tool_name == "loom_init.py":
102
+ script = installed_skill_script_or_unknown('loom-init')
103
+ return f"python3 {script}" if script is not None else "unknown"
104
+ if tool_name == "loom_flow.py":
105
+ script = installed_skill_script_or_unknown('loom-resume')
106
+ return f"python3 {script}" if script is not None else "unknown"
107
+ return "unknown"
108
+
109
+
110
+ def git_remote_origin(root: Path) -> str | None:
111
+ result = run_process(["git", "remote", "get-url", "origin"], root)
112
+ if result.returncode != 0:
113
+ return None
114
+ remote = result.stdout.strip()
115
+ return remote or None
116
+
117
+
118
+ def detect_github_repo(root: Path) -> tuple[str | None, str | None]:
119
+ remote = git_remote_origin(root)
120
+ if not remote:
121
+ return None, None
122
+ match = re.search(r"github\.com[:/](?P<owner>[^/]+)/(?P<repo>[^/.]+)(?:\.git)?$", remote)
123
+ if not match:
124
+ return None, None
125
+ return match.group("owner"), match.group("repo")
126
+
127
+
128
+ def gh_json(root: Path, args: list[str]) -> tuple[dict[str, Any] | None, list[str]]:
129
+ result = run_process(["gh", *args], root)
130
+ if result.returncode != 0:
131
+ detail = result.stderr.strip() or result.stdout.strip() or "gh command failed"
132
+ return None, [detail]
133
+ try:
134
+ payload = json.loads(result.stdout)
135
+ except json.JSONDecodeError as exc:
136
+ return None, [f"invalid JSON from gh {' '.join(args)}: {exc.msg}"]
137
+ if not isinstance(payload, dict):
138
+ return None, [f"gh {' '.join(args)} did not return a JSON object"]
139
+ return payload, []
140
+
141
+
142
+ def detect_loom_state(root: Path) -> str:
143
+ active_requirements = (
144
+ root / ".loom/bootstrap/init-result.json",
145
+ root / ".loom/work-items",
146
+ root / ".loom/progress",
147
+ root / ".loom/status/current.md",
148
+ )
149
+ if all(path.exists() for path in active_requirements):
150
+ return "active"
151
+
152
+ partial_markers = (
153
+ root / ".loom",
154
+ root / "AGENTS.md",
155
+ root / ".github/PULL_REQUEST_TEMPLATE.md",
156
+ )
157
+ if any(path.exists() for path in partial_markers):
158
+ return "partial"
159
+ return "absent"
160
+
161
+
162
+ def detect_repository_mode(root: Path, loom_state: str, scenario_override: str | None = None) -> str:
163
+ if scenario_override in {"new", "small-existing", "complex-existing"}:
164
+ return scenario_override
165
+
166
+ init_result = safe_read_json(root / ".loom/bootstrap/init-result.json")
167
+ if isinstance(init_result, dict):
168
+ run = init_result.get("run")
169
+ if isinstance(run, dict):
170
+ scenario_key = run.get("scenario_key")
171
+ if scenario_key in {"new", "small-existing", "complex-existing"}:
172
+ return str(scenario_key)
173
+
174
+ code_dirs = ("src", "app", "lib", "cmd", "pkg", "services", "packages")
175
+ boundary_files = (
176
+ "README.md",
177
+ "AGENTS.md",
178
+ "WORKFLOW.md",
179
+ "docs/WORKFLOW.md",
180
+ "package.json",
181
+ "pyproject.toml",
182
+ "Cargo.toml",
183
+ "go.mod",
184
+ "Makefile",
185
+ ".github/workflows",
186
+ )
187
+ baseline_count = sum(1 for entry in boundary_files if file_exists(root, entry))
188
+ code_count = sum(1 for entry in code_dirs if file_exists(root, entry))
189
+
190
+ meaningful_entries = 0
191
+ for path in root.iterdir():
192
+ if path.name in {".git", ".DS_Store"}:
193
+ continue
194
+ if path.name == ".loom" and loom_state != "absent":
195
+ continue
196
+ meaningful_entries += 1
197
+
198
+ if loom_state == "absent" and meaningful_entries <= 2 and baseline_count <= 1 and code_count == 0:
199
+ return "new"
200
+ if baseline_count + code_count >= 4 or meaningful_entries >= 8:
201
+ return "complex-existing"
202
+ return "small-existing"
203
+
204
+
205
+ def carrier_entry(status: str, locator: str, source: str) -> dict[str, str]:
206
+ return {"status": status, "locator": locator, "source": source}
207
+
208
+
209
+ def has_legacy_companion_docs(root: Path) -> bool:
210
+ companion_dir = root / ".loom" / "companion"
211
+ if not companion_dir.exists() or not companion_dir.is_dir():
212
+ return False
213
+ for path in companion_dir.iterdir():
214
+ if path.name in {"manifest.json", "repo-interface.json"}:
215
+ continue
216
+ if path.suffix.lower() == ".md":
217
+ return True
218
+ return False
219
+
220
+
221
+ def relative_locator_from_value(root: Path, raw_locator: object) -> str | None:
222
+ if not isinstance(raw_locator, str):
223
+ return None
224
+ locator = raw_locator.strip()
225
+ if not locator:
226
+ return None
227
+ locator_path = Path(locator)
228
+ if locator_path.is_absolute():
229
+ try:
230
+ return str(locator_path.relative_to(root))
231
+ except ValueError:
232
+ return str(locator_path)
233
+ return str(locator_path)
234
+
235
+
236
+ def resolve_locator(root: Path, raw_locator: object) -> tuple[str | None, Path | None]:
237
+ locator = relative_locator_from_value(root, raw_locator)
238
+ if locator is None:
239
+ return None, None
240
+ return locator, (root / locator).resolve()
241
+
242
+
243
+ def locator_status_entry(
244
+ *,
245
+ root: Path,
246
+ raw_locator: object,
247
+ source: str,
248
+ ) -> tuple[dict[str, str], str | None]:
249
+ locator, target = resolve_locator(root, raw_locator)
250
+ if locator is None or target is None:
251
+ return carrier_entry("missing", "unknown", source), f"{source} is missing a valid locator"
252
+ if not target.exists():
253
+ return carrier_entry("missing", locator, source), f"{source} points to missing path `{locator}`"
254
+ return carrier_entry("present", locator, source), None
255
+
256
+
257
+ def validate_repo_specific_requirement(
258
+ *,
259
+ root: Path,
260
+ surface: str,
261
+ entry: object,
262
+ index: int,
263
+ ) -> list[str]:
264
+ prefix = f"repo_interface.{surface}[{index}]"
265
+ if not isinstance(entry, dict):
266
+ return [f"{prefix} must be an object"]
267
+ missing_inputs: list[str] = []
268
+ for field in ("id", "summary", "locator", "enforcement"):
269
+ value = entry.get(field)
270
+ if not isinstance(value, str) or not value.strip():
271
+ missing_inputs.append(f"{prefix} missing `{field}`")
272
+ enforcement = entry.get("enforcement")
273
+ if enforcement not in REPO_INTERFACE_ENFORCEMENT:
274
+ missing_inputs.append(f"{prefix} enforcement must be `blocking` or `advisory`")
275
+ locator, target = resolve_locator(root, entry.get("locator"))
276
+ if locator is None or target is None:
277
+ missing_inputs.append(f"{prefix} locator must be a non-empty string")
278
+ elif not target.exists():
279
+ missing_inputs.append(f"{prefix} locator points to missing path `{locator}`")
280
+ return missing_inputs
281
+
282
+
283
+ def validate_specialized_gate(
284
+ *,
285
+ root: Path,
286
+ entry: object,
287
+ index: int,
288
+ ) -> list[str]:
289
+ prefix = f"specialized_gates[{index}]"
290
+ if not isinstance(entry, dict):
291
+ return [f"{prefix} must be an object"]
292
+ missing_inputs: list[str] = []
293
+ for field in ("id", "summary", "locator"):
294
+ value = entry.get(field)
295
+ if not isinstance(value, str) or not value.strip():
296
+ missing_inputs.append(f"{prefix} missing `{field}`")
297
+ locator, target = resolve_locator(root, entry.get("locator"))
298
+ if locator is None or target is None:
299
+ missing_inputs.append(f"{prefix} locator must be a non-empty string")
300
+ elif not target.exists():
301
+ missing_inputs.append(f"{prefix} locator points to missing path `{locator}`")
302
+ gate_type = entry.get("gate_type")
303
+ if gate_type is not None and gate_type not in REPO_INTERFACE_GATE_TYPES:
304
+ missing_inputs.append(
305
+ f"{prefix} gate_type must be one of `admission`, `pre_review`, `review`, `build`, `merge_ready`, `closeout`"
306
+ )
307
+ return missing_inputs
308
+
309
+
310
+ def validate_metadata_contract(
311
+ *,
312
+ root: Path,
313
+ entry: object,
314
+ ) -> list[str]:
315
+ prefix = "metadata_contract"
316
+ if not isinstance(entry, dict):
317
+ return [f"{prefix} must be an object"]
318
+ fields = entry.get("fields")
319
+ if not isinstance(fields, list):
320
+ return [f"{prefix} must include `fields` as a list"]
321
+ missing_inputs: list[str] = []
322
+ for index, field in enumerate(fields):
323
+ field_prefix = f"{prefix}.fields[{index}]"
324
+ if not isinstance(field, dict):
325
+ missing_inputs.append(f"{field_prefix} must be an object")
326
+ continue
327
+ for required in ("id", "summary", "applicability_locator", "authority_locator", "enforcement"):
328
+ value = field.get(required)
329
+ if required == "enforcement":
330
+ continue
331
+ if not isinstance(value, str) or not value.strip():
332
+ missing_inputs.append(f"{field_prefix} missing `{required}`")
333
+ enforcement = field.get("enforcement")
334
+ if enforcement not in REPO_INTERFACE_ENFORCEMENT:
335
+ missing_inputs.append(f"{field_prefix} enforcement must be `blocking` or `advisory`")
336
+ for locator_field in ("applicability_locator", "authority_locator"):
337
+ locator, target = resolve_locator(root, field.get(locator_field))
338
+ if locator is None or target is None:
339
+ missing_inputs.append(f"{field_prefix} `{locator_field}` must be a non-empty string")
340
+ elif not target.exists():
341
+ missing_inputs.append(f"{field_prefix} `{locator_field}` points to missing path `{locator}`")
342
+ return missing_inputs
343
+
344
+
345
+ def validate_context_schema(
346
+ *,
347
+ root: Path,
348
+ entry: object,
349
+ ) -> list[str]:
350
+ prefix = "context_schema"
351
+ if not isinstance(entry, dict):
352
+ return [f"{prefix} must be an object"]
353
+ fields = entry.get("fields")
354
+ if not isinstance(fields, list):
355
+ return [f"{prefix} must include `fields` as a list"]
356
+ missing_inputs: list[str] = []
357
+ for index, field in enumerate(fields):
358
+ field_prefix = f"{prefix}.fields[{index}]"
359
+ if not isinstance(field, dict):
360
+ missing_inputs.append(f"{field_prefix} must be an object")
361
+ continue
362
+ for required in ("id", "summary", "type", "mapping_rule_locator"):
363
+ value = field.get(required)
364
+ if not isinstance(value, str) or not value.strip():
365
+ missing_inputs.append(f"{field_prefix} missing `{required}`")
366
+ field_type = field.get("type")
367
+ if field_type not in REPO_INTERFACE_CONTEXT_TYPES:
368
+ missing_inputs.append(f"{field_prefix} type must be one of `string`, `integer`, `number`, `boolean`")
369
+ if not isinstance(field.get("required"), bool):
370
+ missing_inputs.append(f"{field_prefix} `required` must be a boolean")
371
+ locator, target = resolve_locator(root, field.get("mapping_rule_locator"))
372
+ if locator is None or target is None:
373
+ missing_inputs.append(f"{field_prefix} `mapping_rule_locator` must be a non-empty string")
374
+ elif not target.exists():
375
+ missing_inputs.append(f"{field_prefix} `mapping_rule_locator` points to missing path `{locator}`")
376
+ return missing_inputs
377
+
378
+
379
+ def validate_repo_interop_collection_entry(
380
+ *,
381
+ root: Path,
382
+ collection: str,
383
+ entry: object,
384
+ index: int,
385
+ ) -> list[str]:
386
+ prefix = f"{collection}[{index}]"
387
+ if not isinstance(entry, dict):
388
+ return [f"{prefix} must be an object"]
389
+ missing_inputs: list[str] = []
390
+ for field in ("id", "summary", "locator"):
391
+ value = entry.get(field)
392
+ if not isinstance(value, str) or not value.strip():
393
+ missing_inputs.append(f"{prefix} missing `{field}`")
394
+ surfaces = entry.get("surfaces")
395
+ if not isinstance(surfaces, list) or not surfaces:
396
+ missing_inputs.append(f"{prefix} must include `surfaces` as a non-empty list")
397
+ else:
398
+ for surface_index, surface in enumerate(surfaces):
399
+ if surface not in REPO_INTEROP_COLLECTION_SURFACES:
400
+ missing_inputs.append(
401
+ f"{prefix}.surfaces[{surface_index}] must be one of `admission`, `pre_review`, `review`, `build`, `merge_ready`, `closeout`"
402
+ )
403
+ locator, target = resolve_locator(root, entry.get("locator"))
404
+ if locator is None or target is None:
405
+ missing_inputs.append(f"{prefix} locator must be a non-empty string")
406
+ elif not target.exists():
407
+ missing_inputs.append(f"{prefix} locator points to missing path `{locator}`")
408
+ return missing_inputs
409
+
410
+
411
+ def validate_shadow_surface(
412
+ *,
413
+ root: Path,
414
+ surface: str,
415
+ entry: object,
416
+ ) -> list[str]:
417
+ prefix = f"shadow_surfaces.{surface}"
418
+ if not isinstance(entry, dict):
419
+ return [f"{prefix} must be an object"]
420
+ missing_inputs: list[str] = []
421
+ summary = entry.get("summary")
422
+ if not isinstance(summary, str) or not summary.strip():
423
+ missing_inputs.append(f"{prefix} missing `summary`")
424
+ for locator_field in ("loom_locator", "repo_locator"):
425
+ locator, target = resolve_locator(root, entry.get(locator_field))
426
+ if locator is None or target is None:
427
+ missing_inputs.append(f"{prefix} `{locator_field}` must be a non-empty string")
428
+ elif not target.exists():
429
+ missing_inputs.append(f"{prefix} `{locator_field}` points to missing path `{locator}`")
430
+ return missing_inputs
431
+
432
+
433
+ def detect_repo_interface(root: Path) -> tuple[dict[str, Any], list[str]]:
434
+ companion_dir = root / ".loom" / "companion"
435
+ manifest_path = companion_dir / "manifest.json"
436
+ repo_interface_path = companion_dir / "repo-interface.json"
437
+
438
+ repo_interface_surface: dict[str, Any] = {
439
+ "availability": "absent",
440
+ "manifest": carrier_entry("missing", ".loom/companion/manifest.json", "companion manifest"),
441
+ "companion_entry": carrier_entry("missing", "unknown", "repo companion manifest"),
442
+ "repo_specific_requirements": carrier_entry("missing", "unknown", "repo companion interface"),
443
+ "specialized_gates": carrier_entry("missing", "unknown", "repo companion interface"),
444
+ "summary": "no repo companion interface is declared for this repository.",
445
+ "missing_inputs": [],
446
+ }
447
+ missing_inputs: list[str] = []
448
+
449
+ if not manifest_path.exists():
450
+ if has_legacy_companion_docs(root):
451
+ repo_interface_surface["availability"] = "companion_docs_only"
452
+ repo_interface_surface["summary"] = (
453
+ "legacy companion docs are present, but no machine-readable repo companion manifest is declared."
454
+ )
455
+ return repo_interface_surface, missing_inputs
456
+
457
+ repo_interface_surface["manifest"] = carrier_entry(
458
+ "present",
459
+ ".loom/companion/manifest.json",
460
+ "repository scan",
461
+ )
462
+ manifest = safe_read_json(manifest_path)
463
+ if manifest is None:
464
+ missing_inputs.append("repo companion manifest is unreadable")
465
+ repo_interface_surface["availability"] = "incomplete"
466
+ repo_interface_surface["summary"] = "repo companion manifest exists, but the machine-readable interface is incomplete."
467
+ repo_interface_surface["missing_inputs"] = missing_inputs
468
+ return repo_interface_surface, missing_inputs
469
+
470
+ if manifest.get("schema_version") != REPO_INTERFACE_MANIFEST_SCHEMA:
471
+ missing_inputs.append(
472
+ f"repo companion manifest schema must be `{REPO_INTERFACE_MANIFEST_SCHEMA}`"
473
+ )
474
+ extra_manifest_keys = sorted(set(manifest.keys()) - REPO_INTERFACE_MANIFEST_KEYS)
475
+ if extra_manifest_keys:
476
+ missing_inputs.append(
477
+ "repo companion manifest must stay locator-only: "
478
+ + ", ".join(extra_manifest_keys)
479
+ )
480
+
481
+ companion_entry, companion_error = locator_status_entry(
482
+ root=root,
483
+ raw_locator=manifest.get("companion_entry"),
484
+ source="repo companion manifest.companion_entry",
485
+ )
486
+ repo_interface_surface["companion_entry"] = companion_entry
487
+ if companion_error:
488
+ missing_inputs.append(companion_error)
489
+
490
+ manifest_repo_interface, manifest_repo_interface_error = locator_status_entry(
491
+ root=root,
492
+ raw_locator=manifest.get("repo_interface"),
493
+ source="repo companion manifest.repo_interface",
494
+ )
495
+ repo_interface_surface["repo_specific_requirements"] = manifest_repo_interface
496
+ repo_interface_surface["specialized_gates"] = manifest_repo_interface.copy()
497
+ if manifest_repo_interface_error:
498
+ missing_inputs.append(manifest_repo_interface_error)
499
+
500
+ repo_interface_locator, repo_interface_target = resolve_locator(root, manifest.get("repo_interface"))
501
+ if repo_interface_surface["repo_specific_requirements"]["status"] != "present":
502
+ if repo_interface_path.exists() and manifest_repo_interface_error:
503
+ missing_inputs.append("repo companion manifest must point `repo_interface` to `.loom/companion/repo-interface.json`")
504
+ else:
505
+ interface_payload = safe_read_json(repo_interface_target or repo_interface_path)
506
+ if interface_payload is None:
507
+ missing_inputs.append("repo companion interface is unreadable")
508
+ else:
509
+ interface_schema = interface_payload.get("schema_version")
510
+ if interface_schema not in REPO_INTERFACE_SCHEMAS:
511
+ missing_inputs.append(
512
+ "repo companion interface schema must be `loom-repo-interface/v1` or `loom-repo-interface/v2`"
513
+ )
514
+ allowed_interface_keys = (
515
+ REPO_INTERFACE_V2_KEYS if interface_schema == REPO_INTERFACE_V2_SCHEMA else REPO_INTERFACE_V1_KEYS
516
+ )
517
+ extra_interface_keys = sorted(set(interface_payload.keys()) - allowed_interface_keys)
518
+ if extra_interface_keys:
519
+ missing_inputs.append(
520
+ "repo companion interface contains unexpected top-level fields: "
521
+ + ", ".join(extra_interface_keys)
522
+ )
523
+ interface_companion_entry, interface_companion_error = locator_status_entry(
524
+ root=root,
525
+ raw_locator=interface_payload.get("companion_entry"),
526
+ source="repo companion interface.companion_entry",
527
+ )
528
+ if interface_companion_entry["status"] == "present":
529
+ repo_interface_surface["companion_entry"] = interface_companion_entry
530
+ if interface_companion_error:
531
+ missing_inputs.append(interface_companion_error)
532
+
533
+ requirements = interface_payload.get("repo_specific_requirements")
534
+ if not isinstance(requirements, dict):
535
+ missing_inputs.append("repo companion interface must include `repo_specific_requirements`")
536
+ else:
537
+ for surface in REPO_INTERFACE_SURFACES:
538
+ entries = requirements.get(surface)
539
+ if not isinstance(entries, list):
540
+ missing_inputs.append(
541
+ f"repo companion interface surface `{surface}` must be a list"
542
+ )
543
+ continue
544
+ for index, entry in enumerate(entries):
545
+ missing_inputs.extend(
546
+ validate_repo_specific_requirement(
547
+ root=root,
548
+ surface=surface,
549
+ entry=entry,
550
+ index=index,
551
+ )
552
+ )
553
+
554
+ specialized_gates = interface_payload.get("specialized_gates")
555
+ if not isinstance(specialized_gates, list):
556
+ missing_inputs.append("repo companion interface must include `specialized_gates` as a list")
557
+ else:
558
+ for index, entry in enumerate(specialized_gates):
559
+ missing_inputs.extend(
560
+ validate_specialized_gate(
561
+ root=root,
562
+ entry=entry,
563
+ index=index,
564
+ )
565
+ )
566
+
567
+ if interface_schema == REPO_INTERFACE_V2_SCHEMA:
568
+ metadata_contract = interface_payload.get("metadata_contract")
569
+ if metadata_contract is not None:
570
+ missing_inputs.extend(
571
+ validate_metadata_contract(
572
+ root=root,
573
+ entry=metadata_contract,
574
+ )
575
+ )
576
+ context_schema = interface_payload.get("context_schema")
577
+ if context_schema is not None:
578
+ missing_inputs.extend(
579
+ validate_context_schema(
580
+ root=root,
581
+ entry=context_schema,
582
+ )
583
+ )
584
+
585
+ if missing_inputs:
586
+ repo_interface_surface["availability"] = "incomplete"
587
+ repo_interface_surface["summary"] = (
588
+ "repo companion manifest exists, but the machine-readable interface is incomplete."
589
+ )
590
+ else:
591
+ repo_interface_surface["availability"] = "present"
592
+ repo_interface_surface["summary"] = (
593
+ "repo companion manifest and machine-readable repo interface are readable."
594
+ )
595
+ repo_interface_surface["missing_inputs"] = list(dict.fromkeys(missing_inputs))
596
+ return repo_interface_surface, list(dict.fromkeys(missing_inputs))
597
+
598
+
599
+ def detect_repo_interop(root: Path) -> tuple[dict[str, Any], list[str]]:
600
+ interop_path = root / ".loom" / "companion" / "interop.json"
601
+ repo_interop_surface: dict[str, Any] = {
602
+ "availability": "absent",
603
+ "contract": carrier_entry("missing", ".loom/companion/interop.json", "repository scan"),
604
+ "host_adapters": carrier_entry("missing", "unknown", "repo interop contract"),
605
+ "repo_native_carriers": carrier_entry("missing", "unknown", "repo interop contract"),
606
+ "shadow_surfaces": carrier_entry("missing", "unknown", "repo interop contract"),
607
+ "summary": "no repo interop contract is declared for this repository.",
608
+ "missing_inputs": [],
609
+ }
610
+ missing_inputs: list[str] = []
611
+
612
+ if not interop_path.exists():
613
+ return repo_interop_surface, missing_inputs
614
+
615
+ repo_interop_surface["contract"] = carrier_entry(
616
+ "present",
617
+ ".loom/companion/interop.json",
618
+ "repository scan",
619
+ )
620
+ interop_payload = safe_read_json(interop_path)
621
+ if interop_payload is None:
622
+ missing_inputs.append("repo interop contract is unreadable")
623
+ else:
624
+ if interop_payload.get("schema_version") != REPO_INTEROP_SCHEMA:
625
+ missing_inputs.append(f"repo interop contract schema must be `{REPO_INTEROP_SCHEMA}`")
626
+ extra_keys = sorted(set(interop_payload.keys()) - REPO_INTEROP_KEYS)
627
+ if extra_keys:
628
+ missing_inputs.append(
629
+ "repo interop contract contains unexpected top-level fields: "
630
+ + ", ".join(extra_keys)
631
+ )
632
+
633
+ for key in ("host_adapters", "repo_native_carriers", "shadow_surfaces"):
634
+ repo_interop_surface[key] = carrier_entry(
635
+ "present",
636
+ ".loom/companion/interop.json",
637
+ "repo interop contract",
638
+ )
639
+
640
+ host_adapters = interop_payload.get("host_adapters")
641
+ if not isinstance(host_adapters, list):
642
+ missing_inputs.append("repo interop contract must include `host_adapters` as a list")
643
+ else:
644
+ for index, entry in enumerate(host_adapters):
645
+ missing_inputs.extend(
646
+ validate_repo_interop_collection_entry(
647
+ root=root,
648
+ collection="host_adapters",
649
+ entry=entry,
650
+ index=index,
651
+ )
652
+ )
653
+
654
+ repo_native_carriers = interop_payload.get("repo_native_carriers")
655
+ if not isinstance(repo_native_carriers, list):
656
+ missing_inputs.append("repo interop contract must include `repo_native_carriers` as a list")
657
+ else:
658
+ for index, entry in enumerate(repo_native_carriers):
659
+ missing_inputs.extend(
660
+ validate_repo_interop_collection_entry(
661
+ root=root,
662
+ collection="repo_native_carriers",
663
+ entry=entry,
664
+ index=index,
665
+ )
666
+ )
667
+
668
+ shadow_surfaces = interop_payload.get("shadow_surfaces")
669
+ if not isinstance(shadow_surfaces, dict):
670
+ missing_inputs.append("repo interop contract must include `shadow_surfaces` as an object")
671
+ else:
672
+ extra_shadow_surfaces = sorted(set(shadow_surfaces.keys()) - set(REPO_INTEROP_SHADOW_SURFACES))
673
+ if extra_shadow_surfaces:
674
+ missing_inputs.append(
675
+ "repo interop contract shadow_surfaces contains unexpected surfaces: "
676
+ + ", ".join(extra_shadow_surfaces)
677
+ )
678
+ for surface in REPO_INTEROP_SHADOW_SURFACES:
679
+ if surface not in shadow_surfaces:
680
+ missing_inputs.append(f"repo interop contract shadow_surfaces missing `{surface}`")
681
+ continue
682
+ missing_inputs.extend(
683
+ validate_shadow_surface(
684
+ root=root,
685
+ surface=surface,
686
+ entry=shadow_surfaces.get(surface),
687
+ )
688
+ )
689
+
690
+ if missing_inputs:
691
+ repo_interop_surface["availability"] = "incomplete"
692
+ repo_interop_surface["summary"] = "repo interop contract exists, but the machine-readable read surface is incomplete."
693
+ else:
694
+ repo_interop_surface["availability"] = "present"
695
+ repo_interop_surface["summary"] = "repo interop contract is readable for host adapters, repo-native carriers, and shadow parity."
696
+ repo_interop_surface["missing_inputs"] = list(dict.fromkeys(missing_inputs))
697
+ return repo_interop_surface, list(dict.fromkeys(missing_inputs))
698
+
699
+
700
+ def first_match(directory: Path, suffix: str, root: Path) -> str:
701
+ for path in sorted(directory.glob(f"*{suffix}")):
702
+ return relative_locator(path, root)
703
+ return ""
704
+
705
+
706
+ def detect_carrier_summary(root: Path, *, repository_mode: str, planning_mode: bool) -> dict[str, dict[str, str]]:
707
+ item_dir = root / ".loom/work-items"
708
+ recovery_dir = root / ".loom/progress"
709
+ review_dir = root / ".loom/reviews"
710
+ status_path = root / ".loom/status/current.md"
711
+ spec_path = root / ".loom/specs/INIT-0001/spec.md"
712
+ plan_path = root / ".loom/specs/INIT-0001/plan.md"
713
+
714
+ present_locators = {
715
+ "work_item": first_match(item_dir, ".md", root) if item_dir.exists() else "",
716
+ "recovery": first_match(recovery_dir, ".md", root) if recovery_dir.exists() else "",
717
+ "review": first_match(review_dir, ".json", root) if review_dir.exists() else "",
718
+ "status_surface": relative_locator(status_path, root) if status_path.exists() else "",
719
+ "spec_path": relative_locator(spec_path, root) if spec_path.exists() else "",
720
+ "plan_path": relative_locator(plan_path, root) if plan_path.exists() else "",
721
+ }
722
+
723
+ summary: dict[str, dict[str, str]] = {}
724
+ for key in CARRIER_KEYS:
725
+ locator = present_locators[key]
726
+ if locator:
727
+ summary[key] = carrier_entry("present", locator, "repository scan")
728
+ elif planning_mode and repository_mode == "new":
729
+ summary[key] = carrier_entry("planned", PLANNED_LOCATORS[key], "bootstrap plan")
730
+ else:
731
+ summary[key] = carrier_entry("missing", "unknown", "repository scan")
732
+ return summary
733
+
734
+
735
+ def detect_execution_entry(root: Path, loom_state: str, *, bootstrap_mode: bool) -> str:
736
+ if bootstrap_mode:
737
+ return "python3 .loom/bin/loom_flow.py flow resume --target . --item INIT-0001"
738
+ if loom_state == "active":
739
+ return f"{command_prefix(root, 'loom_flow.py')} flow resume --target . --item INIT-0001"
740
+ if loom_state == "partial":
741
+ return f"{command_prefix(root, 'loom_init.py')} route --target <repo> --task \"请接手当前事项并恢复上下文后继续推进\""
742
+ return "unknown"
743
+
744
+
745
+ def detect_validation_entry(loom_state: str, *, bootstrap_mode: bool) -> str:
746
+ if bootstrap_mode:
747
+ return "python3 .loom/bin/loom_init.py verify --target ."
748
+ if loom_state == "active":
749
+ return "python3 .loom/bin/loom_init.py verify --target ."
750
+ if loom_state == "partial":
751
+ script = installed_skill_script_or_unknown('loom-init')
752
+ return f"python3 {script} verify --target <repo>" if script is not None else "unknown"
753
+ return "unknown"
754
+
755
+
756
+ def detect_review_merge_surface(root: Path, loom_state: str, *, bootstrap_mode: bool) -> dict[str, str]:
757
+ pr_template = ".github/PULL_REQUEST_TEMPLATE.md" if file_exists(root, ".github/PULL_REQUEST_TEMPLATE.md") else "unknown"
758
+ validation_surface = ".loom/status/current.md" if file_exists(root, ".loom/status/current.md") else "unknown"
759
+ if bootstrap_mode and validation_surface == "unknown":
760
+ validation_surface = ".loom/status/current.md"
761
+
762
+ if bootstrap_mode:
763
+ merge_surface = "python3 .loom/bin/loom_flow.py checkpoint merge --target . --item INIT-0001"
764
+ elif loom_state == "active":
765
+ merge_surface = f"{command_prefix(root, 'loom_flow.py')} checkpoint merge --target . [--item <id>]"
766
+ else:
767
+ merge_surface = "unknown"
768
+ return {
769
+ "pr_template": pr_template,
770
+ "validation_surface": validation_surface,
771
+ "merge_surface": merge_surface,
772
+ }
773
+
774
+
775
+ def detect_github_control_plane(root: Path) -> tuple[dict[str, Any], list[str]]:
776
+ owner, repo = detect_github_repo(root)
777
+ surface: dict[str, Any] = {
778
+ "repository": f"{owner}/{repo}" if owner and repo else "unknown",
779
+ "default_branch": "unknown",
780
+ "branch_protection": "unknown",
781
+ "required_checks": "unknown",
782
+ "pr_reviews": "unknown",
783
+ }
784
+ missing_inputs: list[str] = []
785
+
786
+ if not owner or not repo:
787
+ missing_inputs.append("cannot resolve GitHub repository from git origin")
788
+ return surface, missing_inputs
789
+
790
+ repo_payload, repo_errors = gh_json(root, ["repo", "view", f"{owner}/{repo}", "--json", "nameWithOwner,defaultBranchRef"])
791
+ if repo_errors or repo_payload is None:
792
+ missing_inputs.extend(f"github control plane: {message}" for message in repo_errors)
793
+ return surface, missing_inputs
794
+
795
+ branch_ref = repo_payload.get("defaultBranchRef")
796
+ if isinstance(branch_ref, dict):
797
+ branch_name = branch_ref.get("name")
798
+ if isinstance(branch_name, str) and branch_name:
799
+ surface["default_branch"] = branch_name
800
+ if surface["default_branch"] == "unknown":
801
+ missing_inputs.append("github control plane: default branch is unavailable")
802
+ return surface, missing_inputs
803
+
804
+ branch_payload, branch_errors = gh_json(root, ["api", f"repos/{owner}/{repo}/branches/{surface['default_branch']}"])
805
+ if branch_errors or branch_payload is None:
806
+ missing_inputs.extend(f"github control plane: {message}" for message in branch_errors)
807
+ return surface, missing_inputs
808
+
809
+ protected = branch_payload.get("protected")
810
+ if isinstance(protected, bool):
811
+ surface["branch_protection"] = "enabled" if protected else "disabled"
812
+ protection = branch_payload.get("protection")
813
+ if isinstance(protection, dict):
814
+ required_status = protection.get("required_status_checks")
815
+ if isinstance(required_status, dict):
816
+ contexts = required_status.get("contexts")
817
+ if isinstance(contexts, list) and all(isinstance(item, str) for item in contexts):
818
+ surface["required_checks"] = contexts
819
+ else:
820
+ surface["required_checks"] = []
821
+ pull_request_reviews = protection.get("required_pull_request_reviews")
822
+ if isinstance(pull_request_reviews, dict):
823
+ surface["pr_reviews"] = "required"
824
+ elif surface["branch_protection"] == "enabled":
825
+ surface["pr_reviews"] = "not_required"
826
+ return surface, missing_inputs
827
+
828
+
829
+ def build_governance_surface(
830
+ root: Path,
831
+ *,
832
+ bootstrap_mode: bool = False,
833
+ scenario_override: str | None = None,
834
+ ) -> dict[str, Any]:
835
+ loom_state = detect_loom_state(root)
836
+ repository_mode = detect_repository_mode(root, loom_state, scenario_override=scenario_override)
837
+ planning_mode = bootstrap_mode and repository_mode == "new" and loom_state != "active"
838
+ carrier_summary = detect_carrier_summary(root, repository_mode=repository_mode, planning_mode=planning_mode)
839
+ github_control_plane, github_missing = detect_github_control_plane(root)
840
+ execution_entry = detect_execution_entry(root, loom_state, bootstrap_mode=bootstrap_mode)
841
+ validation_entry = detect_validation_entry(loom_state, bootstrap_mode=bootstrap_mode)
842
+ review_merge_surface = detect_review_merge_surface(root, loom_state, bootstrap_mode=bootstrap_mode)
843
+ repo_interface, repo_interface_missing = detect_repo_interface(root)
844
+ repo_interop, repo_interop_missing = detect_repo_interop(root)
845
+
846
+ missing_inputs: list[str] = []
847
+ if bootstrap_mode and repository_mode == "new":
848
+ missing_inputs.extend(github_missing)
849
+ summary = "repository is treated as new; Loom can plan the first governance carriers and bootstrap entrypoints without adding a second truth source."
850
+ else:
851
+ present_carriers = [key for key, value in carrier_summary.items() if value["status"] == "present"]
852
+ if not present_carriers:
853
+ missing_inputs.append("no stable Loom carriers are readable yet")
854
+ missing_inputs.extend(github_missing)
855
+ if repo_interface["availability"] == "incomplete":
856
+ missing_inputs.extend(repo_interface_missing)
857
+ if repo_interop["availability"] == "incomplete":
858
+ missing_inputs.extend(repo_interop_missing)
859
+ control_plane_ready = github_control_plane["default_branch"] != "unknown"
860
+ carrier_ready = bool(present_carriers)
861
+ summary = (
862
+ "resume chain is readable and the current governance carriers can support continued execution."
863
+ if carrier_ready and control_plane_ready
864
+ else "resume chain is only partially supported because governance carriers or GitHub control-plane signals are incomplete."
865
+ )
866
+
867
+ return {
868
+ "repository_mode": repository_mode,
869
+ "loom_state": loom_state,
870
+ "carrier_summary": carrier_summary,
871
+ "execution_entry": execution_entry,
872
+ "validation_entry": validation_entry,
873
+ "review_merge_surface": review_merge_surface,
874
+ "github_control_plane": github_control_plane,
875
+ "repo_interface": repo_interface,
876
+ "repo_interop": repo_interop,
877
+ "summary": summary,
878
+ "missing_inputs": list(dict.fromkeys(missing_inputs)),
879
+ }