@interf/compiler 0.22.2 → 0.50.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 (616) hide show
  1. package/README.md +119 -282
  2. package/dist/bin-mcp.d.ts +2 -0
  3. package/dist/bin-mcp.js +63 -0
  4. package/dist/bin-runtime.d.ts +2 -0
  5. package/dist/bin-runtime.js +111 -0
  6. package/dist/cli/commands/agents.js +4 -35
  7. package/dist/cli/commands/auth.d.ts +20 -0
  8. package/dist/cli/commands/auth.js +161 -0
  9. package/dist/cli/commands/benchmark.d.ts +9 -0
  10. package/dist/cli/commands/benchmark.js +58 -0
  11. package/dist/cli/commands/build-plan.js +107 -139
  12. package/dist/cli/commands/build.d.ts +3 -4
  13. package/dist/cli/commands/build.js +16 -45
  14. package/dist/cli/commands/doctor.js +3 -3
  15. package/dist/cli/commands/graphs.d.ts +2 -0
  16. package/dist/cli/commands/graphs.js +344 -0
  17. package/dist/cli/commands/login.js +4 -6
  18. package/dist/cli/commands/logout.js +1 -1
  19. package/dist/cli/commands/mcp.d.ts +4 -2
  20. package/dist/cli/commands/mcp.js +846 -232
  21. package/dist/cli/commands/project.d.ts +2 -0
  22. package/dist/cli/commands/project.js +176 -0
  23. package/dist/cli/commands/reset.d.ts +3 -4
  24. package/dist/cli/commands/reset.js +10 -31
  25. package/dist/cli/commands/runs.js +136 -57
  26. package/dist/cli/commands/runtime.d.ts +24 -0
  27. package/dist/cli/commands/runtime.js +373 -0
  28. package/dist/cli/commands/status.d.ts +1 -0
  29. package/dist/cli/commands/status.js +35 -45
  30. package/dist/cli/commands/traces.d.ts +2 -0
  31. package/dist/cli/commands/traces.js +97 -0
  32. package/dist/cli/commands/wizard.js +171 -178
  33. package/dist/cli/index.d.ts +7 -4
  34. package/dist/cli/index.js +13 -7
  35. package/dist/cli/lib/http-client.d.ts +39 -0
  36. package/dist/cli/lib/http-client.js +73 -0
  37. package/dist/index.d.ts +2 -2
  38. package/dist/index.js +2 -2
  39. package/dist/packages/build-plans/authoring/brief.d.ts +538 -0
  40. package/dist/packages/build-plans/authoring/brief.js +89 -0
  41. package/dist/packages/build-plans/authoring/build-plan-authoring.d.ts +52 -11
  42. package/dist/packages/build-plans/authoring/build-plan-authoring.js +493 -46
  43. package/dist/packages/build-plans/authoring/build-plan-edit-session.d.ts +10 -1
  44. package/dist/packages/build-plans/authoring/build-plan-edit-session.js +27 -4
  45. package/dist/packages/build-plans/authoring/build-plan-improvement.d.ts +9 -6
  46. package/dist/packages/build-plans/authoring/build-plan-improvement.js +97 -46
  47. package/dist/packages/build-plans/authoring/lib/build-plan-edit-utils.d.ts +1 -0
  48. package/dist/packages/build-plans/authoring/lib/build-plan-edit-utils.js +7 -7
  49. package/dist/packages/build-plans/build-plan-resolution.d.ts +1 -1
  50. package/dist/packages/build-plans/build-plan-resolution.js +3 -3
  51. package/dist/packages/build-plans/index.d.ts +1 -1
  52. package/dist/packages/build-plans/index.js +1 -1
  53. package/dist/packages/build-plans/package/build-plan-definitions.d.ts +14 -13
  54. package/dist/packages/build-plans/package/build-plan-definitions.js +45 -42
  55. package/dist/packages/build-plans/package/build-plan-helpers.d.ts +3 -2
  56. package/dist/packages/build-plans/package/build-plan-helpers.js +27 -13
  57. package/dist/packages/build-plans/package/build-plan-review-paths.d.ts +5 -5
  58. package/dist/packages/build-plans/package/build-plan-review-paths.js +15 -15
  59. package/dist/packages/build-plans/package/build-plan-stage-runner.d.ts +5 -4
  60. package/dist/packages/build-plans/package/build-plan-stage-runner.js +23 -11
  61. package/dist/packages/build-plans/package/builtin-build-plan.d.ts +7 -8
  62. package/dist/packages/build-plans/package/builtin-build-plan.js +10 -11
  63. package/dist/packages/build-plans/package/context-interface.d.ts +14 -9
  64. package/dist/packages/build-plans/package/context-interface.js +14 -33
  65. package/dist/packages/build-plans/package/interf-build-plan-package.d.ts +6 -17
  66. package/dist/packages/build-plans/package/interf-build-plan-package.js +68 -64
  67. package/dist/packages/build-plans/package/local-build-plans.d.ts +21 -14
  68. package/dist/packages/build-plans/package/local-build-plans.js +105 -55
  69. package/dist/packages/build-plans/package/user-build-plans.js +1 -1
  70. package/dist/packages/contracts/index.d.ts +5 -2
  71. package/dist/packages/contracts/index.js +3 -1
  72. package/dist/packages/contracts/lib/context-graph-layer.d.ts +161 -0
  73. package/dist/packages/contracts/lib/context-graph-layer.js +216 -0
  74. package/dist/packages/contracts/lib/project-paths.d.ts +144 -0
  75. package/dist/packages/contracts/lib/project-paths.js +220 -0
  76. package/dist/packages/contracts/lib/project-schema.d.ts +423 -0
  77. package/dist/packages/contracts/lib/project-schema.js +138 -0
  78. package/dist/packages/contracts/lib/schema.d.ts +1273 -81
  79. package/dist/packages/contracts/lib/schema.js +675 -79
  80. package/dist/packages/contracts/utils/filesystem.d.ts +1 -0
  81. package/dist/packages/contracts/utils/filesystem.js +29 -1
  82. package/dist/packages/contracts/utils/parse.js +67 -0
  83. package/dist/packages/projects/index.d.ts +6 -0
  84. package/dist/packages/{project → projects}/index.js +0 -3
  85. package/dist/packages/{project → projects}/interf-detect.d.ts +12 -12
  86. package/dist/packages/{project → projects}/interf-detect.js +56 -50
  87. package/dist/packages/projects/interf.d.ts +2 -0
  88. package/dist/packages/projects/interf.js +1 -0
  89. package/dist/packages/projects/lib/schema.d.ts +77 -0
  90. package/dist/packages/projects/lib/schema.js +91 -0
  91. package/dist/packages/projects/source-config.d.ts +53 -0
  92. package/dist/packages/projects/source-config.js +339 -0
  93. package/dist/packages/projects/source-folders.d.ts +11 -0
  94. package/dist/packages/{project → projects}/source-folders.js +26 -26
  95. package/dist/packages/{engine → runtime}/action-planner.d.ts +1 -1
  96. package/dist/packages/{engine → runtime}/action-planner.js +20 -22
  97. package/dist/packages/runtime/action-values.d.ts +1 -0
  98. package/dist/packages/runtime/action-values.js +1 -0
  99. package/dist/packages/runtime/actions/errors.d.ts +2 -0
  100. package/dist/packages/runtime/actions/errors.js +12 -0
  101. package/dist/packages/runtime/actions/fields.d.ts +86 -0
  102. package/dist/packages/runtime/actions/form-builders.d.ts +14 -0
  103. package/dist/packages/runtime/actions/form-builders.js +667 -0
  104. package/dist/packages/runtime/actions/form-validators.d.ts +8 -0
  105. package/dist/packages/runtime/actions/form-validators.js +134 -0
  106. package/dist/packages/runtime/actions/helpers.d.ts +11 -0
  107. package/dist/packages/runtime/actions/helpers.js +80 -0
  108. package/dist/packages/runtime/actions/index.d.ts +8 -0
  109. package/dist/packages/runtime/actions/index.js +11 -0
  110. package/dist/packages/runtime/actions/registry.d.ts +64 -0
  111. package/dist/packages/runtime/actions/registry.js +62 -0
  112. package/dist/packages/runtime/actions/requests.d.ts +45 -0
  113. package/dist/packages/runtime/actions/requests.js +164 -0
  114. package/dist/packages/runtime/actions/schemas.d.ts +161 -0
  115. package/dist/packages/runtime/actions/schemas.js +37 -0
  116. package/dist/packages/runtime/agent-handoff.d.ts +11 -0
  117. package/dist/packages/runtime/agent-handoff.js +102 -0
  118. package/dist/packages/{engine → runtime}/agents/index.d.ts +1 -2
  119. package/dist/packages/{engine → runtime}/agents/index.js +1 -2
  120. package/dist/packages/runtime/agents/lib/args.d.ts +14 -0
  121. package/dist/packages/runtime/agents/lib/args.js +24 -0
  122. package/dist/packages/{engine → runtime}/agents/lib/constants.d.ts +4 -1
  123. package/dist/packages/runtime/agents/lib/constants.js +13 -0
  124. package/dist/packages/runtime/agents/lib/context-graph-bootstrap.d.ts +3 -0
  125. package/dist/packages/{engine/agents/lib/verifiable-context-bootstrap.js → runtime/agents/lib/context-graph-bootstrap.js} +5 -6
  126. package/dist/packages/{engine → runtime}/agents/lib/detection.d.ts +5 -0
  127. package/dist/packages/{engine → runtime}/agents/lib/detection.js +16 -7
  128. package/dist/packages/{engine → runtime}/agents/lib/execution-profile.d.ts +14 -0
  129. package/dist/packages/{engine → runtime}/agents/lib/execution-profile.js +31 -14
  130. package/dist/packages/{engine → runtime}/agents/lib/execution.js +22 -6
  131. package/dist/packages/{engine → runtime}/agents/lib/executors.d.ts +1 -0
  132. package/dist/packages/{engine → runtime}/agents/lib/executors.js +11 -2
  133. package/dist/packages/runtime/agents/lib/logs.d.ts +12 -0
  134. package/dist/packages/runtime/agents/lib/logs.js +41 -0
  135. package/dist/packages/{engine → runtime}/agents/lib/preflight.js +19 -14
  136. package/dist/packages/runtime/agents/lib/render.d.ts +26 -0
  137. package/dist/packages/{engine → runtime}/agents/lib/render.js +48 -22
  138. package/dist/packages/runtime/agents/lib/shell-fs.d.ts +18 -0
  139. package/dist/packages/runtime/agents/lib/shell-fs.js +190 -0
  140. package/dist/packages/runtime/agents/lib/shell-paths.d.ts +16 -0
  141. package/dist/packages/runtime/agents/lib/shell-paths.js +63 -0
  142. package/dist/packages/runtime/agents/lib/shell-projection.d.ts +25 -0
  143. package/dist/packages/runtime/agents/lib/shell-projection.js +314 -0
  144. package/dist/packages/runtime/agents/lib/shell-templates.d.ts +30 -0
  145. package/dist/packages/runtime/agents/lib/shell-templates.js +494 -0
  146. package/dist/packages/runtime/agents/lib/shell-workspace.d.ts +17 -0
  147. package/dist/packages/runtime/agents/lib/shell-workspace.js +70 -0
  148. package/dist/packages/runtime/agents/lib/shells.d.ts +92 -0
  149. package/dist/packages/runtime/agents/lib/shells.js +509 -0
  150. package/dist/packages/runtime/agents/lib/source-context-scan.d.ts +10 -0
  151. package/dist/packages/runtime/agents/lib/source-context-scan.js +388 -0
  152. package/dist/packages/{engine → runtime}/agents/lib/status.js +1 -14
  153. package/dist/packages/runtime/agents/lib/string-utils.d.ts +16 -0
  154. package/dist/packages/runtime/agents/lib/string-utils.js +36 -0
  155. package/dist/packages/{engine → runtime}/agents/lib/types.d.ts +1 -0
  156. package/dist/packages/{engine → runtime}/agents/lib/user-config.d.ts +8 -2
  157. package/dist/packages/{engine → runtime}/agents/lib/user-config.js +8 -2
  158. package/dist/packages/runtime/agents/providers/claude-code.d.ts +13 -0
  159. package/dist/packages/runtime/agents/providers/claude-code.js +45 -0
  160. package/dist/packages/runtime/agents/providers/codex.d.ts +17 -0
  161. package/dist/packages/runtime/agents/providers/codex.js +66 -0
  162. package/dist/packages/runtime/agents/providers/cursor.d.ts +9 -0
  163. package/dist/packages/runtime/agents/providers/cursor.js +24 -0
  164. package/dist/packages/runtime/agents/providers/index.d.ts +9 -0
  165. package/dist/packages/runtime/agents/providers/index.js +31 -0
  166. package/dist/packages/runtime/agents/providers/types.d.ts +50 -0
  167. package/dist/packages/{engine → runtime}/agents/registry.d.ts +13 -2
  168. package/dist/packages/{engine → runtime}/agents/registry.js +48 -10
  169. package/dist/packages/{engine → runtime}/agents/role-executors.d.ts +1 -1
  170. package/dist/packages/{engine → runtime}/agents/role-executors.js +9 -7
  171. package/dist/packages/{engine → runtime}/agents/role-router.js +7 -5
  172. package/dist/packages/runtime/auth/account-context.d.ts +52 -0
  173. package/dist/packages/runtime/auth/account-context.js +68 -0
  174. package/dist/packages/runtime/auth/auth-flow.d.ts +73 -0
  175. package/dist/packages/runtime/auth/auth-flow.js +189 -0
  176. package/dist/packages/runtime/auth/jwt-validator.d.ts +58 -0
  177. package/dist/packages/runtime/auth/jwt-validator.js +86 -0
  178. package/dist/packages/runtime/auth/keychain.d.ts +35 -0
  179. package/dist/packages/runtime/auth/keychain.js +85 -0
  180. package/dist/packages/runtime/auth/session-store.d.ts +38 -0
  181. package/dist/packages/runtime/auth/session-store.js +96 -0
  182. package/dist/packages/runtime/auth/workos-client.d.ts +58 -0
  183. package/dist/packages/runtime/auth/workos-client.js +87 -0
  184. package/dist/packages/runtime/benchmark-question-draft.d.ts +23 -0
  185. package/dist/packages/runtime/benchmark-question-draft.js +153 -0
  186. package/dist/packages/runtime/build/artifact-counts.d.ts +1 -0
  187. package/dist/packages/{engine → runtime}/build/artifact-counts.js +5 -9
  188. package/dist/packages/{engine → runtime}/build/artifact-status.d.ts +6 -6
  189. package/dist/packages/{engine → runtime}/build/artifact-status.js +26 -24
  190. package/dist/packages/runtime/build/atomic-fs.d.ts +3 -0
  191. package/dist/packages/runtime/build/atomic-fs.js +95 -0
  192. package/dist/packages/runtime/build/billing-events.d.ts +78 -0
  193. package/dist/packages/{engine → runtime}/build/billing-events.js +17 -19
  194. package/dist/packages/runtime/build/build-evidence.d.ts +16 -0
  195. package/dist/packages/runtime/build/build-evidence.js +179 -0
  196. package/dist/packages/{engine → runtime}/build/build-pipeline.d.ts +12 -8
  197. package/dist/packages/runtime/build/build-pipeline.js +388 -0
  198. package/dist/packages/{engine → runtime}/build/build-plan-primitives.d.ts +1 -1
  199. package/dist/packages/{engine → runtime}/build/build-plan-primitives.js +0 -1
  200. package/dist/packages/runtime/build/build-plan-runs.d.ts +14 -0
  201. package/dist/packages/runtime/build/build-plan-runs.js +31 -0
  202. package/dist/packages/runtime/build/build-stage-plan.d.ts +16 -0
  203. package/dist/packages/runtime/build/build-stage-plan.js +101 -0
  204. package/dist/packages/{engine → runtime}/build/build-stage-runner.d.ts +2 -1
  205. package/dist/packages/runtime/build/build-stage-runner.js +302 -0
  206. package/dist/packages/{engine → runtime}/build/build-target.d.ts +7 -4
  207. package/dist/packages/runtime/build/build-target.js +40 -0
  208. package/dist/packages/{engine → runtime}/build/check-evaluator.d.ts +14 -16
  209. package/dist/packages/runtime/build/check-evaluator.js +1226 -0
  210. package/dist/packages/runtime/build/context-graph-paths.d.ts +64 -0
  211. package/dist/packages/runtime/build/context-graph-paths.js +160 -0
  212. package/dist/packages/runtime/build/context-graph-schema.d.ts +19 -0
  213. package/dist/packages/runtime/build/context-graph-schema.js +39 -0
  214. package/dist/packages/{engine → runtime}/build/discovery.d.ts +2 -2
  215. package/dist/packages/{engine → runtime}/build/discovery.js +4 -4
  216. package/dist/packages/{engine → runtime}/build/index.d.ts +7 -5
  217. package/dist/packages/{engine → runtime}/build/index.js +7 -5
  218. package/dist/packages/runtime/build/inspect-map.d.ts +10 -0
  219. package/dist/packages/runtime/build/inspect-map.js +270 -0
  220. package/dist/packages/{engine → runtime}/build/lib/schema.d.ts +449 -123
  221. package/dist/packages/runtime/build/lib/schema.js +494 -0
  222. package/dist/packages/runtime/build/native-entrypoint.d.ts +2 -0
  223. package/dist/packages/runtime/build/native-entrypoint.js +286 -0
  224. package/dist/packages/runtime/build/reset.d.ts +2 -0
  225. package/dist/packages/runtime/build/reset.js +62 -0
  226. package/dist/packages/{engine → runtime}/build/runtime-contracts.js +13 -7
  227. package/dist/packages/runtime/build/runtime-inventory.d.ts +7 -0
  228. package/dist/packages/{engine → runtime}/build/runtime-inventory.js +3 -3
  229. package/dist/packages/runtime/build/runtime-log-paths.d.ts +3 -0
  230. package/dist/packages/runtime/build/runtime-log-paths.js +16 -0
  231. package/dist/packages/{engine → runtime}/build/runtime-prompt.js +12 -9
  232. package/dist/packages/{engine → runtime}/build/runtime-reconcile.d.ts +1 -1
  233. package/dist/packages/{engine → runtime}/build/runtime-reconcile.js +25 -21
  234. package/dist/packages/runtime/build/runtime-runs.d.ts +10 -0
  235. package/dist/packages/runtime/build/runtime-runs.js +318 -0
  236. package/dist/packages/{engine → runtime}/build/runtime-types.d.ts +9 -6
  237. package/dist/packages/runtime/build/runtime-types.js +1 -0
  238. package/dist/packages/runtime/build/runtime.d.ts +8 -0
  239. package/dist/packages/runtime/build/runtime.js +7 -0
  240. package/dist/packages/runtime/build/source-files.d.ts +58 -0
  241. package/dist/packages/runtime/build/source-files.js +193 -0
  242. package/dist/packages/runtime/build/source-inventory.d.ts +28 -0
  243. package/dist/packages/runtime/build/source-inventory.js +512 -0
  244. package/dist/packages/runtime/build/source-manifest.d.ts +63 -0
  245. package/dist/packages/runtime/build/source-manifest.js +220 -0
  246. package/dist/packages/runtime/build/stage-evidence.d.ts +22 -0
  247. package/dist/packages/runtime/build/stage-evidence.js +386 -0
  248. package/dist/packages/runtime/build/stage-manifest.d.ts +45 -0
  249. package/dist/packages/runtime/build/stage-manifest.js +1125 -0
  250. package/dist/packages/runtime/build/stage-reuse.d.ts +11 -0
  251. package/dist/packages/runtime/build/stage-reuse.js +154 -0
  252. package/dist/packages/runtime/build/stage-session.d.ts +81 -0
  253. package/dist/packages/runtime/build/stage-session.js +308 -0
  254. package/dist/packages/runtime/build/state-artifacts.d.ts +9 -0
  255. package/dist/packages/runtime/build/state-artifacts.js +14 -0
  256. package/dist/packages/runtime/build/state-health.d.ts +4 -0
  257. package/dist/packages/{engine → runtime}/build/state-health.js +21 -26
  258. package/dist/packages/runtime/build/state-io.d.ts +12 -0
  259. package/dist/packages/runtime/build/state-io.js +118 -0
  260. package/dist/packages/runtime/build/state-view.d.ts +5 -0
  261. package/dist/packages/runtime/build/state-view.js +121 -0
  262. package/dist/packages/runtime/build/state.d.ts +7 -0
  263. package/dist/packages/runtime/build/state.js +12 -0
  264. package/dist/packages/runtime/build/summary-coverage-index.d.ts +21 -0
  265. package/dist/packages/runtime/build/summary-coverage-index.js +189 -0
  266. package/dist/packages/runtime/build/traces.d.ts +30 -0
  267. package/dist/packages/runtime/build/traces.js +133 -0
  268. package/dist/packages/{engine/build/validate-verifiable-context.d.ts → runtime/build/validate-context-graph.d.ts} +6 -6
  269. package/dist/packages/{engine/build/validate-verifiable-context.js → runtime/build/validate-context-graph.js} +49 -36
  270. package/dist/packages/{engine → runtime}/build/validate.d.ts +5 -5
  271. package/dist/packages/{engine → runtime}/build/validate.js +26 -26
  272. package/dist/packages/{engine → runtime}/client.d.ts +18 -18
  273. package/dist/packages/{engine → runtime}/client.js +48 -36
  274. package/dist/packages/{engine → runtime}/connection-config.d.ts +3 -2
  275. package/dist/packages/{engine → runtime}/connection-config.js +9 -8
  276. package/dist/packages/runtime/context-checks.d.ts +10 -0
  277. package/dist/packages/runtime/context-checks.js +127 -0
  278. package/dist/packages/runtime/context-graph-scaffold.d.ts +9 -0
  279. package/dist/packages/runtime/context-graph-scaffold.js +135 -0
  280. package/dist/packages/runtime/context-graph-semantic-graph.d.ts +9 -0
  281. package/dist/packages/runtime/context-graph-semantic-graph.js +416 -0
  282. package/dist/packages/runtime/entitlement-guard.d.ts +43 -0
  283. package/dist/packages/runtime/entitlement-guard.js +70 -0
  284. package/dist/packages/{engine → runtime}/execution/index.d.ts +2 -2
  285. package/dist/packages/{engine → runtime}/execution/index.js +1 -1
  286. package/dist/packages/{engine → runtime}/execution/lib/schema.d.ts +272 -191
  287. package/dist/packages/{engine → runtime}/execution/lib/schema.js +35 -32
  288. package/dist/packages/runtime/index.d.ts +29 -0
  289. package/dist/packages/runtime/index.js +21 -0
  290. package/dist/packages/runtime/instance-paths.d.ts +30 -0
  291. package/dist/packages/runtime/instance-paths.js +29 -0
  292. package/dist/packages/runtime/native-run-handlers.d.ts +63 -0
  293. package/dist/packages/{engine → runtime}/native-run-handlers.js +217 -166
  294. package/dist/packages/runtime/plan-artifact-contract.d.ts +17 -0
  295. package/dist/packages/runtime/plan-artifact-contract.js +42 -0
  296. package/dist/packages/runtime/project-entries.d.ts +11 -0
  297. package/dist/packages/runtime/project-entries.js +49 -0
  298. package/dist/packages/runtime/project-source-state.d.ts +26 -0
  299. package/dist/packages/runtime/project-source-state.js +56 -0
  300. package/dist/packages/runtime/project-store.d.ts +90 -0
  301. package/dist/packages/runtime/project-store.js +195 -0
  302. package/dist/packages/runtime/requested-artifacts.d.ts +7 -0
  303. package/dist/packages/{engine → runtime}/requested-artifacts.js +23 -1
  304. package/dist/packages/{engine → runtime}/run-observability.d.ts +2 -1
  305. package/dist/packages/{engine → runtime}/run-observability.js +174 -87
  306. package/dist/packages/runtime/runtime-action-proposals.d.ts +7 -0
  307. package/dist/packages/runtime/runtime-action-proposals.js +542 -0
  308. package/dist/packages/runtime/runtime-build-plans.d.ts +5 -0
  309. package/dist/packages/runtime/runtime-build-plans.js +175 -0
  310. package/dist/packages/runtime/runtime-build-runs.d.ts +47 -0
  311. package/dist/packages/runtime/runtime-build-runs.js +555 -0
  312. package/dist/packages/runtime/runtime-caches.d.ts +117 -0
  313. package/dist/packages/runtime/runtime-caches.js +266 -0
  314. package/dist/packages/{engine → runtime}/runtime-event-applier.d.ts +3 -1
  315. package/dist/packages/{engine → runtime}/runtime-event-applier.js +53 -17
  316. package/dist/packages/runtime/runtime-executor.d.ts +22 -0
  317. package/dist/packages/runtime/runtime-executor.js +131 -0
  318. package/dist/packages/runtime/runtime-jobs.d.ts +13 -0
  319. package/dist/packages/runtime/runtime-jobs.js +463 -0
  320. package/dist/packages/runtime/runtime-observability.d.ts +11 -0
  321. package/dist/packages/runtime/runtime-observability.js +39 -0
  322. package/dist/packages/{engine → runtime}/runtime-persistence.d.ts +9 -18
  323. package/dist/packages/{engine → runtime}/runtime-persistence.js +25 -25
  324. package/dist/packages/runtime/runtime-project-mutations.d.ts +7 -0
  325. package/dist/packages/runtime/runtime-project-mutations.js +65 -0
  326. package/dist/packages/runtime/runtime-project-reads.d.ts +18 -0
  327. package/dist/packages/runtime/runtime-project-reads.js +574 -0
  328. package/dist/packages/runtime/runtime-proposal-helpers.d.ts +22 -0
  329. package/dist/packages/runtime/runtime-proposal-helpers.js +223 -0
  330. package/dist/packages/{engine → runtime}/runtime-resource-builders.d.ts +23 -16
  331. package/dist/packages/{engine → runtime}/runtime-resource-builders.js +58 -46
  332. package/dist/packages/runtime/runtime-status.d.ts +14 -0
  333. package/dist/packages/runtime/runtime-status.js +15 -0
  334. package/dist/packages/runtime/runtime-verify-runs.d.ts +84 -0
  335. package/dist/packages/runtime/runtime-verify-runs.js +296 -0
  336. package/dist/packages/runtime/runtime.d.ts +1582 -0
  337. package/dist/packages/runtime/runtime.js +431 -0
  338. package/dist/packages/runtime/schemas/actions.d.ts +1206 -0
  339. package/dist/packages/runtime/schemas/actions.js +117 -0
  340. package/dist/packages/runtime/schemas/agents.d.ts +104 -0
  341. package/dist/packages/runtime/schemas/agents.js +74 -0
  342. package/dist/packages/runtime/schemas/build-plans.d.ts +1132 -0
  343. package/dist/packages/runtime/schemas/build-plans.js +141 -0
  344. package/dist/packages/runtime/schemas/context-graphs.d.ts +1522 -0
  345. package/dist/packages/runtime/schemas/context-graphs.js +110 -0
  346. package/dist/packages/runtime/schemas/files.d.ts +227 -0
  347. package/dist/packages/runtime/schemas/files.js +28 -0
  348. package/dist/packages/runtime/schemas/index.d.ts +9 -0
  349. package/dist/packages/runtime/schemas/index.js +13 -0
  350. package/dist/packages/runtime/schemas/instance.d.ts +141 -0
  351. package/dist/packages/runtime/schemas/instance.js +143 -0
  352. package/dist/packages/runtime/schemas/jobs.d.ts +339 -0
  353. package/dist/packages/runtime/schemas/jobs.js +107 -0
  354. package/dist/packages/runtime/schemas/projects.d.ts +366 -0
  355. package/dist/packages/runtime/schemas/projects.js +160 -0
  356. package/dist/packages/runtime/schemas/runs.d.ts +3445 -0
  357. package/dist/packages/runtime/schemas/runs.js +115 -0
  358. package/dist/packages/runtime/service/index.d.ts +3 -0
  359. package/dist/packages/runtime/service/index.js +3 -0
  360. package/dist/packages/runtime/service/openapi.d.ts +7 -0
  361. package/dist/packages/runtime/service/openapi.js +118 -0
  362. package/dist/packages/runtime/service/operations.d.ts +3011 -0
  363. package/dist/packages/runtime/service/operations.js +375 -0
  364. package/dist/packages/runtime/service/routes.d.ts +114 -0
  365. package/dist/packages/runtime/service/routes.js +128 -0
  366. package/dist/packages/runtime/service/server-api-files.d.ts +10 -0
  367. package/dist/packages/runtime/service/server-api-files.js +85 -0
  368. package/dist/packages/runtime/service/server-app-boot.d.ts +4 -0
  369. package/dist/packages/runtime/service/server-app-boot.js +46 -0
  370. package/dist/packages/runtime/service/server-guards.d.ts +63 -0
  371. package/dist/packages/runtime/service/server-guards.js +181 -0
  372. package/dist/packages/runtime/service/server-helpers.d.ts +38 -0
  373. package/dist/packages/runtime/service/server-helpers.js +108 -0
  374. package/dist/packages/runtime/service/server-instance-helpers.d.ts +30 -0
  375. package/dist/packages/runtime/service/server-instance-helpers.js +114 -0
  376. package/dist/packages/runtime/service/server-routes-action-proposals.d.ts +3 -0
  377. package/dist/packages/runtime/service/server-routes-action-proposals.js +45 -0
  378. package/dist/packages/runtime/service/server-routes-agents.d.ts +4 -0
  379. package/dist/packages/runtime/service/server-routes-agents.js +132 -0
  380. package/dist/packages/runtime/service/server-routes-auth.d.ts +33 -0
  381. package/dist/packages/runtime/service/server-routes-auth.js +138 -0
  382. package/dist/packages/runtime/service/server-routes-build-plans.d.ts +3 -0
  383. package/dist/packages/runtime/service/server-routes-build-plans.js +86 -0
  384. package/dist/packages/runtime/service/server-routes-discovery.d.ts +4 -0
  385. package/dist/packages/runtime/service/server-routes-discovery.js +196 -0
  386. package/dist/packages/runtime/service/server-routes-events.d.ts +5 -0
  387. package/dist/packages/runtime/service/server-routes-events.js +99 -0
  388. package/dist/packages/runtime/service/server-routes-project-context.d.ts +9 -0
  389. package/dist/packages/runtime/service/server-routes-project-context.js +287 -0
  390. package/dist/packages/runtime/service/server-routes-project-jobs.d.ts +9 -0
  391. package/dist/packages/runtime/service/server-routes-project-jobs.js +137 -0
  392. package/dist/packages/runtime/service/server-routes-project-runs.d.ts +14 -0
  393. package/dist/packages/runtime/service/server-routes-project-runs.js +88 -0
  394. package/dist/packages/runtime/service/server-routes-projects.d.ts +4 -0
  395. package/dist/packages/runtime/service/server-routes-projects.js +96 -0
  396. package/dist/packages/runtime/service/server-routes-runs.d.ts +3 -0
  397. package/dist/packages/runtime/service/server-routes-runs.js +119 -0
  398. package/dist/packages/runtime/service/server.d.ts +37 -0
  399. package/dist/packages/runtime/service/server.js +300 -0
  400. package/dist/packages/{engine → runtime/service}/service-registry.d.ts +5 -5
  401. package/dist/packages/{engine → runtime/service}/service-registry.js +7 -7
  402. package/dist/packages/runtime/verify/benchmark-run.d.ts +81 -0
  403. package/dist/packages/runtime/verify/benchmark-run.js +303 -0
  404. package/dist/packages/{engine → runtime}/verify/index.d.ts +2 -2
  405. package/dist/packages/{engine → runtime}/verify/index.js +1 -1
  406. package/dist/packages/{engine → runtime}/verify/lib/schema.d.ts +83 -16
  407. package/dist/packages/{engine → runtime}/verify/lib/schema.js +38 -18
  408. package/dist/packages/runtime/verify/test-file-guard.d.ts +2 -0
  409. package/dist/packages/runtime/verify/test-file-guard.js +29 -0
  410. package/dist/packages/{engine → runtime}/verify/verify-execution.d.ts +7 -0
  411. package/dist/packages/{engine → runtime}/verify/verify-execution.js +119 -45
  412. package/dist/packages/{engine → runtime}/verify/verify-paths.d.ts +5 -4
  413. package/dist/packages/runtime/verify/verify-paths.js +65 -0
  414. package/dist/packages/{engine → runtime}/verify/verify-sandbox.d.ts +1 -1
  415. package/dist/packages/runtime/verify/verify-sandbox.js +88 -0
  416. package/dist/packages/{engine → runtime}/verify/verify-specs.d.ts +2 -0
  417. package/dist/packages/runtime/verify/verify-specs.js +126 -0
  418. package/dist/packages/runtime/verify/verify-targets.d.ts +5 -0
  419. package/dist/packages/{engine → runtime}/verify/verify-targets.js +12 -12
  420. package/dist/packages/runtime/verify/verify-types.js +1 -0
  421. package/dist/packages/{engine → runtime}/verify/verify.d.ts +1 -1
  422. package/dist/packages/{engine → runtime}/verify/verify.js +1 -1
  423. package/dist/packages/runtime/wire-schemas.d.ts +18 -0
  424. package/dist/packages/runtime/wire-schemas.js +27 -0
  425. package/package.json +32 -30
  426. package/public-repo/CONTRIBUTING.md +16 -18
  427. package/public-repo/README.md +119 -282
  428. package/public-repo/SECURITY.md +3 -4
  429. package/public-repo/build-plans/interf-default/README.md +24 -16
  430. package/public-repo/build-plans/interf-default/build/stages/entrypoint/SKILL.md +74 -0
  431. package/public-repo/build-plans/interf-default/build/stages/knowledge/SKILL.md +95 -0
  432. package/public-repo/build-plans/interf-default/build/stages/summarize/SKILL.md +49 -4
  433. package/public-repo/build-plans/interf-default/build-plan.json +49 -39
  434. package/public-repo/build-plans/interf-default/build-plan.schema.json +59 -33
  435. package/public-repo/build-plans/interf-default/improve/SKILL.md +3 -3
  436. package/public-repo/build-plans/interf-default/use/query/SKILL.md +18 -11
  437. package/public-repo/openapi/local-service.openapi.json +14227 -0
  438. package/public-repo/skills/interf/SKILL.md +508 -187
  439. package/dist/cli/commands/prep.d.ts +0 -2
  440. package/dist/cli/commands/prep.js +0 -240
  441. package/dist/cli/commands/test.d.ts +0 -10
  442. package/dist/cli/commands/test.js +0 -85
  443. package/dist/cli/commands/web.d.ts +0 -2
  444. package/dist/cli/commands/web.js +0 -286
  445. package/dist/interf-ui/404.html +0 -1
  446. package/dist/interf-ui/__next.__PAGE__.txt +0 -10
  447. package/dist/interf-ui/__next._full.txt +0 -20
  448. package/dist/interf-ui/__next._head.txt +0 -5
  449. package/dist/interf-ui/__next._index.txt +0 -5
  450. package/dist/interf-ui/__next._tree.txt +0 -5
  451. package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_buildManifest.js +0 -11
  452. package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_clientMiddlewareManifest.js +0 -1
  453. package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_ssgManifest.js +0 -1
  454. package/dist/interf-ui/_next/static/chunks/0.tjb6f4golw..css +0 -3
  455. package/dist/interf-ui/_next/static/chunks/03~yq9q893hmn.js +0 -1
  456. package/dist/interf-ui/_next/static/chunks/085-n_jv2ng_q.css +0 -1
  457. package/dist/interf-ui/_next/static/chunks/0dn41fa_zvgsl.js +0 -1
  458. package/dist/interf-ui/_next/static/chunks/0g-ea0zj5d-0k.js +0 -1
  459. package/dist/interf-ui/_next/static/chunks/0gwqglc4iz583.js +0 -1
  460. package/dist/interf-ui/_next/static/chunks/0haldgm65ve6l.js +0 -1
  461. package/dist/interf-ui/_next/static/chunks/0nv3am99vjzn4.js +0 -1
  462. package/dist/interf-ui/_next/static/chunks/0s77gt_o4jwtx.js +0 -1
  463. package/dist/interf-ui/_next/static/chunks/0y5z3t-z1c8ks.js.map +0 -5
  464. package/dist/interf-ui/_next/static/chunks/0~a36ujuzpaz..js +0 -116
  465. package/dist/interf-ui/_next/static/chunks/10jeodxe4nkgj.js +0 -31
  466. package/dist/interf-ui/_next/static/chunks/119h2rouych2t.js +0 -1
  467. package/dist/interf-ui/_next/static/chunks/13c8b~m8knjsf.js +0 -1
  468. package/dist/interf-ui/_next/static/chunks/14dznb2qpt-ho.js +0 -91
  469. package/dist/interf-ui/_next/static/chunks/15z_en80lrq-3.js +0 -5
  470. package/dist/interf-ui/_next/static/chunks/turbopack-0p.pvcjrtq-jh.js +0 -1
  471. package/dist/interf-ui/_next/static/chunks/turbopack-0usj_75.8frlw.js +0 -1
  472. package/dist/interf-ui/_next/static/chunks/turbopack-worker-0sjn--fhq~1cg.js +0 -1
  473. package/dist/interf-ui/_next/static/media/GeistMono_Variable.p.17jn9btb_52pq.woff2 +0 -0
  474. package/dist/interf-ui/_next/static/media/Geist_Variable-s.p.0-te~ja_gpvcf.woff2 +0 -0
  475. package/dist/interf-ui/_next/static/media/worker.102zas1s52_pf.js +0 -109
  476. package/dist/interf-ui/_not-found/__next._full.txt +0 -15
  477. package/dist/interf-ui/_not-found/__next._head.txt +0 -5
  478. package/dist/interf-ui/_not-found/__next._index.txt +0 -5
  479. package/dist/interf-ui/_not-found/__next._not-found.__PAGE__.txt +0 -5
  480. package/dist/interf-ui/_not-found/__next._not-found.txt +0 -5
  481. package/dist/interf-ui/_not-found/__next._tree.txt +0 -2
  482. package/dist/interf-ui/_not-found.html +0 -1
  483. package/dist/interf-ui/_not-found.txt +0 -15
  484. package/dist/interf-ui/index.html +0 -1
  485. package/dist/interf-ui/index.txt +0 -20
  486. package/dist/packages/contracts/lib/preparation-paths.d.ts +0 -117
  487. package/dist/packages/contracts/lib/preparation-paths.js +0 -177
  488. package/dist/packages/engine/action-definitions.d.ts +0 -407
  489. package/dist/packages/engine/action-definitions.js +0 -1158
  490. package/dist/packages/engine/action-values.d.ts +0 -1
  491. package/dist/packages/engine/action-values.js +0 -1
  492. package/dist/packages/engine/agents/lib/args.d.ts +0 -4
  493. package/dist/packages/engine/agents/lib/args.js +0 -52
  494. package/dist/packages/engine/agents/lib/chart-guidance.d.ts +0 -1
  495. package/dist/packages/engine/agents/lib/chart-guidance.js +0 -8
  496. package/dist/packages/engine/agents/lib/constants.js +0 -28
  497. package/dist/packages/engine/agents/lib/logs.d.ts +0 -2
  498. package/dist/packages/engine/agents/lib/logs.js +0 -17
  499. package/dist/packages/engine/agents/lib/render.d.ts +0 -8
  500. package/dist/packages/engine/agents/lib/schema.d.ts +0 -8
  501. package/dist/packages/engine/agents/lib/schema.js +0 -7
  502. package/dist/packages/engine/agents/lib/shells.d.ts +0 -74
  503. package/dist/packages/engine/agents/lib/shells.js +0 -1052
  504. package/dist/packages/engine/agents/lib/verifiable-context-bootstrap.d.ts +0 -3
  505. package/dist/packages/engine/build/artifact-counts.d.ts +0 -1
  506. package/dist/packages/engine/build/billing-events.d.ts +0 -89
  507. package/dist/packages/engine/build/build-pipeline.js +0 -175
  508. package/dist/packages/engine/build/build-plan-runs.d.ts +0 -14
  509. package/dist/packages/engine/build/build-plan-runs.js +0 -31
  510. package/dist/packages/engine/build/build-stage-plan.d.ts +0 -16
  511. package/dist/packages/engine/build/build-stage-plan.js +0 -100
  512. package/dist/packages/engine/build/build-stage-runner.js +0 -94
  513. package/dist/packages/engine/build/build-target.js +0 -16
  514. package/dist/packages/engine/build/check-evaluator.js +0 -298
  515. package/dist/packages/engine/build/lib/schema.js +0 -316
  516. package/dist/packages/engine/build/reset.d.ts +0 -2
  517. package/dist/packages/engine/build/reset.js +0 -74
  518. package/dist/packages/engine/build/runtime-inventory.d.ts +0 -7
  519. package/dist/packages/engine/build/runtime-paths.d.ts +0 -8
  520. package/dist/packages/engine/build/runtime-paths.js +0 -26
  521. package/dist/packages/engine/build/runtime-runs.d.ts +0 -10
  522. package/dist/packages/engine/build/runtime-runs.js +0 -224
  523. package/dist/packages/engine/build/runtime.d.ts +0 -5
  524. package/dist/packages/engine/build/runtime.js +0 -4
  525. package/dist/packages/engine/build/source-files.d.ts +0 -46
  526. package/dist/packages/engine/build/source-files.js +0 -149
  527. package/dist/packages/engine/build/state-artifacts.d.ts +0 -9
  528. package/dist/packages/engine/build/state-artifacts.js +0 -14
  529. package/dist/packages/engine/build/state-health.d.ts +0 -4
  530. package/dist/packages/engine/build/state-io.d.ts +0 -11
  531. package/dist/packages/engine/build/state-io.js +0 -82
  532. package/dist/packages/engine/build/state-paths.d.ts +0 -5
  533. package/dist/packages/engine/build/state-paths.js +0 -16
  534. package/dist/packages/engine/build/state-view.d.ts +0 -5
  535. package/dist/packages/engine/build/state-view.js +0 -94
  536. package/dist/packages/engine/build/state.d.ts +0 -7
  537. package/dist/packages/engine/build/state.js +0 -12
  538. package/dist/packages/engine/build/validate-helpers.d.ts +0 -12
  539. package/dist/packages/engine/build/validate-helpers.js +0 -41
  540. package/dist/packages/engine/build/verifiable-context-paths.d.ts +0 -47
  541. package/dist/packages/engine/build/verifiable-context-paths.js +0 -121
  542. package/dist/packages/engine/build/verifiable-context-schema.d.ts +0 -21
  543. package/dist/packages/engine/build/verifiable-context-schema.js +0 -126
  544. package/dist/packages/engine/cloud-seams.d.ts +0 -115
  545. package/dist/packages/engine/cloud-seams.js +0 -84
  546. package/dist/packages/engine/index.d.ts +0 -22
  547. package/dist/packages/engine/index.js +0 -15
  548. package/dist/packages/engine/instance-paths.d.ts +0 -106
  549. package/dist/packages/engine/instance-paths.js +0 -171
  550. package/dist/packages/engine/lib/schema.d.ts +0 -6304
  551. package/dist/packages/engine/lib/schema.js +0 -730
  552. package/dist/packages/engine/native-run-handlers.d.ts +0 -25
  553. package/dist/packages/engine/preparation-store.d.ts +0 -105
  554. package/dist/packages/engine/preparation-store.js +0 -213
  555. package/dist/packages/engine/readiness-check-draft.d.ts +0 -20
  556. package/dist/packages/engine/readiness-check-draft.js +0 -111
  557. package/dist/packages/engine/requested-artifacts.d.ts +0 -5
  558. package/dist/packages/engine/routes.d.ts +0 -85
  559. package/dist/packages/engine/routes.js +0 -99
  560. package/dist/packages/engine/runtime-caches.d.ts +0 -76
  561. package/dist/packages/engine/runtime-caches.js +0 -191
  562. package/dist/packages/engine/runtime-proposal-helpers.d.ts +0 -35
  563. package/dist/packages/engine/runtime-proposal-helpers.js +0 -247
  564. package/dist/packages/engine/runtime.d.ts +0 -371
  565. package/dist/packages/engine/runtime.js +0 -2463
  566. package/dist/packages/engine/server.d.ts +0 -58
  567. package/dist/packages/engine/server.js +0 -1399
  568. package/dist/packages/engine/verify/readiness-check-run.d.ts +0 -82
  569. package/dist/packages/engine/verify/readiness-check-run.js +0 -265
  570. package/dist/packages/engine/verify/verify-paths.js +0 -61
  571. package/dist/packages/engine/verify/verify-sandbox.js +0 -88
  572. package/dist/packages/engine/verify/verify-specs.js +0 -114
  573. package/dist/packages/engine/verify/verify-targets.d.ts +0 -5
  574. package/dist/packages/engine/wire-schemas.d.ts +0 -547
  575. package/dist/packages/engine/wire-schemas.js +0 -59
  576. package/dist/packages/project/index.d.ts +0 -9
  577. package/dist/packages/project/interf-bootstrap.d.ts +0 -1
  578. package/dist/packages/project/interf-bootstrap.js +0 -1
  579. package/dist/packages/project/interf-scaffold.d.ts +0 -3
  580. package/dist/packages/project/interf-scaffold.js +0 -136
  581. package/dist/packages/project/interf.d.ts +0 -4
  582. package/dist/packages/project/interf.js +0 -3
  583. package/dist/packages/project/lib/schema.d.ts +0 -328
  584. package/dist/packages/project/lib/schema.js +0 -136
  585. package/dist/packages/project/preparation-entries.d.ts +0 -11
  586. package/dist/packages/project/preparation-entries.js +0 -49
  587. package/dist/packages/project/source-config.d.ts +0 -46
  588. package/dist/packages/project/source-config.js +0 -394
  589. package/dist/packages/project/source-folders.d.ts +0 -11
  590. package/public-repo/build-plans/interf-default/build/stages/shape/SKILL.md +0 -27
  591. package/public-repo/build-plans/interf-default/build/stages/structure/SKILL.md +0 -21
  592. package/public-repo/plugins/README.md +0 -9
  593. package/public-repo/plugins/interf/.claude-plugin/plugin.json +0 -21
  594. package/public-repo/plugins/interf/.mcp.json +0 -12
  595. package/public-repo/plugins/interf/README.md +0 -32
  596. package/public-repo/plugins/interf/skills/interf/SKILL.md +0 -376
  597. /package/dist/packages/{engine/agents/lib/types.js → runtime/actions/fields.js} +0 -0
  598. /package/dist/packages/{engine → runtime}/agents/lib/agents.d.ts +0 -0
  599. /package/dist/packages/{engine → runtime}/agents/lib/agents.js +0 -0
  600. /package/dist/packages/{engine → runtime}/agents/lib/execution.d.ts +0 -0
  601. /package/dist/packages/{engine → runtime}/agents/lib/preflight.d.ts +0 -0
  602. /package/dist/packages/{engine → runtime}/agents/lib/status.d.ts +0 -0
  603. /package/dist/packages/{engine/build/runtime-types.js → runtime/agents/lib/types.js} +0 -0
  604. /package/dist/packages/{engine/verify/verify-types.js → runtime/agents/providers/types.js} +0 -0
  605. /package/dist/packages/{engine → runtime}/agents/role-router.d.ts +0 -0
  606. /package/dist/packages/{engine → runtime}/build/build-execution.d.ts +0 -0
  607. /package/dist/packages/{engine → runtime}/build/build-execution.js +0 -0
  608. /package/dist/packages/{engine → runtime}/build/runtime-contracts.d.ts +0 -0
  609. /package/dist/packages/{engine → runtime}/build/runtime-prompt.d.ts +0 -0
  610. /package/dist/packages/{engine → runtime}/execution/adapters.d.ts +0 -0
  611. /package/dist/packages/{engine → runtime}/execution/adapters.js +0 -0
  612. /package/dist/packages/{engine → runtime}/execution/events.d.ts +0 -0
  613. /package/dist/packages/{engine → runtime}/execution/events.js +0 -0
  614. /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.d.ts +0 -0
  615. /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.js +0 -0
  616. /package/dist/packages/{engine → runtime}/verify/verify-types.d.ts +0 -0
