project-tiny-context-harness 0.2.84 → 0.6.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 (361) hide show
  1. package/README.md +163 -428
  2. package/assets/README.md +283 -455
  3. package/assets/README.zh-CN.md +199 -123
  4. package/assets/agents/AGENTS_CORE.md +54 -67
  5. package/assets/context_templates/context.toml +3 -0
  6. package/assets/context_templates/global.md +6 -6
  7. package/assets/github/harness.yml +2 -2
  8. package/assets/skills/context_development_engineer/SKILL.md +91 -107
  9. package/assets/skills/context_product_plan/SKILL.md +18 -28
  10. package/assets/skills/context_surface_contract/SKILL.md +35 -38
  11. package/assets/skills/context_uiux_design/SKILL.md +31 -30
  12. package/assets/skills/long-task-workflow/SKILL.md +76 -0
  13. package/assets/skills/long-task-workflow/agents/openai.yaml +4 -0
  14. package/assets/skills/long-task-workflow/references/authority-lifecycle.md +41 -0
  15. package/assets/skills/long-task-workflow/references/contract-authoring.md +62 -0
  16. package/assets/skills/long-task-workflow/references/evidence-design.md +45 -0
  17. package/assets/skills/normal-long-task/SKILL.md +12 -489
  18. package/assets/skills/source-plan-authoring/SKILL.md +379 -0
  19. package/assets/tools/validate_context.py +293 -127
  20. package/dist/cli.js +3 -1
  21. package/dist/commands/check-modularity.js +33 -10
  22. package/dist/commands/composite-campaign.d.ts +1 -0
  23. package/dist/commands/composite-campaign.js +8 -0
  24. package/dist/commands/composite-long-task.d.ts +1 -6
  25. package/dist/commands/composite-long-task.js +7 -157
  26. package/dist/commands/delivery-set.d.ts +1 -0
  27. package/dist/commands/delivery-set.js +8 -0
  28. package/dist/commands/disable.d.ts +1 -0
  29. package/dist/commands/disable.js +15 -0
  30. package/dist/commands/enable.d.ts +1 -0
  31. package/dist/commands/enable.js +14 -0
  32. package/dist/commands/export-context-args.js +13 -4
  33. package/dist/commands/export-context.js +18 -7
  34. package/dist/commands/index.js +42 -30
  35. package/dist/commands/init.js +12 -6
  36. package/dist/commands/long-task-authoring.d.ts +3 -0
  37. package/dist/commands/long-task-authoring.js +92 -0
  38. package/dist/commands/long-task-explain.d.ts +1 -0
  39. package/dist/commands/long-task-explain.js +52 -0
  40. package/dist/commands/long-task.d.ts +1 -0
  41. package/dist/commands/long-task.js +226 -0
  42. package/dist/commands/package-source.js +2 -2
  43. package/dist/commands/upgrade.js +10 -10
  44. package/dist/index.d.ts +11 -1
  45. package/dist/index.js +8 -0
  46. package/dist/lib/config.js +34 -8
  47. package/dist/lib/context-default-footprint.d.ts +16 -0
  48. package/dist/lib/context-default-footprint.js +107 -0
  49. package/dist/lib/context-export.js +105 -41
  50. package/dist/lib/context-graph-snapshot.d.ts +18 -0
  51. package/dist/lib/context-graph-snapshot.js +171 -0
  52. package/dist/lib/context-manifest-schema.d.ts +28 -0
  53. package/dist/lib/context-manifest-schema.js +150 -0
  54. package/dist/lib/context-manifest.js +28 -20
  55. package/dist/lib/context-templates.js +5 -5
  56. package/dist/lib/design-md.js +1 -1
  57. package/dist/lib/doctor.js +54 -1
  58. package/dist/lib/harness-root.js +25 -8
  59. package/dist/lib/init.js +6 -3
  60. package/dist/lib/legacy-managed-scan.js +23 -7
  61. package/dist/lib/legacy-sdlc-migration.js +21 -11
  62. package/dist/lib/long-task-acceptance-reference.d.ts +22 -0
  63. package/dist/lib/long-task-acceptance-reference.js +46 -0
  64. package/dist/lib/long-task-acceptance-shape.d.ts +5 -0
  65. package/dist/lib/long-task-acceptance-shape.js +131 -0
  66. package/dist/lib/long-task-activation-validation.d.ts +21 -0
  67. package/dist/lib/long-task-activation-validation.js +136 -0
  68. package/dist/lib/long-task-artifacts.d.ts +5 -0
  69. package/dist/lib/long-task-artifacts.js +34 -0
  70. package/dist/lib/long-task-assertions-v2.d.ts +22 -0
  71. package/dist/lib/long-task-assertions-v2.js +212 -0
  72. package/dist/lib/long-task-authoring-authority-preview.d.ts +5 -0
  73. package/dist/lib/long-task-authoring-authority-preview.js +85 -0
  74. package/dist/lib/long-task-authoring-preflight-diagnostics.d.ts +8 -0
  75. package/dist/lib/long-task-authoring-preflight-diagnostics.js +179 -0
  76. package/dist/lib/long-task-authoring-preflight-repair-order.d.ts +8 -0
  77. package/dist/lib/long-task-authoring-preflight-repair-order.js +95 -0
  78. package/dist/lib/long-task-authoring-preflight-types.d.ts +46 -0
  79. package/dist/lib/long-task-authoring-preflight-types.js +38 -0
  80. package/dist/lib/long-task-authoring-preflight.d.ts +3 -0
  81. package/dist/lib/long-task-authoring-preflight.js +44 -0
  82. package/dist/lib/long-task-authority-material-diff.d.ts +17 -0
  83. package/dist/lib/long-task-authority-material-diff.js +152 -0
  84. package/dist/lib/long-task-authority-materials.d.ts +7 -0
  85. package/dist/lib/long-task-authority-materials.js +83 -0
  86. package/dist/lib/long-task-authority-policy.d.ts +168 -0
  87. package/dist/lib/long-task-authority-policy.js +181 -0
  88. package/dist/lib/long-task-authority-revision-details.d.ts +19 -0
  89. package/dist/lib/long-task-authority-revision-details.js +192 -0
  90. package/dist/lib/long-task-authority-revision-enforcement.d.ts +3 -0
  91. package/dist/lib/long-task-authority-revision-enforcement.js +41 -0
  92. package/dist/lib/long-task-authority-revision-types.d.ts +50 -0
  93. package/dist/lib/long-task-authority-revision-types.js +1 -0
  94. package/dist/lib/long-task-authority-revision.d.ts +4 -0
  95. package/dist/lib/long-task-authority-revision.js +188 -0
  96. package/dist/lib/long-task-authority-transition-policy.d.ts +62 -0
  97. package/dist/lib/long-task-authority-transition-policy.js +62 -0
  98. package/dist/lib/long-task-authority-types.d.ts +96 -0
  99. package/dist/lib/long-task-authority-types.js +1 -0
  100. package/dist/lib/long-task-authority.d.ts +7 -0
  101. package/dist/lib/long-task-authority.js +142 -0
  102. package/dist/lib/long-task-boundary-check.d.ts +15 -0
  103. package/dist/lib/long-task-boundary-check.js +9 -0
  104. package/dist/lib/long-task-check-evidence-decoder.d.ts +3 -0
  105. package/dist/lib/long-task-check-evidence-decoder.js +74 -0
  106. package/dist/lib/long-task-check-execution-policy.d.ts +18 -0
  107. package/dist/lib/long-task-check-execution-policy.js +36 -0
  108. package/dist/lib/long-task-check-runner.d.ts +2 -0
  109. package/dist/lib/long-task-check-runner.js +181 -0
  110. package/dist/lib/long-task-check-shape.d.ts +2 -0
  111. package/dist/lib/long-task-check-shape.js +136 -0
  112. package/dist/lib/long-task-claim-definitions.d.ts +7 -0
  113. package/dist/lib/long-task-claim-definitions.js +78 -0
  114. package/dist/lib/long-task-claim-proof-policy.d.ts +4 -0
  115. package/dist/lib/long-task-claim-proof-policy.js +57 -0
  116. package/dist/lib/long-task-claims.d.ts +10 -0
  117. package/dist/lib/long-task-claims.js +187 -0
  118. package/dist/lib/long-task-context-authority-topology.d.ts +7 -0
  119. package/dist/lib/long-task-context-authority-topology.js +37 -0
  120. package/dist/lib/long-task-context-authority.d.ts +14 -0
  121. package/dist/lib/long-task-context-authority.js +66 -0
  122. package/dist/lib/long-task-contract-types.d.ts +203 -0
  123. package/dist/lib/long-task-contract-types.js +1 -0
  124. package/dist/lib/long-task-counterfactual-claim-policy.d.ts +10 -0
  125. package/dist/lib/long-task-counterfactual-claim-policy.js +57 -0
  126. package/dist/lib/long-task-counterfactual-sandbox.d.ts +6 -0
  127. package/dist/lib/long-task-counterfactual-sandbox.js +87 -0
  128. package/dist/lib/long-task-counterfactual-types.d.ts +24 -0
  129. package/dist/lib/long-task-counterfactual-types.js +1 -0
  130. package/dist/lib/long-task-delivery-compiler.d.ts +10 -0
  131. package/dist/lib/long-task-delivery-compiler.js +129 -0
  132. package/dist/lib/long-task-delivery-parser.d.ts +13 -0
  133. package/dist/lib/long-task-delivery-parser.js +90 -0
  134. package/dist/lib/long-task-delivery-preflight.d.ts +5 -0
  135. package/dist/lib/long-task-delivery-preflight.js +151 -0
  136. package/dist/lib/long-task-delivery-shape.d.ts +5 -0
  137. package/dist/lib/long-task-delivery-shape.js +5 -0
  138. package/dist/lib/long-task-delivery-types.d.ts +8 -0
  139. package/dist/lib/long-task-delivery-types.js +8 -0
  140. package/dist/lib/long-task-delivery-validation.d.ts +3 -0
  141. package/dist/lib/long-task-delivery-validation.js +175 -0
  142. package/dist/lib/long-task-evidence-adapter-policy.d.ts +4 -0
  143. package/dist/lib/long-task-evidence-adapter-policy.js +15 -0
  144. package/dist/lib/long-task-evidence-adapter-types.d.ts +1 -0
  145. package/dist/lib/long-task-evidence-adapter-types.js +1 -0
  146. package/dist/lib/long-task-evidence-findings.d.ts +5 -0
  147. package/dist/lib/long-task-evidence-findings.js +113 -0
  148. package/dist/lib/long-task-evidence-sensitivity-policy.d.ts +4 -0
  149. package/dist/lib/long-task-evidence-sensitivity-policy.js +98 -0
  150. package/dist/lib/long-task-evidence-v2.d.ts +5 -0
  151. package/dist/lib/long-task-evidence-v2.js +226 -0
  152. package/dist/lib/long-task-explain-acceptance-link.d.ts +46 -0
  153. package/dist/lib/long-task-explain-acceptance-link.js +96 -0
  154. package/dist/lib/long-task-explain-claim-links.d.ts +45 -0
  155. package/dist/lib/long-task-explain-claim-links.js +88 -0
  156. package/dist/lib/long-task-explain-source-links.d.ts +93 -0
  157. package/dist/lib/long-task-explain-source-links.js +51 -0
  158. package/dist/lib/long-task-final-v2.d.ts +2 -0
  159. package/dist/lib/long-task-final-v2.js +124 -0
  160. package/dist/lib/long-task-finding-context.d.ts +3 -0
  161. package/dist/lib/long-task-finding-context.js +63 -0
  162. package/dist/lib/long-task-freshness.d.ts +3 -0
  163. package/dist/lib/long-task-freshness.js +80 -0
  164. package/dist/lib/long-task-hook-install.d.ts +9 -0
  165. package/dist/lib/long-task-hook-install.js +184 -0
  166. package/dist/lib/long-task-hook-preflight.d.ts +7 -0
  167. package/dist/lib/long-task-hook-preflight.js +58 -0
  168. package/dist/lib/long-task-observation-ownership.d.ts +2 -0
  169. package/dist/lib/long-task-observation-ownership.js +22 -0
  170. package/dist/lib/long-task-outcome-parser.d.ts +4 -0
  171. package/dist/lib/long-task-outcome-parser.js +100 -0
  172. package/dist/lib/long-task-paths.d.ts +49 -0
  173. package/dist/lib/long-task-paths.js +418 -0
  174. package/dist/lib/long-task-playwright-counterfactual-policy.d.ts +7 -0
  175. package/dist/lib/long-task-playwright-counterfactual-policy.js +125 -0
  176. package/dist/lib/long-task-playwright-evidence.d.ts +6 -0
  177. package/dist/lib/long-task-playwright-evidence.js +244 -0
  178. package/dist/lib/long-task-product-shape.d.ts +6 -0
  179. package/dist/lib/long-task-product-shape.js +73 -0
  180. package/dist/lib/long-task-progress.d.ts +4 -0
  181. package/dist/lib/long-task-progress.js +114 -0
  182. package/dist/lib/long-task-protected-files.d.ts +1 -0
  183. package/dist/lib/long-task-protected-files.js +30 -0
  184. package/dist/lib/long-task-required-proof-surfaces.d.ts +2 -0
  185. package/dist/lib/long-task-required-proof-surfaces.js +13 -0
  186. package/dist/lib/long-task-requirement-shape.d.ts +2 -0
  187. package/dist/lib/long-task-requirement-shape.js +18 -0
  188. package/dist/lib/long-task-risk-surfaces.d.ts +2 -0
  189. package/dist/lib/long-task-risk-surfaces.js +60 -0
  190. package/dist/lib/long-task-risk-types.d.ts +5 -0
  191. package/dist/lib/long-task-risk-types.js +12 -0
  192. package/dist/lib/long-task-risk.d.ts +9 -0
  193. package/dist/lib/long-task-risk.js +132 -0
  194. package/dist/lib/long-task-root-shape.d.ts +4 -0
  195. package/dist/lib/long-task-root-shape.js +86 -0
  196. package/dist/lib/long-task-runner-environment.d.ts +7 -0
  197. package/dist/lib/long-task-runner-environment.js +57 -0
  198. package/dist/lib/long-task-runner-files.d.ts +3 -0
  199. package/dist/lib/long-task-runner-files.js +39 -0
  200. package/dist/lib/long-task-runner-freeze.d.ts +2 -0
  201. package/dist/lib/long-task-runner-freeze.js +168 -0
  202. package/dist/lib/long-task-runtime-types.d.ts +214 -0
  203. package/dist/lib/long-task-runtime-types.js +1 -0
  204. package/dist/lib/long-task-shape-primitives.d.ts +17 -0
  205. package/dist/lib/long-task-shape-primitives.js +81 -0
  206. package/dist/lib/long-task-source-authority-types.d.ts +13 -0
  207. package/dist/lib/long-task-source-authority-types.js +1 -0
  208. package/dist/lib/long-task-source-claim-validation.d.ts +5 -0
  209. package/dist/lib/long-task-source-claim-validation.js +96 -0
  210. package/dist/lib/long-task-source-continuity.d.ts +4 -0
  211. package/dist/lib/long-task-source-continuity.js +57 -0
  212. package/dist/lib/long-task-source-inventory.d.ts +2 -0
  213. package/dist/lib/long-task-source-inventory.js +21 -0
  214. package/dist/lib/long-task-source-item-parser.d.ts +3 -0
  215. package/dist/lib/long-task-source-item-parser.js +112 -0
  216. package/dist/lib/long-task-source-shape.d.ts +2 -0
  217. package/dist/lib/long-task-source-shape.js +56 -0
  218. package/dist/lib/long-task-source-target-continuity.d.ts +4 -0
  219. package/dist/lib/long-task-source-target-continuity.js +80 -0
  220. package/dist/lib/long-task-source-target-index.d.ts +12 -0
  221. package/dist/lib/long-task-source-target-index.js +76 -0
  222. package/dist/lib/long-task-source-validation.d.ts +3 -0
  223. package/dist/lib/long-task-source-validation.js +46 -0
  224. package/dist/lib/long-task-state.d.ts +91 -0
  225. package/dist/lib/long-task-state.js +611 -0
  226. package/dist/lib/long-task-status-projection.d.ts +21 -0
  227. package/dist/lib/long-task-status-projection.js +116 -0
  228. package/dist/lib/long-task-status-v2.d.ts +37 -0
  229. package/dist/lib/long-task-status-v2.js +306 -0
  230. package/dist/lib/long-task-technical-shape.d.ts +3 -0
  231. package/dist/lib/long-task-technical-shape.js +44 -0
  232. package/dist/lib/long-task-verifier-authority.d.ts +12 -0
  233. package/dist/lib/long-task-verifier-authority.js +47 -0
  234. package/dist/lib/long-task-verifier-identity.d.ts +2 -0
  235. package/dist/lib/long-task-verifier-identity.js +55 -0
  236. package/dist/lib/long-task-verifier-v2.d.ts +13 -0
  237. package/dist/lib/long-task-verifier-v2.js +266 -0
  238. package/dist/lib/long-task-workspace-runtime-types.d.ts +23 -0
  239. package/dist/lib/long-task-workspace-runtime-types.js +1 -0
  240. package/dist/lib/long-task-workspace.d.ts +25 -0
  241. package/dist/lib/long-task-workspace.js +366 -0
  242. package/dist/lib/managed-file.js +20 -5
  243. package/dist/lib/migrations.js +156 -32
  244. package/dist/lib/modularity.d.ts +27 -1
  245. package/dist/lib/modularity.js +499 -23
  246. package/dist/lib/package-json-config.js +14 -5
  247. package/dist/lib/package-source.js +15 -3
  248. package/dist/lib/profiles.d.ts +13 -0
  249. package/dist/lib/profiles.js +66 -0
  250. package/dist/lib/schema-guard.js +4 -2
  251. package/dist/lib/source-files.js +14 -7
  252. package/dist/lib/source-pack-classify.js +91 -19
  253. package/dist/lib/source-pack-config.js +25 -8
  254. package/dist/lib/source-pack-export.js +84 -25
  255. package/dist/lib/source-pack-manifest.js +18 -6
  256. package/dist/lib/source-pack-records.js +35 -11
  257. package/dist/lib/source-pack-render.js +47 -18
  258. package/dist/lib/stable-json.d.ts +2 -0
  259. package/dist/lib/stable-json.js +21 -0
  260. package/dist/lib/strict-codec.d.ts +4 -0
  261. package/dist/lib/strict-codec.js +65 -0
  262. package/dist/lib/sync-engine.js +76 -24
  263. package/dist/lib/types.d.ts +8 -1
  264. package/dist/lib/upgrade.js +4 -3
  265. package/dist/lib/validators.js +218 -191
  266. package/dist/long-task-hook.d.ts +2 -0
  267. package/dist/long-task-hook.js +55 -0
  268. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +340 -0
  269. package/dist/schemas/long-task-delivery-v2/long-task-outcomes-v2.schema.json +18 -0
  270. package/migrations/README.md +8 -3
  271. package/package.json +17 -6
  272. package/source-mappings.yaml +0 -3
  273. package/assets/protected-harness-baseline.json +0 -20
  274. package/assets/skills/composite-long-task-workflow/SKILL.md +0 -244
  275. package/assets/skills/composite-long-task-workflow/assets/execution-binding.template.md +0 -57
  276. package/assets/skills/composite-long-task-workflow/assets/goal-objective.template.md +0 -17
  277. package/assets/skills/composite-long-task-workflow/references/composite-long-task-workflow-protocol.md +0 -675
  278. package/dist/commands/superpowers.d.ts +0 -1
  279. package/dist/commands/superpowers.js +0 -8
  280. package/dist/lib/composite-long-task-renderer.d.ts +0 -12
  281. package/dist/lib/composite-long-task-renderer.js +0 -109
  282. package/dist/lib/plan-acceptance-artifacts.d.ts +0 -1
  283. package/dist/lib/plan-acceptance-artifacts.js +0 -220
  284. package/dist/lib/plan-acceptance-evidence.d.ts +0 -2
  285. package/dist/lib/plan-acceptance-evidence.js +0 -108
  286. package/dist/lib/plan-acceptance-json.d.ts +0 -15
  287. package/dist/lib/plan-acceptance-json.js +0 -133
  288. package/dist/lib/plan-acceptance-validator.d.ts +0 -2
  289. package/dist/lib/plan-acceptance-validator.js +0 -209
  290. package/dist/lib/plan-contract-validator.d.ts +0 -2
  291. package/dist/lib/plan-contract-validator.js +0 -127
  292. package/dist/lib/plan-validator-common.d.ts +0 -24
  293. package/dist/lib/plan-validator-common.js +0 -196
  294. package/dist/lib/superpowers-task-ac010.d.ts +0 -6
  295. package/dist/lib/superpowers-task-ac010.js +0 -26
  296. package/dist/lib/superpowers-task-assertion-normalizers.d.ts +0 -3
  297. package/dist/lib/superpowers-task-assertion-normalizers.js +0 -74
  298. package/dist/lib/superpowers-task-assertions.d.ts +0 -20
  299. package/dist/lib/superpowers-task-assertions.js +0 -257
  300. package/dist/lib/superpowers-task-attempt.d.ts +0 -4
  301. package/dist/lib/superpowers-task-attempt.js +0 -102
  302. package/dist/lib/superpowers-task-command-run-correlation.d.ts +0 -8
  303. package/dist/lib/superpowers-task-command-run-correlation.js +0 -103
  304. package/dist/lib/superpowers-task-command-specs.d.ts +0 -3
  305. package/dist/lib/superpowers-task-command-specs.js +0 -52
  306. package/dist/lib/superpowers-task-compile-diagnostics.d.ts +0 -5
  307. package/dist/lib/superpowers-task-compile-diagnostics.js +0 -20
  308. package/dist/lib/superpowers-task-compile-guards.d.ts +0 -2
  309. package/dist/lib/superpowers-task-compile-guards.js +0 -66
  310. package/dist/lib/superpowers-task-compile.d.ts +0 -6
  311. package/dist/lib/superpowers-task-compile.js +0 -133
  312. package/dist/lib/superpowers-task-completion-output.d.ts +0 -52
  313. package/dist/lib/superpowers-task-completion-output.js +0 -228
  314. package/dist/lib/superpowers-task-conformance.d.ts +0 -2
  315. package/dist/lib/superpowers-task-conformance.js +0 -24
  316. package/dist/lib/superpowers-task-contradictions.d.ts +0 -6
  317. package/dist/lib/superpowers-task-contradictions.js +0 -126
  318. package/dist/lib/superpowers-task-current-evidence.d.ts +0 -3
  319. package/dist/lib/superpowers-task-current-evidence.js +0 -176
  320. package/dist/lib/superpowers-task-delivery.d.ts +0 -4
  321. package/dist/lib/superpowers-task-delivery.js +0 -96
  322. package/dist/lib/superpowers-task-derive.d.ts +0 -14
  323. package/dist/lib/superpowers-task-derive.js +0 -382
  324. package/dist/lib/superpowers-task-events.d.ts +0 -1
  325. package/dist/lib/superpowers-task-events.js +0 -13
  326. package/dist/lib/superpowers-task-evidence-kernel.d.ts +0 -19
  327. package/dist/lib/superpowers-task-evidence-kernel.js +0 -347
  328. package/dist/lib/superpowers-task-evidence-records.d.ts +0 -2
  329. package/dist/lib/superpowers-task-evidence-records.js +0 -55
  330. package/dist/lib/superpowers-task-evidence.d.ts +0 -10
  331. package/dist/lib/superpowers-task-evidence.js +0 -147
  332. package/dist/lib/superpowers-task-fields.d.ts +0 -22
  333. package/dist/lib/superpowers-task-fields.js +0 -276
  334. package/dist/lib/superpowers-task-final-card.d.ts +0 -3
  335. package/dist/lib/superpowers-task-final-card.js +0 -24
  336. package/dist/lib/superpowers-task-gates.d.ts +0 -12
  337. package/dist/lib/superpowers-task-gates.js +0 -155
  338. package/dist/lib/superpowers-task-harness-drift.d.ts +0 -11
  339. package/dist/lib/superpowers-task-harness-drift.js +0 -90
  340. package/dist/lib/superpowers-task-next-slices.d.ts +0 -1
  341. package/dist/lib/superpowers-task-next-slices.js +0 -12
  342. package/dist/lib/superpowers-task-protected-baseline.d.ts +0 -10
  343. package/dist/lib/superpowers-task-protected-baseline.js +0 -66
  344. package/dist/lib/superpowers-task-source-compile.d.ts +0 -5
  345. package/dist/lib/superpowers-task-source-compile.js +0 -226
  346. package/dist/lib/superpowers-task-source-parser.d.ts +0 -23
  347. package/dist/lib/superpowers-task-source-parser.js +0 -218
  348. package/dist/lib/superpowers-task-state-schema.d.ts +0 -440
  349. package/dist/lib/superpowers-task-state-schema.js +0 -66
  350. package/dist/lib/superpowers-task-state-shape.d.ts +0 -3
  351. package/dist/lib/superpowers-task-state-shape.js +0 -50
  352. package/dist/lib/superpowers-task-state.d.ts +0 -16
  353. package/dist/lib/superpowers-task-state.js +0 -246
  354. package/dist/lib/superpowers-task-status.d.ts +0 -2
  355. package/dist/lib/superpowers-task-status.js +0 -24
  356. package/dist/lib/superpowers-task-under-specified.d.ts +0 -7
  357. package/dist/lib/superpowers-task-under-specified.js +0 -61
  358. package/dist/lib/superpowers-task-unregistered-evidence.d.ts +0 -11
  359. package/dist/lib/superpowers-task-unregistered-evidence.js +0 -72
  360. package/dist/lib/superpowers-task-validator.d.ts +0 -5
  361. package/dist/lib/superpowers-task-validator.js +0 -290
