@1aboveio/skills 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/LICENSE +3 -0
  2. package/README.md +90 -0
  3. package/bin/1aboveio-skills.mjs +18 -0
  4. package/package.json +28 -0
  5. package/runtime/skills/distribution/generated/recipes.json +1189 -0
  6. package/runtime/skills/distribution/scripts/bundles.mjs +280 -0
  7. package/runtime/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  8. package/skills/backend/airflow-dag-develop/LICENSE +3 -0
  9. package/skills/backend/airflow-dag-develop/SKILL.md +111 -0
  10. package/skills/backend/app-debug/LICENSE +3 -0
  11. package/skills/backend/app-debug/SKILL.md +109 -0
  12. package/skills/backend/app-debug/references/common-errors.md +128 -0
  13. package/skills/backend/python-backend/LICENSE +3 -0
  14. package/skills/backend/python-backend/SKILL.md +326 -0
  15. package/skills/cicd-pipeline/cloud-build/LICENSE +3 -0
  16. package/skills/cicd-pipeline/cloud-build/SKILL.md +707 -0
  17. package/skills/cicd-pipeline/cloud-debug/LICENSE +3 -0
  18. package/skills/cicd-pipeline/cloud-debug/SKILL.md +316 -0
  19. package/skills/cicd-pipeline/cloud-debug/references/build-failures.md +238 -0
  20. package/skills/cicd-pipeline/cloud-debug/references/deploy-failures.md +376 -0
  21. package/skills/cicd-pipeline/cloud-debug/references/pipeline-failures.md +378 -0
  22. package/skills/cicd-pipeline/cloud-deploy/LICENSE +3 -0
  23. package/skills/cicd-pipeline/cloud-deploy/SKILL.md +229 -0
  24. package/skills/cicd-pipeline/cloud-deploy/references/config-templates.md +257 -0
  25. package/skills/cicd-pipeline/docker/LICENSE +3 -0
  26. package/skills/cicd-pipeline/docker/SKILL.md +126 -0
  27. package/skills/cicd-pipeline/google-cloud/LICENSE +3 -0
  28. package/skills/cicd-pipeline/google-cloud/SKILL.md +118 -0
  29. package/skills/cicd-pipeline/google-cloud/references/gcs.md +469 -0
  30. package/skills/cicd-pipeline/google-cloud/references/iam.md +451 -0
  31. package/skills/cicd-pipeline/google-cloud/references/project.md +349 -0
  32. package/skills/cicd-pipeline/google-cloud/references/secrets.md +336 -0
  33. package/skills/cicd-pipeline/google-cloud/references/vpc.md +312 -0
  34. package/skills/cicd-pipeline/google-cloud/scripts/create-sa.sh +36 -0
  35. package/skills/cicd-pipeline/google-cloud/scripts/gcp-config.sh +31 -0
  36. package/skills/cicd-pipeline/google-cloud/scripts/grant-iap.sh +41 -0
  37. package/skills/cicd-pipeline/google-cloud/scripts/setup-secrets.sh +48 -0
  38. package/skills/cicd-pipeline/mergify/LICENSE +3 -0
  39. package/skills/cicd-pipeline/mergify/SKILL.md +138 -0
  40. package/skills/cicd-pipeline/mergify/assets/templates/mergify.yml +237 -0
  41. package/skills/cicd-pipeline/mergify/assets/templates/ruleset.json +46 -0
  42. package/skills/cicd-pipeline/mergify/references/branch-protection.md +277 -0
  43. package/skills/cicd-pipeline/mergify/references/configuration.md +183 -0
  44. package/skills/cicd-pipeline/mergify/references/diagnosis.md +73 -0
  45. package/skills/cicd-pipeline/mergify/references/traps.md +78 -0
  46. package/skills/cicd-pipeline/mergify/references/watch-contract.md +218 -0
  47. package/skills/cicd-pipeline/mergify/scripts/audit-core.mjs +131 -0
  48. package/skills/cicd-pipeline/mergify/scripts/audit.mjs +4 -0
  49. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +663 -0
  50. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs +4 -0
  51. package/skills/cicd-pipeline/podman/LICENSE +3 -0
  52. package/skills/cicd-pipeline/podman/SKILL.md +70 -0
  53. package/skills/cicd-pipeline/podman/agents/openai.yaml +4 -0
  54. package/skills/cicd-pipeline/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
  55. package/skills/cicd-pipeline/podman/assets/templates/podman-service-override.conf +3 -0
  56. package/skills/cicd-pipeline/podman/references/compose-compatibility.md +70 -0
  57. package/skills/cicd-pipeline/podman/references/networking-and-ports.md +74 -0
  58. package/skills/cicd-pipeline/podman/references/rootless-services-and-sockets.md +156 -0
  59. package/skills/cicd-pipeline/podman/references/troubleshooting.md +98 -0
  60. package/skills/engineering/e2e-test/LICENSE +3 -0
  61. package/skills/engineering/e2e-test/SKILL.md +156 -0
  62. package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +272 -0
  63. package/skills/engineering/e2e-test/assets/ci-gates.github.yml +451 -0
  64. package/skills/engineering/e2e-test/assets/e2e-workflow.yml +282 -0
  65. package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
  66. package/skills/engineering/e2e-test/references/authoring/playwright-config.md +71 -0
  67. package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +219 -0
  68. package/skills/engineering/e2e-test/references/authoring/test-skipping.md +44 -0
  69. package/skills/engineering/e2e-test/references/ci-integration.md +121 -0
  70. package/skills/engineering/e2e-test/references/ci-playwright-container.md +280 -0
  71. package/skills/engineering/e2e-test/references/debugging.md +36 -0
  72. package/skills/engineering/e2e-test/references/presentation-sweep.md +131 -0
  73. package/skills/engineering/e2e-test/references/reviewing.md +39 -0
  74. package/skills/engineering/e2e-test/references/route-discovery.md +50 -0
  75. package/skills/engineering/e2e-test/references/route-manifest.md +44 -0
  76. package/skills/engineering/e2e-test/scripts/detect-routes-fastapi.py +290 -0
  77. package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
  78. package/skills/engineering/e2e-test/scripts/post-visual-evidence.mjs +158 -0
  79. package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
  80. package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
  81. package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
  82. package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
  83. package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +148 -0
  84. package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
  85. package/skills/engineering/e2e-test/scripts/presentation-visual.mjs +84 -0
  86. package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +75 -0
  87. package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
  88. package/skills/engineering/engineering-runtime/LICENSE +3 -0
  89. package/skills/engineering/engineering-runtime/SKILL.md +10 -0
  90. package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
  91. package/skills/engineering/engineering-runtime/coherence/workflow.json +553 -0
  92. package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
  93. package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
  94. package/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  95. package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
  96. package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
  97. package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
  98. package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
  99. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +576 -0
  100. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +166 -0
  101. package/skills/engineering/ensure-coverage/LICENSE +3 -0
  102. package/skills/engineering/ensure-coverage/SKILL.md +136 -0
  103. package/skills/engineering/ensure-coverage/evals/evals.json +125 -0
  104. package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +91 -0
  105. package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +83 -0
  106. package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
  107. package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
  108. package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
  109. package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +25 -0
  110. package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
  111. package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +87 -0
  112. package/skills/engineering/ensure-coverage/references/depth/test-smells.md +23 -0
  113. package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +164 -0
  114. package/skills/engineering/ensure-coverage/references/enforcement/hooks.md +85 -0
  115. package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +109 -0
  116. package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +33 -0
  117. package/skills/engineering/ensure-coverage/references/presentation/axis.md +78 -0
  118. package/skills/engineering/ensure-coverage/references/presentation/runner-contract.md +74 -0
  119. package/skills/engineering/ensure-coverage/references/process/audit-mode.md +33 -0
  120. package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
  121. package/skills/engineering/ensure-coverage/references/process/review-contract-template.md +119 -0
  122. package/skills/engineering/ensure-coverage/references/process/scope-class.md +178 -0
  123. package/skills/engineering/ensure-coverage/references/process/test-strategy.md +55 -0
  124. package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +45 -0
  125. package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +93 -0
  126. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +178 -0
  127. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +101 -0
  128. package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +358 -0
  129. package/skills/engineering/ensure-coverage/scripts/coverage-checklist.mjs +494 -0
  130. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +663 -0
  131. package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
  132. package/skills/engineering/ensure-coverage/scripts/evidence-block.mjs +367 -0
  133. package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +269 -0
  134. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
  135. package/skills/engineering/ensure-coverage/scripts/package-lock.json +76 -0
  136. package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
  137. package/skills/engineering/ensure-coverage/scripts/scope-class.mjs +554 -0
  138. package/skills/engineering/harness-runtime/LICENSE +3 -0
  139. package/skills/engineering/harness-runtime/SKILL.md +18 -0
  140. package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
  141. package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
  142. package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
  143. package/skills/engineering/harness-runtime/contracts.md +15 -0
  144. package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
  145. package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
  146. package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
  147. package/skills/engineering/harness-runtime/index.mjs +767 -0
  148. package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
  149. package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
  150. package/skills/engineering/harness-runtime/references/model-catalog-seed.json +159 -0
  151. package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
  152. package/skills/engineering/implement-and-pr/LICENSE +3 -0
  153. package/skills/engineering/implement-and-pr/SKILL.md +176 -0
  154. package/skills/engineering/implement-and-pr/references/ci-iteration.md +10 -0
  155. package/skills/engineering/implement-and-pr/references/closeout.md +27 -0
  156. package/skills/engineering/implement-and-pr/references/contract-complete-fix-rounds.md +34 -0
  157. package/skills/engineering/implement-and-pr/references/evidence-rules.md +39 -0
  158. package/skills/engineering/implement-and-pr/references/incremental-plan.md +16 -0
  159. package/skills/engineering/implement-and-pr/references/self-review.md +23 -0
  160. package/skills/engineering/implement-and-pr/references/tdd-mode.md +18 -0
  161. package/skills/engineering/resolve-issues/LICENSE +3 -0
  162. package/skills/engineering/resolve-issues/SKILL.md +167 -0
  163. package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +448 -0
  164. package/skills/engineering/resolve-issues/references/breaker.md +82 -0
  165. package/skills/engineering/resolve-issues/references/deliverables.md +27 -0
  166. package/skills/engineering/resolve-issues/references/delivery.md +108 -0
  167. package/skills/engineering/resolve-issues/references/evidence-lane.md +21 -0
  168. package/skills/engineering/resolve-issues/references/exact-head-ci.md +287 -0
  169. package/skills/engineering/resolve-issues/references/fan-out.md +33 -0
  170. package/skills/engineering/resolve-issues/references/finalization.md +68 -0
  171. package/skills/engineering/resolve-issues/references/guarantees.md +10 -0
  172. package/skills/engineering/resolve-issues/references/high-risk.md +29 -0
  173. package/skills/engineering/resolve-issues/references/incidents/848/README.md +156 -0
  174. package/skills/engineering/resolve-issues/references/intake.md +86 -0
  175. package/skills/engineering/resolve-issues/references/integration-gate.md +53 -0
  176. package/skills/engineering/resolve-issues/references/interference.md +87 -0
  177. package/skills/engineering/resolve-issues/references/loop.md +134 -0
  178. package/skills/engineering/resolve-issues/references/model-catalog.md +9 -0
  179. package/skills/engineering/resolve-issues/references/postmortem.md +27 -0
  180. package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +41 -0
  181. package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +48 -0
  182. package/skills/engineering/resolve-issues/references/pre-flight.md +41 -0
  183. package/skills/engineering/resolve-issues/references/regression-checklist.md +26 -0
  184. package/skills/engineering/resolve-issues/references/run-state.md +288 -0
  185. package/skills/engineering/resolve-issues/references/sandboxed-testing.md +48 -0
  186. package/skills/engineering/resolve-issues/references/spawn-contract.md +96 -0
  187. package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +40 -0
  188. package/skills/engineering/resolve-issues/references/why.md +653 -0
  189. package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +49 -0
  190. package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +721 -0
  191. package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +962 -0
  192. package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +220 -0
  193. package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +420 -0
  194. package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +256 -0
  195. package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +168 -0
  196. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
  197. package/skills/engineering/resolve-issues/scripts/doctrine.mjs +62 -0
  198. package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +191 -0
  199. package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +413 -0
  200. package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +332 -0
  201. package/skills/engineering/resolve-issues/scripts/finalize.mjs +488 -0
  202. package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +3307 -0
  203. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +16 -0
  204. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +51 -0
  205. package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +17 -0
  206. package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +166 -0
  207. package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +92 -0
  208. package/skills/engineering/resolve-issues/scripts/guide-index.mjs +73 -0
  209. package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +159 -0
  210. package/skills/engineering/resolve-issues/scripts/interference.mjs +427 -0
  211. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
  212. package/skills/engineering/resolve-issues/scripts/next-operations.mjs +419 -0
  213. package/skills/engineering/resolve-issues/scripts/postmortem.mjs +909 -0
  214. package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +322 -0
  215. package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +415 -0
  216. package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +697 -0
  217. package/skills/engineering/resolve-issues/scripts/report.mjs +494 -0
  218. package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +172 -0
  219. package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +79 -0
  220. package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +334 -0
  221. package/skills/engineering/resolve-issues/scripts/run-state.mjs +4784 -0
  222. package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +395 -0
  223. package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +290 -0
  224. package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +170 -0
  225. package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +293 -0
  226. package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +197 -0
  227. package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +127 -0
  228. package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +893 -0
  229. package/skills/engineering/resolve-issues/scripts/workspaces.mjs +829 -0
  230. package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +290 -0
  231. package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +80 -0
  232. package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +102 -0
  233. package/skills/engineering/resolve-release/LICENSE +3 -0
  234. package/skills/engineering/resolve-release/SKILL.md +112 -0
  235. package/skills/engineering/resolve-release/references/assembly.md +137 -0
  236. package/skills/engineering/resolve-release/references/auto-when-green.md +56 -0
  237. package/skills/engineering/resolve-release/references/candidate.md +167 -0
  238. package/skills/engineering/resolve-release/references/exposure.md +178 -0
  239. package/skills/engineering/resolve-release/references/handoff.md +24 -0
  240. package/skills/engineering/resolve-release/references/postmortem.md +230 -0
  241. package/skills/engineering/resolve-release/references/preflight.md +207 -0
  242. package/skills/engineering/resolve-release/references/principles.md +94 -0
  243. package/skills/engineering/resolve-release/references/regression-checklist.md +36 -0
  244. package/skills/engineering/resolve-release/references/related-skills.md +12 -0
  245. package/skills/engineering/resolve-release/references/routing.md +149 -0
  246. package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +285 -0
  247. package/skills/engineering/resolve-release/references/versioning.md +202 -0
  248. package/skills/engineering/resolve-release/references/why.md +53 -0
  249. package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +389 -0
  250. package/skills/engineering/resolve-release/scripts/build-changes.mjs +209 -0
  251. package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +407 -0
  252. package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +904 -0
  253. package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +81 -0
  254. package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +612 -0
  255. package/skills/engineering/resolve-release/scripts/close-attempt.mjs +135 -0
  256. package/skills/engineering/resolve-release/scripts/closeout-release.mjs +161 -0
  257. package/skills/engineering/resolve-release/scripts/doctrine.mjs +106 -0
  258. package/skills/engineering/resolve-release/scripts/durable-processing.mjs +522 -0
  259. package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +659 -0
  260. package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +1014 -0
  261. package/skills/engineering/resolve-release/scripts/finalize-release.mjs +526 -0
  262. package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +169 -0
  263. package/skills/engineering/resolve-release/scripts/green-gate.mjs +599 -0
  264. package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +752 -0
  265. package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +56 -0
  266. package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +1538 -0
  267. package/skills/engineering/resolve-release/scripts/postmortem.mjs +381 -0
  268. package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +498 -0
  269. package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +326 -0
  270. package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +272 -0
  271. package/skills/engineering/resolve-release/scripts/report.mjs +417 -0
  272. package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +114 -0
  273. package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +238 -0
  274. package/skills/engineering/resolve-release/scripts/review-packet.mjs +503 -0
  275. package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +263 -0
  276. package/skills/engineering/resolve-release/scripts/version-assert.mjs +339 -0
  277. package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +485 -0
  278. package/skills/engineering/resolve-release/scripts/version.mjs +1199 -0
  279. package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +449 -0
  280. package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +21 -0
  281. package/skills/engineering/resolve-release/vendor/README.md +60 -0
  282. package/skills/engineering/resolve-release/vendor/acorn.mjs +6233 -0
  283. package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +21 -0
  284. package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +341 -0
  285. package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +70 -0
  286. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +2 -0
  287. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +1 -0
  288. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +7 -0
  289. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +1 -0
  290. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +2033 -0
  291. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +2033 -0
  292. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +7 -0
  293. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +1 -0
  294. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +2 -0
  295. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +1 -0
  296. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +2 -0
  297. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +1 -0
  298. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +2 -0
  299. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +1 -0
  300. package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +49 -0
  301. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +21 -0
  302. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +5 -0
  303. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +549 -0
  304. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +549 -0
  305. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +2 -0
  306. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +1 -0
  307. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +2 -0
  308. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +1 -0
  309. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +36 -0
  310. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +47 -0
  311. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +82 -0
  312. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +11 -0
  313. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +22 -0
  314. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +21 -0
  315. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +21 -0
  316. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +11 -0
  317. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +11 -0
  318. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +25 -0
  319. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
  320. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +85 -0
  321. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +85 -0
  322. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +2 -0
  323. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +1 -0
  324. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +2 -0
  325. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +1 -0
  326. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +20 -0
  327. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +20 -0
  328. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +2 -0
  329. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +1 -0
  330. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +2 -0
  331. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +1 -0
  332. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +61 -0
  333. package/skills/engineering/review-pr/LICENSE +3 -0
  334. package/skills/engineering/review-pr/SKILL.md +123 -0
  335. package/skills/engineering/review-pr/references/adversarial-reviewer-prompt.md +42 -0
  336. package/skills/engineering/review-pr/references/code-correctness.md +5 -0
  337. package/skills/engineering/review-pr/references/contract-freshness.md +9 -0
  338. package/skills/engineering/review-pr/references/coordination.md +18 -0
  339. package/skills/engineering/review-pr/references/domain-hazards.md +123 -0
  340. package/skills/engineering/review-pr/references/finding-themes.md +7 -0
  341. package/skills/engineering/review-pr/references/github-posting.md +98 -0
  342. package/skills/engineering/review-pr/references/golden-path-smoke.md +5 -0
  343. package/skills/engineering/review-pr/references/incremental-output.md +16 -0
  344. package/skills/engineering/review-pr/references/inputs-and-discovery.md +31 -0
  345. package/skills/engineering/review-pr/references/output-format.md +99 -0
  346. package/skills/engineering/review-pr/references/over-mock-screen.md +7 -0
  347. package/skills/engineering/review-pr/references/promotion-prs.md +16 -0
  348. package/skills/engineering/review-pr/references/re-review.md +18 -0
  349. package/skills/engineering/review-pr/references/review-method.md +199 -0
  350. package/skills/engineering/review-pr/references/review-mode.md +30 -0
  351. package/skills/engineering/review-pr/references/review-posture.md +53 -0
  352. package/skills/engineering/review-pr/references/round1-depth.md +62 -0
  353. package/skills/engineering/review-pr/references/scripts.md +17 -0
  354. package/skills/engineering/review-pr/references/workflow.md +16 -0
  355. package/skills/engineering/review-pr/schemas/findings.schema.json +282 -0
  356. package/skills/engineering/review-pr/scripts/finding-contract.mjs +285 -0
  357. package/skills/engineering/review-pr/scripts/post-review.mjs +405 -0
  358. package/skills/engineering/review-pr/scripts/pr-context.mjs +207 -0
  359. package/skills/engineering/review-pr/scripts/scan-diff.mjs +365 -0
  360. package/skills/engineering/review-pr/scripts/theme-contract.mjs +57 -0
  361. package/skills/engineering/smoke/LICENSE +3 -0
  362. package/skills/engineering/smoke/SKILL.md +131 -0
  363. package/skills/engineering/smoke/assets/smoke.manifest.example.json +53 -0
  364. package/skills/engineering/smoke/references/manifest.md +192 -0
  365. package/skills/engineering/smoke/scripts/smoke.mjs +713 -0
  366. package/skills/fullstack/better-auth/LICENSE +3 -0
  367. package/skills/fullstack/better-auth/SKILL.md +601 -0
  368. package/skills/fullstack/better-auth/references/feishu-api.md +270 -0
  369. package/skills/fullstack/monorepo/LICENSE +3 -0
  370. package/skills/fullstack/monorepo/SKILL.md +465 -0
  371. package/skills/fullstack/nextjs-fullstack/LICENSE +3 -0
  372. package/skills/fullstack/nextjs-fullstack/SKILL.md +210 -0
  373. package/skills/fullstack/nextjs-fullstack/conventions.md +318 -0
  374. package/skills/fullstack/nextjs-fullstack/frontend-conventions.md +61 -0
  375. package/skills/fullstack/nextjs-fullstack/nextjs16.md +287 -0
  376. package/skills/fullstack/nextjs-fullstack/server-actions.md +409 -0
  377. package/skills/fullstack/prisma-setup/LICENSE +3 -0
  378. package/skills/fullstack/prisma-setup/SKILL.md +180 -0
  379. package/skills/fullstack/prisma-setup/nextjs.md +258 -0
  380. package/skills/fullstack/prisma-setup/turborepo.md +301 -0
  381. package/skills/fullstack/shadcn/LICENSE +3 -0
  382. package/skills/fullstack/shadcn/SKILL.md +119 -0
  383. package/skills/fullstack/shadcn/assets/shadcn-small.png +0 -0
  384. package/skills/fullstack/shadcn/assets/shadcn.png +0 -0
  385. package/skills/fullstack/shadcn/cli.md +411 -0
  386. package/skills/fullstack/shadcn/customization.md +224 -0
  387. package/skills/fullstack/shadcn/evals/evals.json +90 -0
  388. package/skills/fullstack/shadcn/mcp.md +101 -0
  389. package/skills/fullstack/shadcn/rules/base-vs-radix.md +323 -0
  390. package/skills/fullstack/shadcn/rules/component-selection.md +67 -0
  391. package/skills/fullstack/shadcn/rules/composition.md +195 -0
  392. package/skills/fullstack/shadcn/rules/data-table.md +201 -0
  393. package/skills/fullstack/shadcn/rules/forms.md +255 -0
  394. package/skills/fullstack/shadcn/rules/icons.md +103 -0
  395. package/skills/fullstack/shadcn/rules/styling.md +167 -0
  396. package/skills/fullstack/zod-v4/LICENSE +3 -0
  397. package/skills/fullstack/zod-v4/SKILL.md +287 -0
