zob-harness 0.1.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 (356) hide show
  1. package/.pi/adapters/registry.json +103 -0
  2. package/.pi/agents/architecture-cartographer.md +53 -0
  3. package/.pi/agents/chief-vision.md +39 -0
  4. package/.pi/agents/clarifier.md +58 -0
  5. package/.pi/agents/context-steward.md +52 -0
  6. package/.pi/agents/doc-steward.md +34 -0
  7. package/.pi/agents/explore.md +49 -0
  8. package/.pi/agents/factory.md +41 -0
  9. package/.pi/agents/implementer.md +44 -0
  10. package/.pi/agents/librarian.md +32 -0
  11. package/.pi/agents/oracle-merge.md +50 -0
  12. package/.pi/agents/oracle.md +55 -0
  13. package/.pi/agents/pattern-miner.md +53 -0
  14. package/.pi/agents/planner.md +39 -0
  15. package/.pi/agents/project-dna-golden-evaluator.md +32 -0
  16. package/.pi/agents/project-dna-ontology-steward.md +30 -0
  17. package/.pi/agents/project-dna-oracle.md +56 -0
  18. package/.pi/agents/project-dna-orchestrator.md +60 -0
  19. package/.pi/agents/project-dna-query-steward.md +38 -0
  20. package/.pi/agents/project-dna-safety-preflight.md +54 -0
  21. package/.pi/agents/project-dna-test-linker.md +27 -0
  22. package/.pi/agents/qa.md +38 -0
  23. package/.pi/agents/refactor-cartographer.md +28 -0
  24. package/.pi/agents/refactor-mover.md +31 -0
  25. package/.pi/agents/refactor-oracle.md +49 -0
  26. package/.pi/agents/repo-scout.md +60 -0
  27. package/.pi/agents/sample-architect.md +48 -0
  28. package/.pi/agents/specifier.md +57 -0
  29. package/.pi/agents/symbol-range-curator.md +41 -0
  30. package/.pi/agents/synthesis.md +52 -0
  31. package/.pi/agents/temp-agent-creator.md +35 -0
  32. package/.pi/autonomy-policy.json +67 -0
  33. package/.pi/budget-policy.json +54 -0
  34. package/.pi/capabilities/zob-public-runtime-capabilities.json +1700 -0
  35. package/.pi/chains/explore-plan-oracle.json +78 -0
  36. package/.pi/chains/explore-spec-clarify-plan-oracle.json +64 -0
  37. package/.pi/chains/explore-spec-plan-oracle.json +53 -0
  38. package/.pi/chains/spec-clarify-plan-oracle.json +53 -0
  39. package/.pi/chains/spec-factory-oracle.json +42 -0
  40. package/.pi/chains/spec-plan-oracle.json +42 -0
  41. package/.pi/compute-profiles/defaults.json +19 -0
  42. package/.pi/compute-profiles/overrides.json +13 -0
  43. package/.pi/compute-profiles/risk-rules.json +16 -0
  44. package/.pi/daemon-policy.json +80 -0
  45. package/.pi/damage-control-rules.json +45 -0
  46. package/.pi/extensions/zob-child-safety/index.ts +212 -0
  47. package/.pi/extensions/zob-harness/AGENTS.md +28 -0
  48. package/.pi/extensions/zob-harness/index.ts +391 -0
  49. package/.pi/extensions/zob-harness/src/AGENTS.md +25 -0
  50. package/.pi/extensions/zob-harness/src/agents.ts +82 -0
  51. package/.pi/extensions/zob-harness/src/autonomous-runtime.ts +2912 -0
  52. package/.pi/extensions/zob-harness/src/autonomy-readiness.ts +778 -0
  53. package/.pi/extensions/zob-harness/src/budget-policy.ts +308 -0
  54. package/.pi/extensions/zob-harness/src/capabilities.ts +249 -0
  55. package/.pi/extensions/zob-harness/src/child-runner.ts +249 -0
  56. package/.pi/extensions/zob-harness/src/chronicle.ts +262 -0
  57. package/.pi/extensions/zob-harness/src/compute-profile.ts +602 -0
  58. package/.pi/extensions/zob-harness/src/compute-workflow-shape.ts +168 -0
  59. package/.pi/extensions/zob-harness/src/coms-v2/AGENTS.md +16 -0
  60. package/.pi/extensions/zob-harness/src/coms-v2/envelope.ts +121 -0
  61. package/.pi/extensions/zob-harness/src/coms-v2/identity.ts +53 -0
  62. package/.pi/extensions/zob-harness/src/coms-v2/ledger-bridge.ts +67 -0
  63. package/.pi/extensions/zob-harness/src/coms-v2/local-transport.ts +147 -0
  64. package/.pi/extensions/zob-harness/src/coms-v2/pending-replies.ts +80 -0
  65. package/.pi/extensions/zob-harness/src/coms-v2/policy.ts +125 -0
  66. package/.pi/extensions/zob-harness/src/coms-v2/presence.ts +55 -0
  67. package/.pi/extensions/zob-harness/src/coms-v2/registry.ts +113 -0
  68. package/.pi/extensions/zob-harness/src/coms-v2/response-capture.ts +50 -0
  69. package/.pi/extensions/zob-harness/src/coms-v2/transcript-capture.ts +164 -0
  70. package/.pi/extensions/zob-harness/src/coms-v2/types.ts +149 -0
  71. package/.pi/extensions/zob-harness/src/coms-v2/zpeer-profile.ts +140 -0
  72. package/.pi/extensions/zob-harness/src/coms-v2/zpeer.ts +452 -0
  73. package/.pi/extensions/zob-harness/src/constants.ts +108 -0
  74. package/.pi/extensions/zob-harness/src/context-gbrain.ts +465 -0
  75. package/.pi/extensions/zob-harness/src/daemon-policy.ts +223 -0
  76. package/.pi/extensions/zob-harness/src/daemon-readiness.ts +134 -0
  77. package/.pi/extensions/zob-harness/src/daemon-runtime.ts +393 -0
  78. package/.pi/extensions/zob-harness/src/factory/AGENTS.md +24 -0
  79. package/.pi/extensions/zob-harness/src/factory/agentic-plan.ts +65 -0
  80. package/.pi/extensions/zob-harness/src/factory/quarantine.ts +319 -0
  81. package/.pi/extensions/zob-harness/src/factory/run.ts +520 -0
  82. package/.pi/extensions/zob-harness/src/factory/validation.ts +454 -0
  83. package/.pi/extensions/zob-harness/src/factory-selector.ts +318 -0
  84. package/.pi/extensions/zob-harness/src/full-autonomy-test.ts +226 -0
  85. package/.pi/extensions/zob-harness/src/git-ops.ts +868 -0
  86. package/.pi/extensions/zob-harness/src/goal-room.ts +178 -0
  87. package/.pi/extensions/zob-harness/src/goal-runtime.ts +1569 -0
  88. package/.pi/extensions/zob-harness/src/goal-todo-imports.ts +111 -0
  89. package/.pi/extensions/zob-harness/src/goal-todo-types.ts +231 -0
  90. package/.pi/extensions/zob-harness/src/goal-todos.ts +1410 -0
  91. package/.pi/extensions/zob-harness/src/goal.ts +152 -0
  92. package/.pi/extensions/zob-harness/src/governed-requests.ts +436 -0
  93. package/.pi/extensions/zob-harness/src/interactive-autonomy.ts +595 -0
  94. package/.pi/extensions/zob-harness/src/launch-apply.ts +313 -0
  95. package/.pi/extensions/zob-harness/src/merge-queue.ts +290 -0
  96. package/.pi/extensions/zob-harness/src/mission-control.ts +573 -0
  97. package/.pi/extensions/zob-harness/src/model-availability.ts +52 -0
  98. package/.pi/extensions/zob-harness/src/model-routing.ts +429 -0
  99. package/.pi/extensions/zob-harness/src/orchestration/AGENTS.md +23 -0
  100. package/.pi/extensions/zob-harness/src/orchestration/adaptive-delegation.ts +547 -0
  101. package/.pi/extensions/zob-harness/src/orchestration/adaptive-workflow.ts +585 -0
  102. package/.pi/extensions/zob-harness/src/orchestration/lead-plan.ts +192 -0
  103. package/.pi/extensions/zob-harness/src/orchestration/plan.ts +168 -0
  104. package/.pi/extensions/zob-harness/src/orchestration/room.ts +346 -0
  105. package/.pi/extensions/zob-harness/src/orchestration/run.ts +134 -0
  106. package/.pi/extensions/zob-harness/src/orchestration/supervised-readonly.ts +1147 -0
  107. package/.pi/extensions/zob-harness/src/orchestration/widget-readers.ts +132 -0
  108. package/.pi/extensions/zob-harness/src/output-contracts.ts +656 -0
  109. package/.pi/extensions/zob-harness/src/project-dna.ts +533 -0
  110. package/.pi/extensions/zob-harness/src/promotion/AGENTS.md +24 -0
  111. package/.pi/extensions/zob-harness/src/promotion/candidate.ts +336 -0
  112. package/.pi/extensions/zob-harness/src/promotion/coms.ts +127 -0
  113. package/.pi/extensions/zob-harness/src/promotion/documentation.ts +142 -0
  114. package/.pi/extensions/zob-harness/src/promotion/factory.ts +107 -0
  115. package/.pi/extensions/zob-harness/src/promotion/ledger.ts +2 -0
  116. package/.pi/extensions/zob-harness/src/promotion/temp-agent.ts +151 -0
  117. package/.pi/extensions/zob-harness/src/promotion/types.ts +149 -0
  118. package/.pi/extensions/zob-harness/src/promotion/validate.ts +6 -0
  119. package/.pi/extensions/zob-harness/src/promotion/write-lane.ts +162 -0
  120. package/.pi/extensions/zob-harness/src/prompt-packs.ts +239 -0
  121. package/.pi/extensions/zob-harness/src/queue.ts +386 -0
  122. package/.pi/extensions/zob-harness/src/rules.ts +225 -0
  123. package/.pi/extensions/zob-harness/src/runtime/AGENTS.md +26 -0
  124. package/.pi/extensions/zob-harness/src/runtime/adaptive-zmode.ts +116 -0
  125. package/.pi/extensions/zob-harness/src/runtime/auto-compaction.ts +715 -0
  126. package/.pi/extensions/zob-harness/src/runtime/commands.ts +1315 -0
  127. package/.pi/extensions/zob-harness/src/runtime/compaction-policy.ts +516 -0
  128. package/.pi/extensions/zob-harness/src/runtime/delegation-click-markers.ts +141 -0
  129. package/.pi/extensions/zob-harness/src/runtime/delegation-feed.ts +415 -0
  130. package/.pi/extensions/zob-harness/src/runtime/delegation-markdown.ts +97 -0
  131. package/.pi/extensions/zob-harness/src/runtime/delegation-monitor.ts +553 -0
  132. package/.pi/extensions/zob-harness/src/runtime/delegation-mouse.ts +205 -0
  133. package/.pi/extensions/zob-harness/src/runtime/delegation-overlay.ts +434 -0
  134. package/.pi/extensions/zob-harness/src/runtime/events.ts +736 -0
  135. package/.pi/extensions/zob-harness/src/runtime/goal-todo-overlay.ts +214 -0
  136. package/.pi/extensions/zob-harness/src/runtime/mode-intent.ts +144 -0
  137. package/.pi/extensions/zob-harness/src/runtime/plan-capture.ts +270 -0
  138. package/.pi/extensions/zob-harness/src/runtime/state.ts +403 -0
  139. package/.pi/extensions/zob-harness/src/runtime/tools-autonomous.ts +117 -0
  140. package/.pi/extensions/zob-harness/src/runtime/tools-compute.ts +136 -0
  141. package/.pi/extensions/zob-harness/src/runtime/tools-coms.ts +365 -0
  142. package/.pi/extensions/zob-harness/src/runtime/tools-context.ts +70 -0
  143. package/.pi/extensions/zob-harness/src/runtime/tools-delegation.ts +1854 -0
  144. package/.pi/extensions/zob-harness/src/runtime/tools-factory.ts +810 -0
  145. package/.pi/extensions/zob-harness/src/runtime/tools-goal-room.ts +46 -0
  146. package/.pi/extensions/zob-harness/src/runtime/tools-governed-requests.ts +38 -0
  147. package/.pi/extensions/zob-harness/src/runtime/tools-merge-queue.ts +61 -0
  148. package/.pi/extensions/zob-harness/src/runtime/tools-mission-control.ts +77 -0
  149. package/.pi/extensions/zob-harness/src/runtime/tools-orchestration.ts +106 -0
  150. package/.pi/extensions/zob-harness/src/runtime/tools-project-dna.ts +123 -0
  151. package/.pi/extensions/zob-harness/src/runtime/tools-worker-pool.ts +93 -0
  152. package/.pi/extensions/zob-harness/src/runtime/tools-workspace-claims.ts +62 -0
  153. package/.pi/extensions/zob-harness/src/runtime/tools-zcommit.ts +147 -0
  154. package/.pi/extensions/zob-harness/src/runtime/widget.ts +353 -0
  155. package/.pi/extensions/zob-harness/src/runtime/zobHarness.ts +60 -0
  156. package/.pi/extensions/zob-harness/src/safety.ts +338 -0
  157. package/.pi/extensions/zob-harness/src/sandbox.ts +1508 -0
  158. package/.pi/extensions/zob-harness/src/schemas-project-dna.ts +47 -0
  159. package/.pi/extensions/zob-harness/src/schemas.ts +695 -0
  160. package/.pi/extensions/zob-harness/src/telemetry.ts +373 -0
  161. package/.pi/extensions/zob-harness/src/topology/AGENTS.md +22 -0
  162. package/.pi/extensions/zob-harness/src/topology/chains.ts +236 -0
  163. package/.pi/extensions/zob-harness/src/topology/coms.ts +211 -0
  164. package/.pi/extensions/zob-harness/src/topology/orchestration-profiles.ts +204 -0
  165. package/.pi/extensions/zob-harness/src/topology/teams.ts +113 -0
  166. package/.pi/extensions/zob-harness/src/types/core.ts +47 -0
  167. package/.pi/extensions/zob-harness/src/types.ts +939 -0
  168. package/.pi/extensions/zob-harness/src/utils/AGENTS.md +22 -0
  169. package/.pi/extensions/zob-harness/src/utils/formatting.ts +34 -0
  170. package/.pi/extensions/zob-harness/src/utils/hashing.ts +11 -0
  171. package/.pi/extensions/zob-harness/src/utils/json.ts +28 -0
  172. package/.pi/extensions/zob-harness/src/utils/paths.ts +54 -0
  173. package/.pi/extensions/zob-harness/src/utils/records.ts +25 -0
  174. package/.pi/extensions/zob-harness/src/utils/resources.ts +38 -0
  175. package/.pi/extensions/zob-harness/src/worker-pool.ts +672 -0
  176. package/.pi/extensions/zob-harness/src/workspace-claims.ts +297 -0
  177. package/.pi/extensions/zob-switch/index.ts +180 -0
  178. package/.pi/factories/budget-preflight-dry-run/batch-manifest.json +59 -0
  179. package/.pi/factories/budget-preflight-dry-run/factory.json +94 -0
  180. package/.pi/factories/budget-preflight-dry-run/pilot-manifest.json +50 -0
  181. package/.pi/factories/budget-preflight-dry-run/smoke-manifest.json +43 -0
  182. package/.pi/factories/code-review-matrix/batch-manifest.json +61 -0
  183. package/.pi/factories/code-review-matrix/factory.json +163 -0
  184. package/.pi/factories/code-review-matrix/pilot-manifest.json +41 -0
  185. package/.pi/factories/code-review-matrix/smoke-manifest.json +35 -0
  186. package/.pi/factories/factory-forge/batch-manifest.json +56 -0
  187. package/.pi/factories/factory-forge/factory.json +84 -0
  188. package/.pi/factories/factory-forge/pilot-manifest.json +32 -0
  189. package/.pi/factories/factory-forge/smoke-manifest.json +19 -0
  190. package/.pi/factories/opencode-pattern-canonizer/batch-manifest.json +54 -0
  191. package/.pi/factories/opencode-pattern-canonizer/factory.json +86 -0
  192. package/.pi/factories/opencode-pattern-canonizer/pilot-manifest.json +39 -0
  193. package/.pi/factories/opencode-pattern-canonizer/smoke-manifest.json +26 -0
  194. package/.pi/factories/project-dna/README.md +182 -0
  195. package/.pi/factories/project-dna/batch-manifest.json +37 -0
  196. package/.pi/factories/project-dna/example-project-dna-manifest-v2.json +80 -0
  197. package/.pi/factories/project-dna/example-project-dna-manifest.json +58 -0
  198. package/.pi/factories/project-dna/factory.json +131 -0
  199. package/.pi/factories/project-dna/golden-cases-smoke.json +62 -0
  200. package/.pi/factories/project-dna/pi-agentic-ontology.json +88 -0
  201. package/.pi/factories/project-dna/pilot-manifest.json +32 -0
  202. package/.pi/factories/project-dna/schemas/benchmark-suite.schema.json +27 -0
  203. package/.pi/factories/project-dna/schemas/code-knowledge-graph.schema.json +97 -0
  204. package/.pi/factories/project-dna/schemas/context-pack.schema.json +43 -0
  205. package/.pi/factories/project-dna/schemas/golden-case.schema.json +36 -0
  206. package/.pi/factories/project-dna/schemas/manifest-v2.schema.json +128 -0
  207. package/.pi/factories/project-dna/schemas/manifest.schema.json +77 -0
  208. package/.pi/factories/project-dna/schemas/ontology.schema.json +45 -0
  209. package/.pi/factories/project-dna/schemas/project-fingerprint.schema.json +28 -0
  210. package/.pi/factories/project-dna/schemas/query-steward-report.schema.json +52 -0
  211. package/.pi/factories/project-dna/smoke-manifest.json +27 -0
  212. package/.pi/factories/roadmap-smoke-lots/batch-manifest.json +49 -0
  213. package/.pi/factories/roadmap-smoke-lots/factory.json +89 -0
  214. package/.pi/factories/roadmap-smoke-lots/pilot-manifest.json +50 -0
  215. package/.pi/factories/roadmap-smoke-lots/smoke-manifest.json +35 -0
  216. package/.pi/git-policy.json +120 -0
  217. package/.pi/mission-control/zob_coms_transport.json +64 -0
  218. package/.pi/model-catalog.example.json +345 -0
  219. package/.pi/model-economy.example.json +196 -0
  220. package/.pi/model-routing.json +86 -0
  221. package/.pi/orchestrations/adaptive-chief-vision.json +193 -0
  222. package/.pi/orchestrations/ceo-feature-build.json +182 -0
  223. package/.pi/orchestrations/readonly-dynamic-smoke.json +75 -0
  224. package/.pi/output-contracts/agent-event.v1.json +19 -0
  225. package/.pi/output-contracts/base.v1.json +24 -0
  226. package/.pi/output-contracts/brain-lookup.v1.json +21 -0
  227. package/.pi/output-contracts/clarification.v1.json +21 -0
  228. package/.pi/output-contracts/context-pack.v1.json +20 -0
  229. package/.pi/output-contracts/context-request.v1.json +21 -0
  230. package/.pi/output-contracts/context-steward.v1.json +19 -0
  231. package/.pi/output-contracts/context-writeback-proposal.v1.json +18 -0
  232. package/.pi/output-contracts/delegation-request.v1.json +21 -0
  233. package/.pi/output-contracts/explore.v1.json +52 -0
  234. package/.pi/output-contracts/factory.v1.json +48 -0
  235. package/.pi/output-contracts/guidance-steward.v1.json +18 -0
  236. package/.pi/output-contracts/implement.v1.json +40 -0
  237. package/.pi/output-contracts/launch-authorization.v1.json +21 -0
  238. package/.pi/output-contracts/lead-plan.v1.json +22 -0
  239. package/.pi/output-contracts/mission-readiness.v1.json +20 -0
  240. package/.pi/output-contracts/oracle-merge.v1.json +44 -0
  241. package/.pi/output-contracts/oracle-request.v1.json +20 -0
  242. package/.pi/output-contracts/oracle.v1.json +44 -0
  243. package/.pi/output-contracts/orchestration-profile.v1.json +22 -0
  244. package/.pi/output-contracts/plan.v1.json +48 -0
  245. package/.pi/output-contracts/prompt-pack.v1.json +20 -0
  246. package/.pi/output-contracts/qa.v1.json +40 -0
  247. package/.pi/output-contracts/research.v1.json +36 -0
  248. package/.pi/output-contracts/spec.v1.json +22 -0
  249. package/.pi/output-contracts/synthesis.v1.json +44 -0
  250. package/.pi/output-contracts/temp-agent-card.v1.json +23 -0
  251. package/.pi/output-contracts/todo-child-result.v1.json +20 -0
  252. package/.pi/output-contracts/todo-child-result.v2.json +22 -0
  253. package/.pi/output-contracts/todo-claim-validation.v1.json +22 -0
  254. package/.pi/output-contracts/todo-split-request.v1.json +20 -0
  255. package/.pi/prompts/adaptive-workflow.md +63 -0
  256. package/.pi/prompts/autonomous-runtime.md +15 -0
  257. package/.pi/prompts/benchmark-contender.md +15 -0
  258. package/.pi/prompts/benchmark-judge.md +19 -0
  259. package/.pi/prompts/clarify-spec.md +20 -0
  260. package/.pi/prompts/compute-plan.md +36 -0
  261. package/.pi/prompts/compute-preview.md +42 -0
  262. package/.pi/prompts/contract.md +29 -0
  263. package/.pi/prompts/explore.md +13 -0
  264. package/.pi/prompts/factory-run.md +36 -0
  265. package/.pi/prompts/factory.md +20 -0
  266. package/.pi/prompts/implement.md +27 -0
  267. package/.pi/prompts/model-catalog.md +68 -0
  268. package/.pi/prompts/model-economy.md +64 -0
  269. package/.pi/prompts/oracle-merge.md +18 -0
  270. package/.pi/prompts/oracle.md +13 -0
  271. package/.pi/prompts/orchestrator.md +48 -0
  272. package/.pi/prompts/parallel-review.md +21 -0
  273. package/.pi/prompts/plan.md +21 -0
  274. package/.pi/prompts/project-dna.md +90 -0
  275. package/.pi/prompts/refactor-oracle.md +23 -0
  276. package/.pi/prompts/refactor-slice.md +24 -0
  277. package/.pi/prompts/research.md +20 -0
  278. package/.pi/prompts/spec.md +19 -0
  279. package/.pi/prompts/synthesis.md +18 -0
  280. package/.pi/rules/always.md +38 -0
  281. package/.pi/rules/docs.md +32 -0
  282. package/.pi/rules/factory.md +44 -0
  283. package/.pi/rules/oracle.md +34 -0
  284. package/.pi/rules/orchestration.md +44 -0
  285. package/.pi/rules/project.md +34 -0
  286. package/.pi/rules/prompts.md +43 -0
  287. package/.pi/rules/runtime.md +43 -0
  288. package/.pi/rules/sandbox.md +43 -0
  289. package/.pi/settings.json +28 -0
  290. package/.pi/skills/zob-agentic-access/SKILL.md +20 -0
  291. package/.pi/skills/zob-autonomous-runtime/SKILL.md +41 -0
  292. package/.pi/skills/zob-commit/SKILL.md +79 -0
  293. package/.pi/skills/zob-compaction-policy/SKILL.md +92 -0
  294. package/.pi/skills/zob-compute-profile/SKILL.md +108 -0
  295. package/.pi/skills/zob-coms-safety/SKILL.md +54 -0
  296. package/.pi/skills/zob-coms-v2-live/SKILL.md +47 -0
  297. package/.pi/skills/zob-delegation-routing/SKILL.md +82 -0
  298. package/.pi/skills/zob-factory/SKILL.md +28 -0
  299. package/.pi/skills/zob-goal-todo-tree/SKILL.md +279 -0
  300. package/.pi/skills/zob-harness/SKILL.md +68 -0
  301. package/.pi/skills/zob-mission-control-coms/SKILL.md +39 -0
  302. package/.pi/skills/zob-oracle/SKILL.md +21 -0
  303. package/.pi/skills/zob-owner-pool-drill-writer/SKILL.md +244 -0
  304. package/.pi/skills/zob-owner-pool-launcher/SKILL.md +261 -0
  305. package/.pi/skills/zob-project-dna/SKILL.md +275 -0
  306. package/.pi/skills/zob-sandbox/SKILL.md +29 -0
  307. package/.pi/skills/zob-spec/SKILL.md +25 -0
  308. package/.pi/skills/zob-split-refactor/SKILL.md +39 -0
  309. package/.pi/skills/zob-tool-router/SKILL.md +104 -0
  310. package/.pi/teams/zob-core.json +122 -0
  311. package/AGENTS.md +89 -0
  312. package/CONTRIBUTING.md +56 -0
  313. package/LICENSE +21 -0
  314. package/README.md +360 -0
  315. package/SECURITY.md +35 -0
  316. package/SOURCE_INDEX.md +46 -0
  317. package/package.json +135 -0
  318. package/scripts/README.md +57 -0
  319. package/scripts/autonomy/mission-readiness-secret-smoke.mjs +90 -0
  320. package/scripts/compute-profile/plan-workflow.mjs +85 -0
  321. package/scripts/compute-profile/preview.mjs +242 -0
  322. package/scripts/compute-profile/regression-smoke.mjs +38 -0
  323. package/scripts/compute-profile/summarize.mjs +72 -0
  324. package/scripts/compute-profile/validate-policy.mjs +50 -0
  325. package/scripts/compute-profile/validate-preview.mjs +95 -0
  326. package/scripts/compute-profile/validate-workflow.mjs +58 -0
  327. package/scripts/git-ops/commit-policy-smoke.mjs +221 -0
  328. package/scripts/goal-todo/child-goal-ref-smoke.mjs +252 -0
  329. package/scripts/harness-switch/static-smoke.mjs +43 -0
  330. package/scripts/model-catalog/validate-economy.mjs +223 -0
  331. package/scripts/model-catalog/validate.mjs +199 -0
  332. package/scripts/package-surface/validate-script-refs.mjs +190 -0
  333. package/scripts/path-policy/validate-smoke.mjs +103 -0
  334. package/scripts/project-dna/bench-smoke.mjs +217 -0
  335. package/scripts/project-dna/build-capsules.mjs +207 -0
  336. package/scripts/project-dna/build-sample-spec.mjs +140 -0
  337. package/scripts/project-dna/emit-golden-cases.mjs +75 -0
  338. package/scripts/project-dna/emit-ontology.mjs +75 -0
  339. package/scripts/project-dna/generate-sample.mjs +302 -0
  340. package/scripts/project-dna/oracle-review-smoke.mjs +157 -0
  341. package/scripts/project-dna/plan-workflow.mjs +289 -0
  342. package/scripts/project-dna/query-context.mjs +276 -0
  343. package/scripts/project-dna/query-steward.mjs +149 -0
  344. package/scripts/project-dna/scan.mjs +553 -0
  345. package/scripts/project-dna/validate-5of5.mjs +159 -0
  346. package/scripts/project-dna/validate-golden-cases.mjs +78 -0
  347. package/scripts/project-dna/validate-ontology.mjs +97 -0
  348. package/scripts/project-dna/validate-sample-project.mjs +105 -0
  349. package/scripts/project-dna/validate-scaffold.mjs +383 -0
  350. package/scripts/project-dna/validate-scan-artifacts.mjs +187 -0
  351. package/scripts/project-dna/validate-workflow.mjs +166 -0
  352. package/scripts/start-pi.sh +4 -0
  353. package/scripts/worker-pool/static-smoke.mjs +54 -0
  354. package/scripts/zpeer-local-e2e-smoke.mjs +395 -0
  355. package/scripts/zpeer-static-smoke.mjs +129 -0
  356. package/tsconfig.json +12 -0