@@ -1,2 +0,0 @@
1
- import { type SuperpowersAcceptanceCriterion, type SuperpowersPlanItem, type SuperpowersProductArchitectureScope } from "./superpowers-task-state-schema.js";
2
- export declare function validateCompiledSources(product: SuperpowersProductArchitectureScope, planItems: Record<string, SuperpowersPlanItem>, acceptanceCriteria: Record<string, SuperpowersAcceptanceCriterion>): void;
@@ -1,66 +0,0 @@
1
- import { MACHINE_VERIFIABLE_PROOF_LAYERS } from "./superpowers-task-assertions.js";
2
- import { compileError, throwCompileErrors } from "./superpowers-task-compile-diagnostics.js";
3
- const ALLOWED_PROOF_LAYERS = new Set(["code", ...MACHINE_VERIFIABLE_PROOF_LAYERS]);
4
- export function validateCompiledSources(product, planItems, acceptanceCriteria) {
5
- const errors = [];
6
- const planIds = new Set(Object.keys(planItems));
7
- const acIds = new Set(Object.keys(acceptanceCriteria));
8
- for (const [planId, item] of Object.entries(planItems)) {
9
- validatePlanItem(planId, item, acIds, acceptanceCriteria, errors);
10
- }
11
- for (const [acId, ac] of Object.entries(acceptanceCriteria)) {
12
- validateAcceptanceCriterion(product, acId, ac, planIds, planItems, errors);
13
- }
14
- throwCompileErrors(errors);
15
- }
16
- function validatePlanItem(planId, item, acIds, acceptanceCriteria, errors) {
17
- for (const acId of item.related_acs) {
18
- if (!acIds.has(acId)) {
19
- errors.push(compileError(`${planId} references unknown related_acs ${acId}`, "blocking_unparseable_object", item.source_file, item.source_start_line, "related_acs", "dangling plan-to-AC references make the graph ambiguous", "fix related_acs to existing AC ids"));
20
- }
21
- }
22
- if (item.delivery_scope !== "out_of_scope_backlog" && item.implementation_paths.length === 0) {
23
- errors.push(compileError(`${planId} missing implementation_paths`, "blocking_missing_primary_path", item.source_file, item.source_start_line, "implementation_paths", "plan conformance needs an implementation owner path", "add implementation_paths or mark the item out_of_scope_backlog"));
24
- }
25
- if (item.owner_surfaces.length > 0) {
26
- const related = item.related_acs.length > 0 ? item.related_acs : Object.keys(acceptanceCriteria);
27
- const hasUiLayer = related.some((acId) => acceptanceCriteria[acId]?.required_proof_layers.includes("ui_browser"));
28
- if (!hasUiLayer) {
29
- errors.push(compileError(`${planId} owner_surfaces requires a ui_browser proof layer`, "blocking_missing_owner_boundary", item.source_file, item.source_start_line, "owner_surfaces", "owner-surface work must have browser proof on the owner route", "add ui_browser to a related AC required_proof_layers"));
30
- }
31
- }
32
- }
33
- function validateAcceptanceCriterion(product, acId, ac, planIds, planItems, errors) {
34
- for (const planId of ac.related_plan_items) {
35
- if (!planIds.has(planId)) {
36
- errors.push(compileError(`${acId} references unknown related_plan_items ${planId}`, "blocking_unparseable_object", ac.source_file, ac.source_start_line, "related_plan_items", "dangling AC-to-plan references make the graph ambiguous", "fix related_plan_items to existing PI ids"));
37
- }
38
- }
39
- for (const layer of ac.required_proof_layers) {
40
- if (!ALLOWED_PROOF_LAYERS.has(layer)) {
41
- errors.push(compileError(`${acId} has invalid required_proof_layers ${layer}`, "blocking_unparseable_object", ac.source_file, ac.source_start_line, "required_proof_layers", "unknown proof layers cannot be evaluated", "use code or a supported machine-verifiable proof layer"));
42
- }
43
- }
44
- if (ac.ac_validates.length === 0) {
45
- errors.push(compileError(`${acId} missing observable acceptance result`, "blocking_missing_observable_result", ac.source_file, ac.source_start_line, "ac_validates", "ACs need an observable result before evidence can prove completion", "add concrete ac_validates outcomes"));
46
- }
47
- const machineRequirements = (ac.assertion_requirements ?? []).filter((item) => item.machine_blocking);
48
- if (machineRequirements.some((item) => item.positive_assertions.length === 0)) {
49
- errors.push(compileError(`${acId} machine-verifiable proof layer lacks positive assertion requirements`, "blocking_missing_assertion_spec", ac.source_file, ac.source_start_line, "assertion_requirements", "machine-verifiable ACs need observable positive assertions", "add ac_validates, required_test_ids, test_cases or final_evidence_expected"));
50
- }
51
- if (machineRequirements.some((item) => item.negative_assertions.length === 0)) {
52
- errors.push(compileError(`${acId} machine-verifiable proof layer lacks negative assertion requirements`, "blocking_missing_invalid_evidence", ac.source_file, ac.source_start_line, "invalid_evidence", "negative assertions prevent forbidden completion shortcuts", "add ac_does_not_validate, fail_conditions or invalid_evidence"));
53
- }
54
- const relatedPlans = ac.related_plan_items.map((planId) => planItems[planId]).filter(Boolean);
55
- if (ac.full_population_required === true && relatedPlans.length > 0 && relatedPlans.every((item) => item.delivery_scope === "representative_sample_validation")) {
56
- errors.push(compileError(`${acId} full-population AC is backed only by representative sample plan items`, "blocking_scope_conflict", ac.source_file, ac.source_start_line, "full_population_required", "sample-only plan items cannot prove full-population acceptance", "add a full_population_operation plan item or change the AC boundary"));
57
- }
58
- const productNonCompleting = product.representative_samples_do_not_validate.join("\n");
59
- if (productNonCompleting && !containsAny(ac.ac_does_not_validate, product.representative_samples_do_not_validate)) {
60
- errors.push(compileError(`${acId} does not represent Product non-completing outcomes`, "blocking_missing_invalid_evidence", ac.source_file, ac.source_start_line, "ac_does_not_validate", "Product non-completing outcomes must remain visible in AC invalid evidence", "add matching ac_does_not_validate or invalid_evidence entries"));
61
- }
62
- }
63
- function containsAny(values, needles) {
64
- const text = values.join("\n").toLowerCase();
65
- return needles.some((needle) => text.includes(needle.toLowerCase()));
66
- }
@@ -1,6 +0,0 @@
1
- import { type SuperpowersTaskState } from "./superpowers-task-state-schema.js";
2
- import type { SuperpowersAttemptMode } from "./superpowers-task-state-schema.js";
3
- export declare function compileSuperpowersTask(workdir: string, options?: {
4
- mode?: SuperpowersAttemptMode;
5
- }): Promise<SuperpowersTaskState>;
6
- export declare function computeScopeConflicts(state: SuperpowersTaskState): string[];
@@ -1,133 +0,0 @@
1
- import path from "node:path";
2
- import { pathExists, readText } from "./fs.js";
3
- import { appendSuperpowersEvent } from "./superpowers-task-events.js";
4
- import { compileError, compileReportSuffix, throwCompileErrors } from "./superpowers-task-compile-diagnostics.js";
5
- import { validateCompiledSources } from "./superpowers-task-compile-guards.js";
6
- import { startSuperpowersAttempt } from "./superpowers-task-attempt.js";
7
- import { deriveRequiredCommandSpecs } from "./superpowers-task-command-specs.js";
8
- import { loadSuperpowersState, recomputeStatuses, saveSuperpowersState, refreshSourceHashes } from "./superpowers-task-state.js";
9
- import { DEFAULT_LAYERS, parseAcceptanceCriteria, parsePlanItems, parseProductArchitectureScope } from "./superpowers-task-source-compile.js";
10
- export async function compileSuperpowersTask(workdir, options = {}) {
11
- const state = await loadSuperpowersState(workdir);
12
- await refreshSourceHashes(workdir, state);
13
- await assertRequiredSourcesExist(workdir, state);
14
- const productSource = await readText(path.join(workdir, state.sources.product_architecture_source.path));
15
- const technicalPlan = await readText(path.join(workdir, state.sources.technical_realization_plan.path));
16
- const checklist = await readText(path.join(workdir, state.sources.acceptance_checklist.path));
17
- state.delivery = {
18
- product_architecture_scope: parseProductArchitectureScope(productSource, state.sources.product_architecture_source.path),
19
- scope_conflicts: []
20
- };
21
- const planItems = parsePlanItems(technicalPlan, state.sources.technical_realization_plan.path);
22
- const acceptanceCriteria = parseAcceptanceCriteria(checklist, state.sources.acceptance_checklist.path);
23
- validateCompiledSources(state.delivery.product_architecture_scope, planItems, acceptanceCriteria);
24
- const acIds = Object.keys(acceptanceCriteria);
25
- for (const [planId, item] of Object.entries(planItems)) {
26
- if (item.related_acs.length === 0) {
27
- item.related_acs = acIds;
28
- }
29
- item.required_proof_layers = item.related_acs.flatMap((acId) => (acceptanceCriteria[acId]?.required_proof_layers ?? DEFAULT_LAYERS).map((layer) => `${acId}.${layer}`));
30
- }
31
- for (const [acId, ac] of Object.entries(acceptanceCriteria)) {
32
- if (ac.related_plan_items.length === 0) {
33
- ac.related_plan_items = Object.keys(planItems);
34
- }
35
- }
36
- state.graph.plan_items = planItems;
37
- state.graph.acceptance_criteria = acceptanceCriteria;
38
- state.graph.proof_layers = {};
39
- for (const [acId, ac] of Object.entries(acceptanceCriteria)) {
40
- for (const layer of ac.required_proof_layers) {
41
- state.graph.proof_layers[`${acId}.${layer}`] = { required: true, status: "missing", evidence_ids: [] };
42
- }
43
- }
44
- state.graph.edges = Object.entries(planItems).flatMap(([planId, item]) => item.related_acs.map((acId) => ({ from: planId, to: acId, type: "supports" })));
45
- state.required_command_specs = deriveRequiredCommandSpecs(state);
46
- state.command_runs = [];
47
- state.negative_evidence_records = [];
48
- state.delivery.scope_conflicts = computeScopeConflicts(state);
49
- state.progress = compileProgress(state);
50
- recomputeStatuses(state);
51
- await startSuperpowersAttempt(workdir, state, options.mode ?? "product_task");
52
- await saveSuperpowersState(workdir, state);
53
- await appendSuperpowersEvent(workdir, "graph_compiled", {
54
- plan_items: Object.keys(planItems).length,
55
- acceptance_criteria: Object.keys(acceptanceCriteria).length
56
- });
57
- return state;
58
- }
59
- async function assertRequiredSourcesExist(workdir, state) {
60
- const errors = [];
61
- const checks = [
62
- ["product_architecture_source", "blocking_missing_source", "Product / Architecture Source"],
63
- ["technical_realization_plan", "blocking_missing_plan", "Technical Realization Plan"],
64
- ["acceptance_checklist", "blocking_missing_checklist", "Acceptance Checklist"]
65
- ];
66
- for (const [key, category, label] of checks) {
67
- const source = state.sources[key];
68
- const file = source?.path ?? `${key}.md`;
69
- if (!source || !(await pathExists(path.join(workdir, file)))) {
70
- errors.push(compileError(`${label} input is missing: ${file}`, category, file, 1, key, "all three authority inputs are required", "restore the missing source file and rerun compile"));
71
- }
72
- }
73
- throwCompileErrors(errors);
74
- }
75
- export function computeScopeConflicts(state) {
76
- const conflicts = [];
77
- const product = state.delivery?.product_architecture_scope;
78
- const productScope = product?.delivery_scope ?? "";
79
- const productRequiresFullPopulation = productScope === "full_population_operation";
80
- const productIsCapabilityOnly = productScope === "system_capability_build" ||
81
- productScope === "representative_sample_validation" ||
82
- product?.full_population_required === false;
83
- for (const [planId, item] of Object.entries(state.graph?.plan_items ?? {})) {
84
- if (productRequiresFullPopulation && item.delivery_scope !== "full_population_operation" && item.delivery_scope !== "out_of_scope_backlog") {
85
- conflicts.push(`scope_conflict_requires_decision: Product / Architecture Source requires full_population_operation but ${planId} delivery_scope=${item.delivery_scope || "missing"}${compileReportSuffix("blocking_scope_conflict", item.source_file, item.source_start_line, "delivery_scope", "Product source and plan delivery scopes disagree", "align the source, plan and checklist delivery scope")}`);
86
- }
87
- if (productIsCapabilityOnly && item.delivery_scope === "full_population_operation" && productScope !== "mixed_scope_requires_boundary") {
88
- conflicts.push(`scope_conflict_requires_decision: Product / Architecture Source delivery_scope=${productScope || "missing"} but ${planId} delivery_scope=full_population_operation${compileReportSuffix("blocking_scope_conflict", item.source_file, item.source_start_line, "delivery_scope", "Product source and plan delivery scopes disagree", "align the source, plan and checklist delivery scope")}`);
89
- }
90
- }
91
- for (const [acId, ac] of Object.entries(state.graph?.acceptance_criteria ?? {})) {
92
- if (productRequiresFullPopulation && (ac.acceptance_scope === "full_population_not_required" || ac.full_population_required === false)) {
93
- conflicts.push(`scope_conflict_requires_decision: Product / Architecture Source requires full_population_operation but ${acId} full_population_required=false${compileReportSuffix("blocking_scope_conflict", ac.source_file, ac.source_start_line, "full_population_required", "Product source and checklist full-population requirements disagree", "align the source, plan and checklist delivery scope")}`);
94
- }
95
- if (productIsCapabilityOnly && (ac.acceptance_scope === "full_population_operation" || ac.full_population_required === true) && productScope !== "mixed_scope_requires_boundary") {
96
- conflicts.push(`scope_conflict_requires_decision: Product / Architecture Source delivery_scope=${productScope || "missing"} but ${acId} acceptance_scope=full_population_operation${compileReportSuffix("blocking_scope_conflict", ac.source_file, ac.source_start_line, "acceptance_scope", "Product source and checklist delivery scopes disagree", "align the source, plan and checklist delivery scope")}`);
97
- }
98
- }
99
- return [...new Set(conflicts)];
100
- }
101
- function compileProgress(state) {
102
- const planEntries = Object.entries(state.graph.plan_items);
103
- const sampleNames = unique([
104
- ...state.delivery.product_architecture_scope.representative_samples_validate,
105
- ...planEntries.flatMap(([, item]) => item.representative_samples)
106
- ]);
107
- const systemPlanIds = planEntries.filter(([, item]) => item.delivery_scope === "system_capability_build").map(([planId]) => planId);
108
- const representativePlanIds = planEntries.filter(([, item]) => item.delivery_scope === "representative_sample_validation").map(([planId]) => planId);
109
- const fullPopulationRequired = state.delivery.product_architecture_scope.delivery_scope === "full_population_operation" ||
110
- state.delivery.product_architecture_scope.full_population_required === true ||
111
- Object.values(state.graph.acceptance_criteria).some((ac) => ac.acceptance_scope === "full_population_operation" || ac.full_population_required === true);
112
- return {
113
- system_capability_progress: {
114
- status: systemPlanIds.length > 0 ? "not_started" : "not_in_scope",
115
- plan_items: systemPlanIds
116
- },
117
- representative_sample_progress: {
118
- status: sampleNames.length > 0 || representativePlanIds.length > 0 ? "not_started" : "not_in_scope",
119
- plan_items: representativePlanIds,
120
- samples: sampleNames
121
- },
122
- real_object_coverage: {
123
- status: sampleNames.length > 0 ? "sampled_only" : "unknown",
124
- covered_objects: sampleNames
125
- },
126
- full_population_operation_progress: {
127
- status: fullPopulationRequired ? "not_started" : "not_in_scope"
128
- }
129
- };
130
- }
131
- function unique(values) {
132
- return [...new Set(values.filter(Boolean))];
133
- }
@@ -1,52 +0,0 @@
1
- import { type SuperpowersTaskState } from "./superpowers-task-state-schema.js";
2
- export type CompletionOutputStatus = "accept" | "reject" | "blocked";
3
- export interface CompletionOutputContract {
4
- product_goal_complete: boolean;
5
- acceptance_target_status: string;
6
- completion_output_status: CompletionOutputStatus;
7
- final_answer_allowed: boolean;
8
- required_user_visible_status: "accepted" | "rejected" | "blocked";
9
- final_answer: CompletionOutputStatus;
10
- exit_code: 0 | 1 | 2;
11
- blocked_reasons: string[];
12
- rejection_reasons: string[];
13
- audit_task_complete: boolean;
14
- final_gate_ran: boolean;
15
- generated_output_mismatch: boolean;
16
- }
17
- export interface CompletionOutputResolveInput {
18
- final_gate_ran?: boolean;
19
- product_goal_complete?: boolean;
20
- acceptance_target_status?: string;
21
- audit_task_complete?: boolean;
22
- validator_errors?: string[];
23
- acceptance_validator_errors?: string[];
24
- blocked_reasons?: string[];
25
- rejection_reasons?: string[];
26
- generated_output_mismatch?: boolean;
27
- required_command_not_run?: boolean;
28
- environment_unknown?: boolean;
29
- state_unreadable?: boolean;
30
- source_unreadable?: boolean;
31
- kernel_invalid?: boolean;
32
- required_validator_unavailable?: boolean;
33
- }
34
- export interface CompletionOutputSurface {
35
- surface: string;
36
- text: string;
37
- }
38
- export interface CompletionPhraseFinding {
39
- surface: string;
40
- phrase: string;
41
- line: number;
42
- text: string;
43
- }
44
- export declare function resolveCompletionOutputStatus(input: CompletionOutputResolveInput): CompletionOutputContract;
45
- export declare function completionOutputContractFromState(state: SuperpowersTaskState): CompletionOutputContract;
46
- export declare function applyCompletionOutputContract(state: SuperpowersTaskState, contract: CompletionOutputContract): void;
47
- export declare function scanFalseCompletionPhrases(input: {
48
- completion_output_status: CompletionOutputStatus;
49
- surfaces: CompletionOutputSurface[] | string;
50
- }): CompletionPhraseFinding[];
51
- export declare function scanGeneratedCompletionOutputSurfaces(workdir: string, contract: CompletionOutputContract): Promise<CompletionPhraseFinding[]>;
52
- export declare function completionPhraseFindingMessages(findings: CompletionPhraseFinding[]): string[];
@@ -1,228 +0,0 @@
1
- import path from "node:path";
2
- import { pathExists, readText } from "./fs.js";
3
- import { asStringArray, isRecord } from "./superpowers-task-state-schema.js";
4
- const BLOCKING_TARGET_STATUSES = new Set(["not_run", "blocked", "under_specified", "unknown"]);
5
- const REJECTING_TARGET_STATUSES = new Set(["partial", "failed", "rejected", "invalidated", "not_accepted"]);
6
- const GENERATED_COMPLETION_SURFACES = [
7
- "derived/final-summary.md",
8
- "derived/final-card.md",
9
- "derived/final-acceptance-verdict.json",
10
- "derived/final-acceptance-verdict.md",
11
- "derived/plan-conformance-matrix.json",
12
- "derived/plan-conformance-matrix.md",
13
- "derived/local-audit.md",
14
- "goal-objective.txt",
15
- "execution-binding.md",
16
- "workflow-protocol.md"
17
- ];
18
- const FORBIDDEN_PHRASES = [
19
- { phrase: "update_goal(status=\"complete\")", pattern: /update_goal\s*\(\s*status\s*=\s*["']complete["']\s*\)/i },
20
- { phrase: "goal achieved", pattern: /\bgoal achieved\b/i },
21
- { phrase: "ready to merge", pattern: /\bready to merge\b/i },
22
- { phrase: "implementation complete", pattern: /\bimplementation complete\b/i },
23
- { phrase: "all passed", pattern: /\ball (?:acs?|acceptance criteria|checks|tests)?\s*passed\b/i },
24
- { phrase: "product complete", pattern: /\bproduct complete\b/i },
25
- { phrase: "completed", pattern: /\bcompleted\b/i },
26
- { phrase: "complete", pattern: /\bcomplete\b/i },
27
- { phrase: "accepted", pattern: /\baccepted\b/i },
28
- { phrase: "accept", pattern: /\baccept\b/i },
29
- { phrase: "done", pattern: /\bdone\b/i },
30
- { phrase: "success", pattern: /\bsuccess(?:ful)?\b/i },
31
- { phrase: "任务完成", pattern: /任务完成/ },
32
- { phrase: "已完成", pattern: /已完成/ },
33
- { phrase: "验收通过", pattern: /验收通过/ },
34
- { phrase: "目标完成", pattern: /目标完成/ },
35
- { phrase: "全部通过", pattern: /全部通过/ },
36
- { phrase: "可以合并", pattern: /可以合并/ }
37
- ];
38
- export function resolveCompletionOutputStatus(input) {
39
- const finalGateRan = input.final_gate_ran === true;
40
- const productGoalComplete = input.product_goal_complete === true;
41
- const acceptanceTargetStatus = normalizeAcceptanceTargetStatus(input.acceptance_target_status);
42
- const validatorErrors = [...(input.validator_errors ?? []), ...(input.acceptance_validator_errors ?? [])].filter(Boolean);
43
- const blockedReasons = [...(input.blocked_reasons ?? [])];
44
- const rejectionReasons = [...(input.rejection_reasons ?? [])];
45
- if (!finalGateRan) {
46
- blockedReasons.push("final_gate_not_run");
47
- }
48
- if (input.required_command_not_run === true) {
49
- blockedReasons.push("required_command_not_run");
50
- }
51
- if (input.environment_unknown === true) {
52
- blockedReasons.push("environment_unknown");
53
- }
54
- if (input.state_unreadable === true) {
55
- blockedReasons.push("state_unreadable");
56
- }
57
- if (input.source_unreadable === true) {
58
- blockedReasons.push("source_unreadable");
59
- }
60
- if (input.kernel_invalid === true) {
61
- blockedReasons.push("kernel_invalid");
62
- }
63
- if (input.required_validator_unavailable === true) {
64
- blockedReasons.push("required_validator_unavailable");
65
- }
66
- if (input.generated_output_mismatch === true) {
67
- blockedReasons.push("generated_output_mismatch");
68
- }
69
- if (BLOCKING_TARGET_STATUSES.has(acceptanceTargetStatus)) {
70
- blockedReasons.push(`acceptance_target_status=${acceptanceTargetStatus}`);
71
- }
72
- if (REJECTING_TARGET_STATUSES.has(acceptanceTargetStatus)) {
73
- rejectionReasons.push(`acceptance_target_status=${acceptanceTargetStatus}`);
74
- }
75
- if (finalGateRan && !productGoalComplete && !BLOCKING_TARGET_STATUSES.has(acceptanceTargetStatus)) {
76
- rejectionReasons.push("product_goal_complete=false");
77
- }
78
- if (validatorErrors.length > 0) {
79
- rejectionReasons.push(...validatorErrors);
80
- }
81
- const accept = finalGateRan &&
82
- productGoalComplete &&
83
- isAcceptedStatus(acceptanceTargetStatus) &&
84
- validatorErrors.length === 0 &&
85
- blockedReasons.length === 0 &&
86
- rejectionReasons.length === 0;
87
- const completionOutputStatus = accept ? "accept" : blockedReasons.length > 0 ? "blocked" : "reject";
88
- const exitCode = completionOutputStatus === "accept" ? 0 : completionOutputStatus === "reject" ? 1 : 2;
89
- return {
90
- product_goal_complete: productGoalComplete && accept,
91
- acceptance_target_status: acceptanceTargetStatus,
92
- completion_output_status: completionOutputStatus,
93
- final_answer_allowed: completionOutputStatus === "accept",
94
- required_user_visible_status: completionOutputStatus === "accept" ? "accepted" : completionOutputStatus === "reject" ? "rejected" : "blocked",
95
- final_answer: completionOutputStatus,
96
- exit_code: exitCode,
97
- blocked_reasons: unique(blockedReasons),
98
- rejection_reasons: unique(rejectionReasons),
99
- audit_task_complete: input.audit_task_complete === true,
100
- final_gate_ran: finalGateRan,
101
- generated_output_mismatch: input.generated_output_mismatch === true
102
- };
103
- }
104
- export function completionOutputContractFromState(state) {
105
- const finalRecord = state.final;
106
- const gate = isRecord(state.gates?.final_gate) ? state.gates.final_gate : {};
107
- const hasStoredOutput = typeof finalRecord.completion_output_status === "string" || typeof gate.completion_output_status === "string";
108
- return resolveCompletionOutputStatus({
109
- final_gate_ran: hasStoredOutput || isRecord(state.gates?.final_gate),
110
- product_goal_complete: state.final.product_goal_complete,
111
- acceptance_target_status: state.final.acceptance_target_status,
112
- audit_task_complete: state.final.audit_task_complete,
113
- blocked_reasons: asStringArray(finalRecord.blocked_reasons ?? gate.blocked_reasons),
114
- rejection_reasons: asStringArray(finalRecord.rejection_reasons ?? gate.rejection_reasons),
115
- generated_output_mismatch: finalRecord.generated_output_mismatch === true || gate.generated_output_mismatch === true
116
- });
117
- }
118
- export function applyCompletionOutputContract(state, contract) {
119
- const finalRecord = state.final;
120
- const metaRecord = state.meta;
121
- finalRecord.product_goal_complete = contract.product_goal_complete;
122
- state.meta.product_goal_complete = contract.product_goal_complete;
123
- finalRecord.acceptance_target_status = contract.acceptance_target_status;
124
- state.meta.acceptance_target_status = contract.acceptance_target_status;
125
- finalRecord.audit_task_complete = contract.audit_task_complete;
126
- state.meta.audit_task_complete = contract.audit_task_complete;
127
- finalRecord.completion_output_status = contract.completion_output_status;
128
- finalRecord.final_answer_allowed = contract.final_answer_allowed;
129
- finalRecord.required_user_visible_status = contract.required_user_visible_status;
130
- finalRecord.final_answer = contract.final_answer;
131
- finalRecord.exit_code = contract.exit_code;
132
- finalRecord.blocked_reasons = contract.blocked_reasons;
133
- finalRecord.rejection_reasons = contract.rejection_reasons;
134
- finalRecord.generated_output_mismatch = contract.generated_output_mismatch;
135
- metaRecord.completion_output_status = contract.completion_output_status;
136
- }
137
- export function scanFalseCompletionPhrases(input) {
138
- if (input.completion_output_status === "accept") {
139
- return [];
140
- }
141
- const surfaces = typeof input.surfaces === "string" ? [{ surface: "inline", text: input.surfaces }] : input.surfaces;
142
- const findings = [];
143
- for (const surface of surfaces) {
144
- const lines = surface.text.split(/\r?\n/);
145
- for (const [index, line] of lines.entries()) {
146
- if (lineAllowedForNonAccept(line)) {
147
- continue;
148
- }
149
- for (const item of FORBIDDEN_PHRASES) {
150
- if (item.pattern.test(line)) {
151
- findings.push({ surface: surface.surface, phrase: item.phrase, line: index + 1, text: line.trim() });
152
- break;
153
- }
154
- }
155
- }
156
- }
157
- return findings;
158
- }
159
- export async function scanGeneratedCompletionOutputSurfaces(workdir, contract) {
160
- const surfaces = [];
161
- for (const relative of GENERATED_COMPLETION_SURFACES) {
162
- const file = path.join(workdir, ...relative.split("/"));
163
- if (await pathExists(file)) {
164
- surfaces.push({ surface: relative, text: await readText(file) });
165
- }
166
- }
167
- return scanFalseCompletionPhrases({ completion_output_status: contract.completion_output_status, surfaces });
168
- }
169
- export function completionPhraseFindingMessages(findings) {
170
- return findings.map((finding) => `false completion phrase in ${finding.surface}:${finding.line}: ${finding.phrase}`);
171
- }
172
- function normalizeAcceptanceTargetStatus(value) {
173
- const normalized = String(value ?? "not_run").trim().toLowerCase();
174
- if (normalized === "accepted") {
175
- return "complete";
176
- }
177
- if (normalized === "not accepted") {
178
- return "not_accepted";
179
- }
180
- return normalized || "not_run";
181
- }
182
- function isAcceptedStatus(value) {
183
- return value === "complete" || value === "accepted";
184
- }
185
- function lineAllowedForNonAccept(line) {
186
- const text = line.trim();
187
- if (!text) {
188
- return true;
189
- }
190
- if (/Audit workflow completed; acceptance target not complete\./i.test(text)) {
191
- return true;
192
- }
193
- if (/^Product goal complete:\s*false$/i.test(text)) {
194
- return true;
195
- }
196
- if (/^(?:complete|partial|acceptance_required|missing_layer)_count:\s*\d+$/i.test(text)) {
197
- return true;
198
- }
199
- if (/^-\s+[A-Z]+-\d+:\s*(?:complete|accepted|accept)\s*$/i.test(text)) {
200
- return true;
201
- }
202
- const jsonField = /^"([^"]+)"\s*:\s*/.exec(text);
203
- if (jsonField && !/^(final_answer|final_conclusion|conclusion|summary|message|required_user_visible_status)$/i.test(jsonField[1])) {
204
- return true;
205
- }
206
- if (/\b(product_goal_complete|completion_output_status|acceptance_target_status|audit_task_complete)\b/i.test(text)) {
207
- return true;
208
- }
209
- if (/["']?(overall_)?status["']?\s*:\s*["']?(complete|accepted|accept)["']?/i.test(text)) {
210
- return true;
211
- }
212
- if (/diagnostic|row-level|row status|not[_ -]?in[_ -]?scope/i.test(text)) {
213
- return true;
214
- }
215
- if (/\b(do not|must not|cannot|never|unless|only when|forbid|forbidden|invalid|false[- ]completion|does not mean|cannot authorize|cannot imply)\b/i.test(text)) {
216
- return true;
217
- }
218
- if (/\bnot\s+(?:complete|completed|accepted|accept|done|successful)\b/i.test(text)) {
219
- return true;
220
- }
221
- if (/不得|不能|禁止|仅当|不是|不等于/.test(text)) {
222
- return true;
223
- }
224
- return false;
225
- }
226
- function unique(values) {
227
- return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
228
- }
@@ -1,2 +0,0 @@
1
- import type { SuperpowersTaskState } from "./superpowers-task-state-schema.js";
2
- export declare function validatePlanCompletionConformance(state: SuperpowersTaskState, errors: string[]): void;
@@ -1,24 +0,0 @@
1
- import { primitiveText } from "./plan-validator-common.js";
2
- export function validatePlanCompletionConformance(state, errors) {
3
- for (const [planId, item] of Object.entries(state.graph?.plan_items ?? {})) {
4
- if (item.status !== "complete") {
5
- continue;
6
- }
7
- if (item.implementation_paths.length === 0 && item.delivery_scope !== "out_of_scope_backlog") {
8
- errors.push(`plan item ${planId} is complete but has no implementation_paths`);
9
- }
10
- if ((item.owner_surfaces ?? []).length > 0 && !item.required_proof_layers.some((layer) => layer.endsWith(".ui_browser"))) {
11
- errors.push(`plan item ${planId} is complete but owner_surfaces has no related ui_browser proof layer`);
12
- }
13
- if ((item.required_tests ?? []).length === 0 && item.explicit_no_test_scope !== true) {
14
- errors.push(`plan item ${planId} is complete but required_tests is empty and no explicit_no_test_scope is recorded`);
15
- }
16
- const shortcuts = item.non_completing_shortcuts ?? [];
17
- const evidenceText = primitiveText(state.evidence.filter((evidence) => evidence.proves.some((layer) => item.required_proof_layers.includes(layer))));
18
- for (const shortcut of shortcuts) {
19
- if (shortcut && evidenceText.toLowerCase().includes(shortcut.toLowerCase())) {
20
- errors.push(`plan item ${planId} is complete but evidence uses forbidden shortcut: ${shortcut}`);
21
- }
22
- }
23
- }
24
- }
@@ -1,6 +0,0 @@
1
- import type { SuperpowersTaskState } from "./superpowers-task-state-schema.js";
2
- export interface SuperpowersContradictionScan {
3
- errors: string[];
4
- historicalCompleteIgnored: boolean;
5
- }
6
- export declare function scanSuperpowersContradictions(workdir: string, state: SuperpowersTaskState): Promise<SuperpowersContradictionScan>;
@@ -1,126 +0,0 @@
1
- import path from "node:path";
2
- import { listFiles, pathExists, readText } from "./fs.js";
3
- const OWNER_SURFACE_FORBIDDEN_STATES = ["尚未运行自测", "运行未记录", "未验证", "不可用", "暂不可用", "页面无明显变化"];
4
- export async function scanSuperpowersContradictions(workdir, state) {
5
- const files = await listFiles(workdir);
6
- const errors = [
7
- ...scanFinalStateContradictions(state),
8
- ...(await scanCurrentFailureArtifacts(workdir, files))
9
- ];
10
- const historicalCompleteIgnored = errors.length > 0 && (await hasHistoricalCompleteEvent(workdir));
11
- if (historicalCompleteIgnored) {
12
- errors.push("historical_complete_ignored: Historical stale completion event detected and ignored. Current recomputed product_goal_complete=false.");
13
- }
14
- if (errors.length > 0) {
15
- errors.push("workflow_gate_bug_prevented: current contradiction scan prevents product_goal_complete=true.");
16
- }
17
- return { errors: unique(errors), historicalCompleteIgnored };
18
- }
19
- function scanFinalStateContradictions(state) {
20
- const errors = [];
21
- if (state.meta?.product_goal_complete === false && state.final?.product_goal_complete === true) {
22
- errors.push("current contradiction task_state_product_goal_mismatch: meta product_goal_complete=false but final product_goal_complete=true.");
23
- }
24
- if (state.meta?.acceptance_target_status && state.final?.acceptance_target_status && state.meta.acceptance_target_status !== state.final.acceptance_target_status) {
25
- errors.push(`current contradiction task_state_acceptance_status_mismatch: meta=${state.meta.acceptance_target_status} final=${state.final.acceptance_target_status}.`);
26
- }
27
- for (const commandRun of state.command_runs ?? []) {
28
- if (Number(commandRun.exit_code) !== 0) {
29
- errors.push(`current contradiction command_run_failed: ${commandRun.command_run_id} ac=${commandRun.ac_id} proof_layer=${commandRun.proof_layer} exit_code=${commandRun.exit_code}.`);
30
- }
31
- }
32
- return errors;
33
- }
34
- async function scanCurrentFailureArtifacts(workdir, files) {
35
- const errors = [];
36
- for (const file of files) {
37
- const relative = slash(path.relative(workdir, file));
38
- if (relative.endsWith(".last-run.json")) {
39
- errors.push(...(await scanPlaywrightLastRun(file, relative)));
40
- continue;
41
- }
42
- if (/test-results\/.*error-context\.md$/i.test(relative)) {
43
- errors.push(...(await scanOwnerDomErrorContext(file, relative)));
44
- continue;
45
- }
46
- if (isFailureJsonCandidate(relative)) {
47
- errors.push(...(await scanFailedJsonArtifact(file, relative)));
48
- }
49
- }
50
- return errors;
51
- }
52
- async function scanPlaywrightLastRun(file, relative) {
53
- const parsed = await readJsonRecord(file);
54
- if (!parsed) {
55
- return [];
56
- }
57
- const status = String(parsed.status ?? parsed.outcome ?? "").toLowerCase();
58
- const failedTests = Array.isArray(parsed.failedTests) ? parsed.failedTests : Array.isArray(parsed.failed_tests) ? parsed.failed_tests : [];
59
- if (status !== "failed" && failedTests.length === 0) {
60
- return [];
61
- }
62
- return [
63
- `current contradiction playwright_last_run_failed: ${relative} status=${status || "unknown"} failed_tests=${failedTests
64
- .map(String)
65
- .join(", ") || "(unspecified)"}.`
66
- ];
67
- }
68
- async function scanOwnerDomErrorContext(file, relative) {
69
- const text = await readText(file);
70
- const findings = OWNER_SURFACE_FORBIDDEN_STATES.filter((state) => text.includes(state));
71
- if (findings.length === 0) {
72
- return [];
73
- }
74
- return [`current contradiction owner_dom_forbidden_state: ${relative} contains ${findings.join(", ")}.`];
75
- }
76
- async function scanFailedJsonArtifact(file, relative) {
77
- const parsed = await readJsonRecord(file);
78
- if (!parsed) {
79
- return [];
80
- }
81
- const text = JSON.stringify(parsed);
82
- const status = String(parsed.status ?? parsed.outcome ?? parsed.result ?? "").toLowerCase();
83
- const failures = Number(parsed.failures ?? parsed.failed ?? parsed.failed_count ?? 0);
84
- if (status !== "failed" && failures <= 0 && !/"failed"/i.test(text)) {
85
- return [];
86
- }
87
- return [`current contradiction failed_test_result_artifact: ${relative} reports failed status.`];
88
- }
89
- function isFailureJsonCandidate(relative) {
90
- return (/\.json$/i.test(relative) &&
91
- /(^|\/)(test-results|playwright-report|junit|command-runs|negative-evidence|negative_evidence)(\/|$)/i.test(relative));
92
- }
93
- async function hasHistoricalCompleteEvent(workdir) {
94
- const eventsPath = path.join(workdir, "events.ndjson");
95
- if (!(await pathExists(eventsPath))) {
96
- return false;
97
- }
98
- const content = await readText(eventsPath);
99
- return content
100
- .split(/\r?\n/)
101
- .filter(Boolean)
102
- .some((line) => {
103
- try {
104
- const event = JSON.parse(line);
105
- return String(event.event ?? event.event_type ?? event.type ?? "") === "final_gate" && event.product_goal_complete === true;
106
- }
107
- catch {
108
- return /final_gate/.test(line) && /product_goal_complete["']?\s*:\s*true/.test(line);
109
- }
110
- });
111
- }
112
- async function readJsonRecord(file) {
113
- try {
114
- const parsed = JSON.parse(await readText(file));
115
- return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : undefined;
116
- }
117
- catch {
118
- return undefined;
119
- }
120
- }
121
- function slash(value) {
122
- return value.split(path.sep).join("/");
123
- }
124
- function unique(values) {
125
- return [...new Set(values.filter(Boolean))];
126
- }