@@ -0,0 +1,427 @@
1
+ // interference — the scheduling primitive, and the two grades that do not have the same
2
+ // effect (ADR 0001 decisions 1, 2, 6).
3
+ //
4
+ // One relation underlies both boundaries this run cares about. Two units INTERFERE when
5
+ // one's correctness depends on the other's tree. The grades:
6
+ //
7
+ // BLOCKING the dependent cannot be CORRECTLY BUILT until the other unit is in the
8
+ // tree. Two sources, both blocking equally:
9
+ // symbol edge the diff references symbols the other unit creates, so the
10
+ // base branch does not exist yet. Fails loudly; derivable.
11
+ // premise edge correctness rests on an invariant the other establishes.
12
+ // Builds and passes in isolation while encoding a false
13
+ // premise, so it fails SILENTLY; declarable only.
14
+ // ASSEMBLY a shared surface. Each unit is green alone, the pair is red together. It
15
+ // prevents independent VALIDATION, not building.
16
+ //
17
+ // Only the blocking grade constrains scheduling. The scheduling view is a strict subset of
18
+ // the delivery view, and `component` is the delivery view — a consequence of interference,
19
+ // not a thing units are assigned to.
20
+ //
21
+ // The two sources part company at DELIVERY, which is the distinction this module exists to
22
+ // keep. Co-delivery is owed when a unit's diff cannot stand alone in the target: either it
23
+ // references symbols that are not there (symbol edge) or its surface is only valid in
24
+ // combination (assembly). A premise edge leaves both intact — the diff compiles, the
25
+ // surface is its own — and what it needs is ORDER. So a premise edge produces two
26
+ // components with an ordering between them, not one component. The pair that forced this:
27
+ // #553 (per-unit workspaces + the scheduler) depends on #579 (orchestrator-only manifest
28
+ // writes) by premise, and bundling them would have co-delivered two units that share no
29
+ // symbol and no surface.
30
+ //
31
+ // Vocabulary: CONTEXT.md § Interference / Scheduling. There is deliberately no term here
32
+ // for a group of units advancing together — no wave, batch or epoch — because a run
33
+ // refills continuously rather than at a barrier.
34
+
35
+ import { terminalDisposition } from './terminal-dispositions.mjs'
36
+ import { completionBlockers, effectiveUnitKind, unitKindComplete } from './unit-lifecycle.mjs'
37
+
38
+ export const BLOCKING_SOURCES = ['symbol', 'premise']
39
+ export { unitKindComplete }
40
+
41
+ // The sources that force CO-DELIVERY. Kept as its own list rather than "everything except
42
+ // premise": the point of the amendment is that the two grades are named by effect, and a
43
+ // negated list would re-encode the mechanism-shaped definition that broke.
44
+ const CO_DELIVERING_SOURCES = ['symbol']
45
+
46
+ // The sources that block SCHEDULING — narrower than the ones that block delivery, and that
47
+ // gap is the whole point (2026-08-04).
48
+ //
49
+ // A symbol edge blocks physically: the dependent's diff references identifiers the upstream
50
+ // creates, so until that lands there is no tree to build against. Nothing declarative can
51
+ // relax it.
52
+ //
53
+ // A premise edge does not. Its dependent compiles, its surface is its own, and what it
54
+ // needs is ORDER — which the delivery view already enforces without any help from here:
55
+ // `componentDependencies` below lifts EVERY cross-component edge whatever its source, and
56
+ // `combine-and-verify.mjs mergeable` refuses "a component whose dependencies are not yet in
57
+ // the target". So blocking the schedule too was a third enforcement of an ordering already
58
+ // held twice, and it was the expensive one.
59
+ //
60
+ // What it cost, measured over 63 run manifests: runs split into two shapes with almost
61
+ // nothing between them — declare no edges (depth 1, 10-33x parallelism) or declare a chain
62
+ // (depth 5-19, 1.2-2.4x). `epic-25-proposal-generator` ran 12 units at 1.7x behind 18
63
+ // premise edges while `sharedSurfaces` was 0 or 1 on every one of them; its head unit spent
64
+ // 9 rounds and 167 minutes with eleven units queued behind an ordering assumption. Against
65
+ // an `inFlightCap` of 4-5 a depth-7 graph can never use the slots: the floor is depth ×
66
+ // per-unit time regardless of the cap.
67
+ //
68
+ // The hazard the old reading defended against — the dependent "silently encodes a false
69
+ // premise" — survives, but silence is what makes it a hazard, and the cure for silence is
70
+ // declaration, not serialization. Ordering the dependent LAST does not remove the premise
71
+ // from its code; it only makes the premise true at that moment. So the edge's `invariant`
72
+ // travels into the dependent's producer and reviewer spawns (`runnableState` returns it on
73
+ // each `orderedAfter` entry), and the unit is built against a named assumption rather than
74
+ // an unexamined one. The motivating incident (#553/#579, why.md § "Why the two blocking
75
+ // sources are named by effect") was a SHIP-order failure — "parallelism on top of a live
76
+ // lost-update race" — and nothing in it required build serialization.
77
+ //
78
+ // This applies the skill's own asymmetry doctrine to the grade that was exempt from it:
79
+ // interference.md already says "an edge you are not sure about costs a serialization".
80
+ const SCHEDULING_BLOCKING_SOURCES = ['symbol']
81
+
82
+ // The in-flight cap's default. See references/why.md § the in-flight cap for the reasoning
83
+ // and the measurement; the short version is that this bounds disk and dependency-install
84
+ // cost, not correctness. Raised 2 → 4 (2026-07-29) on an explicit call that throughput is
85
+ // worth more than the conservative worst case: at 4 a run with an independent roster keeps
86
+ // four units moving instead of two, and the repo where that is a net loss pays three extra
87
+ // installs rather than one. `inFlightCap: 1` remains the serial escape hatch.
88
+ export const DEFAULT_IN_FLIGHT_CAP = 4
89
+
90
+ const isObject = (v) => v != null && typeof v === 'object' && !Array.isArray(v)
91
+ const nonEmpty = (v) => typeof v === 'string' && v.trim().length > 0
92
+ const arr = (v) => (Array.isArray(v) ? v : [])
93
+
94
+ // `dependsOn` entries are either a bare unit id (every manifest written before this
95
+ // module) or `{ unit, source }`. A bare entry reads as a SYMBOL edge, which is the safe
96
+ // interpretation in the only direction that matters: symbol co-delivers, so a legacy
97
+ // roster keeps exactly the component shape it has today. Reading a legacy edge as a
98
+ // premise would SPLIT a component that must merge together and ship a diff referencing
99
+ // symbols the target does not have — a corruption, where the other error is only a cost.
100
+ //
101
+ // An unrecognized source takes the same fallback rather than being dropped, for the same
102
+ // asymmetry: dropping an edge silently unblocks a unit.
103
+ export function normalizeDependsOn(dependsOn) {
104
+ const out = []
105
+ for (const raw of arr(dependsOn)) {
106
+ if (nonEmpty(raw)) {
107
+ out.push({ unit: raw.trim(), source: 'symbol' })
108
+ continue
109
+ }
110
+ if (!isObject(raw) || !nonEmpty(raw.unit)) continue
111
+ const edge = { unit: raw.unit.trim(), source: BLOCKING_SOURCES.includes(raw.source) ? raw.source : 'symbol' }
112
+ // The invariant a premise edge rests on, carried through so the scheduler can hand it
113
+ // to the dependent's spawns. Optional and free-text: it is read by humans and by the
114
+ // producer contract, never branched on, so an absent one costs a less specific spawn
115
+ // rather than a wrong decision. Kept on symbol edges too when supplied — a symbol
116
+ // dependent can also rest on an invariant, it just additionally cannot compile.
117
+ if (nonEmpty(raw.invariant)) edge.invariant = raw.invariant.trim()
118
+ out.push(edge)
119
+ }
120
+ return out
121
+ }
122
+
123
+ // Every unit this one blocking-interferes with. Both sources; the grade is named by its
124
+ // effect, so a premise edge is here exactly as a symbol edge is. This is the DELIVERY
125
+ // view — `componentDependencies` and the merge gate read it, and both grades order there.
126
+ export function blockingEdges(unit) {
127
+ return isObject(unit) ? normalizeDependsOn(unit.dependsOn) : []
128
+ }
129
+
130
+ // The subset that blocks SCHEDULING. Narrower than `blockingEdges` on purpose — see
131
+ // SCHEDULING_BLOCKING_SOURCES above for what that gap buys and what still holds the
132
+ // ordering it stops holding.
133
+ export function schedulingEdges(unit) {
134
+ return blockingEdges(unit).filter((e) => SCHEDULING_BLOCKING_SOURCES.includes(e.source))
135
+ }
136
+
137
+ // The subset that also forces co-delivery.
138
+ function coDeliveringEdges(unit) {
139
+ return blockingEdges(unit).filter((e) => CO_DELIVERING_SOURCES.includes(e.source))
140
+ }
141
+
142
+ // ---- the graph, and the one reading of "done" over it ----
143
+ //
144
+ // `dependencyOrder` and `isResolvedUnit` live here rather than in report.mjs because both
145
+ // are statements about the interference graph and its units, and both now have readers on
146
+ // either side of the reporting layer (the scheduler here; the plan/progress renders,
147
+ // `list`'s tally and `resume`'s next-action derivation there). report.mjs re-exports them,
148
+ // so every existing importer is unchanged — what must not happen is a second copy, because
149
+ // two definitions of "done" let the listing say `3/5 resolved` about a run whose own
150
+ // PROGRESS render says 2/5, and the listing is what a recovering session trusts first.
151
+
152
+ export const RESOLVED = new Set(['merge-ready', 'skipped-already-done'])
153
+
154
+ // Defensive about its argument on purpose: the reports that read it are the tool you reach
155
+ // for when a run has gone wrong, which is exactly when the manifest may be hand-edited.
156
+ //
157
+ // This answers the LIFECYCLE question — "has this unit finished producing?" — and including
158
+ // `merge-ready` is correct for it: `unitPushed` and `needsWorkspace` both want a yes there.
159
+ // It is NOT the answer to "is this unit done?", which `isDoneUnit` below owns. Keeping one
160
+ // function for both was the defect: see that comment.
161
+ export function isResolvedUnit(unit) {
162
+ if (!isObject(unit)) return false
163
+ if (effectiveUnitKind(unit) !== 'implementation') return unitKindComplete(unit)
164
+ const disposition = terminalDisposition(unit)
165
+ return (disposition !== null && disposition !== 'blocked') || RESOLVED.has(unit.status)
166
+ }
167
+
168
+ // A `merge-ready` unit that owes a terminal delivery outcome and has none.
169
+ //
170
+ // `merge-ready` means the loop finished its work; it says nothing about whether the PR ever
171
+ // reached `targetBranch`. SKILL.md is explicit that a unit with neither `merged` nor
172
+ // `handed-back` "is reported *undelivered*, never as done" — and `handed-back` counts as
173
+ // answered, not as a hole: it carries `blockedOn` naming the condition, so a human reading
174
+ // the report knows what happened. The hole is *silence*.
175
+ export function isUndeliveredUnit(unit) {
176
+ if (!isObject(unit)) return false
177
+ if (unit.status !== 'merge-ready') return false
178
+ if (terminalDisposition(unit) !== null) return false
179
+ return true
180
+ }
181
+
182
+ // The REPORTING reading of "done" — what a tally may count and a checkbox may tick.
183
+ //
184
+ // Why this is a second function rather than a tightening of `isResolvedUnit`: that predicate
185
+ // has two kinds of reader with genuinely different questions, and merging them made one of
186
+ // them wrong. The scheduler asks "is this past producing?" (merge-ready: yes). A human
187
+ // skimming PROGRESS asks "is this finished?" (merge-ready with nothing delivered: no).
188
+ //
189
+ // Reproduced against epic-986's own manifest — four units `merge-ready`, `lastVerdict: PASS`,
190
+ // PR refs recorded, `mergedSha: null` on every one — the render's headline read `4/4 units
191
+ // resolved` with every box ticked, while the same report flagged all four UNDELIVERED one
192
+ // line below. That incident is the reason delivery became a gated transition at all, and the
193
+ // most-skimmed line in the report was still calling it finished. An undelivered unit is
194
+ // *stopped*, exactly like a blocked one, and belongs beside the tally rather than inside it.
195
+ export function isDoneUnit(unit) {
196
+ if (effectiveUnitKind(unit) !== 'implementation') return unitKindComplete(unit)
197
+ const disposition = terminalDisposition(unit)
198
+ return ['delivered', 'handed-back', 'already-done'].includes(disposition) || (isResolvedUnit(unit) && !isUndeliveredUnit(unit) && disposition !== 'descoped')
199
+ }
200
+
201
+ // Kahn's algorithm over the blocking edges. Returns { order, cycles }: `order` is the
202
+ // dependency-sorted unit list SKILL.md's epic scheduling calls for, `cycles` names the
203
+ // units left unresolvable. A cycle is reported, never thrown — it is a real thing an
204
+ // intake can produce (two units each claiming the other as a prerequisite), and the plan
205
+ // is the right place for the human to see it rather than a crash mid-schedule.
206
+ //
207
+ // BOTH sources order. A premise edge does not co-deliver, but it absolutely sequences:
208
+ // the whole point of the grade is that the dependent silently encodes a false premise if
209
+ // it is built first.
210
+ export function dependencyOrder(rawUnits) {
211
+ const units = arr(rawUnits).filter(isObject)
212
+ const byId = new Map(units.map((u) => [u.id, u]))
213
+ const indegree = new Map(units.map((u) => [u.id, 0]))
214
+ const dependents = new Map(units.map((u) => [u.id, []]))
215
+ for (const u of units) {
216
+ for (const edge of blockingEdges(u)) {
217
+ if (!byId.has(edge.unit)) continue // dangling dep is surfaced by validation, not here
218
+ indegree.set(u.id, indegree.get(u.id) + 1)
219
+ dependents.get(edge.unit).push(u.id)
220
+ }
221
+ }
222
+ // Ties break on the manifest's own order so the plan is stable across renders — a
223
+ // roster that reshuffles between two reports is one nobody can diff.
224
+ const ready = units.filter((u) => indegree.get(u.id) === 0).map((u) => u.id)
225
+ const order = []
226
+ while (ready.length) {
227
+ const id = ready.shift()
228
+ order.push(byId.get(id))
229
+ for (const next of dependents.get(id)) {
230
+ indegree.set(next, indegree.get(next) - 1)
231
+ if (indegree.get(next) === 0) ready.push(next)
232
+ }
233
+ }
234
+ const cycles = units.filter((u) => !order.includes(u)).map((u) => u.id)
235
+ return { order, cycles }
236
+ }
237
+
238
+ // ---- runnable ----
239
+
240
+ // "Pushed", not "merged". This is the whole parallelism win: today a dependent waits for
241
+ // its dependency to be merge-ready, which serializes a chain; a dependent needs only the
242
+ // dependency's branch to exist on the remote, which happens rounds earlier.
243
+ //
244
+ // Three ways to know, in descending directness. `pushedSha` is what the orchestrator
245
+ // records when a producer pushes. A recorded PR implies a pushed branch — a PR cannot
246
+ // exist over an unpushed head. And a resolved unit is strictly past pushing.
247
+ export function unitPushed(unit) {
248
+ if (!isObject(unit)) return false
249
+ if (terminalDisposition(unit) === 'descoped') return false
250
+ if (nonEmpty(unit.pushedSha)) return true
251
+ if (nonEmpty(unit.pr)) return true
252
+ return isResolvedUnit(unit)
253
+ }
254
+
255
+ // A unit that is neither done nor parked is one the run still owes a workspace.
256
+ function needsWorkspace(unit) {
257
+ if (!isObject(unit)) return false
258
+ if (effectiveUnitKind(unit) !== 'implementation') return false
259
+ if (terminalDisposition(unit) !== null || isResolvedUnit(unit)) return false
260
+ return unit.status !== 'blocked' && unit.status !== 'skipped-already-done'
261
+ }
262
+
263
+ // Path reserved ≠ holding (epic-867 / #945). The in-flight cap bounds disk + one dependency
264
+ // install per unit that is actually using a tree. Pre-writing workspacePath at intake for
265
+ // every queued unit (epic-867: all four paths recorded before any producer) used to fill
266
+ // the cap and make admit empty even though only the foundation unit was runnable. Holding
267
+ // requires evidence that a producer/fix has claimed the path, not merely that a path string
268
+ // exists on a pure queued roster row.
269
+ function holdsWorkspace(unit) {
270
+ if (!needsWorkspace(unit) || !nonEmpty(unit.workspacePath)) return false
271
+ if (unit.status === 'in-progress' || unit.status === 'merge-ready') return true
272
+ if (Array.isArray(unit.rounds) && unit.rounds.length > 0) return true
273
+ if (Number.isInteger(unit.reviewRounds) && unit.reviewRounds > 0) return true
274
+ if (Array.isArray(unit.reviewHistory) && unit.reviewHistory.length > 0) return true
275
+ if (nonEmpty(unit.pr) || nonEmpty(unit.pushedSha)) return true
276
+ return false
277
+ }
278
+
279
+ function coerceCap(raw) {
280
+ return Number.isSafeInteger(raw) && raw > 0 ? raw : DEFAULT_IN_FLIGHT_CAP
281
+ }
282
+
283
+ // The scheduling answer, as data: what is in flight, what is runnable, what may be admitted
284
+ // now, and what each waiting unit is waiting on.
285
+ //
286
+ // A run advances as a continuously refilled, capped runnable set — no wave, batch or
287
+ // barrier. Nothing here is a phase: call it whenever a unit finishes and it returns the
288
+ // next admission. The cap counts units HOLDING a workspace, because that is the resource
289
+ // it bounds (disk + one dependency install per unit).
290
+ export function runnableState(manifest = {}) {
291
+ const m = isObject(manifest) ? manifest : {}
292
+ const units = arr(m.units).filter((u) => isObject(u) && nonEmpty(u.id))
293
+ const pendingNonImplementation = units.filter((u) => effectiveUnitKind(u) !== 'implementation' && !unitKindComplete(u))
294
+ const byId = new Map(units.map((u) => [u.id, u]))
295
+ const cap = coerceCap(m.inFlightCap)
296
+
297
+ // Dependency order, so admission never starves a dependency behind its own dependent.
298
+ const { order, cycles } = dependencyOrder(units)
299
+ const ordered = [...order, ...units.filter((u) => cycles.includes(u.id))]
300
+
301
+ const inFlight = ordered.filter((u) => holdsWorkspace(u))
302
+ const runnable = []
303
+ const waiting = []
304
+ for (const u of ordered) {
305
+ if (!needsWorkspace(u)) continue
306
+ // A dangling edge waits rather than passing: waiting on a unit that is not in the
307
+ // roster is visible and fixable, while treating it as satisfied silently bases the
308
+ // dependent on the wrong tree.
309
+ const unmet = (edges) => edges.filter((e) => !unitPushed(byId.get(e.unit)))
310
+ const waitingOn = unmet(schedulingEdges(u)).map((e) => e.unit)
311
+ // Premise edges that are not yet satisfied do NOT hold the unit back — but they are
312
+ // reported, because a unit admitted ahead of its ordering owes two things the caller
313
+ // has to act on: the invariant goes into its producer/reviewer spawns, and it must not
314
+ // merge first. Returning them silently as "runnable" would hand back a scheduling
315
+ // answer that has quietly dropped the delivery constraint it still carries.
316
+ const orderedAfter = unmet(blockingEdges(u))
317
+ .filter((e) => !SCHEDULING_BLOCKING_SOURCES.includes(e.source))
318
+ .map((e) => ({ unit: e.unit, source: e.source, ...(e.invariant ? { invariant: e.invariant } : {}) }))
319
+ if (waitingOn.length) waiting.push({ unit: u.id, waitingOn, ...(orderedAfter.length ? { orderedAfter } : {}) })
320
+ else {
321
+ const deliveryBlockedOn = completionBlockers(m, u)
322
+ runnable.push(orderedAfter.length || deliveryBlockedOn.length
323
+ ? { ...u, ...(orderedAfter.length ? { orderedAfter } : {}), ...(deliveryBlockedOn.length ? { deliveryBlockedOn } : {}) }
324
+ : u)
325
+ }
326
+ }
327
+
328
+ const held = new Set(inFlight.map((u) => u.id))
329
+ const slots = Math.max(0, cap - held.size)
330
+ const admit = runnable.filter((u) => !held.has(u.id)).slice(0, slots)
331
+
332
+ return { cap, inFlight, runnable, admit, waiting, cycles, pendingNonImplementation }
333
+ }
334
+
335
+ // ---- the delivery view ----
336
+
337
+ // Union-find over the CO-DELIVERING relations only: symbol edges and shared surfaces. A
338
+ // premise edge is deliberately absent — it orders, it does not bundle.
339
+ export function deriveComponents(rawUnits) {
340
+ const units = arr(rawUnits).filter((u) => isObject(u) && nonEmpty(u.id))
341
+ const parent = new Map(units.map((u) => [u.id, u.id]))
342
+ const find = (id) => {
343
+ let root = id
344
+ while (parent.get(root) !== root) root = parent.get(root)
345
+ let walk = id
346
+ while (parent.get(walk) !== walk) { const next = parent.get(walk); parent.set(walk, root); walk = next }
347
+ return root
348
+ }
349
+ const union = (a, b) => {
350
+ const ra = find(a)
351
+ const rb = find(b)
352
+ if (ra !== rb) parent.set(rb, ra)
353
+ }
354
+
355
+ const reasons = new Map(units.map((u) => [u.id, new Set()]))
356
+ for (const u of units) {
357
+ for (const e of coDeliveringEdges(u)) {
358
+ if (!parent.has(e.unit)) continue // dangling; validation names it, grouping ignores it
359
+ union(u.id, e.unit)
360
+ reasons.get(u.id).add('symbol')
361
+ reasons.get(e.unit).add('symbol')
362
+ }
363
+ }
364
+ const bySurface = new Map()
365
+ for (const u of units) {
366
+ for (const s of arr(u.sharedSurfaces).filter(nonEmpty)) {
367
+ if (!bySurface.has(s)) bySurface.set(s, [])
368
+ bySurface.get(s).push(u.id)
369
+ }
370
+ }
371
+ for (const ids of bySurface.values()) {
372
+ for (let i = 1; i < ids.length; i++) {
373
+ union(ids[0], ids[i])
374
+ reasons.get(ids[0]).add('assembly')
375
+ reasons.get(ids[i]).add('assembly')
376
+ }
377
+ }
378
+
379
+ // Ordered by the roster's own order so the grouping is stable across renders — a
380
+ // component list that reshuffles between two reports is one nobody can diff.
381
+ const groups = new Map()
382
+ for (const u of units) {
383
+ const root = find(u.id)
384
+ if (!groups.has(root)) groups.set(root, [])
385
+ groups.get(root).push(u)
386
+ }
387
+ return [...groups.values()].map((members) => {
388
+ const why = new Set()
389
+ for (const u of members) for (const r of reasons.get(u.id)) why.add(r)
390
+ return {
391
+ // Named for its first member in roster order, so the id is stable and a human can
392
+ // find the component from any unit id they already have.
393
+ id: `component:${members[0].id}`,
394
+ units: members,
395
+ derived: true,
396
+ coDeliveryReasons: [...why].sort(),
397
+ ...(members.every((unit) => terminalDisposition(unit) === 'descoped') ? { verdict: 'DESCOPED' } : {}),
398
+ }
399
+ })
400
+ }
401
+
402
+ // The ordering a premise edge imposes, lifted to the delivery view: component → the
403
+ // components it may not merge before. This is what `combine-and-verify.mjs mergeable`
404
+ // consumes as its dependency-components argument, which is why the premise edge does not
405
+ // need a bundling mechanism of its own — the merge gate already refuses a component whose
406
+ // dependencies are not yet in the target.
407
+ //
408
+ // Symbol edges internal to one component vanish here (they are resolved at assembly); an
409
+ // edge that crosses a component boundary is kept whichever source it came from, because a
410
+ // cross-component edge is an ordering constraint either way.
411
+ export function componentDependencies(components) {
412
+ const comps = arr(components).filter((c) => isObject(c) && nonEmpty(c.id))
413
+ const componentOf = new Map()
414
+ for (const c of comps) for (const u of arr(c.units)) if (nonEmpty(u?.id)) componentOf.set(u.id, c.id)
415
+ const out = new Map(comps.map((c) => [c.id, []]))
416
+ for (const c of comps) {
417
+ const deps = new Set()
418
+ for (const u of arr(c.units)) {
419
+ for (const e of blockingEdges(u)) {
420
+ const other = componentOf.get(e.unit)
421
+ if (other && other !== c.id) deps.add(other)
422
+ }
423
+ }
424
+ out.set(c.id, [...deps])
425
+ }
426
+ return out
427
+ }
@@ -0,0 +1,9 @@
1
+ // Compatibility wrapper: canonical ownership lives in harness-runtime.
2
+ export * from '../../harness-runtime/model-catalog.mjs'
3
+
4
+ import { runCli } from '../../harness-runtime/model-catalog.mjs'
5
+ import { isMainModule } from '../../engineering-runtime/scripts/main-module.mjs'
6
+
7
+ if (isMainModule(import.meta.url)) {
8
+ process.exit(runCli(process.argv.slice(2)))
9
+ }