@sema-agent/core 7.55.0 → 7.57.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 (502) hide show
  1. package/CHANGELOG.md +1054 -0
  2. package/LICENSE +1 -1
  3. package/dist/agents/cascade.js +1 -1
  4. package/dist/agents/cc-peer-directory.js +1 -0
  5. package/dist/agents/child-model-seat.d.ts +0 -11
  6. package/dist/agents/child-model-seat.js +0 -3
  7. package/dist/agents/list-agents-tool.d.ts +3 -1
  8. package/dist/agents/list-agents-tool.js +7 -7
  9. package/dist/agents/org-delivery-gate.js +3 -4
  10. package/dist/agents/peer-directory.d.ts +22 -4
  11. package/dist/agents/peer-directory.js +24 -2
  12. package/dist/agents/peer-held-queue.d.ts +69 -49
  13. package/dist/agents/peer-held-queue.js +255 -106
  14. package/dist/agents/peer-session-drain.js +65 -45
  15. package/dist/agents/repair-loop.js +2 -2
  16. package/dist/agents/send-message-tool.js +7 -6
  17. package/dist/agents/subagent.d.ts +6 -4
  18. package/dist/agents/subagent.js +72 -68
  19. package/dist/agents/tool-filter.d.ts +7 -5
  20. package/dist/agents/tool-filter.js +12 -9
  21. package/dist/agents/verify.d.ts +3 -2
  22. package/dist/agents/verify.js +3 -3
  23. package/dist/brain/anthropic.js +45 -80
  24. package/dist/brain/media-degrade.d.ts +18 -7
  25. package/dist/brain/media-degrade.js +13 -2
  26. package/dist/brain/model-capability.d.ts +37 -0
  27. package/dist/brain/model-capability.js +34 -0
  28. package/dist/brain/model-presets.d.ts +2 -8
  29. package/dist/brain/model-presets.js +1 -6
  30. package/dist/brain/open-responses.js +23 -34
  31. package/dist/brain/openai.js +25 -96
  32. package/dist/brain/provider-dialect.d.ts +3 -2
  33. package/dist/brain/provider-dialect.js +2 -2
  34. package/dist/brain/reasoning-request.d.ts +96 -0
  35. package/dist/brain/reasoning-request.js +174 -0
  36. package/dist/brain/reasoning.d.ts +11 -11
  37. package/dist/brain/reasoning.js +4 -3
  38. package/dist/brain/request-params.d.ts +13 -4
  39. package/dist/brain/request-params.js +21 -5
  40. package/dist/brain/status-sink.d.ts +20 -0
  41. package/dist/brain/status-sink.js +7 -0
  42. package/dist/brain/stream-engine.d.ts +9 -0
  43. package/dist/brain/stream-engine.js +24 -10
  44. package/dist/brain/stream-shared.d.ts +5 -4
  45. package/dist/brain/stream-shared.js +4 -4
  46. package/dist/core/a2a.d.ts +2 -1
  47. package/dist/core/a2a.js +19 -13
  48. package/dist/core/agent-definition.d.ts +10 -0
  49. package/dist/core/allow-entry.d.ts +23 -23
  50. package/dist/core/allow-entry.js +42 -46
  51. package/dist/core/allow-rule-shadow.d.ts +3 -3
  52. package/dist/core/approval-object.d.ts +21 -5
  53. package/dist/core/approval-object.js +44 -17
  54. package/dist/core/ask-origin.d.ts +66 -20
  55. package/dist/core/ask-origin.js +63 -23
  56. package/dist/core/ask-question.d.ts +51 -8
  57. package/dist/core/ask-question.js +3 -4
  58. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  59. package/dist/core/ask-unresolvable-notice.js +16 -2
  60. package/dist/core/auto-compaction.d.ts +71 -6
  61. package/dist/core/auto-compaction.js +42 -26
  62. package/dist/core/background-agent-store.d.ts +6 -2
  63. package/dist/core/background-agent-store.js +1 -1
  64. package/dist/core/checkpoint-generation.d.ts +53 -0
  65. package/dist/core/checkpoint-generation.js +35 -0
  66. package/dist/core/checkpoint-queries.d.ts +180 -0
  67. package/dist/core/checkpoint-queries.js +272 -0
  68. package/dist/core/checkpoint-requirements.d.ts +19 -1
  69. package/dist/core/checkpoint-requirements.js +6 -0
  70. package/dist/core/checkpoint-store.d.ts +105 -53
  71. package/dist/core/checkpoint-store.js +43 -20
  72. package/dist/core/cross-boundary-taint.d.ts +6 -5
  73. package/dist/core/cross-boundary-taint.js +5 -5
  74. package/dist/core/decision-receipt.d.ts +37 -3
  75. package/dist/core/decision-receipt.js +17 -17
  76. package/dist/core/delegation-not-started.d.ts +6 -0
  77. package/dist/core/delegation-not-started.js +17 -0
  78. package/dist/core/engine-attestation.d.ts +93 -0
  79. package/dist/core/engine-attestation.js +70 -0
  80. package/dist/core/engine-capabilities.d.ts +4 -1
  81. package/dist/core/engine-capabilities.js +1 -1
  82. package/dist/core/engine-notice.d.ts +32 -12
  83. package/dist/core/engine-notice.js +6 -0
  84. package/dist/core/file-history-store.d.ts +104 -22
  85. package/dist/core/file-history-store.js +37 -19
  86. package/dist/core/gate-fold.d.ts +1 -1
  87. package/dist/core/gate-fold.js +22 -10
  88. package/dist/core/gate-lanes.js +73 -65
  89. package/dist/core/gate-outcome.d.ts +26 -5
  90. package/dist/core/gate-outcome.js +26 -0
  91. package/dist/core/governance-codes.d.ts +5 -1
  92. package/dist/core/governance-codes.js +6 -0
  93. package/dist/core/hooks.d.ts +19 -18
  94. package/dist/core/hooks.js +3 -1
  95. package/dist/core/host-floor.d.ts +128 -0
  96. package/dist/core/host-floor.js +206 -0
  97. package/dist/core/host-target.d.ts +38 -3
  98. package/dist/core/host-target.js +38 -5
  99. package/dist/core/mailbox-store.d.ts +62 -1
  100. package/dist/core/mailbox-store.js +59 -0
  101. package/dist/core/mcp-name-judge.d.ts +46 -0
  102. package/dist/core/mcp-name-judge.js +61 -0
  103. package/dist/core/mcp-probe.d.ts +1 -1
  104. package/dist/core/mcp-probe.js +2 -5
  105. package/dist/core/mcp.d.ts +5 -1
  106. package/dist/core/mcp.js +70 -64
  107. package/dist/core/memory-engine/consolidation-driver.js +4 -3
  108. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  109. package/dist/core/memory-engine/distiller.js +26 -17
  110. package/dist/core/memory-engine/engine.js +4 -4
  111. package/dist/core/memory-engine/layout.d.ts +60 -8
  112. package/dist/core/memory-engine/layout.js +70 -8
  113. package/dist/core/model-seat.d.ts +10 -3
  114. package/dist/core/mods/classic-events.d.ts +67 -0
  115. package/dist/core/mods/classic-events.js +1 -0
  116. package/dist/core/mods/dollar.d.ts +13 -0
  117. package/dist/core/mods/extension-call.d.ts +31 -0
  118. package/dist/core/mods/extension-call.js +43 -0
  119. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  120. package/dist/core/mods/kernel/dispatch.js +140 -69
  121. package/dist/core/mods/kernel/events.d.ts +47 -11
  122. package/dist/core/mods/kernel/events.js +66 -42
  123. package/dist/core/mods/kernel/index.d.ts +4 -4
  124. package/dist/core/mods/kernel/index.js +2 -2
  125. package/dist/core/mods/kernel/receive.d.ts +39 -5
  126. package/dist/core/mods/kernel/receive.js +290 -17
  127. package/dist/core/mods/kernel/registration.d.ts +33 -2
  128. package/dist/core/mods/kernel/registration.js +6 -7
  129. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  130. package/dist/core/mods/kernel/site-rules.js +24 -42
  131. package/dist/core/mods/spec-seats.d.ts +69 -0
  132. package/dist/core/mods/spec-seats.js +114 -0
  133. package/dist/core/mods/stations.d.ts +28 -8
  134. package/dist/core/mods/stations.js +29 -13
  135. package/dist/core/mods/tool-call.d.ts +79 -0
  136. package/dist/core/mods/tool-call.js +152 -0
  137. package/dist/core/namespaced-rule-name.d.ts +32 -38
  138. package/dist/core/namespaced-rule-name.js +29 -36
  139. package/dist/core/parent-spec-seat.d.ts +6 -1
  140. package/dist/core/parent-spec-seat.js +2 -0
  141. package/dist/core/park-selfcheck.js +3 -0
  142. package/dist/core/permission-rule-consent.d.ts +24 -3
  143. package/dist/core/permission-rule-consent.js +136 -41
  144. package/dist/core/permission-rule-model.d.ts +57 -5
  145. package/dist/core/permission-rule-model.js +90 -31
  146. package/dist/core/permission-rule-org.d.ts +6 -2
  147. package/dist/core/permission-rule-org.js +8 -4
  148. package/dist/core/permission-rule-provider.d.ts +5 -2
  149. package/dist/core/permission-rule-provider.js +41 -11
  150. package/dist/core/permission-rule-store.d.ts +3 -2
  151. package/dist/core/permission-rule-store.js +11 -2
  152. package/dist/core/permission-rule-sync.js +3 -2
  153. package/dist/core/permission-rule-syntax.d.ts +5 -4
  154. package/dist/core/permission-rule-syntax.js +2 -2
  155. package/dist/core/permission-rules.d.ts +4 -4
  156. package/dist/core/permission-rules.js +11 -20
  157. package/dist/core/persisted-rule-arms.d.ts +2 -2
  158. package/dist/core/persisted-rule-arms.js +10 -12
  159. package/dist/core/principal-name.d.ts +20 -0
  160. package/dist/core/principal-name.js +22 -0
  161. package/dist/core/prompt-section-seat.js +4 -6
  162. package/dist/core/protocol-http-auth.d.ts +40 -5
  163. package/dist/core/protocol-http-auth.js +168 -4
  164. package/dist/core/protocol-naming.d.ts +20 -0
  165. package/dist/core/protocol-naming.js +20 -3
  166. package/dist/core/read-only-shell.d.ts +20 -5
  167. package/dist/core/read-only-shell.js +29 -14
  168. package/dist/core/remote-env.d.ts +37 -1
  169. package/dist/core/remote-env.js +11 -0
  170. package/dist/core/resume-startup-cause.d.ts +24 -2
  171. package/dist/core/resume-startup-cause.js +20 -1
  172. package/dist/core/retired-keys.d.ts +16 -0
  173. package/dist/core/retired-keys.js +16 -4
  174. package/dist/core/rewrite-rejudge.d.ts +60 -0
  175. package/dist/core/rewrite-rejudge.js +36 -0
  176. package/dist/core/roles.d.ts +28 -1
  177. package/dist/core/roles.js +81 -26
  178. package/dist/core/rule-lane-reads.d.ts +20 -15
  179. package/dist/core/rule-lane-reads.js +45 -17
  180. package/dist/core/rule-owner.d.ts +3 -3
  181. package/dist/core/rule-owner.js +3 -2
  182. package/dist/core/runner/announce-once-ledger.d.ts +14 -0
  183. package/dist/core/runner/announce-once-ledger.js +5 -0
  184. package/dist/core/runner/assemble-result.d.ts +1 -0
  185. package/dist/core/runner/assemble-result.js +1 -1
  186. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  187. package/dist/core/runner/caller-roster.d.ts +16 -4
  188. package/dist/core/runner/caller-roster.js +33 -6
  189. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  190. package/dist/core/runner/capability-withheld-seat.js +24 -0
  191. package/dist/core/runner/classifier-ladder.d.ts +7 -9
  192. package/dist/core/runner/classifier-ladder.js +3 -3
  193. package/dist/core/runner/compact-session.d.ts +10 -0
  194. package/dist/core/runner/compact-session.js +202 -0
  195. package/dist/core/runner/compaction-call-options.d.ts +2 -2
  196. package/dist/core/runner/compaction-seams.d.ts +21 -1
  197. package/dist/core/runner/compaction-seams.js +11 -8
  198. package/dist/core/runner/construction-doors.js +3 -0
  199. package/dist/core/runner/contracts.d.ts +50 -40
  200. package/dist/core/runner/cross-boundary-lane.d.ts +17 -13
  201. package/dist/core/runner/cross-boundary-lane.js +40 -27
  202. package/dist/core/runner/denial-limit-arms.d.ts +2 -2
  203. package/dist/core/runner/denial-limit-arms.js +1 -1
  204. package/dist/core/runner/derived-route-fallback.d.ts +13 -0
  205. package/dist/core/runner/derived-route-fallback.js +6 -0
  206. package/dist/core/runner/env-capability-census.d.ts +3 -2
  207. package/dist/core/runner/env-capability-census.js +9 -3
  208. package/dist/core/runner/file-history-request.d.ts +18 -0
  209. package/dist/core/runner/file-history-request.js +21 -13
  210. package/dist/core/runner/file-history-restore.d.ts +45 -0
  211. package/dist/core/runner/file-history-restore.js +46 -0
  212. package/dist/core/runner/gate-exit.d.ts +3 -3
  213. package/dist/core/runner/gate-exit.js +4 -3
  214. package/dist/core/runner/image.d.ts +7 -17
  215. package/dist/core/runner/image.js +9 -60
  216. package/dist/core/runner/permission-rule-lanes.d.ts +11 -11
  217. package/dist/core/runner/permission-rule-lanes.js +39 -17
  218. package/dist/core/runner/person-path-rows.d.ts +12 -9
  219. package/dist/core/runner/person-path-rows.js +18 -7
  220. package/dist/core/runner/prepare-acquire-reconcile.d.ts +3 -0
  221. package/dist/core/runner/prepare-acquire-reconcile.js +2 -1
  222. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  223. package/dist/core/runner/prepare-ask-lane.js +5 -2
  224. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  225. package/dist/core/runner/prepare-caps-and-workflow.js +4 -3
  226. package/dist/core/runner/prepare-config-doors.d.ts +35 -38
  227. package/dist/core/runner/prepare-config-doors.js +46 -28
  228. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  229. package/dist/core/runner/prepare-defer-classify.js +7 -8
  230. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  231. package/dist/core/runner/prepare-file-history.js +7 -39
  232. package/dist/core/runner/prepare-gate-stations.d.ts +1 -1
  233. package/dist/core/runner/prepare-gate-stations.js +10 -1
  234. package/dist/core/runner/prepare-hands-readface.d.ts +5 -9
  235. package/dist/core/runner/prepare-hands-readface.js +17 -14
  236. package/dist/core/runner/prepare-inherited-gate.d.ts +6 -3
  237. package/dist/core/runner/prepare-inherited-gate.js +5 -3
  238. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  239. package/dist/core/runner/prepare-park-ask.d.ts +2 -0
  240. package/dist/core/runner/prepare-park-ask.js +7 -7
  241. package/dist/core/runner/prepare-policy-chain.d.ts +6 -3
  242. package/dist/core/runner/prepare-policy-chain.js +67 -76
  243. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  244. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  245. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  246. package/dist/core/runner/prepare-prompt-inputs.js +3 -5
  247. package/dist/core/runner/prepare-protocol-tools.d.ts +2 -0
  248. package/dist/core/runner/prepare-protocol-tools.js +3 -3
  249. package/dist/core/runner/prepare-safety-scan.d.ts +1 -1
  250. package/dist/core/runner/prepare-safety-scan.js +0 -17
  251. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  252. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  253. package/dist/core/runner/prepare-task.d.ts +5 -2
  254. package/dist/core/runner/prepare-task.js +48 -43
  255. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +20 -4
  256. package/dist/core/runner/prepare-tool-disclosure-mount.js +33 -23
  257. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  258. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  259. package/dist/core/runner/prepare-wiring-manifest.d.ts +6 -2
  260. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  261. package/dist/core/runner/resume-admission.js +1 -1
  262. package/dist/core/runner/resume-apply.js +11 -12
  263. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  264. package/dist/core/runner/resume-claim.d.ts +4 -2
  265. package/dist/core/runner/resume-claim.js +15 -8
  266. package/dist/core/runner/retired-runner-deps.js +1 -0
  267. package/dist/core/runner/rewind-files.d.ts +12 -0
  268. package/dist/core/runner/rewind-files.js +90 -0
  269. package/dist/core/runner/run-attachment-seats.js +2 -1
  270. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  271. package/dist/core/runner/run-brain-sinks.js +4 -2
  272. package/dist/core/runner/run-harness-handlers.js +12 -4
  273. package/dist/core/runner/run-leg.d.ts +1 -1
  274. package/dist/core/runner/run-leg.js +40 -39
  275. package/dist/core/runner/run-notification-lane.d.ts +2 -0
  276. package/dist/core/runner/run-notification-lane.js +2 -2
  277. package/dist/core/runner/run-recovery-lanes.js +3 -4
  278. package/dist/core/runner/run-settle-and-teardown.js +7 -12
  279. package/dist/core/runner/run-terminal-adoption.js +3 -4
  280. package/dist/core/runner/run-turn-boundary.js +4 -15
  281. package/dist/core/runner/runtask.d.ts +10 -0
  282. package/dist/core/runner/runtask.js +35 -42
  283. package/dist/core/runner/send-message-continuation.js +1 -1
  284. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  285. package/dist/core/runner/session-read-file-states.js +28 -0
  286. package/dist/core/runner/session-rule-policy.js +4 -3
  287. package/dist/core/runner/session-verb-doors.d.ts +28 -0
  288. package/dist/core/runner/session-verb-doors.js +48 -0
  289. package/dist/core/runner/session-write-ledger.d.ts +30 -0
  290. package/dist/core/runner/session-write-ledger.js +101 -0
  291. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  292. package/dist/core/runner/shell-env-withheld.js +51 -0
  293. package/dist/core/runner/skills-seat.js +6 -2
  294. package/dist/core/runner/stream-settle-backstop.js +12 -15
  295. package/dist/core/runner/sub-agent-deny-lists.d.ts +25 -3
  296. package/dist/core/runner/sub-agent-deny-lists.js +25 -17
  297. package/dist/core/runner/synthetic-tools.d.ts +6 -0
  298. package/dist/core/runner/synthetic-tools.js +4 -1
  299. package/dist/core/runner/teardown-bounded.d.ts +1 -0
  300. package/dist/core/runner/teardown-bounded.js +1 -0
  301. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  302. package/dist/core/runner/tool-disclosure.js +1 -3
  303. package/dist/core/runner/tool-end-body.d.ts +1 -1
  304. package/dist/core/runner/tool-end-body.js +10 -9
  305. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  306. package/dist/core/runner/tool-not-executed.js +11 -0
  307. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  308. package/dist/core/runner/tool-occurrence.js +7 -0
  309. package/dist/core/runner/turn-attachments.d.ts +33 -15
  310. package/dist/core/runner/turn-attachments.js +62 -37
  311. package/dist/core/runner-deps.d.ts +7 -7
  312. package/dist/core/safety-axis-vocab.d.ts +6 -4
  313. package/dist/core/safety-axis-vocab.js +6 -5
  314. package/dist/core/safety-merge-corpus.js +11 -3
  315. package/dist/core/secret-env.d.ts +30 -3
  316. package/dist/core/secret-env.js +47 -8
  317. package/dist/core/select-model.js +3 -3
  318. package/dist/core/session-policy-store.d.ts +32 -15
  319. package/dist/core/session-policy-store.js +156 -36
  320. package/dist/core/session-store.d.ts +29 -10
  321. package/dist/core/session-store.js +51 -19
  322. package/dist/core/session.d.ts +82 -16
  323. package/dist/core/session.js +53 -0
  324. package/dist/core/shell-read-silence.d.ts +11 -12
  325. package/dist/core/shell-read-silence.js +9 -5
  326. package/dist/core/shell-run-candidates.js +3 -1
  327. package/dist/core/shell-wrapper-projection.d.ts +1 -1
  328. package/dist/core/shell-wrapper-projection.js +1 -1
  329. package/dist/core/shell-wrapper-table.d.ts +14 -7
  330. package/dist/core/shell-wrapper-table.js +5 -4
  331. package/dist/core/side-query.js +10 -1
  332. package/dist/core/skill-grant.d.ts +7 -2
  333. package/dist/core/skill-grant.js +5 -0
  334. package/dist/core/skills-directory.js +6 -2
  335. package/dist/core/store-contracts/background-agent-store-contract.js +1 -0
  336. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  337. package/dist/core/store-contracts/checkpoint-store-contract.js +141 -2
  338. package/dist/core/store-contracts/file-history-store-contract.js +40 -1
  339. package/dist/core/store-contracts/mailbox-store-contract.js +49 -1
  340. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  341. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  342. package/dist/core/store-contracts/session-repo-contract.js +51 -0
  343. package/dist/core/store-contracts/session-store-contract.d.ts +2 -1
  344. package/dist/core/store-contracts/session-store-contract.js +150 -14
  345. package/dist/core/stub-env.d.ts +2 -0
  346. package/dist/core/stub-env.js +1 -0
  347. package/dist/core/synthetic-read-verdict.js +3 -3
  348. package/dist/core/task-event.d.ts +32 -4
  349. package/dist/core/task-notification.d.ts +16 -12
  350. package/dist/core/task-registry-agent.d.ts +8 -4
  351. package/dist/core/task-registry-agent.js +14 -8
  352. package/dist/core/task-registry-shared.d.ts +35 -6
  353. package/dist/core/task-registry-shared.js +11 -0
  354. package/dist/core/task-registry.d.ts +10 -1
  355. package/dist/core/task-registry.js +12 -2
  356. package/dist/core/task-result.d.ts +18 -0
  357. package/dist/core/task-spec.d.ts +18 -13
  358. package/dist/core/tighten-task-spec.js +2 -1
  359. package/dist/core/tool-catalog-entries.d.ts +23 -0
  360. package/dist/core/tool-catalog-entries.js +14 -2
  361. package/dist/core/tool-check-reading.d.ts +11 -0
  362. package/dist/core/tool-check-reading.js +11 -6
  363. package/dist/core/tool-model-gate.d.ts +2 -2
  364. package/dist/core/tool-name-aliases.d.ts +48 -18
  365. package/dist/core/tool-name-aliases.js +36 -19
  366. package/dist/core/tool-name-readings.d.ts +6 -32
  367. package/dist/core/tool-name-readings.js +2 -9
  368. package/dist/core/tool-policy.d.ts +78 -204
  369. package/dist/core/tool-policy.js +152 -204
  370. package/dist/core/tool-result-store.js +3 -0
  371. package/dist/core/tool-roster.d.ts +14 -19
  372. package/dist/core/tool-roster.js +11 -44
  373. package/dist/core/tool-spec-members.js +7 -2
  374. package/dist/core/tool-spec.d.ts +19 -11
  375. package/dist/core/tools.js +49 -9
  376. package/dist/core/trace.d.ts +6 -3
  377. package/dist/core/trace.js +2 -1
  378. package/dist/core/types.d.ts +1 -1
  379. package/dist/core/untrusted-egress.d.ts +20 -0
  380. package/dist/core/untrusted-egress.js +77 -3
  381. package/dist/core/user-attachment.d.ts +8 -1
  382. package/dist/core/user-attachment.js +64 -4
  383. package/dist/core/wiring-manifest.d.ts +9 -0
  384. package/dist/core/wiring-manifest.js +1 -0
  385. package/dist/core/workflow-journal-store.js +1 -1
  386. package/dist/engine/compaction/compaction.js +3 -2
  387. package/dist/engine/execution-env/node-execution-env.d.ts +7 -3
  388. package/dist/engine/execution-env/node-execution-env.js +11 -2
  389. package/dist/engine/harness/agent-harness.d.ts +32 -6
  390. package/dist/engine/harness/agent-harness.js +65 -9
  391. package/dist/engine/harness/types.d.ts +29 -2
  392. package/dist/engine/llm/types.d.ts +28 -11
  393. package/dist/engine/loop/agent-loop.d.ts +23 -4
  394. package/dist/engine/loop/agent-loop.js +42 -30
  395. package/dist/engine/loop/types.d.ts +16 -6
  396. package/dist/engine/session/memory-repo.d.ts +9 -2
  397. package/dist/engine/session/memory-repo.js +11 -1
  398. package/dist/engine/session/repo-utils.d.ts +6 -5
  399. package/dist/engine/session/repo-utils.js +14 -6
  400. package/dist/index.d.ts +34 -17
  401. package/dist/index.js +22 -11
  402. package/dist/internal/harness-types.d.ts +1 -1
  403. package/dist/internal/harness.d.ts +2 -1
  404. package/dist/internal/harness.js +1 -0
  405. package/dist/internal/llm.d.ts +1 -1
  406. package/dist/orchestration/run-workflow-tool.d.ts +6 -4
  407. package/dist/orchestration/run-workflow-tool.js +5 -3
  408. package/dist/orchestration/workflow.d.ts +3 -0
  409. package/dist/orchestration/workflow.js +36 -18
  410. package/dist/primitives/credential-ref.d.ts +89 -0
  411. package/dist/primitives/credential-ref.js +125 -0
  412. package/dist/primitives/index.d.ts +2 -0
  413. package/dist/primitives/index.js +1 -0
  414. package/dist/prompt-assembly/artifact.d.ts +2 -2
  415. package/dist/prompt-assembly/artifact.js +5 -3
  416. package/dist/prompt-assembly/assemble.d.ts +3 -2
  417. package/dist/prompt-assembly/assemble.js +1 -1
  418. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  419. package/dist/prompt-assembly/catalog/schema.js +34 -2
  420. package/dist/prompt-assembly/catalog/sections.js +0 -1
  421. package/dist/prompt-assembly/composer.d.ts +3 -1
  422. package/dist/prompt-assembly/composer.js +1 -1
  423. package/dist/prompt-assembly/event-registry.js +1 -0
  424. package/dist/prompt-assembly/overlay.js +3 -3
  425. package/dist/prompt-assembly/renderers.d.ts +1 -1
  426. package/dist/prompt-assembly/renderers.js +0 -3
  427. package/dist/prompt-assembly/role-base.d.ts +15 -0
  428. package/dist/prompt-assembly/role-base.js +9 -0
  429. package/dist/prompt-assembly/select.d.ts +39 -14
  430. package/dist/prompt-assembly/select.js +47 -16
  431. package/dist/prompt-assembly/sugar.d.ts +17 -11
  432. package/dist/prompt-assembly/sugar.js +8 -3
  433. package/dist/prompt-assembly/tool-catalog.d.ts +37 -3
  434. package/dist/prompt-assembly/tool-catalog.js +114 -4
  435. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  436. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  437. package/dist/prompt-assembly/types.d.ts +0 -7
  438. package/dist/scenarios/full-body.d.ts +11 -11
  439. package/dist/scenarios/full-body.js +4 -3
  440. package/dist/shell/lex.js +10 -1
  441. package/dist/stores/file/adoption/adopt.js +4 -3
  442. package/dist/stores/file/adoption/marker.js +3 -2
  443. package/dist/stores/file/checkpoint-store.d.ts +21 -4
  444. package/dist/stores/file/checkpoint-store.js +38 -7
  445. package/dist/stores/file/file-history-store.js +18 -11
  446. package/dist/stores/file/index.js +2 -1
  447. package/dist/stores/file/mailbox-store.d.ts +2 -1
  448. package/dist/stores/file/mailbox-store.js +26 -1
  449. package/dist/stores/file/permission-rule-adopt.js +4 -3
  450. package/dist/stores/file/permission-rule-store.js +11 -5
  451. package/dist/stores/file/session-store.d.ts +29 -6
  452. package/dist/stores/file/session-store.js +42 -50
  453. package/dist/tools/artifact/artifact-tool.js +3 -2
  454. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  455. package/dist/tools/fs/bash-program-position.js +56 -9
  456. package/dist/tools/fs/bash-readonly-classifier.d.ts +15 -19
  457. package/dist/tools/fs/bash-readonly-classifier.js +5 -10
  458. package/dist/tools/fs/fs-bash.js +15 -8
  459. package/dist/tools/fs/fs-glob.d.ts +86 -0
  460. package/dist/tools/fs/fs-glob.js +226 -0
  461. package/dist/tools/fs/fs-read.js +14 -14
  462. package/dist/tools/fs/fs-search-tools.js +7 -7
  463. package/dist/tools/fs/pattern-kill-guard.d.ts +23 -0
  464. package/dist/tools/fs/pattern-kill-guard.js +429 -0
  465. package/dist/tools/fs/pdf.d.ts +9 -6
  466. package/dist/tools/fs/pdf.js +3 -3
  467. package/dist/tools/fs/program-read-model.d.ts +57 -7
  468. package/dist/tools/fs/program-read-model.js +11 -1
  469. package/dist/tools/fs/program-read-model.rows.js +78 -21
  470. package/dist/tools/fs/read-deny-home.js +3 -2
  471. package/dist/tools/fs/removal-targets.d.ts +17 -7
  472. package/dist/tools/fs/removal-targets.js +47 -20
  473. package/dist/tools/fs/search.d.ts +10 -0
  474. package/dist/tools/fs/search.js +20 -26
  475. package/dist/tools/fs/shell-read-argv.js +89 -12
  476. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  477. package/dist/tools/fs/shell-read-bindings.js +41 -0
  478. package/dist/tools/fs/shell-read-check.d.ts +10 -0
  479. package/dist/tools/fs/shell-read-check.js +13 -20
  480. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  481. package/dist/tools/fs/shell-read-environment.js +3 -2
  482. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  483. package/dist/tools/fs/shell-read-establish.js +19 -20
  484. package/dist/tools/fs/shell-read-identity.d.ts +12 -9
  485. package/dist/tools/fs/shell-read-identity.js +9 -4
  486. package/dist/tools/fs/shell-read-plan.js +24 -16
  487. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  488. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  489. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  490. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  491. package/dist/tools/fs/shell-reentry-text.js +40 -2
  492. package/dist/tools/todo.js +63 -63
  493. package/dist/tools/web.d.ts +19 -14
  494. package/dist/tools/web.js +46 -61
  495. package/package.json +1 -1
  496. package/test/export-surface.snapshot.json +221 -7
  497. package/wire-changes/core-stores-sql@7.57.0.json +29 -0
  498. package/wire-changes/core@7.56.0.json +3891 -0
  499. package/wire-changes/core@7.57.0.json +1487 -0
  500. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  501. package/wire-changes/mods-kernel@7.57.0.json +29 -0
  502. package/wire-changes/primitives@7.57.0.json +245 -0
