project-tiny-context-harness 0.2.85 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/README.md +164 -427
  2. package/assets/README.md +284 -455
  3. package/assets/README.zh-CN.md +200 -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 +63 -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 +467 -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 -163
  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 +4 -2
  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 -245
  275. package/assets/skills/composite-long-task-workflow/assets/execution-binding.template.md +0 -62
  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 -682
  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 -91
  313. package/dist/lib/superpowers-task-completion-output.js +0 -374
  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 -393
  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 -35
  336. package/dist/lib/superpowers-task-gates.d.ts +0 -12
  337. package/dist/lib/superpowers-task-gates.js +0 -267
  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 -460
  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 -293
@@ -1,374 +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
- const contract = 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
- const triage = isRecord(finalRecord.blocker_triage)
118
- ? finalRecord.blocker_triage
119
- : isRecord(gate.blocker_triage)
120
- ? gate.blocker_triage
121
- : undefined;
122
- const candidate = isRecord(finalRecord.candidate_state)
123
- ? finalRecord.candidate_state
124
- : isRecord(gate.candidate_state)
125
- ? gate.candidate_state
126
- : undefined;
127
- if (triage) {
128
- contract.blocker_triage = triage;
129
- }
130
- if (candidate) {
131
- contract.candidate_state = candidate;
132
- }
133
- return contract;
134
- }
135
- export function applyCompletionOutputContract(state, contract) {
136
- const finalRecord = state.final;
137
- const metaRecord = state.meta;
138
- finalRecord.product_goal_complete = contract.product_goal_complete;
139
- state.meta.product_goal_complete = contract.product_goal_complete;
140
- finalRecord.acceptance_target_status = contract.acceptance_target_status;
141
- state.meta.acceptance_target_status = contract.acceptance_target_status;
142
- finalRecord.audit_task_complete = contract.audit_task_complete;
143
- state.meta.audit_task_complete = contract.audit_task_complete;
144
- finalRecord.completion_output_status = contract.completion_output_status;
145
- finalRecord.final_answer_allowed = contract.final_answer_allowed;
146
- finalRecord.required_user_visible_status = contract.required_user_visible_status;
147
- finalRecord.final_answer = contract.final_answer;
148
- finalRecord.exit_code = contract.exit_code;
149
- finalRecord.blocked_reasons = contract.blocked_reasons;
150
- finalRecord.rejection_reasons = contract.rejection_reasons;
151
- finalRecord.generated_output_mismatch = contract.generated_output_mismatch;
152
- if (contract.blocker_triage) {
153
- finalRecord.blocker_triage = contract.blocker_triage;
154
- }
155
- if (contract.candidate_state) {
156
- finalRecord.candidate_state = contract.candidate_state;
157
- }
158
- metaRecord.completion_output_status = contract.completion_output_status;
159
- }
160
- export function scanFalseCompletionPhrases(input) {
161
- return scanFalseCompletionPhrasesDetailed(input);
162
- }
163
- export function scanFalseCompletionPhrasesDetailed(input) {
164
- if (input.completion_output_status === "accept") {
165
- return [];
166
- }
167
- const surfaces = typeof input.surfaces === "string" ? [{ surface: "inline", text: input.surfaces }] : input.surfaces;
168
- const findings = [];
169
- for (const surface of surfaces) {
170
- const lines = surface.text.split(/\r?\n/);
171
- for (const [index, line] of lines.entries()) {
172
- const allowed = classifyAllowedCompletionLine(surface.surface, line);
173
- if (allowed) {
174
- continue;
175
- }
176
- for (const item of FORBIDDEN_PHRASES) {
177
- if (item.pattern.test(line)) {
178
- findings.push({
179
- surface: surface.surface,
180
- surface_type: classifySurfaceLine(surface.surface, line),
181
- classification: "true_false_completion_claim",
182
- phrase: item.phrase,
183
- line: index + 1,
184
- text: line.trim(),
185
- self_recoverable: isSelfRecoverableSurface(surface.surface)
186
- });
187
- break;
188
- }
189
- }
190
- }
191
- }
192
- return findings;
193
- }
194
- export async function scanGeneratedCompletionOutputSurfaces(workdir, contract) {
195
- return scanGeneratedCompletionOutputSurfacesDetailed(workdir, contract);
196
- }
197
- export async function scanGeneratedCompletionOutputSurfacesDetailed(workdir, contract) {
198
- const surfaces = [];
199
- for (const relative of GENERATED_COMPLETION_SURFACES) {
200
- const file = path.join(workdir, ...relative.split("/"));
201
- if (await pathExists(file)) {
202
- surfaces.push({ surface: relative, text: await readText(file) });
203
- }
204
- }
205
- return scanFalseCompletionPhrasesDetailed({ completion_output_status: contract.completion_output_status, surfaces });
206
- }
207
- export function completionPhraseFindingMessages(findings) {
208
- return findings.map((finding) => {
209
- const kind = finding.classification ? ` ${finding.classification}` : "";
210
- return `false completion phrase${kind} in ${finding.surface}:${finding.line}: ${finding.phrase}`;
211
- });
212
- }
213
- export function triageFinalGateBlockers(input) {
214
- const errors = unique(input.errors);
215
- const findings = input.output_findings ?? [];
216
- const previous = unique(input.previous_transient_findings ?? []);
217
- const details = unique([...errors, ...findings.map((finding) => `${finding.surface}:${finding.line}:${finding.phrase}`), ...previous]);
218
- const recoveryAttempted = input.recovery_attempted === true;
219
- const recoveryAction = input.recovery_action ?? "";
220
- if (findings.length > 0) {
221
- const selfRecoverable = findings.every((finding) => finding.self_recoverable === true);
222
- return {
223
- category: selfRecoverable ? "self_recoverable_generated_output_mismatch" : "generated_output_mismatch",
224
- self_recoverable: selfRecoverable,
225
- recovery_attempted: recoveryAttempted,
226
- recovery_action: recoveryAction,
227
- next_action: selfRecoverable
228
- ? "regenerate derived generated-output surfaces and rerun final-gate once"
229
- : "remove or regenerate the user-visible false completion wording before final-gate can accept",
230
- details,
231
- blocker_count: findings.length
232
- };
233
- }
234
- const text = errors.join("\n");
235
- if (/harness_drift|protected_baseline|product task modified|harness task missing/i.test(text)) {
236
- return blocker("harness_drift_blocked", false, recoveryAttempted, recoveryAction, "split harness changes into a harness_task with adversarial fixtures before proving product completion", details);
237
- }
238
- if (/source file is missing|source_unreadable|scope_conflict_requires_decision|three[- ]input|Product \/ Plan \/ Checklist|Context Delta coverage is unresolved/i.test(text)) {
239
- return blocker("contract_blocked", false, recoveryAttempted, recoveryAction, "clarify or restore the source contract before rerunning final-gate", details);
240
- }
241
- if (/required command not_run|command not_run|browser unavailable|playwright unavailable|dependency unavailable|environment_unknown|required_validator_unavailable|permission|MFA/i.test(text)) {
242
- return blocker("environment_blocked", false, recoveryAttempted, recoveryAction, "restore the unavailable command, browser, dependency or permission and rerun final-gate", details);
243
- }
244
- if (/stale evidence|negative evidence|current contradiction|source hash mismatch|dirty worktree|failed_test_result_artifact|owner_dom_forbidden_state|playwright_last_run_failed/i.test(text)) {
245
- return blocker("stale_or_contradictory_evidence", false, recoveryAttempted, recoveryAction, "replace stale or contradictory evidence with fresh current-attempt evidence", details);
246
- }
247
- if (/missing current|missing assertion result|not machine-backed|missing required proof layer|proof layer .*missing|requires all required plan items|incomplete|no evidence_ids|unknown evidence_id/i.test(text)) {
248
- return blocker("missing_current_evidence", false, recoveryAttempted, recoveryAction, "add fresh current-attempt evidence for the missing AC, PI or proof layer", details);
249
- }
250
- if (previous.length > 0 && errors.length === 0) {
251
- return blocker("transient_state_bookkeeping", true, recoveryAttempted, recoveryAction || "cleared previous transient bookkeeping before current candidate scan", "cleared previous transient bookkeeping; no user action required", details);
252
- }
253
- if (errors.length > 0) {
254
- return blocker("product_evidence_failed", false, recoveryAttempted, recoveryAction, "fix the current product evidence failure and rerun final-gate", details);
255
- }
256
- return blocker("none", false, recoveryAttempted, recoveryAction, "no blocker remains", details);
257
- }
258
- function normalizeAcceptanceTargetStatus(value) {
259
- const normalized = String(value ?? "not_run").trim().toLowerCase();
260
- if (normalized === "accepted") {
261
- return "complete";
262
- }
263
- if (normalized === "not accepted") {
264
- return "not_accepted";
265
- }
266
- return normalized || "not_run";
267
- }
268
- function isAcceptedStatus(value) {
269
- return value === "complete" || value === "accepted";
270
- }
271
- function classifyAllowedCompletionLine(surface, line) {
272
- const text = line.trim();
273
- if (!text) {
274
- return "allowed_rule_explanation";
275
- }
276
- if (/Audit workflow completed; acceptance target not complete\./i.test(text)) {
277
- return "allowed_rule_explanation";
278
- }
279
- if (/^Product goal complete:\s*false$/i.test(text)) {
280
- return "allowed_diagnostic_status";
281
- }
282
- if (/^(?:complete|partial|acceptance_required|missing_layer)_count:\s*\d+$/i.test(text)) {
283
- return "allowed_diagnostic_status";
284
- }
285
- if (/^-\s+[A-Z]+-\d+:\s*(?:complete|accepted|accept)\s*$/i.test(text)) {
286
- return "allowed_diagnostic_status";
287
- }
288
- const jsonField = /^"([^"]+)"\s*:\s*/.exec(text);
289
- if (jsonField && !/^(final_answer|final_conclusion|conclusion|summary|message|required_user_visible_status)$/i.test(jsonField[1])) {
290
- return "allowed_machine_status_field";
291
- }
292
- if (/\b(product_goal_complete|completion_output_status|acceptance_target_status|audit_task_complete)\b/i.test(text)) {
293
- return "allowed_diagnostic_status";
294
- }
295
- if (isDiagnosticSurface(surface) && /["']?(overall_)?status["']?\s*:\s*["']?(complete|accepted|accept)["']?/i.test(text)) {
296
- return "allowed_diagnostic_status";
297
- }
298
- if (/diagnostic|row-level|row status|not[_ -]?in[_ -]?scope/i.test(text)) {
299
- return "allowed_diagnostic_status";
300
- }
301
- 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)) {
302
- return "allowed_rule_explanation";
303
- }
304
- if (/\bnot\s+(?:complete|completed|accepted|accept|done|successful)\b/i.test(text)) {
305
- return "allowed_rule_explanation";
306
- }
307
- if (/不得|不能|禁止|仅当|不是|不等于/.test(text)) {
308
- return "allowed_rule_explanation";
309
- }
310
- return undefined;
311
- }
312
- function classifySurfaceLine(surface, line) {
313
- const normalized = surface.split(path.sep).join("/");
314
- if (/^Final answer:|Goal achieved|ready to merge|implementation complete/i.test(line)) {
315
- return "agent_final_answer";
316
- }
317
- if (normalized.endsWith("derived/final-summary.md")) {
318
- return "user_visible_final_summary";
319
- }
320
- if (normalized.endsWith("derived/final-card.md")) {
321
- return "final_card";
322
- }
323
- if (normalized.endsWith("goal-objective.txt")) {
324
- return "agent_final_answer";
325
- }
326
- if (normalized.endsWith("execution-binding.md")) {
327
- return "execution_binding_text";
328
- }
329
- if (normalized.endsWith("workflow-protocol.md")) {
330
- return "workflow_protocol_text";
331
- }
332
- if (/final-acceptance-verdict\.json$/.test(normalized)) {
333
- return "verdict_diagnostic";
334
- }
335
- if (/plan-conformance-matrix\.json$/.test(normalized)) {
336
- return "matrix_diagnostic";
337
- }
338
- if (/\.json$/.test(normalized)) {
339
- return "machine_readable_json_status";
340
- }
341
- if (/local-audit/.test(normalized)) {
342
- return "local_audit_diagnostic";
343
- }
344
- if (/derived\//.test(normalized)) {
345
- return "generated_summary";
346
- }
347
- return "unknown";
348
- }
349
- function isSelfRecoverableSurface(surface) {
350
- const normalized = surface.split(path.sep).join("/");
351
- return /^derived\/(?:final-summary|final-card|final-acceptance-verdict|plan-conformance-matrix|local-audit)\.(?:md|json)$/.test(normalized);
352
- }
353
- function isDiagnosticSurface(surface) {
354
- const type = classifySurfaceLine(surface, "");
355
- return (type === "machine_readable_json_status" ||
356
- type === "derived_diagnostic_json" ||
357
- type === "matrix_diagnostic" ||
358
- type === "verdict_diagnostic" ||
359
- type === "local_audit_diagnostic");
360
- }
361
- function blocker(category, selfRecoverable, recoveryAttempted, recoveryAction, nextAction, details) {
362
- return {
363
- category,
364
- self_recoverable: selfRecoverable,
365
- recovery_attempted: recoveryAttempted,
366
- recovery_action: recoveryAction,
367
- next_action: nextAction,
368
- details,
369
- blocker_count: category === "none" ? 0 : Math.max(1, details.length)
370
- };
371
- }
372
- function unique(values) {
373
- return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
374
- }
@@ -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
- }
@@ -1,3 +0,0 @@
1
- import type { SuperpowersEvidenceRecord, SuperpowersTaskState } from "./superpowers-task-state-schema.js";
2
- export declare function evaluateCurrentAttemptEvidence(state: SuperpowersTaskState, evidence: SuperpowersEvidenceRecord, layerId: string): string[];
3
- export declare function evaluateCurrentAttemptArtifact(workdir: string, evidence: SuperpowersEvidenceRecord, layerId: string): Promise<string[]>;