@@ -1,10 +1,13 @@
1
1
  import { existsSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { createBuildPlanAuthoringShell, } from "../../engine/agents/lib/shells.js";
3
+ import { CANONICAL_LAYER_DIRS, isCanonicalDeclarationPath, layerForPath, normalizeLayerPath, } from "../../contracts/lib/context-graph-layer.js";
4
+ import { createBuildPlanAuthoringShell, freezeBuildPlanAuthoringShell, } from "../../runtime/agents/lib/shells.js";
5
+ import { asProjectDataDir, projectServiceJobShellsRoot, } from "../../contracts/lib/project-paths.js";
6
+ import { scanSourceContext } from "../../runtime/agents/lib/source-context-scan.js";
4
7
  import { createScratchLocalBuildPlanPackage } from "../package/interf-build-plan-package.js";
5
8
  import { CONTEXT_INTERFACE_FILE, listContextInterfaceArtifacts } from "../package/context-interface.js";
6
- import { loadBuildPlanDefinitionFromDir, validateBuildPlanPackage, buildPlanDefinitionPath, } from "../package/local-build-plans.js";
7
- import { runBuildPlanEditSession } from "./build-plan-edit-session.js";
9
+ import { loadBuildPlanDefinitionFromDir, validateBuildPlanPackage, } from "../package/local-build-plans.js";
10
+ import { runBuildPlanEditSession, SHARED_BUILD_PLAN_EDIT_RULES, } from "./build-plan-edit-session.js";
8
11
  /**
9
12
  * Walk build-plan.json after a successful authoring run and fill in
10
13
  * `role: "general"` for any stage missing a role field. Custom role
@@ -61,32 +64,60 @@ function buildBuildPlanAuthoringPrompt() {
61
64
  return [
62
65
  "This is an automated Interf Build Plan authoring run, not an open-ended chat session.",
63
66
  "Execute it now.",
64
- "Create one standalone Build Plan package for the source data, desired verifiable-context outputs, and proof requirements in this source folder.",
67
+ "Create one standalone Build Plan package for the Source data, Project intent, requested outputs, coverage metrics, and evidence requirements behind the Source locator.",
65
68
  "Read `runtime/authoring-context.json` first.",
66
- "Treat `task_prompt` as the user's preparation-and-evidence brief: source data, output shape, and evidence that should show the data is ready.",
69
+ "Treat `intent`, `requested_artifacts` (legacy field for requested outputs and graph entrypoints), `checks` (diagnostic context only), `user_prep_instructions`, and `source_context` as the user's agent task and coverage brief.",
67
70
  `Then read \`build-plan/README.md\`, \`build-plan/build-plan.json\`, and \`build-plan/${CONTEXT_INTERFACE_FILE}\`.`,
68
71
  "The `build-plan/` directory starts as a neutral Build Plan scaffold, not as a suggested final plan.",
69
- "Replace the scaffold purpose, inputs, Artifacts, stages, stage docs, checks, and query guidance with the Build Plan this agent work actually needs.",
70
- "Read `runtime/source-files.json` and inspect the listed source locators before editing the package.",
72
+ "Replace the scaffold purpose, inputs, outputs, stages, stage docs, coverage expectations, and query guidance with the Build Plan this agent task actually needs.",
73
+ "Read `runtime/source-locator.json`, then use the `source_context` inventory in `runtime/authoring-context.json` as your primary picture of what is actually in this Source: its `summary`, the `items[]` (each with `name`, `path`, `kind`, optional `page_count`, and `note`), and the listed `observations` and `limitations`. Open specific Source files through your own available tools only to confirm or fill gaps the inventory leaves open before editing the package.",
74
+ "Derive the stage shape from that inventory. Choose stage ids and stage labels that NAME what is genuinely present in this Source — its folder structure, the dominant file kinds, the natural groupings, and any date or period ranges the inventory reveals. Do NOT emit a generic cover/build/verify/assemble (or extract/summarize/structure/verify) skeleton unless the inventory shows the Source is genuinely unstructured and offers no better organizing principle. There is no fixed stage taxonomy: reason from this Source's inventory, not from a template.",
71
75
  "Prefer direct file-reading and search tools over shell commands for routine file inspection.",
72
76
  "Do not use shell helpers like `cat`, `sed`, `ls`, or `find` when a native read/search tool can inspect the same files.",
73
77
  "Edit only files under `build-plan/`.",
74
78
  "Keep the Build Plan valid for the current local-engine API and `build-plan.schema.json`.",
75
- "Choose stage ids, stage order, artifact reads, artifact writes, artifact checks, and stage docs from the source data and preparation-and-evidence brief.",
76
- "Use kebab-case ids everywhere: stage ids, skill_dir values, Artifact ids, reads/writes values, and package ids. Never use underscores.",
79
+ "Do not edit the root `brief`; the service restores it from Project intent, requested outputs, diagnostic checks, and Source context after every edit attempt.",
80
+ "Do not add ad-hoc top-level keys to `build-plan/build-plan.json`; only use keys already present in the scaffold or documented by the local Build Plan schema.",
81
+ "If you want to express user-facing promises, use the Build Plan's existing root `brief` field, `purpose.label`, `purpose.task_hint`, and requested output contract. Never add `purpose.brief` or any other ad-hoc nested promise field.",
82
+ "Choose stage ids, stage order, requested output reads/writes, StageManifest coverage expectations, and stage docs from the `source_context` inventory, the agent task, and the coverage brief. The stage shape must reflect this Source's real structure and content, not a reused skeleton.",
83
+ "Stage `reads` may only contain requested output ids that are declared in `build-plan.schema.json` and produced by an earlier stage. Source files are implicit input through runtime stage assignment; never put `source`, source file paths, or source-folder ids in stage `reads`.",
84
+ // Stable kebab-case-id rule (shared verbatim with the repair prompt).
85
+ SHARED_BUILD_PLAN_EDIT_RULES[0],
77
86
  "Each stage MAY declare a `role`: one of `extractor`, `summarizer`, `structurer`, `verifier`, or `general`. Pick the role that best matches what the stage's prompt asks the agent to do. Omit `role` (or use `general`) when the stage doesn't fit any specialized role. Custom role names are allowed; the engine treats unknown roles as `general`.",
78
87
  "Do not preserve the placeholder `prepare` stage unless the final Build Plan genuinely needs a stage with that exact role.",
79
- "Put deterministic validation on Artifact `checks[]`; do not add stage `acceptance` blocks.",
88
+ "Treat `checks` as optional context, not the primary product surface.",
89
+ "Design coverage first: expected inputs, reviewed inputs, produced outputs, entrypoints, and missing/blocked/not-relevant coverage decisions that can roll into a GraphManifest.",
90
+ "For file-based Projects, every final Build Plan must preserve the Context Graph shape: `summaries/` for source coverage, `knowledge/` for task-aware claims/entities/topics/indexes, `home.md` as primary entrypoint, and `artifacts/` for supplemental task handoffs.",
91
+ "`summaries/` is the coverage layer. It should prove what source files were inspected. For PDFs, decks, or paginated reports, prefer page-level notes or explicit page coverage records when practical; each summary must link back to the original Source path, page, section, figure, table, or other source reference instead of copying the Source file.",
92
+ "`knowledge/` is the graph layer. The current default contract is flat `knowledge/*.md` notes, and may contain claims, entities, topics, and indexes. Treat knowledge notes as navigation and assurance, not as the authority for exact wording, table values, chart reads, or provenance-sensitive claims.",
93
+ "Knowledge notes MUST connect to the coverage layer, not orphan it. This is a hard requirement: for every summary whose evidence a knowledge/entity note draws on, that note MUST include at least one `[[summaries/<source-name>/summary]]` wikilink to that summary, IN ADDITION to its source_refs. The wikilink to the summary and the source_ref to the original are both required; one does not substitute for the other. A knowledge note that cites a source through source_refs without also linking that source's summary is INCOMPLETE and must not be treated as done. Encode this mandate in the knowledge stage's SKILL.md and in the StageManifest coverage so it is enforced, not optional — never describe it as preferred, optional, or a choice between summary links and plain source refs.",
94
+ "Make this mandate machine-enforced, not just prose: on the requested output for the knowledge/graph layer (the directory output that holds the `knowledge/*.md` notes), declare a required `summary_backlinks_present` deterministic check in `build-plan.schema.json`. Use the default params (summaries directory, `summary.md`, `manifest.md`) unless this Build Plan renames those, in which case pass `summaries_dir`, `summary_file`, and `manifest_file` to match. This is the only deterministic check that proves no cited summary is orphaned; every file-based Build Plan that produces a `knowledge/` layer must include it.",
95
+ "Enforce the WHOLE-GRAPH connectivity floor, not only the knowledge layer: `summary_backlinks_present` and `knowledge_web_connectivity` only police summaries a knowledge note CITES and the knowledge web itself — a summary no note cites or links would still ship as a free-floating island and pass readiness. To close that, declare a required `graph_notes_connected` deterministic check on the graph spine output (the `home.md` requested output, or another always-present output) in `build-plan.schema.json`. It scans the WHOLE Context Graph root by default and fails readiness if any note — including any uncited summary — is link-disconnected from every other note. Every file-based Build Plan that produces a Context Graph must include it. Its job is reachability, not a quota: an inbound OR outbound link satisfies a note. Make sure the entrypoint/coverage routing actually links every summary (directly or through a coverage index) so this floor can pass honestly.",
96
+ "`home.md` is the primary agent entrypoint. Supplemental graph entrypoints may live under `artifacts/` when they help the downstream agent and should tell it which original Source files, pages, figures, tables, sections, units, periods, series, and caveats matter for the task.",
97
+ "Requested outputs should normally route the downstream agent to the right original Source evidence. They should not present generated summaries or knowledge notes as the dataset or source of truth.",
98
+ "For tasks that depend on charts, tables, images, or other visual evidence, requested outputs must capture the source semantics needed to answer: target period, unit, series/legend, axis or table interpretation, exact printed values when available, bounded ranges when not, evidence tier, and source page.",
99
+ "For unlabeled charts, screenshots, diagrams, or visual marks, do not write a final numeric answer unless the requested output also captures a source-grounded measurement method, visual reference, axis/table calibration, and uncertainty. Otherwise the output must route the downstream agent to inspect the original Source before answering.",
100
+ "Do not let structural diagnostics such as file_exists, frontmatter_required_keys, or must_contain stand in for coverage or evidence fidelity. Use stage docs, StageManifest coverage, and requested output descriptions to require the semantic fields the agent task needs.",
101
+ "If a visual source has no printed data labels, the requested output should preserve a bounded read at source granularity and should mark unresolved semantics instead of inventing pseudo-exact precision.",
102
+ "Verification stages must not pass by comparing generated notes only to other generated notes. If a verifier did not inspect the relevant original Source reference, page-level summary with source refs, table extraction, visual trace, or measurement output required by the claim, it must report the claim as not verified.",
103
+ "Preserve `backed_by_artifact_ids` in the root Build Plan `brief` when present and use matching requested output ids in `build-plan.schema.json`.",
104
+ "When `runtime/authoring-context.json.artifact_requirements[]` is non-empty, it is binding: copy each requirement's `id`, `shape`, and `checks[]` exactly into `build-plan.schema.json`.",
105
+ "Do not rename, move, merge, split, or reinterpret required requested outputs. `stage_hint` can guide which stage writes the output, but it never changes the required `shape.path`, `shape.artifact_kind`, or diagnostic contract.",
106
+ "Keep deterministic validation on requested output `checks[]` minimal; do not use diagnostics as the primary proof surface.",
80
107
  "Use only the CheckKind values listed in `runtime/authoring-context.json`; do not invent aliases.",
81
- "Keep Artifact checks aligned with produced outputs. Use stage docs to describe the output contract, but do not turn source-specific user wording into brittle stage-doc wording requirements.",
108
+ // Stable check-param-contract + diagnostic-description rules (shared verbatim
109
+ // with the repair prompt).
110
+ SHARED_BUILD_PLAN_EDIT_RULES[1],
111
+ SHARED_BUILD_PLAN_EDIT_RULES[2],
112
+ "Keep diagnostics aligned with produced requested outputs. Use stage docs and StageManifest coverage to describe the output contract, but do not turn source-specific user wording into brittle stage-doc wording requirements.",
82
113
  "For every stage in `build-plan.json`, create `build-plan/build/stages/<skill_dir>/SKILL.md` and make the folder name exactly match that stage's kebab-case `skill_dir`.",
83
- "Every Artifact path in `build-plan.schema.json` must be unique and non-overlapping.",
84
- "Make the package materially specific to this Preparation task, output shape, and proof requirement. A no-op scaffold is not acceptable.",
85
- "Treat the Build Plan as four aligned layers: purpose, inputs, context interface, and stages.",
86
- "If the Build Plan writes an agent entrypoint, declare it as an Artifact and make the final shaping stage own it.",
87
- "Prefer explicit stage-doc, stage-policy, purpose, input-contract, and context-interface edits over vague rewrites.",
114
+ "Every requested output path in `build-plan.schema.json` must be unique. Child outputs may live under the required layer directories `summaries/`, `knowledge/`, and `artifacts/`; unrelated output paths must not overlap.",
115
+ "Make the package materially specific to this Project's agent task, output shape, coverage, and evidence requirement. A no-op scaffold is not acceptable.",
116
+ "Treat the Build Plan as four aligned layers: purpose, inputs, requested output contract, and stages.",
117
+ "If the Build Plan writes `home.md`, declare it as a requested output and make the entrypoint stage own it.",
118
+ "Prefer explicit stage-doc, stage-policy, purpose, input-contract, and requested-output-contract edits over vague rewrites.",
88
119
  "Do not introduce wikilinks unless the Build Plan also creates the target note by exact basename or explicit relative path.",
89
- "Respect stage boundaries: a stage may only introduce links that resolve within that stage's declared writes or already-existing read Artifacts.",
120
+ "Respect stage boundaries: a stage may only introduce links that resolve within that stage's declared writes or already-existing read outputs.",
90
121
  "Do not make one stage point at files or notes that are only created later by another stage.",
91
122
  "Prefer conservative retrieval routing over speculative note sprawl.",
92
123
  "Do not narrate plans or ask follow-up questions.",
@@ -107,12 +138,45 @@ function stableJson(value) {
107
138
  .map((key) => `${JSON.stringify(key)}:${stableJson(record[key])}`)
108
139
  .join(",")}}`;
109
140
  }
141
+ /**
142
+ * Persist the authoring brief (intent, requested outputs, `source_context`,
143
+ * `artifact_requirements`) into the package's `build-plan.json` so the saved
144
+ * plan and every validation pass carry the SAME brief the shell was built
145
+ * from.
146
+ *
147
+ * Returns `true` when the brief was written, `false` when it could not be
148
+ * (missing or unparseable `build-plan.json`). The caller MUST observe the
149
+ * `false` case: previously this no-op was silent, so a brief carrying the
150
+ * Source inventory and the binding artifact requirements could be dropped
151
+ * with no signal — validation would then run against a plan that has no
152
+ * brief, and an untailored draft could persist. The drop is now reportable,
153
+ * never silent.
154
+ */
155
+ function writeBuildPlanAuthoringBrief(buildPlanPath, brief) {
156
+ const buildPlanJsonPath = join(buildPlanPath, "build-plan.json");
157
+ if (!existsSync(buildPlanJsonPath))
158
+ return false;
159
+ let parsed;
160
+ try {
161
+ parsed = JSON.parse(readFileSync(buildPlanJsonPath, "utf8"));
162
+ }
163
+ catch {
164
+ return false;
165
+ }
166
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
167
+ return false;
168
+ writeFileSync(buildPlanJsonPath, `${JSON.stringify({ ...parsed, brief }, null, 2)}\n`);
169
+ return true;
170
+ }
110
171
  function checkMatchesRequirement(actual, required) {
111
172
  return actual.id === required.id &&
112
173
  actual.kind === required.kind &&
113
174
  (actual.required ?? true) === (required.required ?? true) &&
114
175
  stableJson(actual.params) === stableJson(required.params);
115
176
  }
177
+ function compactJson(value) {
178
+ return JSON.stringify(value);
179
+ }
116
180
  function producingStagesForArtifact(definition, artifactId) {
117
181
  return (definition.stages ?? []).filter((stage) => Array.isArray(stage.writes) && stage.writes.includes(artifactId));
118
182
  }
@@ -122,34 +186,372 @@ function validateArtifactRequirements(definition, requirements) {
122
186
  for (const requirement of requirements) {
123
187
  const artifact = artifacts.find((candidate) => candidate.id === requirement.id);
124
188
  if (!artifact) {
125
- errors.push(`Missing required Artifact \`${requirement.id}\`.`);
189
+ errors.push(`Missing required requested output \`${requirement.id}\`.`);
126
190
  continue;
127
191
  }
128
192
  if (artifact.shape.kind !== requirement.shape.kind ||
129
193
  artifact.shape.path !== requirement.shape.path ||
130
194
  artifact.shape.artifact_kind !== requirement.shape.artifact_kind) {
131
- errors.push(`Artifact \`${requirement.id}\` does not match required shape.`);
195
+ errors.push(`Requested output \`${requirement.id}\` must declare required shape ${compactJson(requirement.shape)}; found ${compactJson(artifact.shape)}.`);
132
196
  }
133
197
  for (const check of requirement.checks) {
134
198
  if (!artifact.checks.some((candidate) => checkMatchesRequirement(candidate, check))) {
135
- errors.push(`Artifact \`${requirement.id}\` is missing required check \`${check.id}\`.`);
199
+ errors.push(`Requested output \`${requirement.id}\` must include required diagnostic ${compactJson(check)}.`);
136
200
  }
137
201
  }
138
202
  const producingStages = producingStagesForArtifact(definition, requirement.id);
139
203
  if (producingStages.length === 0) {
140
- errors.push(`Artifact \`${requirement.id}\` is not written by any stage.`);
204
+ errors.push(`Requested output \`${requirement.id}\` is not written by any stage.`);
141
205
  }
142
206
  }
143
207
  return errors;
144
208
  }
145
- function validateAuthoredBuildPlanPackage(buildPlanPath, artifactRequirements = []) {
209
+ /**
210
+ * A requested output materializes the `knowledge/` graph layer when it is a
211
+ * directory output whose path is `knowledge` or lives under `knowledge/`.
212
+ * Path-only and layer-agnostic — no Build-Plan-specific naming.
213
+ */
214
+ function isKnowledgeLayerArtifact(artifact) {
215
+ if (artifact.shape.kind !== "path" || artifact.shape.artifact_kind !== "directory") {
216
+ return false;
217
+ }
218
+ // Central tolerant classifier: a directory output at `knowledge` or anything
219
+ // under `knowledge/` (any casing) is the knowledge graph layer.
220
+ return layerForPath(artifact.shape.path) === "knowledge";
221
+ }
222
+ /**
223
+ * Backlink guard. The product mandate is that no cited summary is left
224
+ * orphaned: every file-based Build Plan that produces a `knowledge/` graph
225
+ * layer must declare a required `summary_backlinks_present` deterministic
226
+ * check on the directory output holding the `knowledge/*.md` notes. That
227
+ * check is the only deterministic proof the graph layer connects back to the
228
+ * coverage layer.
229
+ *
230
+ * The authoring prompt already asks for this in prose, but prose is advisory.
231
+ * This guard makes it machine-enforced: if any `knowledge/` directory output
232
+ * exists, at least one such knowledge-layer output must carry a REQUIRED
233
+ * `summary_backlinks_present` check, or the package fails validation. Generic
234
+ * — it keys only off the layer path and the central CheckKind, never off
235
+ * intent or per-Build-Plan naming.
236
+ */
237
+ function validateSummaryBacklinkGuard(definition) {
238
+ const artifacts = definition.build_plan_schema.artifacts ?? [];
239
+ const knowledgeArtifacts = artifacts.filter(isKnowledgeLayerArtifact);
240
+ if (knowledgeArtifacts.length === 0)
241
+ return [];
242
+ const hasRequiredBacklinkCheck = knowledgeArtifacts.some((artifact) => artifact.checks.some((check) => check.kind === "summary_backlinks_present" && (check.required ?? true)));
243
+ if (hasRequiredBacklinkCheck)
244
+ return [];
245
+ const layerPaths = knowledgeArtifacts
246
+ .map((artifact) => artifact.shape.kind === "path" ? artifact.shape.path : artifact.id)
247
+ .join(", ");
248
+ return [
249
+ `Build Plan produces a \`knowledge/\` graph layer (${layerPaths}) but no knowledge-layer ` +
250
+ "requested output declares a required `summary_backlinks_present` check. Add that check so no " +
251
+ "summary cited by a knowledge note is left orphaned (the graph layer must connect to the coverage layer).",
252
+ ];
253
+ }
254
+ /**
255
+ * Whole-graph connectivity floor guard. The product promise is a "deeply
256
+ * connected web": EVERY note across the Context Graph — including every summary,
257
+ * not only the ones a knowledge note happened to cite — must be reachable
258
+ * through the link web. The `summary_backlinks_present` guard above only covers
259
+ * CITED summaries, and `knowledge_web_connectivity` only the `knowledge/` layer;
260
+ * an uncited summary would still ship as a free-floating island and pass
261
+ * readiness silently. The `graph_notes_connected` check closes that floor by
262
+ * scanning the whole graph root.
263
+ *
264
+ * This makes the floor machine-enforced rather than advisory: a Build Plan that
265
+ * produces a `knowledge/` graph layer (the same trigger condition the backlink
266
+ * guard uses — a file-based Context Graph) must declare at least one REQUIRED
267
+ * `graph_notes_connected` check somewhere in its requested outputs, or the
268
+ * package fails validation. Generic — keys only off the layer path and the
269
+ * central CheckKind, never off intent or per-Build-Plan naming.
270
+ */
271
+ function validateGraphConnectivityFloorGuard(definition) {
272
+ const artifacts = definition.build_plan_schema.artifacts ?? [];
273
+ // Same trigger as the backlink guard: a file-based Context Graph that
274
+ // materializes a `knowledge/` layer. A plan with no knowledge graph layer is
275
+ // not the connected-web product and is exempt.
276
+ const knowledgeArtifacts = artifacts.filter(isKnowledgeLayerArtifact);
277
+ if (knowledgeArtifacts.length === 0)
278
+ return [];
279
+ const hasRequiredFloorCheck = artifacts.some((artifact) => artifact.checks.some((check) => check.kind === "graph_notes_connected" && (check.required ?? true)));
280
+ if (hasRequiredFloorCheck)
281
+ return [];
282
+ return [
283
+ "Build Plan produces a Context Graph but no requested output declares a required " +
284
+ "`graph_notes_connected` check. Add that check (typically on the `home.md` spine output) so the " +
285
+ "WHOLE graph — every summary included, not only cited ones — is link-connected and no note ships " +
286
+ "as a free-floating island that passes readiness silently.",
287
+ ];
288
+ }
289
+ /**
290
+ * Canonical top-level-layer guard (FIXED SKELETON / FLEXIBLE INTERIOR). A Build
291
+ * Plan's core derived content must live under the three canonical top-level layers
292
+ * — `summaries/`, `knowledge/`, `artifacts/` — or the `home.md` spine. A plan may
293
+ * NOT invent a new top-level folder (e.g. `graph/`, `insights/`) for core content;
294
+ * graph-shaped content goes under `knowledge/<your-interior>/`, whose interior is
295
+ * free (`entities/`, `claims/`, `timelines/`, `tables/`, `atlas/`, anything).
296
+ *
297
+ * Authoring is STRICT on case: a layer must be DECLARED in exact lowercase. A
298
+ * mixed-case declaration like `Knowledge/` is REJECTED here, because package
299
+ * validation and the runtime scanners are lowercase-path based — a mixed-case
300
+ * declaration would pass a tolerant authoring check and then silently break
301
+ * downstream (`collectMarkdownFiles(graph, "knowledge")` finds nothing under
302
+ * `Knowledge/`). The tolerant, case-insensitive classifier (`layerForPath`)
303
+ * exists only to POLICE already-built outputs, never to bless a bad
304
+ * declaration. Both faces come from the one central layer model:
305
+ * `isCanonicalDeclarationPath` is the strict authoring face;
306
+ * `layerForPath`/`roleForPath` is the tolerant policing face.
307
+ *
308
+ * Keys ONLY off each path artifact's FIRST path segment and the central
309
+ * canonical set — no task taxonomy, no per-plan naming, no hardcoded interior.
310
+ * Only the first segment is checked, so the entire interior of `knowledge/` is
311
+ * allowed. Non-path artifacts declare no folder and are skipped.
312
+ */
313
+ function validateCanonicalTopLevelLayers(definition) {
314
+ const errors = [];
315
+ for (const artifact of definition.build_plan_schema.artifacts ?? []) {
316
+ if (artifact.shape.kind !== "path")
317
+ continue;
318
+ const normalized = normalizeLayerPath(artifact.shape.path);
319
+ if (normalized.length === 0)
320
+ continue;
321
+ // Strict: exact-lowercase canonical declaration (`knowledge/…` or the exact
322
+ // `home.md` spine). `Knowledge/` deliberately does NOT pass.
323
+ if (isCanonicalDeclarationPath(normalized))
324
+ continue;
325
+ const segment = normalized.split("/")[0] ?? "";
326
+ // A path that the tolerant classifier WOULD route into a canonical layer but
327
+ // that is not an exact lowercase declaration is a case-drift declaration
328
+ // (e.g. `Knowledge/`). Name the canonical lowercase form it must use.
329
+ const classified = layerForPath(normalized);
330
+ const detail = classified !== "other"
331
+ ? `Declare it in exact lowercase as \`${classified === "home" ? "home.md" : `${classified}/`}\`; ` +
332
+ "canonical layers must be declared lowercase so package validation and the runtime scanners find it."
333
+ : "Core Context Graph content must live under the canonical layers `summaries/`, `knowledge/`, " +
334
+ `\`artifacts/\`, or \`home.md\` (interior free, e.g. \`knowledge/<your-interior>/\`). Canonical layers: ${CANONICAL_LAYER_DIRS.join(", ")}.`;
335
+ errors.push(`Build Plan declares a core requested output at top-level folder \`${segment}/\` (${artifact.id}). ${detail}`);
336
+ }
337
+ return errors;
338
+ }
339
+ /**
340
+ * Lowercase alphanumeric tokens of length >= 3 drawn from free text. Used to
341
+ * compare the plan's own wording against the actual Source inventory.
342
+ */
343
+ function tailoringTokens(text) {
344
+ const tokens = new Set();
345
+ for (const raw of text.toLowerCase().split(/[^a-z0-9]+/)) {
346
+ if (raw.length >= 3)
347
+ tokens.add(raw);
348
+ }
349
+ return tokens;
350
+ }
351
+ /**
352
+ * Generic structural words the contents-free scan emits for EVERY Source
353
+ * (boilerplate about files/folders/groups and the scan's own caveats). They
354
+ * carry no Source-specific signal, so they are excluded from the tailoring
355
+ * vocabulary — otherwise a generic skeleton could "pass" by echoing scan
356
+ * boilerplate. These are not intent or task words; they are the scan's own
357
+ * structural vocabulary.
358
+ */
359
+ const TAILORING_STOP_TOKENS = new Set([
360
+ "file", "files", "folder", "folders", "root", "group", "groups", "extension",
361
+ "kind", "kinds", "the", "and", "across", "top", "level", "free", "source",
362
+ "scan", "inventory", "interf", "did", "not", "open", "read", "any", "before",
363
+ "locking", "stages", "treat", "counts", "lower", "bound", "some", "deep",
364
+ "were", "enumerated", "capped", "cost", "names", "contents", "parsed",
365
+ "period", "span", "reference", "filenames", "structure",
366
+ ]);
367
+ /**
368
+ * Distinctive vocabulary the contents-free Source scan surfaced about THIS
369
+ * Source: folder/group names, the file-kind labels actually present, and any
370
+ * date/period tokens parsed from filenames. Derived entirely from the
371
+ * inventory — no intent keywords, no task taxonomy. Generic structural words
372
+ * are stripped so the vocabulary is Source-specific, not scan-specific.
373
+ */
374
+ function sourceInventoryVocabulary(sourceContext) {
375
+ const vocabulary = new Set();
376
+ const add = (text) => {
377
+ if (!text)
378
+ return;
379
+ for (const token of tailoringTokens(text)) {
380
+ if (!TAILORING_STOP_TOKENS.has(token))
381
+ vocabulary.add(token);
382
+ }
383
+ };
384
+ // The items and observations carry the Source-specific signal (folder
385
+ // names, present file kinds, period tokens). The summary and limitations
386
+ // are mostly scan boilerplate, so they are intentionally not mined here.
387
+ // Callers may hand in a partial SourceContext (the type defaults `items`
388
+ // and `observations` to [], but raw caller objects are not re-parsed), so
389
+ // coalesce missing arrays defensively.
390
+ for (const item of sourceContext.items ?? []) {
391
+ add(item.name);
392
+ add(item.path);
393
+ add(item.kind);
394
+ add(item.note);
395
+ }
396
+ for (const observation of sourceContext.observations ?? [])
397
+ add(observation);
398
+ return vocabulary;
399
+ }
400
+ /**
401
+ * Tailoring guard. The original failure was a drafted Build Plan that was
402
+ * generic boilerplate — a cover/build/verify-style skeleton that ignored what
403
+ * was actually in the Source. The authoring prompt asks the agent to NAME
404
+ * what is present in the Source, but prose is advisory.
405
+ *
406
+ * This makes "provably tailored" machine-checked WITHOUT a task taxonomy: it
407
+ * derives a vocabulary from the contents-free Source inventory (folder/group
408
+ * names, present file kinds, period tokens) and requires the authored plan's
409
+ * own wording — stage ids/labels/descriptions and the purpose — to reference
410
+ * at least one of those Source-specific tokens. A plan that names nothing from
411
+ * the actual Source is, by construction, not tailored to it.
412
+ *
413
+ * It only runs when a real inventory is available; with no inventory there is
414
+ * nothing to tailor against, so the guard is a no-op (it never blocks on
415
+ * fabricated signal when the caller supplied no Source context).
416
+ */
417
+ function validateTailoringGuard(definition, sourceContext) {
418
+ if (!sourceContext)
419
+ return [];
420
+ const vocabulary = sourceInventoryVocabulary(sourceContext);
421
+ // No distinctive Source vocabulary to tailor against (e.g. an inventory of
422
+ // only generic structural words). Tailoring cannot be proven either way, so
423
+ // do not block.
424
+ if (vocabulary.size === 0)
425
+ return [];
426
+ const planText = [
427
+ definition.purpose?.label ?? "",
428
+ definition.purpose?.task_hint ?? "",
429
+ ...(definition.stages ?? []).flatMap((stage) => [
430
+ stage.id,
431
+ stage.label,
432
+ stage.description ?? "",
433
+ ]),
434
+ ].join(" ");
435
+ for (const token of tailoringTokens(planText)) {
436
+ if (vocabulary.has(token))
437
+ return [];
438
+ }
439
+ return [
440
+ "Authored Build Plan is not tailored to this Source: its stage ids, stage labels, descriptions, " +
441
+ "and purpose reference nothing from the Source inventory (folder names, present file kinds, or " +
442
+ "period tokens). Reshape the stages to name what is actually in this Source instead of a generic skeleton.",
443
+ ];
444
+ }
445
+ /**
446
+ * Does the Build Plan package at `buildPlanPath` name at least one
447
+ * Source-specific token from `sourceContext`? True when it is tailored to the
448
+ * Source (or when there is nothing to tailor against — see below), false only
449
+ * when a real Source vocabulary exists and the plan references none of it.
450
+ *
451
+ * Re-uses the exact draft-time tailoring guard so the two faces of "tailored"
452
+ * cannot drift: a plan is tailored iff `validateTailoringGuard` raises no
453
+ * error. A null inventory, an empty Source vocabulary, or an unloadable
454
+ * package all return `true` (nothing to tailor against / nothing to compare),
455
+ * which keeps the non-regression guard below a no-op in exactly those cases.
456
+ */
457
+ function buildPlanIsTailoredToSource(buildPlanPath, sourceContext) {
458
+ const definition = loadBuildPlanDefinitionFromDir(buildPlanPath);
459
+ if (!definition)
460
+ return true;
461
+ return validateTailoringGuard(definition, sourceContext).length === 0;
462
+ }
463
+ /**
464
+ * IMPROVE-loop tailoring NON-REGRESSION guard (the improve-path analogue of the
465
+ * draft-time tailoring guard).
466
+ *
467
+ * The draft guard (`validateTailoringGuard`) is an absolute "this plan must
468
+ * name something from the Source" check, correct for a from-scratch draft. It
469
+ * is the WRONG shape for the improvement loop: a user may select and improve a
470
+ * plan that is generic by design (the shipped `interf-default` carries no
471
+ * draft-time tailoring at all), and the absolute guard would reject every
472
+ * legitimate improvement to it the moment the Source vocabulary happened not to
473
+ * collide with the plan's generic wording. Running the absolute guard on
474
+ * improve would therefore false-reject faithful improvements, not just
475
+ * de-tailoring ones.
476
+ *
477
+ * The real C1 threat is narrower and is what this guards: an improvement edit
478
+ * must not take a plan that WAS tailored to the Source and strip that tailoring
479
+ * back to a generic skeleton. So this is a before/after DELTA check against the
480
+ * SAME scanned Source inventory: if the pre-edit plan was tailored and the
481
+ * post-edit plan is not, the edit de-tailored the plan and is rejected. A plan
482
+ * that was already generic before the edit (e.g. `interf-default`) has no
483
+ * tailoring to lose, so the guard is a no-op for it — improve is free to refine
484
+ * it without being forced to invent Source-specific vocabulary. With no
485
+ * Source inventory available (no Source binding, unreadable Source), there is
486
+ * nothing to compare and the guard is likewise a no-op.
487
+ */
488
+ export function validateImproveTailoringNonRegression(beforeBuildPlanPath, afterBuildPlanPath, sourceContext) {
489
+ if (!sourceContext)
490
+ return [];
491
+ // Only a plan that was tailored BEFORE the edit can be de-tailored by it.
492
+ if (!buildPlanIsTailoredToSource(beforeBuildPlanPath, sourceContext))
493
+ return [];
494
+ if (buildPlanIsTailoredToSource(afterBuildPlanPath, sourceContext))
495
+ return [];
496
+ return [
497
+ "Improvement edit de-tailored the Build Plan: the pre-edit plan referenced this Source " +
498
+ "(folder names, present file kinds, or period tokens) in its stage ids, labels, descriptions, " +
499
+ "or purpose, but the edited plan references none of it. An improvement may refine the plan but " +
500
+ "must not strip its Source-specific tailoring back to a generic skeleton.",
501
+ ];
502
+ }
503
+ /**
504
+ * Re-shape a base-validation result plus extra guard errors into one result.
505
+ * Shared so authoring and the improvement loop fold their guard errors in the
506
+ * exact same way (no per-call-site re-implementation of the ok/summary logic).
507
+ */
508
+ function withExtraGuardErrors(validation, extraErrors) {
509
+ if (extraErrors.length === 0)
510
+ return validation;
511
+ const errors = [...validation.errors, ...extraErrors];
512
+ return {
513
+ ok: validation.ok && errors.length === 0,
514
+ summary: errors.length === 0
515
+ ? validation.summary
516
+ : `Build Plan package has ${errors.length} issue(s).`,
517
+ errors,
518
+ counts: validation.counts,
519
+ };
520
+ }
521
+ /**
522
+ * Lifecycle guards that apply to EVERY lifecycle stage that mutates a Build
523
+ * Plan package (authoring draft AND self-improvement loop): the base package
524
+ * validation plus the product-critical structural invariants a self-improvement
525
+ * run must not be allowed to silently strip —
526
+ * `summary_backlinks_present` (no orphaned CITED summary),
527
+ * `graph_notes_connected` (the WHOLE-graph connectivity floor: no uncited-summary
528
+ * or any-note island), and the canonical-top-level-layer rule (core content stays
529
+ * under `summaries/`, `knowledge/`, `artifacts/`, or `home.md`).
530
+ *
531
+ * The authoring-only guards (scaffold-removal, artifact-requirements, tailoring)
532
+ * live in `validateAuthoredBuildPlanPackage` because they are draft-time
533
+ * concerns, not improvement concerns.
534
+ */
535
+ export function validateLifecycleBuildPlanPackage(buildPlanPath) {
146
536
  const validation = validateBuildPlanPackage(buildPlanPath);
147
- if (!validation.ok)
537
+ const definition = loadBuildPlanDefinitionFromDir(buildPlanPath);
538
+ if (!definition)
148
539
  return validation;
540
+ return withExtraGuardErrors(validation, [
541
+ ...validateSummaryBacklinkGuard(definition),
542
+ ...validateGraphConnectivityFloorGuard(definition),
543
+ ...validateCanonicalTopLevelLayers(definition),
544
+ ]);
545
+ }
546
+ function validateAuthoredBuildPlanPackage(buildPlanPath, artifactRequirements = [], sourceContext = null) {
547
+ // Start from the shared lifecycle guards (base + backlink + canonical layers),
548
+ // then layer the authoring-only guards on top. The lifecycle guards are
549
+ // defined once and shared with the improvement loop.
550
+ const validation = validateLifecycleBuildPlanPackage(buildPlanPath);
149
551
  const definition = loadBuildPlanDefinitionFromDir(buildPlanPath);
150
552
  if (!definition)
151
553
  return validation;
152
- const errors = [...validation.errors];
554
+ const authoringErrors = [];
153
555
  const placeholderStage = definition.stages?.find((stage) => stage.id === "prepare" &&
154
556
  stage.contract_type === "build-plan-draft-stage" &&
155
557
  stage.writes.includes("draft-context"));
@@ -157,64 +559,112 @@ function validateAuthoredBuildPlanPackage(buildPlanPath, artifactRequirements =
157
559
  const placeholderPurpose = definition.purpose?.label === "From-scratch Build Plan draft" ||
158
560
  definition.purpose?.task_hint?.includes("Replace this neutral scaffold");
159
561
  if (placeholderStage) {
160
- errors.push("Authored Build Plan still contains the neutral scaffold stage `prepare`.");
562
+ authoringErrors.push("Authored Build Plan still contains the neutral scaffold stage `prepare`.");
161
563
  }
162
564
  if (placeholderArtifact) {
163
- errors.push("Authored Build Plan still contains the neutral scaffold artifact `draft-context`.");
565
+ authoringErrors.push("Authored Build Plan still contains the neutral scaffold artifact `draft-context`.");
164
566
  }
165
567
  if (placeholderPurpose) {
166
- errors.push("Authored Build Plan still contains the neutral scaffold purpose.");
568
+ authoringErrors.push("Authored Build Plan still contains the neutral scaffold purpose.");
167
569
  }
168
- errors.push(...validateArtifactRequirements(definition, artifactRequirements));
169
- return {
170
- ok: validation.ok && errors.length === 0,
171
- summary: errors.length === 0
172
- ? validation.summary
173
- : `Build Plan package has ${errors.length} issue(s).`,
174
- errors,
175
- counts: validation.counts,
176
- };
570
+ authoringErrors.push(...validateArtifactRequirements(definition, artifactRequirements));
571
+ authoringErrors.push(...validateTailoringGuard(definition, sourceContext));
572
+ return withExtraGuardErrors(validation, authoringErrors);
177
573
  }
178
574
  export async function runBuildPlanAuthoringDraft(options) {
179
575
  const buildPlanPath = createScratchLocalBuildPlanPackage({
180
- prepDataDir: options.prepDataDir,
576
+ projectDataDir: options.projectDataDir,
181
577
  buildPlanId: options.buildPlanId,
182
578
  label: options.label,
183
- hint: options.hint,
579
+ hint: options.hint ?? options.intent,
184
580
  });
581
+ // Resolve the Source context ONCE here so the shell's authoring-context.json
582
+ // and the persisted authoring brief carry the SAME value. Caller-supplied
583
+ // context wins (e.g. an MCP brief); otherwise run the cheap, contents-free
584
+ // Source scan so the auto path never feeds the draft a null inventory while
585
+ // the shell quietly held the real scan. This is the single source of truth
586
+ // for source_context across both surfaces.
587
+ const sourceContext = options.sourceContext ?? scanSourceContext(options.sourceFolderPath) ?? null;
588
+ // Create the authoring shell under the Project's durable service job storage
589
+ // (not /tmp) so it is preserved and inspectable like a stage shell: the
590
+ // rendered SKILL the agent received, its reasoning transcript, the build-plan
591
+ // before/after, and the validation verdict all survive for debugging.
592
+ const shellRoot = join(projectServiceJobShellsRoot(asProjectDataDir(options.projectDataDir)), `build-plan-author-${options.buildPlanId}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`);
185
593
  const shell = createBuildPlanAuthoringShell({
186
594
  buildPlanPath,
187
595
  buildPlanId: options.buildPlanId,
188
596
  label: options.label,
189
597
  referenceBuildPlanId: options.baseBuildPlanId ?? null,
190
598
  sourceFolderPath: options.sourceFolderPath,
191
- taskPrompt: options.taskPrompt,
599
+ intent: options.intent,
192
600
  checks: options.checks ?? [],
601
+ userPrepInstructions: options.userPrepInstructions,
193
602
  requestedArtifacts: options.requestedArtifacts ?? [],
194
- sourceProfile: options.sourceProfile ?? null,
603
+ sourceContext,
195
604
  artifactRequirements: options.artifactRequirements ?? [],
605
+ shellRoot,
196
606
  });
607
+ const authoringBrief = {
608
+ intent: options.intent,
609
+ requested_artifacts: options.requestedArtifacts ?? [],
610
+ checks: options.checks ?? [],
611
+ ...(options.userPrepInstructions ? { user_prep_instructions: options.userPrepInstructions } : {}),
612
+ source_context: sourceContext,
613
+ artifact_requirements: options.artifactRequirements ?? [],
614
+ };
197
615
  const session = await runBuildPlanEditSession({
198
616
  executor: options.executor,
199
617
  buildPlanPath,
200
618
  shell,
201
619
  prompt: buildBuildPlanAuthoringPrompt(),
202
- validate: (buildPlanPath) => validateAuthoredBuildPlanPackage(buildPlanPath, options.artifactRequirements ?? []),
203
- maxValidationRepairAttempts: 1,
620
+ validate: (buildPlanPath) => {
621
+ // Restore the brief BEFORE validating so coverage runs against the same
622
+ // source_context + artifact_requirements the shell was built from. If
623
+ // the restore can't land (missing/unparseable build-plan.json), do NOT
624
+ // silently validate a brief-less plan — fail loudly so the drop is
625
+ // visible instead of producing a plan that lost its tailoring inputs.
626
+ const briefWritten = writeBuildPlanAuthoringBrief(buildPlanPath, authoringBrief);
627
+ const result = validateAuthoredBuildPlanPackage(buildPlanPath, options.artifactRequirements ?? [], sourceContext);
628
+ if (briefWritten)
629
+ return result;
630
+ const errors = [
631
+ "Could not restore the authoring brief into build-plan.json (file missing or unparseable); " +
632
+ "refusing to accept a draft that dropped its source_context and artifact_requirements.",
633
+ ...result.errors,
634
+ ];
635
+ return {
636
+ ok: false,
637
+ summary: `Build Plan package has ${errors.length} issue(s).`,
638
+ errors,
639
+ counts: result.counts,
640
+ };
641
+ },
642
+ maxValidationRepairAttempts: 2,
204
643
  onStatus: options.onStatus,
205
644
  });
206
645
  if (session.status !== "updated") {
207
646
  rmSync(buildPlanPath, { recursive: true, force: true });
208
647
  }
209
648
  else {
210
- // 0.15 — auto-fill `role: "general"` for any stage the agent
649
+ // auto-fill `role: "general"` for any stage the agent
211
650
  // didn't explicitly tag. Idempotent and silent when every stage
212
651
  // already declares a role.
213
652
  const touched = ensureStageRoles(buildPlanPath);
214
653
  if (touched.length > 0 && options.onStatus) {
215
654
  options.onStatus(`STATUS: filled role=general on ${touched.length} stage(s) the author didn't tag (${touched.join(", ")}).`);
216
655
  }
656
+ // Final brief restore on the persisted package. `ensureStageRoles` may
657
+ // have rewritten build-plan.json, so re-stamp the brief and surface the
658
+ // rare case where it can't land rather than shipping a brief-less plan.
659
+ if (!writeBuildPlanAuthoringBrief(buildPlanPath, authoringBrief) && options.onStatus) {
660
+ options.onStatus("ERROR: could not restore the authoring brief into the saved Build Plan (source_context/artifact_requirements dropped).");
661
+ }
217
662
  }
663
+ // Freeze the shell so the draft execution is preserved and inspectable: the
664
+ // path is unchanged (so result.shellPath stays valid), symlinks are
665
+ // materialized into real files, and a preserved-shell manifest is written.
666
+ // Best-effort — a preservation hiccup must never fail the draft itself.
667
+ freezeBuildPlanAuthoringShell(shell.rootPath);
218
668
  return {
219
669
  status: session.status,
220
670
  changed: session.changed,
@@ -224,6 +674,3 @@ export async function runBuildPlanAuthoringDraft(options) {
224
674
  shellPath: shell.rootPath,
225
675
  };
226
676
  }
227
- export function resolveBuildPlanDraftPath(sourcePath, buildPlanId) {
228
- return buildPlanDefinitionPath(sourcePath, buildPlanId);
229
- }