@@ -0,0 +1,199 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+
5
+ const repoRoot = process.cwd();
6
+ const localCatalogPath = ".pi/model-catalog.json";
7
+ const exampleCatalogPath = ".pi/model-catalog.example.json";
8
+ const catalogPath = existsSync(join(repoRoot, localCatalogPath)) ? localCatalogPath : exampleCatalogPath;
9
+ const routingPath = ".pi/model-routing.json";
10
+ const errors = [];
11
+ const warnings = [];
12
+
13
+ function readJson(path) {
14
+ const full = join(repoRoot, path);
15
+ if (!existsSync(full)) {
16
+ errors.push(`missing ${path}`);
17
+ return undefined;
18
+ }
19
+ try {
20
+ return JSON.parse(readFileSync(full, "utf8"));
21
+ } catch (error) {
22
+ errors.push(`invalid JSON in ${path}: ${error instanceof Error ? error.message : String(error)}`);
23
+ return undefined;
24
+ }
25
+ }
26
+
27
+ function isRecord(value) {
28
+ return value !== null && typeof value === "object" && !Array.isArray(value);
29
+ }
30
+
31
+ function stringArray(value) {
32
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
33
+ }
34
+
35
+ function assert(condition, message) {
36
+ if (!condition) errors.push(message);
37
+ }
38
+
39
+ function warn(condition, message) {
40
+ if (!condition) warnings.push(message);
41
+ }
42
+
43
+ const forbiddenExactKeys = new Set([
44
+ "apikey",
45
+ "api_key",
46
+ "secret",
47
+ "password",
48
+ "credential",
49
+ "authorization",
50
+ "authheader",
51
+ "auth_header",
52
+ "headers",
53
+ "bearer",
54
+ "privatekey",
55
+ "private_key",
56
+ "env",
57
+ "prompt",
58
+ "task",
59
+ "output",
60
+ "body",
61
+ "content"
62
+ ]);
63
+
64
+ function scanForbiddenKeys(value, path = "$") {
65
+ if (!value || typeof value !== "object") return;
66
+ if (Array.isArray(value)) {
67
+ value.forEach((item, index) => scanForbiddenKeys(item, `${path}[${index}]`));
68
+ return;
69
+ }
70
+ for (const [key, child] of Object.entries(value)) {
71
+ const normalized = key.toLowerCase().replace(/[\s-]/g, "_");
72
+ const compact = normalized.replace(/_/g, "");
73
+ if (forbiddenExactKeys.has(normalized) || forbiddenExactKeys.has(compact)) {
74
+ errors.push(`forbidden secret/body-like key at ${path}.${key}`);
75
+ }
76
+ scanForbiddenKeys(child, `${path}.${key}`);
77
+ }
78
+ }
79
+
80
+ function safeModelPattern(value) {
81
+ return typeof value === "string"
82
+ && value.length > 0
83
+ && value.length <= 160
84
+ && !value.includes("\0")
85
+ && !value.includes("\n")
86
+ && !value.includes("\r")
87
+ && !value.includes("..")
88
+ && !value.startsWith("/")
89
+ && !value.startsWith("~")
90
+ && /^[a-zA-Z0-9._:/+@-]+$/.test(value);
91
+ }
92
+
93
+ function uniqueStrings(values) {
94
+ return new Set(values).size === values.length;
95
+ }
96
+
97
+ const catalog = readJson(catalogPath);
98
+ const routing = readJson(routingPath);
99
+ const modelClasses = isRecord(routing?.modelClasses) ? Object.keys(routing.modelClasses).sort() : [];
100
+ const knownClasses = new Set(modelClasses);
101
+ const statusValues = new Set(["candidate", "preferred", "fallback", "disabled"]);
102
+ const resolutionValues = new Set(["verified", "unverified", "needs_user"]);
103
+ const costTiers = new Set(["unknown", "free", "low", "medium", "high"]);
104
+ const qualityTiers = new Set(["unknown", "experimental", "reliable", "strong"]);
105
+
106
+ if (catalog) {
107
+ assert(catalog.schema === "zob.model-catalog.v1", "catalog schema must be zob.model-catalog.v1");
108
+ assert(catalog.advisoryOnly === true, "catalog advisoryOnly must be true");
109
+ assert(catalog.routingConfigRef === routingPath, `catalog routingConfigRef must be ${routingPath}`);
110
+ for (const flag of ["liveRoutingEnabled", "modelRouterUsed", "routingApplied", "childDispatchAllowed", "networkAccessed", "bodyStored", "promptBodiesStored", "outputBodiesStored"]) {
111
+ assert(catalog[flag] === false, `catalog must keep ${flag}=false`);
112
+ }
113
+ scanForbiddenKeys(catalog);
114
+
115
+ assert(isRecord(catalog.models), "catalog.models must be an object");
116
+ assert(isRecord(catalog.classDefaults), "catalog.classDefaults must be an object");
117
+ assert(isRecord(catalog.agentPreferences), "catalog.agentPreferences must be an object");
118
+
119
+ const modelIds = new Set(Object.keys(isRecord(catalog.models) ? catalog.models : {}));
120
+ for (const modelId of modelIds) {
121
+ assert(safeModelPattern(modelId), `model key must be a safe Pi --model pattern: ${modelId}`);
122
+ const entry = catalog.models[modelId];
123
+ assert(isRecord(entry), `models.${modelId} must be an object`);
124
+ if (!isRecord(entry)) continue;
125
+ assert(typeof entry.label === "string" && entry.label.trim().length > 0, `models.${modelId}.label must be non-empty`);
126
+ assert(statusValues.has(entry.status), `models.${modelId}.status must be one of ${[...statusValues].join(",")}`);
127
+ assert(resolutionValues.has(entry.resolutionStatus), `models.${modelId}.resolutionStatus must be one of ${[...resolutionValues].join(",")}`);
128
+ assert(stringArray(entry.classes) && entry.classes.length > 0, `models.${modelId}.classes must be a non-empty string array`);
129
+ for (const modelClass of entry.classes ?? []) {
130
+ assert(knownClasses.has(modelClass), `models.${modelId}.classes contains unknown model class: ${modelClass}`);
131
+ }
132
+ assert(typeof entry.whyWeLikeIt === "string" && entry.whyWeLikeIt.trim().length > 0, `models.${modelId}.whyWeLikeIt must be non-empty`);
133
+ assert(stringArray(entry.bestFor), `models.${modelId}.bestFor must be a string array`);
134
+ assert(stringArray(entry.avoidFor), `models.${modelId}.avoidFor must be a string array`);
135
+ assert(costTiers.has(entry.costTier), `models.${modelId}.costTier must be one of ${[...costTiers].join(",")}`);
136
+ assert(qualityTiers.has(entry.qualityTier), `models.${modelId}.qualityTier must be one of ${[...qualityTiers].join(",")}`);
137
+ if (entry.contextWindow !== undefined) {
138
+ assert(Number.isInteger(entry.contextWindow) && entry.contextWindow > 0, `models.${modelId}.contextWindow must be a positive integer when present`);
139
+ }
140
+ if (entry.notes !== undefined) assert(stringArray(entry.notes), `models.${modelId}.notes must be a string array when present`);
141
+ if (entry.lastUpdated !== undefined) assert(/^\d{4}-\d{2}-\d{2}$/.test(entry.lastUpdated), `models.${modelId}.lastUpdated must be YYYY-MM-DD when present`);
142
+ warn(entry.resolutionStatus === "verified" || entry.status !== "preferred", `models.${modelId} is preferred but not verified`);
143
+ }
144
+
145
+ for (const modelClass of modelClasses) {
146
+ assert(Object.hasOwn(catalog.classDefaults, modelClass), `classDefaults missing ${modelClass}`);
147
+ }
148
+ for (const [modelClass, defaults] of Object.entries(isRecord(catalog.classDefaults) ? catalog.classDefaults : {})) {
149
+ assert(knownClasses.has(modelClass), `classDefaults contains unknown class: ${modelClass}`);
150
+ assert(stringArray(defaults), `classDefaults.${modelClass} must be a string array`);
151
+ if (stringArray(defaults)) {
152
+ assert(uniqueStrings(defaults), `classDefaults.${modelClass} must not contain duplicate models`);
153
+ for (const modelId of defaults) {
154
+ assert(modelIds.has(modelId), `classDefaults.${modelClass} references unknown model: ${modelId}`);
155
+ const entry = catalog.models?.[modelId];
156
+ if (isRecord(entry)) {
157
+ assert(entry.status !== "disabled", `classDefaults.${modelClass} references disabled model: ${modelId}`);
158
+ assert(Array.isArray(entry.classes) && entry.classes.includes(modelClass), `classDefaults.${modelClass} model ${modelId} must include class ${modelClass}`);
159
+ if (modelClass === "strong_oracle") {
160
+ assert(entry.qualityTier === "strong", `strong_oracle default ${modelId} must have qualityTier=strong`);
161
+ assert(entry.status === "preferred" || entry.status === "fallback", `strong_oracle default ${modelId} must be preferred or fallback`);
162
+ }
163
+ }
164
+ }
165
+ }
166
+ }
167
+
168
+ for (const [agent, preference] of Object.entries(isRecord(catalog.agentPreferences) ? catalog.agentPreferences : {})) {
169
+ assert(/^[a-zA-Z0-9._-]+$/.test(agent), `agentPreferences key must be agent-name safe: ${agent}`);
170
+ assert(isRecord(preference), `agentPreferences.${agent} must be an object`);
171
+ if (!isRecord(preference)) continue;
172
+ for (const field of ["preferred", "fallback", "avoid"]) {
173
+ if (preference[field] === undefined) continue;
174
+ assert(stringArray(preference[field]), `agentPreferences.${agent}.${field} must be a string array`);
175
+ for (const modelId of preference[field] ?? []) {
176
+ assert(modelIds.has(modelId), `agentPreferences.${agent}.${field} references unknown model: ${modelId}`);
177
+ }
178
+ }
179
+ if (preference.notes !== undefined) assert(stringArray(preference.notes), `agentPreferences.${agent}.notes must be a string array when present`);
180
+ }
181
+ }
182
+
183
+ const result = {
184
+ schema: "zob.model-catalog-validation.v1",
185
+ valid: errors.length === 0,
186
+ errors,
187
+ warnings,
188
+ catalogPath,
189
+ routingPath,
190
+ modelClasses,
191
+ modelCount: catalog && isRecord(catalog.models) ? Object.keys(catalog.models).length : 0,
192
+ noExecution: true,
193
+ childDispatchAllowed: false,
194
+ networkAccessed: false,
195
+ bodyStored: false
196
+ };
197
+
198
+ console.log(JSON.stringify(result, null, 2));
199
+ if (errors.length > 0) process.exit(1);
@@ -0,0 +1,190 @@
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from "node:child_process";
3
+ import { existsSync, readFileSync, statSync } from "node:fs";
4
+ import { isAbsolute, normalize, relative, sep } from "node:path";
5
+
6
+ const repoRoot = process.cwd();
7
+ const packagePath = "package.json";
8
+ const packageJson = JSON.parse(readFileSync(packagePath, "utf8"));
9
+ const packageFiles = Array.isArray(packageJson.files) ? packageJson.files : [];
10
+ const scripts = packageJson.scripts && typeof packageJson.scripts === "object" ? packageJson.scripts : {};
11
+ const fileRefPattern = /\.(?:cjs|js|json|mjs|sh|ts|tsx)$/u;
12
+
13
+ function runGit(args) {
14
+ return spawnSync("git", args, {
15
+ cwd: repoRoot,
16
+ encoding: "utf8",
17
+ stdio: ["ignore", "pipe", "pipe"],
18
+ });
19
+ }
20
+
21
+ function splitShellWords(command) {
22
+ const words = [];
23
+ let current = "";
24
+ let quote = null;
25
+ let escaping = false;
26
+
27
+ for (const char of command) {
28
+ if (escaping) {
29
+ current += char;
30
+ escaping = false;
31
+ continue;
32
+ }
33
+
34
+ if (char === "\\") {
35
+ escaping = true;
36
+ continue;
37
+ }
38
+
39
+ if (quote) {
40
+ if (char === quote) {
41
+ quote = null;
42
+ } else {
43
+ current += char;
44
+ }
45
+ continue;
46
+ }
47
+
48
+ if (char === "\"" || char === "'") {
49
+ quote = char;
50
+ continue;
51
+ }
52
+
53
+ if (/\s/u.test(char)) {
54
+ if (current) {
55
+ words.push(current);
56
+ current = "";
57
+ }
58
+ continue;
59
+ }
60
+
61
+ current += char;
62
+ }
63
+
64
+ if (current) {
65
+ words.push(current);
66
+ }
67
+
68
+ return words;
69
+ }
70
+
71
+ function normalizeRepoPath(raw) {
72
+ const withoutPrefix = raw.replace(/^\.\//u, "");
73
+ const normalized = normalize(withoutPrefix);
74
+ if (isAbsolute(normalized) || normalized === ".." || normalized.startsWith(`..${sep}`)) {
75
+ return null;
76
+ }
77
+ return normalized.split(sep).join("/");
78
+ }
79
+
80
+ function looksLikeFileReference(token) {
81
+ if (!token || token.startsWith("-") || token.includes("$")) {
82
+ return false;
83
+ }
84
+
85
+ const pathLike = token.startsWith("./") || token.startsWith("scripts/") || token.startsWith(".pi/") || token.includes("/");
86
+ return pathLike && fileRefPattern.test(token);
87
+ }
88
+
89
+ function isIgnored(relPath) {
90
+ const result = runGit(["check-ignore", "--no-index", "--quiet", "--", relPath]);
91
+ if (result.status === 0) {
92
+ return true;
93
+ }
94
+ if (result.status === 1) {
95
+ return false;
96
+ }
97
+ throw new Error(`git check-ignore failed for ${relPath}: ${result.stderr.trim()}`);
98
+ }
99
+
100
+ function gitTrackingState(relPath) {
101
+ const tracked = runGit(["ls-files", "--error-unmatch", "--", relPath]);
102
+ if (tracked.status === 0) {
103
+ return "tracked";
104
+ }
105
+
106
+ const status = runGit(["status", "--porcelain", "--", relPath]);
107
+ if (status.status !== 0) {
108
+ throw new Error(`git status failed for ${relPath}: ${status.stderr.trim()}`);
109
+ }
110
+
111
+ return status.stdout.trim().startsWith("?? ") ? "pending-add" : "untracked";
112
+ }
113
+
114
+ function coveringFilesEntry(relPath) {
115
+ return packageFiles.find((entry) => {
116
+ const normalizedEntry = normalizeRepoPath(entry);
117
+ return normalizedEntry && (relPath === normalizedEntry || relPath.startsWith(`${normalizedEntry}/`));
118
+ });
119
+ }
120
+
121
+ const refs = new Map();
122
+ for (const [scriptName, command] of Object.entries(scripts)) {
123
+ if (typeof command !== "string") {
124
+ continue;
125
+ }
126
+
127
+ for (const token of splitShellWords(command)) {
128
+ if (!looksLikeFileReference(token)) {
129
+ continue;
130
+ }
131
+
132
+ const relPath = normalizeRepoPath(token);
133
+ if (!relPath) {
134
+ refs.set(token, [...(refs.get(token) ?? []), scriptName]);
135
+ continue;
136
+ }
137
+
138
+ refs.set(relPath, [...(refs.get(relPath) ?? []), scriptName]);
139
+ }
140
+ }
141
+
142
+ const failures = [];
143
+ const rows = [];
144
+
145
+ for (const [relPath, scriptNames] of [...refs.entries()].sort(([left], [right]) => left.localeCompare(right))) {
146
+ const absolutePath = `${repoRoot}/${relPath}`;
147
+ const exists = existsSync(absolutePath);
148
+ const file = exists && statSync(absolutePath).isFile();
149
+ const coveredBy = coveringFilesEntry(relPath);
150
+ const ignored = exists ? isIgnored(relPath) : false;
151
+ const tracking = exists && !ignored ? gitTrackingState(relPath) : "not-checked";
152
+
153
+ if (!exists) {
154
+ failures.push(`${relPath}: missing; referenced by ${scriptNames.join(", ")}`);
155
+ } else if (!file) {
156
+ failures.push(`${relPath}: not a file; referenced by ${scriptNames.join(", ")}`);
157
+ }
158
+
159
+ if (exists && ignored) {
160
+ failures.push(`${relPath}: ignored by git; referenced by ${scriptNames.join(", ")}`);
161
+ }
162
+
163
+ if (exists && !ignored && tracking === "untracked") {
164
+ failures.push(`${relPath}: untracked and not visible as a new pending add; referenced by ${scriptNames.join(", ")}`);
165
+ }
166
+
167
+ if (!coveredBy) {
168
+ failures.push(`${relPath}: not covered by package.json files; referenced by ${scriptNames.join(", ")}`);
169
+ }
170
+
171
+ rows.push({ relPath, scriptNames, coveredBy, tracking });
172
+ }
173
+
174
+ if (!refs.size) {
175
+ failures.push("package.json scripts contain no file references to validate");
176
+ }
177
+
178
+ if (failures.length) {
179
+ console.error("script-surface validation FAIL");
180
+ for (const failure of failures) {
181
+ console.error(`- ${failure}`);
182
+ }
183
+ process.exit(1);
184
+ }
185
+
186
+ console.log(`script-surface validation PASS (${rows.length} package.json script file refs checked)`);
187
+ for (const row of rows) {
188
+ const location = relative(repoRoot, `${repoRoot}/${row.relPath}`).split(sep).join("/");
189
+ console.log(`- ${location} <- ${row.scriptNames.join(", ")} (${row.tracking}, files:${row.coveredBy})`);
190
+ }
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env node
2
+ import assert from "node:assert/strict";
3
+ import { mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { dirname, join, relative } from "node:path";
6
+ import { pathToFileURL } from "node:url";
7
+ import ts from "typescript";
8
+
9
+ const repoRoot = process.cwd();
10
+ const srcRoot = join(repoRoot, ".pi", "extensions", "zob-harness", "src");
11
+ const outRoot = join(tmpdir(), `zob-path-policy-smoke-${process.pid}-${Date.now()}`);
12
+
13
+ function listTsFiles(dir) {
14
+ return readdirSync(dir).flatMap((entry) => {
15
+ const full = join(dir, entry);
16
+ return statSync(full).isDirectory() ? listTsFiles(full) : full.endsWith(".ts") ? [full] : [];
17
+ });
18
+ }
19
+
20
+ for (const file of listTsFiles(srcRoot)) {
21
+ const rel = relative(srcRoot, file).replace(/\.ts$/, ".js");
22
+ const out = join(outRoot, rel);
23
+ mkdirSync(dirname(out), { recursive: true });
24
+ const transpiled = ts.transpileModule(readFileSync(file, "utf8"), {
25
+ compilerOptions: {
26
+ target: ts.ScriptTarget.ES2022,
27
+ module: ts.ModuleKind.ES2022,
28
+ moduleResolution: ts.ModuleResolutionKind.NodeNext,
29
+ esModuleInterop: true,
30
+ skipLibCheck: true,
31
+ sourceMap: false,
32
+ },
33
+ fileName: file,
34
+ });
35
+ const outputText = transpiled.outputText.replace(
36
+ /import \{ getAgentDir \} from "@earendil-works\/pi-coding-agent";/g,
37
+ "const getAgentDir = () => process.cwd();",
38
+ );
39
+ writeFileSync(out, outputText);
40
+ }
41
+
42
+ const safety = await import(pathToFileURL(join(outRoot, "safety.js")).href);
43
+ const paths = await import(pathToFileURL(join(outRoot, "utils", "paths.js")).href);
44
+ const adaptive = await import(pathToFileURL(join(outRoot, "orchestration", "adaptive-delegation.js")).href);
45
+
46
+ const invalidAllowedPaths = ["docs/../", "docs/../src", "./docs/../", "a/../../b"];
47
+ for (const candidate of invalidAllowedPaths) {
48
+ const errors = safety.validateAllowedPathPolicy([candidate], "allowed_paths", repoRoot);
49
+ assert(errors.some((error) => error.includes("traversal segments")), `${candidate} should be rejected as embedded traversal; got ${JSON.stringify(errors)}`);
50
+ }
51
+
52
+ for (const candidate of ["docs/private", ".pi/extensions/zob-harness/src"]) {
53
+ assert.deepEqual(safety.validateAllowedPathPolicy([candidate], "allowed_paths", repoRoot), [], `${candidate} should remain accepted`);
54
+ }
55
+
56
+ assert.equal(paths.pathMatches("package.json", "docs/../", repoRoot, repoRoot), true, "docs/../ still resolves to a broad root match if policy fails first");
57
+ assert(safety.validateAllowedPathPolicy(["docs/../"], "allowed_paths", repoRoot).length > 0, "policy must block trailing-slash broad-root traversal before pathMatches can grant access");
58
+
59
+ const policy = adaptive.normalizeAdaptiveDelegationPolicy({ enabled: true, mode: "advisory_only", dispatch: false, runtimeMaxDepth: 1 });
60
+ const validHash = "a".repeat(64);
61
+ const requestBase = {
62
+ schema: "zob.delegation-request.v1",
63
+ requesterRole: "root",
64
+ referentRole: "worker",
65
+ requestedAgent: "explore",
66
+ requestedOutputContract: "explore.v1",
67
+ requiredTools: ["read"],
68
+ requesterDepth: 0,
69
+ targetDepth: 1,
70
+ ttlRequested: 1,
71
+ evidenceRefs: ["package.json"],
72
+ estimatedTokensIfAlone: 100,
73
+ estimatedTokensWithDelegation: 80,
74
+ estimatedSuccessIfAlone: 0.5,
75
+ estimatedSuccessWithDelegation: 0.7,
76
+ risk: "low",
77
+ proposedTaskHash: validHash,
78
+ proposedContextHash: validHash,
79
+ rationaleHash: validHash,
80
+ bodyStored: false,
81
+ promptBodiesStored: false,
82
+ outputBodiesStored: false,
83
+ };
84
+
85
+ const adaptiveErrors = adaptive.validateDelegationRequestHardGates({
86
+ repoRoot,
87
+ request: { ...requestBase, targetFileSet: ["docs/../"] },
88
+ policy,
89
+ rootGoalHash: validHash,
90
+ parentTaskId: "parent",
91
+ });
92
+ assert(adaptiveErrors.some((error) => error.includes("adaptive_delegation targetFileSet") && error.includes("traversal segments")), `adaptive targetFileSet should reject embedded traversal; got ${JSON.stringify(adaptiveErrors)}`);
93
+
94
+ const adaptiveAccepted = adaptive.validateDelegationRequestHardGates({
95
+ repoRoot,
96
+ request: { ...requestBase, targetFileSet: [".pi/extensions/zob-harness/src"] },
97
+ policy,
98
+ rootGoalHash: validHash,
99
+ parentTaskId: "parent",
100
+ });
101
+ assert(!adaptiveAccepted.some((error) => error.includes("targetFileSet")), `adaptive targetFileSet should accept scoped repo path; got ${JSON.stringify(adaptiveAccepted)}`);
102
+
103
+ console.log("path-policy smoke PASS");