@@ -6,6 +6,7 @@ import { lastAttachmentFrameOf } from "../user-attachment.js";
6
6
  import { reconcileInterruptedSession } from "../session-reconcile.js";
7
7
  import { detectConflicts, settleBranchWriteBack } from "./branch-writeback.js";
8
8
  import { settleTeardownLeg } from "./teardown-bounded.js";
9
+ import { writesThroughLeg } from "./session-write-ledger.js";
9
10
  const RECONCILE_MAX_RETRIES = 3;
10
11
  export async function prepareAcquireReconcile(input) {
11
12
  const { sessions, spec, resume, wakeEffects } = input;
@@ -29,7 +30,7 @@ export async function prepareAcquireReconcile(input) {
29
30
  }
30
31
  conflictRef = { hit: false };
31
32
  const own = { ids: undefined };
32
- session = new StoredSession(detectConflicts(acquired.session.getStorage(), conflictRef, own));
33
+ session = new StoredSession(detectConflicts(input.legWrites !== undefined ? writesThroughLeg(acquired.session.getStorage(), input.legWrites, acquired.sessionId) : acquired.session.getStorage(), conflictRef, own));
33
34
  if (!spec.sessionId) {
34
35
  break;
35
36
  }
@@ -38,8 +38,8 @@ export interface PrepareAskLaneInput {
38
38
  advertisedWritableDirs: Pick<AdvertisedWritableDirs, "roots"> | undefined;
39
39
  /** borrowed-readonly — the leg's ONE exempt root, stamped on every request a policy judges (`ToolCallRequest.exemptRoots`). */
40
40
  exemptRoots: readonly string[];
41
- /** borrowed-readonly — the shared mount roster; read at RUN time by the approval-preview projection (alias-aware
42
- * lookup over whatever the roster holds when the ask is minted). Never mutated here. */
41
+ /** borrowed-readonly — the shared mount roster; read at RUN time by the approval-preview projection (the dispatcher's
42
+ * resolution over whatever the roster holds when the ask is minted). Never mutated here. */
43
43
  tools: readonly AgentTool[];
44
44
  /** borrowed-mutable — the inherited-unavailable marker set. Writer here: `resolveAskBound` consumes (`delete`) a
45
45
  * marked call at its fail-closed intercept; the policy-chain phase records, the gate station sweeps. */
@@ -6,9 +6,11 @@ import { exactBoundInputHashOf } from "../canonical-json.js";
6
6
  import { composeCallSignal, raceSettlementAgainstSignal } from "./abort-race.js";
7
7
  import { failedJudgmentDeny, policyCheckAbortedDeny } from "./policy-throw.js";
8
8
  import { askMandateMember } from "../ask-origin.js";
9
- import { approvalCardMemberOf } from "../tool-roster.js";
9
+ import { approvalCardMemberOf, survivorsByName } from "../tool-roster.js";
10
+ import { toolNameIndex } from "../../internal/llm.js";
10
11
  import { gateAskCarry, lateAskSettlementObserver } from "./denial-limit-arms.js";
11
12
  import { consumeInheritedAskGrant } from "./inherited-ask-grants.js";
13
+ import { requesterOf } from "../mods/extension-call.js";
12
14
  import { settleReadRootGrant } from "./read-root-grant.js";
13
15
  function createDenyObserverNotifier(bus, signal) {
14
16
  if (bus === undefined || !bus.hasHandlers("classic.PermissionDenied"))
@@ -32,7 +34,7 @@ const sanitizePreview = (node, depth = 0) => {
32
34
  return out;
33
35
  };
34
36
  function resolveApprovalPreview(tools, toolName, args) {
35
- const t = tools.find((x) => x.name === toolName || (x.aliases?.includes(toolName) ?? false));
37
+ const t = toolNameIndex([...survivorsByName(tools).values()])(toolName);
36
38
  if (t?.approvalPreview === undefined)
37
39
  return {};
38
40
  try {
@@ -106,6 +108,7 @@ export function prepareAskLane(input) {
106
108
  ...askSourceIdentity(),
107
109
  ...riskAxesOf(req),
108
110
  ...approvalCardMemberOf(req),
111
+ ...requesterOf(modBus, req.toolCallId),
109
112
  ...(decision.action === "ask" && decision.requiresRealApproval === true ? { requiresRealApproval: true } : {}),
110
113
  ...(decision.action === "ask" ? askMandateMember(decision) : {}),
111
114
  ...(decision.action === "ask" ? gateAskCarry(decision, isLiveApproverSeat(onAsk), autoModeDenialTracking.current) : {}),
@@ -36,7 +36,7 @@ import type { AssertAllKeysHandled } from "../ask-origin.js";
36
36
  import { type ChildClampSource } from "../child-clamp-seats.js";
37
37
  import type { InheritedGate, Prepared, RunInternals, RunnerSelfSeat, ToolFaceSnapshot } from "./contracts.js";
38
38
  import { type BlockedRef } from "./synthetic-tools.js";
39
- import { RosterBuilder, type RosterAxisTables } from "../tool-roster.js";
39
+ import { RosterBuilder } from "../tool-roster.js";
40
40
  import type { ParentSpecSeat } from "../parent-spec-seat.js";
41
41
  import { type RosterSpec } from "./caller-roster.js";
42
42
  export interface PrepareCapsAndWorkflowInput {
@@ -56,7 +56,7 @@ export interface PrepareCapsAndWorkflowInput {
56
56
  /** borrowed-readonly — the trusted spawn-side channel; the Workflow mount forwards `rootSessionId`, `placementRoot`,
57
57
  * `onTaskNotification`, `workflowDepth`, the capture-floor getter reads `memoryCaptureAncestors`, and the arming reads
58
58
  * the chain's auto-mode face (`inheritedGate.autoModeFace`). */
59
- internals: Pick<RunInternals, "rootSessionId" | "placementRoot" | "onTaskNotification" | "workflowDepth" | "memoryCaptureAncestors" | "workflowParkedResume" | "questionFaceStripped" | "inheritedGate"> | undefined;
59
+ internals: Pick<RunInternals, "rootSessionId" | "placementRoot" | "onTaskNotification" | "workflowDepth" | "memoryCaptureAncestors" | "workflowParkedResume" | "holder" | "questionFaceStripped" | "inheritedGate"> | undefined;
60
60
  /** borrowed-readonly — the tree's cross-boundary token (inherited or minted), which the Workflow mount hands to its children. */ crossBoundaryTree: import("../cross-boundary-taint.js").CrossBoundaryTreeToken;
61
61
  /** borrowed-readonly — the acquired session; the classifier leg rebuilds its transcript window from `buildContext`. */
62
62
  session: Pick<StoredSession, "buildContext">;
@@ -78,12 +78,10 @@ export interface PrepareCapsAndWorkflowInput {
78
78
  lockedPreflight: Pick<LockedPreflight, "mcp">;
79
79
  /** borrowed-mutable — the effect collection (`Prepared.toolEffects`): the safety scan's caller entries, then the mounts' writes. */
80
80
  toolEffects: Prepared["toolEffects"];
81
- /** borrowed-mutable — the scan's axis tables, so the builder moves an alias's axes with its member (a phase test may omit them). */
82
- safetyAxes?: RosterAxisTables;
83
81
  /** borrowed-readonly — the frozen tool-face snapshot the Workflow mount forwards (exclude / defer / alwaysLoad / restoreGated). */
84
82
  toolFaceSnapshot: ToolFaceSnapshot;
85
- /** borrowed-readonly — the resolved prompt profile (the Workflow mount's parentPromptProfile). */
86
- promptProfile: ToolExecuteContext["promptProfile"];
83
+ /** borrowed-readonly — the task-level lean switch (the Workflow mount's parentPromptLean; absent ⇒ no key). */
84
+ promptLean: ToolExecuteContext["promptLean"];
87
85
  /** borrowed-readonly — the resolved interaction posture (the Workflow mount's parentInteractionPosture; absent ⇒ no key). */
88
86
  resolvedInteractionPosture: ToolExecuteContext["interactionPosture"];
89
87
  /** borrowed-readonly — the harness seat; the Workflow mount's parentModel / parentThinking getters read it call-time. */
@@ -117,8 +117,8 @@ function autoModeArmReasonOf(intent, facePresent, caps, capsFaulted) {
117
117
  return { armed: true, reason: "armed" };
118
118
  }
119
119
  export async function prepareCapsAndWorkflow(input) {
120
- const { spec, deps, parentSpecSeat, checkpointSeat, internals, session, sessionId, runId, hostTaskId, taskScope, taskRootFinal, model, thinking, lockedPreflight, toolEffects, safetyAxes, toolFaceSnapshot, promptProfile, resolvedInteractionPosture, harnessRef, askSeat, runClampSource, forwardEvent, inheritedGateForChildren, enrichSpecToolCtx, maybeOffload, requestReview, enterPlanMode, permissionMode, readDenyEntries, peerLaneActive, peerSendMessageBuiltIn, runnerSelf, delegated, sideCallBookRef } = input;
121
- const roster = new RosterBuilder(toolEffects, safetyAxes);
120
+ const { spec, deps, parentSpecSeat, checkpointSeat, internals, session, sessionId, runId, hostTaskId, taskScope, taskRootFinal, model, thinking, lockedPreflight, toolEffects, toolFaceSnapshot, promptLean, resolvedInteractionPosture, harnessRef, askSeat, runClampSource, forwardEvent, inheritedGateForChildren, enrichSpecToolCtx, maybeOffload, requestReview, enterPlanMode, permissionMode, readDenyEntries, peerLaneActive, peerSendMessageBuiltIn, runnerSelf, delegated, sideCallBookRef } = input;
121
+ const roster = new RosterBuilder(toolEffects);
122
122
  for (const t of spec.tools ?? []) {
123
123
  const mounted = mountCallerTool(t);
124
124
  roster.mount(mounted, { source: callerMountSource(mounted), mountedBy: "scenario" });
@@ -317,7 +317,7 @@ export async function prepareCapsAndWorkflow(input) {
317
317
  parentDeferTools: toolFaceSnapshot.defer,
318
318
  parentAlwaysLoadTools: toolFaceSnapshot.alwaysLoad,
319
319
  ...(toolFaceSnapshot.restoreGated !== undefined ? { parentRestoreGatedTools: toolFaceSnapshot.restoreGated } : {}),
320
- parentPromptProfile: promptProfile,
320
+ ...(promptLean !== undefined ? { parentPromptLean: promptLean } : {}),
321
321
  models: deps.models,
322
322
  agents: deps.agents,
323
323
  builtinAgents: deps.builtinAgents,
@@ -352,6 +352,7 @@ export async function prepareCapsAndWorkflow(input) {
352
352
  return mine.length > 0 ? mine : undefined;
353
353
  } }
354
354
  : {}),
355
+ ...(internals?.holder !== undefined ? { holder: internals.holder } : {}),
355
356
  parentSpecSeat, ...(internals?.questionFaceStripped === true ? { parentQuestionFaceStripped: true } : {}),
356
357
  ...(resolvedInteractionPosture !== undefined ? { parentInteractionPosture: resolvedInteractionPosture } : {}),
357
358
  parentMemoryCaptureState: () => {
@@ -23,6 +23,7 @@ import type { Model } from "../../internal/llm.js";
23
23
  import type { ThinkingLevel } from "../../internal/harness.js";
24
24
  import { type MicroCompactMachine } from "../context-edit.js";
25
25
  import { type CrossBoundaryPosture } from "../cross-boundary-taint.js";
26
+ import { type HostFloor } from "../host-floor.js";
26
27
  import { recordedModeSeed } from "../checkpoint-store.js";
27
28
  import { type ConfigDoorEntry, type LockedPreflight } from "../locked-config.js";
28
29
  import { type ResolvedRole } from "../roles.js";
@@ -33,10 +34,24 @@ import { type UsageWindow } from "../usage-window-store.js";
33
34
  import { type AskSeat } from "../wiring-manifest.js";
34
35
  import type { PrepareResume, RunInternals, ToolFaceLists } from "./contracts.js";
35
36
  import { resolveHost } from "../../prompt-assembly/select.js";
37
+ import type { PromptTraitName } from "../../prompt-assembly/catalog/schema.js";
36
38
  import { type RosterSpec } from "./caller-roster.js";
39
+ /**
40
+ * The model a compaction pass summarizes on: the explicit `compactionModel` wins (resolved at `seat`, the word a
41
+ * refusal names), else the `summarize` role when one is configured, else `undefined` — the pass then falls back to
42
+ * the main model inside `maybeCompact`. One reading for a run's prepare and the out-of-run `Runner.compactSession`.
43
+ */
44
+ export declare function resolveCompactionModel(spec: Pick<TaskSpec, "compactionModel" | "roles">, deps: Pick<RunnerDeps, "models" | "roles">, seat: string): Model | undefined;
37
45
  export declare function limitConfigError(code: string, message: string): Error & {
38
46
  code?: string;
39
47
  };
48
+ /**
49
+ * `TaskSpec.principal`: absent (omitted, or the empty string the engine has always read as no principal) or a principal name. A
50
+ * principal that was PROVIDED and is no name (white space, an invisible or control character, a non-string) is refused at the task, on
51
+ * every leg a resume's re-supplied config included — read as "no principal" it would reach the unauthenticated floor, or, on a
52
+ * deployment that declared local-owner rules, the machine owner's standing approvals.
53
+ */
54
+ export declare function assertPrincipalValue(raw: unknown): void;
40
55
  /**
41
56
  * Validate `TaskSpec.limits` at the door and return it unchanged.
42
57
  *
@@ -52,8 +67,9 @@ export declare function limitConfigError(code: string, message: string): Error &
52
67
  */
53
68
  export declare function resolveTaskLimits(limits: TaskLimits | undefined): TaskLimits | undefined;
54
69
  /**
55
- * Validate the MODE-VALUED members of `TaskSpec.attachments` at the same door, and return the
56
- * config unchanged. Today that is exactly one member, `totalTokensReminderMode`.
70
+ * Validate the members of `TaskSpec.attachments` that refuse a value they cannot read at the same door, and return the
71
+ * config unchanged. Today that is two: the mode-valued `totalTokensReminderMode` and the boolean switch `mcpUnavailable`
72
+ * (read by its own reader, `mcpUnavailableOn`, which the leg asks as well).
57
73
  *
58
74
  * WHY A DOOR AT ALL (坏值响亮度律): a knob whose bad value silently folds to the default is a knob the
59
75
  * deployment believes is armed. `totalTokensReminderMode: "padded_countdown"` (underscore) or
@@ -86,36 +102,13 @@ export declare function resolveTaskLimits(limits: TaskLimits | undefined): TaskL
86
102
  */
87
103
  export declare function resolveAttachmentsConfig(attachments: TaskSpec["attachments"]): TaskSpec["attachments"];
88
104
  /**
89
- * R2 双形轴(追加令 2026-07-18): the reference's fable-variant prompt gate (
90
- * `fable_5_mitigations` capability / claude-mythos-5), ORTHOGONAL to the simple/classic profile.
91
- * sema is BYOM, so the id may carry provider prefixes ("anthropic/claude-fable-5",
92
- * "openrouter/anthropic/claude-fable-5"): BOUNDARY-AWARE family match on the last path segment
93
- * (raw substring classified "vendor/not-claude-fable-5" and "claude-mythos-50"
94
- * as fable), case-normalized. Recognition set = CC's _Nr (startsWith "claude-fable-") + b9e
95
- * (mythos-5). R3 system sections fork on the resulting fact.
105
+ * The run's prompt traits — the one place prepare forms them: the model's declared set (`Model.promptTraits`, read
106
+ * through the model door: a retired `promptGuidance` or a name that is no trait refuses the task by name) with the
107
+ * task's switch on `lean_prompt` (`promptLean`, as the spec writes it — an engine-built child's spec carries its
108
+ * parent's), bundles expanded ({@link effectiveTraitsOf}). The reference's counterpart is a model registry's capability list; sema is
109
+ * BYOM, so the model entry carries the list and no model id is read.
96
110
  */
97
- export declare function isFableFamilyModelId(id: string): boolean;
98
- /**
99
- * The SINGLE decision point for the two prompt-shape axes.
100
- * Both were resolved in separate places with different mechanisms — `promptProfile` off a TaskSpec field,
101
- * `fableMitigations` off a raw model-id prefix test — so "which shape does this task speak" had no one
102
- * place to read. The reference's counterpart is a model-registry `capabilities` array (one table drives
103
- * `lean_prompt` + `fable_5_mitigations` alike).
104
- *
105
- * sema stays BYOM: we cannot key off a capability table for arbitrary model ids, so the RESOLUTION RULES
106
- * are unchanged — profile: spec > inherited internals > "simple"; mitigations: model family. This is a
107
- * consolidation, not a behavior change (the axes stay ORTHOGONAL: neither rewrites the other).
108
- */
109
- export declare function resolveModelPromptTraits(model: {
110
- id: string;
111
- }, spec: {
112
- promptProfile?: "simple" | "classic";
113
- }, internals?: {
114
- promptProfile?: "simple" | "classic";
115
- }): {
116
- promptProfile: "simple" | "classic";
117
- fableMitigations: boolean;
118
- };
111
+ export declare function resolvePromptTraits(model: Model, promptLean: boolean | undefined): ReadonlySet<PromptTraitName>;
119
112
  export interface PrepareConfigDoorsInput {
120
113
  /** borrowed-readonly — the snapshot spec (its roster is faces). NEVER mutated here: the per-task agents rebind returns a
121
114
  * SHALLOW COPY on {@link PrepareConfigDoorsResult.spec} (only `tools` replaced, each rebuilt entry through the snapshot). */
@@ -130,7 +123,7 @@ export interface PrepareConfigDoorsInput {
130
123
  /** borrowed-readonly — presence gates the resumeAt-conflict door and exempts the empty-objective
131
124
  * door (a checkpoint resume passes `objective: ""` by design). */
132
125
  resume?: PrepareResume | undefined;
133
- /** borrowed-readonly — trusted engine channel: prompt-profile inheritance, the spawning run's
126
+ /** borrowed-readonly — trusted engine channel: the spawning run's
134
127
  * interaction posture, the engine question-strip flag. */
135
128
  internals?: RunInternals | undefined;
136
129
  }
@@ -142,8 +135,12 @@ export interface PrepareConfigDoorsResult {
142
135
  /** owned — the frozen task-start copies of the caller's tool-face control arrays; the driver compiles the leg's selector
143
136
  * from them, and the selector (with the disclosure lists) is the ONLY thing later face reads consult. Frozen-immutable. */
144
137
  toolFaceLists: ToolFaceLists;
145
- /** owned — the profile half of the single decision point (model-independent by contract). */
146
- promptProfile: "simple" | "classic";
138
+ /** owned — the task-level switch on the lean shape (`TaskSpec.promptLean`, validated; an engine-built child's spec
139
+ * carries its parent's): what the run hands its children and workflow agents, never its effective traits. */
140
+ promptLean: boolean | undefined;
141
+ /** owned, frozen-by-contract — the run's effective prompt traits ({@link resolvePromptTraits}): the catalog's
142
+ * variants, every overlay's `when.traits` and each tool's description variants select on them. */
143
+ promptTraits: ReadonlySet<PromptTraitName>;
147
144
  /** owned — the host selector values (`TaskSpec.promptRole` / `TaskSpec.promptForm`, validated) the assembly selects on. */
148
145
  promptHost: ReturnType<typeof resolveHost>;
149
146
  /** owned — the run's binding (`TaskSpec.promptBinding`, validated): the selector value every overlay's `when.binding` reads. */
@@ -170,8 +167,6 @@ export interface PrepareConfigDoorsResult {
170
167
  /** owned — the compaction model: explicit wins, else the `summarize` role, else undefined (main
171
168
  * model fallback inside maybeCompact). NOT derivable from {@link resolvedRole}. */
172
169
  compModel: Model | undefined;
173
- /** owned — the mitigations half of the decision point (model-family fact). */
174
- fableMitigations: boolean;
175
170
  /** owned, frozen — model-gate DISCLOSURE data (the application itself already
176
171
  * happened on {@link spec}: its `tools` is the survivor rebind when anything was removed).
177
172
  * prepareTask emits the notices from this after the doors return (the onNotice station);
@@ -214,6 +209,7 @@ export interface PrepareConfigDoorsResult {
214
209
  /** owned — the screened cross-boundary posture: the deps seat read ONCE, a bad value refused; absent stays `undefined` (undeclared is its own fact). */
215
210
  crossBoundaryPosture: CrossBoundaryPosture | undefined;
216
211
  advisorTool: "disabled" | undefined;
212
+ hostFloor: HostFloor | undefined;
217
213
  }
218
214
  /** The microCompact knob door (坏值响亮度默认律, the sibling knob doors' form:
219
215
  * interactionPosture / toolModelGate / staleToolResultOffload). Placement is load-bearing:
@@ -238,7 +234,7 @@ export declare const checkpointStoreSeat: (spec: {
238
234
  export declare function assertResumeConfigRecord(config: unknown): void;
239
235
  /** The spec the value doors read: a prepare's (its roster is faces) or a resume's re-supplied config (no objective, no session id). */
240
236
  type ValueDoorSpec = Omit<TaskSpec, "tools" | "objective" | "sessionId" | "userAttachments"> & Partial<Pick<TaskSpec, "objective" | "sessionId">>;
241
- type ConfigValueDoorsResult = Pick<PrepareConfigDoorsResult, "toolFaceLists" | "promptHost" | "promptBinding" | "lockedPreflight" | "microCompactKnob" | "memoryDelegationEvidence" | "memoryProvenance" | "memoryCapturePolicy" | "usageWindows" | "brainCallGuardrailMs" | "crossBoundaryPosture" | "advisorTool"> & {
237
+ type ConfigValueDoorsResult = Pick<PrepareConfigDoorsResult, "toolFaceLists" | "promptHost" | "promptBinding" | "lockedPreflight" | "microCompactKnob" | "memoryDelegationEvidence" | "memoryProvenance" | "memoryCapturePolicy" | "usageWindows" | "brainCallGuardrailMs" | "crossBoundaryPosture" | "advisorTool" | "promptLean" | "hostFloor"> & {
242
238
  skillListingSeats: {
243
239
  fraction: unknown;
244
240
  maxDescChars: unknown;
@@ -259,6 +255,7 @@ export declare function configValueDoors(input: {
259
255
  deps: RunnerDeps;
260
256
  resumeLeg: boolean;
261
257
  sessions: SessionStore;
258
+ holder?: string | undefined;
262
259
  }, enter?: ConfigDoorEntry): ConfigValueDoorsResult;
263
260
  /**
264
261
  * The doors a RESUMED leg's prepare refuses at, run as one screen BEFORE the claim — prepare's own functions, so a refusal carries
@@ -273,6 +270,6 @@ export declare function configValueDoors(input: {
273
270
  * corrected resume redeems the same token. A throw that is none of prepare's codes leaves as it was thrown. Returns the config the
274
271
  * leg is handed: the caller's, its MCP servers and A2A peers the frozen entries the lock layer judged (read once, dialed as judged).
275
272
  */
276
- export declare function refuseResumeDoors<C extends ValueDoorSpec & Pick<TaskSpec, "userAttachments">>(config: C, recordedGate: Parameters<typeof recordedModeSeed>[0], deps: RunnerDeps, sessions: SessionStore): C;
273
+ export declare function refuseResumeDoors<C extends ValueDoorSpec & Pick<TaskSpec, "userAttachments">>(config: C, recordedGate: Parameters<typeof recordedModeSeed>[0], deps: RunnerDeps, sessions: SessionStore, holder?: string): C;
277
274
  export declare function prepareConfigDoors(input: PrepareConfigDoorsInput): PrepareConfigDoorsResult;
278
275
  export {};
@@ -3,8 +3,10 @@ import { assertContainmentFaceValue } from "../../tools/fs/index.js";
3
3
  import { MICRO_COMPACT_MACHINES } from "../context-edit.js";
4
4
  import { assertAddOnlySeats } from "../child-clamp-seats.js";
5
5
  import { CROSS_BOUNDARY_POSTURES } from "../cross-boundary-taint.js";
6
+ import { compileHostFloor } from "../host-floor.js";
6
7
  import { assertNoRetiredRunnerDeps } from "./retired-runner-deps.js";
7
8
  import { recordedModeSeed, resolveCheckpointStore } from "../checkpoint-store.js";
9
+ import { assertCheckpointStoreJudgesHolder, assertHolderValue } from "../checkpoint-generation.js";
8
10
  import { asResumeConfigRefusal, refusePermissionModeDoors } from "../mode-policy.js";
9
11
  import { resolveOutputStyleFrame } from "../output-style.js";
10
12
  import { screenUserAttachments } from "../user-attachment.js";
@@ -15,21 +17,24 @@ import { assertAutoConsolidationWirable } from "./memory-consolidation-driver.js
15
17
  import { isModelPriced, malformedPricingField, modelCostToPricing } from "../pricing.js";
16
18
  import { ENTER_AS_IS, preflightLockedConfig } from "../locked-config.js";
17
19
  import { assertRetentionCapability } from "../retention.js";
18
- import { resolveModel, resolveTaskModel, roleModelIfSet } from "../roles.js";
20
+ import { resolveModel, resolveTaskModel, roleModelIfSet, screenRoleMap } from "../roles.js";
19
21
  import { resolveSkillListingBudget } from "../skill-listing-budget.js";
20
22
  import { describeRejectedValue } from "../tool-search-setting.js";
21
23
  import { assertAdvisorModelShape } from "../advisor-verdict.js";
22
- import { applyToolModelGate, assertRestoreGatedToolsValue, modelIdTail } from "../tool-model-gate.js";
24
+ import { applyToolModelGate, assertRestoreGatedToolsValue } from "../tool-model-gate.js";
23
25
  import { resolveUsageWindows } from "../usage-window-store.js";
24
26
  import { deriveAskEffective, resolveAskSeat, resolveQuestionSeam, screenApprovalReach } from "../wiring-manifest.js";
25
- import { resolveHost } from "../../prompt-assembly/select.js";
27
+ import { effectiveTraitsOf, readModelPromptTraits, resolveHost, resolvePromptLean } from "../../prompt-assembly/select.js";
28
+ import { assertNoRetiredKeys, RETIRED_MODEL_KEYS } from "../retired-keys.js";
26
29
  import { resolvePromptBinding } from "../../prompt-assembly/overlay.js";
27
30
  import { assertPeerPresenceValue } from "../../agents/peer-directory.js";
28
31
  import { snapshotDefinitionLists } from "../../agents/tool-filter.js";
29
- import { TOTAL_TOKENS_REMINDER_MODES } from "./turn-attachments.js";
30
- import { rosterFaceOf } from "./caller-roster.js";
32
+ import { mcpUnavailableOn, TOTAL_TOKENS_REMINDER_MODES } from "./turn-attachments.js";
33
+ import { refuseRetiredMember, rosterFaceOf } from "./caller-roster.js";
31
34
  import { assertToolBoundaryLegs } from "../tool-roster.js";
35
+ import { assertToolCardDeclarations } from "../../prompt-assembly/tool-catalog.js";
32
36
  import { refuseRenamedDelegationMounts } from "./sub-agent-deny-lists.js";
37
+ import { readPrincipal } from "../principal-name.js";
33
38
  const TASK_LIMIT_KEY_DICT = {
34
39
  maxTokens: true,
35
40
  maxCostUsd: true,
@@ -49,11 +54,20 @@ const RETIRED_TASK_LIMIT_KEYS = {
49
54
  callCapByDeadline: "(retired — no replacement)",
50
55
  gracefulFinalize: "(retired — the approach notice is the only end-of-budget prompt)",
51
56
  };
57
+ export function resolveCompactionModel(spec, deps, seat) {
58
+ return spec.compactionModel !== undefined ? resolveModel(spec.compactionModel, deps.models, seat) : roleModelIfSet("summarize", spec, deps);
59
+ }
52
60
  export function limitConfigError(code, message) {
53
61
  const e = new Error(message);
54
62
  e.code = code;
55
63
  return e;
56
64
  }
65
+ export function assertPrincipalValue(raw) {
66
+ const reading = readPrincipal(raw);
67
+ if (reading.kind === "invalid") {
68
+ throw limitConfigError("config.invalid_argument", `TaskSpec.principal must be a principal name when present (got ${reading.fault}) — omit the key for a task with no principal; a provided value that names nobody is refused, never read as "no principal".`);
69
+ }
70
+ }
57
71
  export function resolveTaskLimits(limits) {
58
72
  if (limits === undefined)
59
73
  return undefined;
@@ -99,6 +113,7 @@ export function resolveTaskLimits(limits) {
99
113
  export function resolveAttachmentsConfig(attachments) {
100
114
  if (attachments === null || (typeof attachments !== "object" && typeof attachments !== "function"))
101
115
  return attachments;
116
+ mcpUnavailableOn(attachments);
102
117
  const mode = attachments.totalTokensReminderMode;
103
118
  if (mode !== undefined) {
104
119
  const legal = TOTAL_TOKENS_REMINDER_MODES;
@@ -109,15 +124,9 @@ export function resolveAttachmentsConfig(attachments) {
109
124
  }
110
125
  return attachments;
111
126
  }
112
- export function isFableFamilyModelId(id) {
113
- const tail = modelIdTail(id);
114
- return /^claude-fable-\d/.test(tail) || /^claude-mythos-5(?!\d)/.test(tail);
115
- }
116
- export function resolveModelPromptTraits(model, spec, internals) {
117
- return {
118
- promptProfile: spec.promptProfile ?? internals?.promptProfile ?? "simple",
119
- fableMitigations: isFableFamilyModelId(model.id),
120
- };
127
+ export function resolvePromptTraits(model, promptLean) {
128
+ assertNoRetiredKeys(model, RETIRED_MODEL_KEYS, "Model");
129
+ return effectiveTraitsOf(readModelPromptTraits(model), promptLean);
121
130
  }
122
131
  function microCompactConfigError(field, value, legal) {
123
132
  let shown;
@@ -173,8 +182,9 @@ export function assertResumeConfigRecord(config) {
173
182
  }
174
183
  }
175
184
  export function configValueDoors(input, enter = ENTER_AS_IS) {
176
- const { spec, deps, resumeLeg, sessions } = input;
185
+ const { spec, deps, resumeLeg, sessions, holder } = input;
177
186
  enter("deps", () => assertNoRetiredRunnerDeps(deps));
187
+ enter("taskConfig", () => assertPrincipalValue(spec.principal));
178
188
  enter("taskConfig", () => assertPeerPresenceValue(spec.peerPresence));
179
189
  enter("taskConfig", () => assertRestoreGatedToolsValue(spec.restoreGatedTools));
180
190
  const microCompactKnob = enter("deps", () => resolveMicroCompactKnob(deps.microCompact));
@@ -213,7 +223,10 @@ export function configValueDoors(input, enter = ENTER_AS_IS) {
213
223
  : undefined,
214
224
  };
215
225
  const promptHost = enter("taskConfig", () => resolveHost(spec));
226
+ enter("deps", () => screenRoleMap(deps.roles, "RunnerDeps.roles"));
227
+ enter("taskConfig", () => screenRoleMap(spec.roles, "TaskSpec.roles"));
216
228
  const promptBinding = enter("taskConfig", () => resolvePromptBinding(spec));
229
+ const promptLean = enter("taskConfig", () => resolvePromptLean(spec));
217
230
  if (spec.resumeAt !== undefined)
218
231
  enter("taskConfig", () => {
219
232
  if (resumeLeg) {
@@ -236,6 +249,7 @@ export function configValueDoors(input, enter = ENTER_AS_IS) {
236
249
  const memoryProvenance = enter("deps", () => closedWord(deps.memoryProvenance, "RunnerDeps.memoryProvenance", ["off", "carry"], "carry", "config.memory_provenance", "an unevaluable provenance mode is refused loudly, never folded to either mode."));
237
250
  const memoryCapturePolicy = enter("deps", () => closedWord(deps.memoryCapturePolicy, "RunnerDeps.memoryCapturePolicy", ["open", "governed", "capture-required"], "open", "config.memory_capture_policy", "an unevaluable capture posture is refused loudly, never folded to any posture (the fault arms differ per posture, so a guess would pick a polarity nobody configured)."));
238
251
  const crossBoundaryPosture = enter("deps", () => closedWord(deps.crossBoundaryPosture, "RunnerDeps.crossBoundaryPosture", CROSS_BOUNDARY_POSTURES, undefined, "config.cross_boundary_posture", "an unevaluable posture is refused loudly, never folded to either word (an absent seat is undeclared, which is its own fact)."));
252
+ const hostFloor = enter("deps", () => compileHostFloor(deps.hostFloor));
239
253
  const advisorTool = enter("deps", () => closedWord(deps.advisorTool, "RunnerDeps.advisorTool", ["disabled"], undefined, "config.advisor_tool_invalid", "the switch has one word; anything else is refused, never read as either state."));
240
254
  if (advisorTool === undefined)
241
255
  enter("taskConfig", () => assertAdvisorModelShape(spec.advisorModel));
@@ -310,6 +324,8 @@ export function configValueDoors(input, enter = ENTER_AS_IS) {
310
324
  const taskGuardrail = spec.limits?.brainCallGuardrailMs;
311
325
  const brainCallGuardrailMs = enter(taskGuardrail != null ? "taskConfig" : "deps", () => resolveBrainCallGuardrailMs(taskGuardrail ?? deps.brainCallGuardrailMs));
312
326
  const checkpointStore = enter(checkpointStoreSeat(spec), () => resolveCheckpointStore(spec, deps));
327
+ enter("deps", () => assertHolderValue(holder));
328
+ enter(checkpointStoreSeat(spec), () => assertCheckpointStoreJudgesHolder(checkpointStoreSeat(spec) === "taskConfig" ? "TaskSpec.checkpointStore" : "RunnerDeps.checkpointStore", checkpointStore, holder));
313
329
  const taskStore = checkpointStoreSeat(spec) === "taskConfig" ? checkpointStore : undefined;
314
330
  const retention = { policy: deps.retentionPolicy, locked: lockedPreflight.lockedKeys.has("retentionPolicy") };
315
331
  enter("deps", () => assertRetentionCapability({
@@ -322,9 +338,9 @@ export function configValueDoors(input, enter = ENTER_AS_IS) {
322
338
  }));
323
339
  if (taskStore !== undefined)
324
340
  enter("taskConfig", () => assertRetentionCapability({ ...retention, stores: [{ name: "checkpointStore", store: taskStore }] }));
325
- return { toolFaceLists, promptHost, promptBinding, lockedPreflight, skillListingSeats, skills, projectMemory, microCompactKnob, memoryDelegationEvidence, memoryProvenance, memoryCapturePolicy, usageWindows, brainCallGuardrailMs, crossBoundaryPosture, advisorTool };
341
+ return { toolFaceLists, promptHost, promptBinding, promptLean, lockedPreflight, skillListingSeats, skills, projectMemory, microCompactKnob, memoryDelegationEvidence, memoryProvenance, memoryCapturePolicy, usageWindows, brainCallGuardrailMs, crossBoundaryPosture, advisorTool, hostFloor };
326
342
  }
327
- export function refuseResumeDoors(config, recordedGate, deps, sessions) {
343
+ export function refuseResumeDoors(config, recordedGate, deps, sessions, holder) {
328
344
  asResumeConfigRefusal("taskConfig", () => {
329
345
  refusePermissionModeDoors(config);
330
346
  resolveOutputStyleFrame(config.outputStyle);
@@ -332,19 +348,20 @@ export function refuseResumeDoors(config, recordedGate, deps, sessions) {
332
348
  screenUserInvokedSkills(config);
333
349
  screenUserAttachments(config.userAttachments, { resumeLeg: true });
334
350
  assertToolBoundaryLegs(config.tools);
351
+ assertToolCardDeclarations(config.tools);
335
352
  });
336
- const { lockedPreflight, skills } = configValueDoors({ spec: config, deps, resumeLeg: true, sessions }, asResumeConfigRefusal);
353
+ const { lockedPreflight, skills } = configValueDoors({ spec: config, deps, resumeLeg: true, sessions, holder }, asResumeConfigRefusal);
337
354
  asResumeConfigRefusal("inheritedGate", () => void recordedModeSeed(recordedGate));
338
355
  return { ...config, ...(config.mcp !== undefined ? { mcp: lockedPreflight.mcp ?? [] } : {}), ...(config.a2a !== undefined ? { a2a: lockedPreflight.a2a ?? [] } : {}), skills };
339
356
  }
340
357
  export function prepareConfigDoors(input) {
341
358
  const { deps, sessions, resume, internals } = input;
342
359
  assertToolBoundaryLegs(input.spec.tools);
360
+ assertToolCardDeclarations(input.spec.tools);
343
361
  let spec = input.spec;
344
- const { toolFaceLists, promptHost, promptBinding, lockedPreflight, skillListingSeats, skills, projectMemory, microCompactKnob, memoryDelegationEvidence, memoryProvenance, memoryCapturePolicy, usageWindows, brainCallGuardrailMs, crossBoundaryPosture, advisorTool } = configValueDoors({ spec, deps, resumeLeg: resume !== undefined, sessions });
362
+ const { toolFaceLists, promptHost, promptBinding, promptLean, lockedPreflight, skillListingSeats, skills, projectMemory, microCompactKnob, memoryDelegationEvidence, memoryProvenance, memoryCapturePolicy, usageWindows, brainCallGuardrailMs, crossBoundaryPosture, advisorTool, hostFloor } = configValueDoors({ spec, deps, resumeLeg: resume !== undefined, sessions, holder: internals?.holder });
345
363
  const doorRead = (value) => ({ value, enumerable: value !== undefined, writable: false, configurable: false });
346
364
  spec = Object.create(Object.getPrototypeOf(spec), { ...Object.getOwnPropertyDescriptors(spec), skills: doorRead(skills), projectMemory: doorRead(projectMemory) });
347
- const promptProfile = resolveModelPromptTraits({ id: "" }, spec, internals).promptProfile;
348
365
  const resolvedInteractionPosture = spec.interactionPosture ?? internals?.parentInteractionPosture ?? deps.interactionPosture;
349
366
  const askSeat = resolveAskSeat(spec, deps);
350
367
  {
@@ -410,7 +427,10 @@ export function prepareConfigDoors(input) {
410
427
  if (typeof t.withAgents !== "function")
411
428
  return t;
412
429
  const rebuilt = t.withAgents(perTask);
413
- return rosterFaceOf(t.modelGate !== undefined && rebuilt.modelGate === undefined ? { ...rebuilt, modelGate: t.modelGate } : rebuilt, index);
430
+ const restamp = t.modelGate !== undefined && rebuilt.modelGate === undefined;
431
+ if (restamp)
432
+ refuseRetiredMember(rebuilt, index);
433
+ return rosterFaceOf(restamp ? { ...rebuilt, modelGate: t.modelGate } : rebuilt, index);
414
434
  }),
415
435
  };
416
436
  }
@@ -447,7 +467,7 @@ export function prepareConfigDoors(input) {
447
467
  throw limitConfigError("config.limit_invalid", `TaskSpec.${dollarCeiling} is a money ceiling, but the price table for model ${JSON.stringify(model.id)} declares an unevaluable ${bad} — every rate must be a finite, non-negative number of USD per 1M tokens. A table like this prices every turn at zero (or below), so the ceiling would never trip: refused rather than enforced in name only.`);
448
468
  }
449
469
  }
450
- const fableMitigations = resolveModelPromptTraits(model, spec, internals).fableMitigations;
470
+ const promptTraits = resolvePromptTraits(model, promptLean);
451
471
  const gateDecision = applyToolModelGate({
452
472
  tools: spec.tools,
453
473
  modelId: model.id,
@@ -465,13 +485,12 @@ export function prepareConfigDoors(input) {
465
485
  discardedEnvRaw: gateDecision.discardedEnvRaw,
466
486
  });
467
487
  const thinking = spec.thinking ?? resolvedRole.thinking ?? model.defaultThinking;
468
- const compModel = spec.compactionModel !== undefined
469
- ? resolveModel(spec.compactionModel, deps.models, "TaskSpec.compactionModel")
470
- : roleModelIfSet("summarize", spec, deps);
488
+ const compModel = resolveCompactionModel(spec, deps, "TaskSpec.compactionModel");
471
489
  return {
472
490
  spec,
473
491
  toolFaceLists,
474
- promptProfile,
492
+ promptLean,
493
+ promptTraits,
475
494
  promptHost,
476
495
  promptBinding,
477
496
  lockedPreflight,
@@ -482,12 +501,11 @@ export function prepareConfigDoors(input) {
482
501
  model,
483
502
  thinking,
484
503
  compModel,
485
- fableMitigations,
486
504
  modelGate,
487
505
  memoryDelegationEvidence,
488
506
  skillListingBudget,
489
507
  memoryProvenance,
490
- memoryCapturePolicy, crossBoundaryPosture, advisorTool,
508
+ memoryCapturePolicy, crossBoundaryPosture, advisorTool, hostFloor,
491
509
  usageWindows,
492
510
  brainCallGuardrailRef,
493
511
  brainCallGuardrailMs,
@@ -1,4 +1,5 @@
1
1
  import type { Model } from "../../internal/llm.js";
2
+ import type { PromptTraitName } from "../../prompt-assembly/catalog/schema.js";
2
3
  import type { MaterializedA2a } from "../a2a.js";
3
4
  import type { MaterializedMcp } from "../mcp.js";
4
5
  import type { RunnerDeps, TaskSpec } from "../types.js";
@@ -11,7 +12,7 @@ export interface PrepareDeferClassifyInput {
11
12
  deps: Pick<RunnerDeps, "deferMode" | "toolSearch">;
12
13
  /** borrowed-mutable — the shared mount array (later refs alias it; in-place contract, never
13
14
  * re-created). Mutated here, in order: `splice` of every excluded name; element REPLACEMENT with a
14
- * shallow copy for the classic-profile description swap (the caller's ToolSpec object is never
15
+ * shallow copy for a description variant chosen by the run's traits (the caller's ToolSpec object is never
15
16
  * mutated); `splice` of a retracted memory group. After this phase: the content-origin wrap
16
17
  * (element replacement with the wrapped object), the disclosure mount, the MCP refresh re-splice. Since
17
18
  * Every one of those writes is a builder verb (`unmountWhere` / `replaceAt`). */
@@ -22,8 +23,8 @@ export interface PrepareDeferClassifyInput {
22
23
  handsEnabled: boolean;
23
24
  /** borrowed-readonly — the spec-time precomputation the invariant checks the post-exclusion roster against: a mismatch is an engine bug, thrown. */
24
25
  fullShellReachable: boolean;
25
- /** borrowed-readonly — the resolved prompt profile (`classic` swaps in `descriptionClassic`). */
26
- promptProfile: "simple" | "classic";
26
+ /** borrowed-readonly — the run's effective prompt traits (each tool's description variants are chosen on them). */
27
+ promptTraits: ReadonlySet<PromptTraitName>;
27
28
  /** borrowed-readonly — the resolved model (the deferral gate's threshold reads its context window). */
28
29
  model: Model;
29
30
  /** borrowed-readonly — the materialized MCP roster; only `tools` is read (protocol names; `mcpAlwaysLoad` self-declarations lose to an operator defer). */
@@ -1,4 +1,4 @@
1
- import { getToolContract } from "../../prompt-assembly/tool-catalog.js";
1
+ import { getToolContract, mountDescriptionVariant } from "../../prompt-assembly/tool-catalog.js";
2
2
  import { FULL_SHELL_CONTRACT_ID } from "../../tools/fs/index.js";
3
3
  import { ASK_USER_QUESTION_TOOL_NAME } from "../ask-question.js";
4
4
  import { MEMORY_ENGINE_TOOL_NAMES } from "../memory-engine/tools.js";
@@ -17,7 +17,7 @@ function memoryGroupRetractionSet(builtinDeferPairNames, engineTrioInPlay) {
17
17
  return new Set([...builtinDeferPairNames, ...(engineTrioInPlay ? MEMORY_ENGINE_TOOL_NAMES : [])]);
18
18
  }
19
19
  export function prepareDeferClassify(input) {
20
- const { spec, deps, roster, toolFaceSnapshot, handsEnabled, fullShellReachable, promptProfile, model, mcp, a2a, sharedMemoryPairMounted, memoryEnginePairMounted, memoryRecallSegment, onceLedger, sessionId } = input;
20
+ const { spec, deps, roster, toolFaceSnapshot, handsEnabled, fullShellReachable, promptTraits, model, mcp, a2a, sharedMemoryPairMounted, memoryEnginePairMounted, memoryRecallSegment, onceLedger, sessionId } = input;
21
21
  const tools = roster.tools;
22
22
  let memoryBlock = input.memoryBlock;
23
23
  const leaves = valveLeaves(spec, toolFaceSnapshot.selector);
@@ -32,12 +32,11 @@ export function prepareDeferClassify(input) {
32
32
  throw e;
33
33
  }
34
34
  }
35
- if (promptProfile === "classic") {
36
- for (let i = 0; i < tools.length; i++) {
37
- const t = tools[i];
38
- if (t.descriptionClassic !== undefined)
39
- roster.replaceAt(i, { ...t, description: t.descriptionClassic });
40
- }
35
+ for (let i = 0; i < tools.length; i++) {
36
+ const t = tools[i];
37
+ const face = mountDescriptionVariant(t, promptTraits);
38
+ if (face !== t)
39
+ roster.replaceAt(i, face);
41
40
  }
42
41
  const protocolToolNames = [...mcp.tools, ...a2a.tools].filter((t) => protocolOf(t.name) !== undefined).map((t) => t.name);
43
42
  const mcpAlwaysLoadNames = mcp.tools