@sema-agent/core 7.17.7 → 7.19.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 (201) hide show
  1. package/CHANGELOG.md +233 -13
  2. package/dist/agents/send-message-tool.js +1 -0
  3. package/dist/agents/subagent.d.ts +1 -0
  4. package/dist/agents/subagent.js +5 -0
  5. package/dist/agents/teacher.js +1 -0
  6. package/dist/agents/verify.js +3 -0
  7. package/dist/brain/anthropic.js +6 -3
  8. package/dist/brain/open-responses.js +10 -4
  9. package/dist/brain/openai.js +5 -2
  10. package/dist/brain/reasoning.d.ts +13 -13
  11. package/dist/brain/reasoning.js +2 -2
  12. package/dist/brain/route-adjudicator.d.ts +18 -0
  13. package/dist/brain/route-adjudicator.js +16 -0
  14. package/dist/brain/stream-engine.js +2 -1
  15. package/dist/brain/stream-shared.d.ts +3 -0
  16. package/dist/brain/stream-shared.js +1 -0
  17. package/dist/core/agent-definition.d.ts +10 -0
  18. package/dist/core/artifact-host.d.ts +41 -4
  19. package/dist/core/artifact-host.js +18 -2
  20. package/dist/core/ask-origin.d.ts +16 -0
  21. package/dist/core/ask-origin.js +8 -0
  22. package/dist/core/auto-mode-arming.d.ts +6 -0
  23. package/dist/core/auto-mode-arming.js +5 -5
  24. package/dist/core/auto-mode-defaults.d.ts +43 -15
  25. package/dist/core/auto-mode-defaults.js +4 -1
  26. package/dist/core/auto-mode.d.ts +184 -59
  27. package/dist/core/auto-mode.js +188 -13
  28. package/dist/core/checkpoint-store.d.ts +23 -2
  29. package/dist/core/checkpoint-store.js +2 -2
  30. package/dist/core/engine-notice.d.ts +77 -1
  31. package/dist/core/engine-notice.js +7 -0
  32. package/dist/core/gate-fold.js +5 -1
  33. package/dist/core/gate-lanes.js +9 -8
  34. package/dist/core/gate-outcome.d.ts +42 -2
  35. package/dist/core/gate-outcome.js +23 -0
  36. package/dist/core/governance-codes.d.ts +1 -1
  37. package/dist/core/governance-codes.js +14 -0
  38. package/dist/core/hook-seats.d.ts +66 -0
  39. package/dist/core/hook-seats.js +37 -0
  40. package/dist/core/hooks.d.ts +1 -1
  41. package/dist/core/read-root-candidate.d.ts +12 -0
  42. package/dist/core/read-root-candidate.js +24 -0
  43. package/dist/core/roles.d.ts +9 -1
  44. package/dist/core/roles.js +4 -0
  45. package/dist/core/runner/advertised-writable-dirs.d.ts +8 -3
  46. package/dist/core/runner/assemble-result.d.ts +2 -1
  47. package/dist/core/runner/assemble-result.js +1 -1
  48. package/dist/core/runner/classifier-ladder.d.ts +227 -0
  49. package/dist/core/runner/classifier-ladder.js +214 -0
  50. package/dist/core/runner/contracts.d.ts +71 -13
  51. package/dist/core/runner/decide-continuation.d.ts +1 -3
  52. package/dist/core/runner/decide-continuation.js +1 -7
  53. package/dist/core/runner/deferral-census.d.ts +52 -0
  54. package/dist/core/runner/deferral-census.js +44 -0
  55. package/dist/core/runner/denial-limit-arms.js +2 -2
  56. package/dist/core/runner/derived-route-fallback.d.ts +8 -4
  57. package/dist/core/runner/derived-route-fallback.js +8 -3
  58. package/dist/core/runner/gate-exit.d.ts +12 -0
  59. package/dist/core/runner/gate-exit.js +6 -3
  60. package/dist/core/runner/prepare-artifact.d.ts +10 -2
  61. package/dist/core/runner/prepare-artifact.js +5 -4
  62. package/dist/core/runner/prepare-ask-lane.js +1 -0
  63. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -2
  64. package/dist/core/runner/prepare-caps-and-workflow.js +43 -55
  65. package/dist/core/runner/prepare-config-doors.d.ts +7 -1
  66. package/dist/core/runner/prepare-config-doors.js +13 -13
  67. package/dist/core/runner/prepare-defer-classify.d.ts +13 -19
  68. package/dist/core/runner/prepare-defer-classify.js +8 -3
  69. package/dist/core/runner/prepare-gate-stations.d.ts +26 -0
  70. package/dist/core/runner/prepare-gate-stations.js +1 -1
  71. package/dist/core/runner/prepare-hands-readface.d.ts +24 -7
  72. package/dist/core/runner/prepare-hands-readface.js +60 -24
  73. package/dist/core/runner/prepare-inherited-gate.d.ts +17 -4
  74. package/dist/core/runner/prepare-inherited-gate.js +10 -2
  75. package/dist/core/runner/prepare-lsp.d.ts +2 -2
  76. package/dist/core/runner/prepare-lsp.js +1 -1
  77. package/dist/core/runner/prepare-policy-chain.js +2 -0
  78. package/dist/core/runner/prepare-project-context.d.ts +5 -1
  79. package/dist/core/runner/prepare-project-context.js +7 -4
  80. package/dist/core/runner/prepare-prompt-inputs.d.ts +4 -2
  81. package/dist/core/runner/prepare-prompt-inputs.js +4 -1
  82. package/dist/core/runner/prepare-run-refs.d.ts +9 -1
  83. package/dist/core/runner/prepare-run-refs.js +3 -2
  84. package/dist/core/runner/prepare-suspend-saga.d.ts +5 -0
  85. package/dist/core/runner/prepare-suspend-saga.js +5 -2
  86. package/dist/core/runner/prepare-task.js +19 -14
  87. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +5 -0
  88. package/dist/core/runner/prepare-tool-disclosure-mount.js +10 -2
  89. package/dist/core/runner/prepare-turn-wiring.d.ts +8 -4
  90. package/dist/core/runner/prepare-turn-wiring.js +3 -2
  91. package/dist/core/runner/prepare-wiring-manifest.d.ts +5 -5
  92. package/dist/core/runner/prepare-wiring-manifest.js +5 -2
  93. package/dist/core/runner/resume-apply.js +3 -3
  94. package/dist/core/runner/resume-checkpoint-screen.js +7 -0
  95. package/dist/core/runner/run-harness-handlers.js +4 -1
  96. package/dist/core/runner/run-identity-wiring.js +6 -2
  97. package/dist/core/runner/run-leg.d.ts +2 -0
  98. package/dist/core/runner/run-leg.js +45 -45
  99. package/dist/core/runner/run-notification-lane.js +55 -27
  100. package/dist/core/runner/run-settle-and-teardown.js +1 -0
  101. package/dist/core/runner/run-terminal-adoption.js +16 -13
  102. package/dist/core/runner/run-turn-boundary.js +15 -5
  103. package/dist/core/runner/runtask.d.ts +6 -5
  104. package/dist/core/runner/runtask.js +26 -14
  105. package/dist/core/runner/skill-base-dir.d.ts +54 -0
  106. package/dist/core/runner/skill-base-dir.js +42 -0
  107. package/dist/core/runner/synthetic-tools.d.ts +83 -48
  108. package/dist/core/runner/synthetic-tools.js +69 -32
  109. package/dist/core/runner/tool-defer-gate.d.ts +22 -9
  110. package/dist/core/runner/tool-defer-gate.js +15 -5
  111. package/dist/core/runner/tool-disclosure.d.ts +5 -0
  112. package/dist/core/runner/tool-disclosure.js +2 -0
  113. package/dist/core/runner/tool-progress-lane.d.ts +42 -0
  114. package/dist/core/runner/tool-progress-lane.js +61 -0
  115. package/dist/core/runner/turn-attachments.d.ts +43 -12
  116. package/dist/core/runner/turn-attachments.js +58 -14
  117. package/dist/core/runner-deps.d.ts +48 -7
  118. package/dist/core/sensitive-path-policy.d.ts +58 -17
  119. package/dist/core/sensitive-path-policy.js +33 -5
  120. package/dist/core/skill-listing-budget.d.ts +112 -0
  121. package/dist/core/skill-listing-budget.js +58 -0
  122. package/dist/core/swappable-deps.d.ts +9 -7
  123. package/dist/core/swappable-deps.js +7 -3
  124. package/dist/core/task-event.d.ts +96 -29
  125. package/dist/core/task-notification.d.ts +142 -16
  126. package/dist/core/task-notification.js +106 -0
  127. package/dist/core/task-result.d.ts +9 -1
  128. package/dist/core/task-spec.d.ts +46 -3
  129. package/dist/core/tighten-task-spec.js +7 -5
  130. package/dist/core/tool-model-gate.d.ts +1 -1
  131. package/dist/core/tool-policy.d.ts +19 -4
  132. package/dist/core/tool-policy.js +6 -7
  133. package/dist/core/tool-search-setting.d.ts +78 -0
  134. package/dist/core/tool-search-setting.js +90 -0
  135. package/dist/core/tool-spec.d.ts +45 -4
  136. package/dist/core/types.d.ts +2 -2
  137. package/dist/core/types.js +1 -1
  138. package/dist/core/wiring-manifest.d.ts +46 -0
  139. package/dist/core/wiring-manifest.js +9 -1
  140. package/dist/core/write-protect.d.ts +8 -3
  141. package/dist/core/write-protect.js +8 -5
  142. package/dist/engine/execution-env/node-execution-env.js +10 -4
  143. package/dist/engine/harness/agent-harness.d.ts +42 -0
  144. package/dist/engine/harness/agent-harness.js +61 -29
  145. package/dist/engine/loop/agent-loop.d.ts +68 -3
  146. package/dist/engine/loop/agent-loop.js +109 -16
  147. package/dist/index.d.ts +13 -8
  148. package/dist/index.js +11 -7
  149. package/dist/internal/harness.d.ts +1 -1
  150. package/dist/orchestration/run-workflow-tool.d.ts +3 -0
  151. package/dist/orchestration/run-workflow-tool.js +6 -1
  152. package/dist/orchestration/workflow-governance.d.ts +7 -1
  153. package/dist/orchestration/workflow-governance.js +9 -5
  154. package/dist/orchestration/workflow-primitives.d.ts +3 -0
  155. package/dist/orchestration/workflow-primitives.js +6 -1
  156. package/dist/orchestration/workflow-types.d.ts +48 -13
  157. package/dist/orchestration/workflow-types.js +1 -1
  158. package/dist/orchestration/workflow.js +45 -17
  159. package/dist/prompt-assembly/epoch.js +2 -0
  160. package/dist/prompt-assembly/packs/sema-default.js +2 -2
  161. package/dist/prompt-assembly/section-usage.d.ts +26 -0
  162. package/dist/prompt-assembly/section-usage.js +10 -0
  163. package/dist/prompt-assembly/types.d.ts +8 -6
  164. package/dist/prompts/default.d.ts +13 -0
  165. package/dist/prompts/default.js +16 -8
  166. package/dist/tools/artifact/artifact-text.d.ts +10 -1
  167. package/dist/tools/artifact/artifact-text.js +6 -3
  168. package/dist/tools/artifact/artifact-tool.d.ts +12 -2
  169. package/dist/tools/artifact/artifact-tool.js +203 -70
  170. package/dist/tools/artifact/conformance.d.ts +56 -0
  171. package/dist/tools/artifact/conformance.js +349 -0
  172. package/dist/tools/artifact/local-stub.js +1 -1
  173. package/dist/tools/artifact/reject-breaker.d.ts +28 -0
  174. package/dist/tools/artifact/reject-breaker.js +42 -0
  175. package/dist/tools/fs/bash-lexer.d.ts +132 -0
  176. package/dist/tools/fs/bash-lexer.js +563 -0
  177. package/dist/tools/fs/bash-program-position.d.ts +142 -0
  178. package/dist/tools/fs/bash-program-position.js +125 -0
  179. package/dist/tools/fs/bash-readonly-classifier.d.ts +81 -16
  180. package/dist/tools/fs/bash-readonly-classifier.js +180 -558
  181. package/dist/tools/fs/containment-face.d.ts +89 -0
  182. package/dist/tools/fs/containment-face.js +81 -0
  183. package/dist/tools/fs/fs-bash.d.ts +46 -1
  184. package/dist/tools/fs/fs-bash.js +165 -25
  185. package/dist/tools/fs/fs-read.d.ts +1 -1
  186. package/dist/tools/fs/fs-search-tools.d.ts +3 -3
  187. package/dist/tools/fs/fs-write.d.ts +4 -3
  188. package/dist/tools/fs/fs-write.js +9 -9
  189. package/dist/tools/fs/index.d.ts +24 -5
  190. package/dist/tools/fs/index.js +18 -6
  191. package/dist/tools/fs/read-deny.d.ts +4 -3
  192. package/dist/tools/fs/repo-map.d.ts +2 -2
  193. package/dist/tools/fs/safety.d.ts +18 -3
  194. package/dist/tools/fs/safety.js +11 -4
  195. package/package.json +1 -1
  196. package/test/export-surface.snapshot.json +99 -13
  197. package/wire-changes/core@7.17.7.json +49 -0
  198. package/wire-changes/core@7.18.0.json +1273 -0
  199. package/wire-changes/core@7.19.0.json +457 -0
  200. package/dist/tools/fs/read-face.d.ts +0 -68
  201. package/dist/tools/fs/read-face.js +0 -47
@@ -0,0 +1,457 @@
1
+ {
2
+ "repo": "core",
3
+ "version": "7.19.0",
4
+ "from": "a9ed817912e9808ec38a5b4f02231398d5ccc99f",
5
+ "to": "v7.19.0",
6
+ "added": [
7
+ {
8
+ "name": "AUTO_MODE_PARSE_FAILURES",
9
+ "kind": "variable",
10
+ "tier": "advanced",
11
+ "at": [
12
+ "src/core/auto-mode.ts:69",
13
+ "src/index.ts:1376"
14
+ ],
15
+ "criteriaCovered": false,
16
+ "breaking": false
17
+ },
18
+ {
19
+ "name": "AutoModeParseFailure",
20
+ "kind": "type",
21
+ "tier": "advanced",
22
+ "at": [
23
+ "src/core/auto-mode.ts:70",
24
+ "src/index.ts:1378"
25
+ ],
26
+ "criteriaCovered": false,
27
+ "breaking": false
28
+ },
29
+ {
30
+ "name": "RECOMMENDED_SENSITIVE_ASK_PATTERNS",
31
+ "kind": "variable",
32
+ "tier": "advanced",
33
+ "at": [
34
+ "src/core/sensitive-path-policy.ts:196",
35
+ "src/index.ts:914"
36
+ ],
37
+ "criteriaCovered": false,
38
+ "breaking": false
39
+ },
40
+ {
41
+ "name": "ReadRootGrantCandidate",
42
+ "kind": "interface",
43
+ "tier": "advanced",
44
+ "at": [
45
+ "src/core/tool-spec.ts:105",
46
+ "src/core/types.ts:24",
47
+ "src/index.ts:3300"
48
+ ],
49
+ "criteriaCovered": true,
50
+ "breaking": false
51
+ },
52
+ {
53
+ "name": "classifierParseFailureDenyMessage",
54
+ "kind": "function",
55
+ "tier": "advanced",
56
+ "at": [
57
+ "src/core/auto-mode.ts:247",
58
+ "src/index.ts:1375"
59
+ ],
60
+ "criteriaCovered": false,
61
+ "breaking": false
62
+ },
63
+ {
64
+ "name": "isAutoModeParseFailure",
65
+ "kind": "function",
66
+ "tier": "advanced",
67
+ "at": [
68
+ "src/core/auto-mode.ts:73",
69
+ "src/index.ts:1377"
70
+ ],
71
+ "criteriaCovered": false,
72
+ "breaking": false
73
+ },
74
+ {
75
+ "name": "thinkingOffSpelled",
76
+ "kind": "function",
77
+ "tier": "advanced",
78
+ "at": [
79
+ "src/brain/reasoning.ts:184",
80
+ "src/index.ts:2492"
81
+ ],
82
+ "criteriaCovered": false,
83
+ "breaking": false
84
+ }
85
+ ],
86
+ "removed": [
87
+ {
88
+ "name": "CLASSIFIER_PARSE_FAILURE_DENY_MESSAGE",
89
+ "kind": "variable",
90
+ "tier": "advanced",
91
+ "at": [
92
+ "src/core/auto-mode.ts:222",
93
+ "src/index.ts:1375"
94
+ ],
95
+ "breaking": true
96
+ },
97
+ {
98
+ "name": "thinkingOffExpressible",
99
+ "kind": "function",
100
+ "tier": "advanced",
101
+ "at": [
102
+ "src/brain/reasoning.ts:184",
103
+ "src/index.ts:2489"
104
+ ],
105
+ "breaking": true
106
+ }
107
+ ],
108
+ "changed": [],
109
+ "narrowed": [
110
+ {
111
+ "id": "F2",
112
+ "source": "behaviorFlips.summary",
113
+ "text": "NARROWING (durable-resume path) — a decider's note has ONE mint (#812 / B-123; car-812): `settledByPerson` + `decidersNote` in `gate-outcome.ts`; empty text folds to absence there, once, for the live resolver and the durable decide lane alike, so `reason: \"\"` is a bare refusal on both paths and the issuing batch's not-yet-started siblings halt (`gate.batch_halted`). Whitespace-only text stays a note (pinned current behaviour, not a promise)."
114
+ },
115
+ {
116
+ "id": "F3",
117
+ "source": "behaviorFlips.summary",
118
+ "text": "NARROWING + widening — write protection layered by what the file IS (#804; car-804, ruling (d)) and the write-protection judge anchors relative spellings (#815, security; B-124): the deny set's agent-config block derives from `READ_FACE_BUILTIN_DENY_TABLE`'s `agent-config` tier (one table, two judges; `RECOMMENDED_SENSITIVE_PATTERNS` 26 → 39 members: +8 third-party agent config files, +2 write-face-only rows `.claude/hooks` / `.sema/hooks` (host-executed command bodies, like `.git/hooks`; #824), −4 hand rows), the `.claude` / `.sema` DIRECTORIES leave the deny set and sit on an ask tier of the SAME canonical judge (`RECOMMENDED_SENSITIVE_ASK_PATTERNS` = [`.claude`, `.sema`]; `createSensitivePathPolicy({ askPatterns })` absent = that set, `[]` = no ask tier; the `dataRoot` exemption applies to both tiers); the always-on lexical `WriteProtectionMatcher.matchPath(path, cwd?)` joins a relative spelling onto the gate's tracked cwd BEFORE judging, so `cd ~/.ssh` + `Write(\"authorized_keys\")` is judged like the absolute spelling on every `segment` row."
119
+ }
120
+ ],
121
+ "closedSetMembers": [
122
+ {
123
+ "set": "AUTO_MODE_PARSE_FAILURES",
124
+ "at": [
125
+ "src/core/auto-mode.ts:69"
126
+ ],
127
+ "newSet": true,
128
+ "added": [
129
+ "conflict",
130
+ "missing"
131
+ ],
132
+ "removed": [],
133
+ "breaking": false,
134
+ "criteriaCovered": false
135
+ },
136
+ {
137
+ "set": "CLASSIFIER_ROLE_DEFAULT_REASONS",
138
+ "at": [
139
+ "src/core/runner/classifier-ladder.ts:86"
140
+ ],
141
+ "newSet": true,
142
+ "added": [
143
+ "main_only",
144
+ "role_fallback",
145
+ "role_unresolvable",
146
+ "tier_below_main",
147
+ "tier_table"
148
+ ],
149
+ "removed": [],
150
+ "breaking": false,
151
+ "criteriaCovered": false
152
+ },
153
+ {
154
+ "set": "ENGINE_NOTICE_CODES",
155
+ "at": [
156
+ "src/core/governance-codes.ts:323"
157
+ ],
158
+ "newSet": false,
159
+ "added": [
160
+ "classifier.contract_broken",
161
+ "classifier.role_defaulted",
162
+ "skills.listing_truncated"
163
+ ],
164
+ "removed": [],
165
+ "breaking": false,
166
+ "criteriaCovered": true
167
+ },
168
+ {
169
+ "set": "RECOMMENDED_SENSITIVE_ASK_PATTERNS",
170
+ "at": [
171
+ "src/core/sensitive-path-policy.ts:196"
172
+ ],
173
+ "newSet": true,
174
+ "added": [
175
+ ".claude",
176
+ ".sema"
177
+ ],
178
+ "removed": [],
179
+ "breaking": false,
180
+ "criteriaCovered": false
181
+ },
182
+ {
183
+ "set": "RECOMMENDED_SENSITIVE_PATTERNS",
184
+ "at": [
185
+ "src/core/sensitive-path-policy.ts:102"
186
+ ],
187
+ "newSet": false,
188
+ "added": [
189
+ ".ai-agent/.env",
190
+ ".aider.conf.yml",
191
+ ".claude.*",
192
+ ".claude/agents",
193
+ ".claude/hooks",
194
+ ".claude/settings.json",
195
+ ".claude/settings.local.json",
196
+ ".codex/config.toml",
197
+ ".continue/config.json",
198
+ ".continue/config.yaml",
199
+ ".cursor/mcp.json",
200
+ ".gemini/settings.json",
201
+ ".sema/agents",
202
+ ".sema/engine-data/.env",
203
+ ".sema/hooks",
204
+ ".sema/settings.json",
205
+ ".sema/settings.local.json"
206
+ ],
207
+ "removed": [
208
+ ".claude*",
209
+ ".sema"
210
+ ],
211
+ "persistedBy": "none",
212
+ "breaking": true,
213
+ "criteriaCovered": false
214
+ }
215
+ ],
216
+ "typeKeys": [
217
+ {
218
+ "type": "AskRequest",
219
+ "at": [
220
+ "src/core/tool-policy.ts:2571"
221
+ ],
222
+ "added": [
223
+ "readRootCandidate"
224
+ ],
225
+ "removed": [],
226
+ "breaking": false,
227
+ "criteriaCovered": true
228
+ },
229
+ {
230
+ "type": "AutoModeVerdict",
231
+ "at": [
232
+ "src/core/auto-mode.ts:123"
233
+ ],
234
+ "added": [
235
+ "parse_error.form"
236
+ ],
237
+ "removed": [],
238
+ "breaking": false,
239
+ "criteriaCovered": false
240
+ },
241
+ {
242
+ "type": "CompoundReadonlyVerdict",
243
+ "at": [
244
+ "src/tools/fs/bash-readonly-classifier.ts:585"
245
+ ],
246
+ "added": [
247
+ "outOfRootGrantCandidate"
248
+ ],
249
+ "removed": [],
250
+ "breaking": false,
251
+ "criteriaCovered": false
252
+ },
253
+ {
254
+ "type": "PermissionResult",
255
+ "at": [
256
+ "src/core/tool-policy.ts:412"
257
+ ],
258
+ "added": [
259
+ "probeReadRootCandidate"
260
+ ],
261
+ "removed": [],
262
+ "breaking": false,
263
+ "criteriaCovered": false
264
+ },
265
+ {
266
+ "type": "PreToolUseResult",
267
+ "at": [
268
+ "src/core/hooks.ts:1141"
269
+ ],
270
+ "added": [
271
+ "probeReadRootCandidate"
272
+ ],
273
+ "removed": [],
274
+ "breaking": false,
275
+ "criteriaCovered": false
276
+ },
277
+ {
278
+ "type": "ReversibilityVerdict",
279
+ "at": [
280
+ "src/core/tool-spec.ts:50"
281
+ ],
282
+ "added": [
283
+ "readRootCandidate"
284
+ ],
285
+ "removed": [],
286
+ "breaking": false,
287
+ "criteriaCovered": true
288
+ },
289
+ {
290
+ "type": "TaskSpec",
291
+ "at": [
292
+ "src/core/task-spec.ts:49"
293
+ ],
294
+ "added": [
295
+ "skillListingBudgetFraction",
296
+ "skillListingMaxDescChars"
297
+ ],
298
+ "removed": [],
299
+ "breaking": false,
300
+ "criteriaCovered": true
301
+ }
302
+ ],
303
+ "declarationMoves": [
304
+ {
305
+ "name": "SKILLS_BLOCK_MAX_BYTES",
306
+ "kind": null,
307
+ "onSurface": false,
308
+ "from": [
309
+ "src/core/runner/synthetic-tools.ts"
310
+ ],
311
+ "to": [
312
+ "src/core/runner/synthetic-tools.ts",
313
+ "src/core/skill-listing-budget.ts"
314
+ ]
315
+ }
316
+ ],
317
+ "mintMoves": [],
318
+ "criteriaObserves": [
319
+ {
320
+ "kind": "engineNoticeCode",
321
+ "name": "classifier.contract_broken",
322
+ "assertions": [
323
+ "G1.c"
324
+ ]
325
+ },
326
+ {
327
+ "kind": "engineNoticeCode",
328
+ "name": "classifier.role_defaulted",
329
+ "assertions": [
330
+ "G1.b"
331
+ ]
332
+ },
333
+ {
334
+ "kind": "engineNoticeCode",
335
+ "name": "skills.listing_truncated",
336
+ "assertions": [
337
+ "G4.b"
338
+ ]
339
+ },
340
+ {
341
+ "kind": "typeMember",
342
+ "name": "AskRequest.readRootCandidate",
343
+ "assertions": [
344
+ "G5.a"
345
+ ]
346
+ },
347
+ {
348
+ "kind": "typeMember",
349
+ "name": "AskRequest.toolName",
350
+ "assertions": [
351
+ "G3.b"
352
+ ]
353
+ },
354
+ {
355
+ "kind": "typeMember",
356
+ "name": "AssistantMessage.partialFinalized",
357
+ "assertions": [
358
+ "G1.d"
359
+ ]
360
+ },
361
+ {
362
+ "kind": "typeMember",
363
+ "name": "GateDisposition.classifier",
364
+ "assertions": [
365
+ "G1.a"
366
+ ]
367
+ },
368
+ {
369
+ "kind": "typeMember",
370
+ "name": "ReadRootGrantCandidate.dir",
371
+ "assertions": [
372
+ "G5.b"
373
+ ]
374
+ },
375
+ {
376
+ "kind": "typeMember",
377
+ "name": "ReversibilityVerdict.readRootCandidate",
378
+ "assertions": [
379
+ "G5.c"
380
+ ]
381
+ },
382
+ {
383
+ "kind": "typeMember",
384
+ "name": "Settlement.kind",
385
+ "assertions": [
386
+ "G2.b"
387
+ ]
388
+ },
389
+ {
390
+ "kind": "typeMember",
391
+ "name": "Settlement.note",
392
+ "assertions": [
393
+ "G2.a"
394
+ ]
395
+ },
396
+ {
397
+ "kind": "typeMember",
398
+ "name": "TaskSpec.skillListingBudgetFraction",
399
+ "assertions": [
400
+ "G4.a",
401
+ "G6.a"
402
+ ]
403
+ },
404
+ {
405
+ "kind": "typeMember",
406
+ "name": "TaskSpec.skillListingMaxDescChars",
407
+ "assertions": [
408
+ "G4.c"
409
+ ]
410
+ },
411
+ {
412
+ "kind": "typeMember",
413
+ "name": "WriteProtectionMatcher.matchPath",
414
+ "assertions": [
415
+ "G3.a"
416
+ ]
417
+ }
418
+ ],
419
+ "consumersHint": {
420
+ "cli": [
421
+ "AskRequest",
422
+ "CompoundReadonlyVerdict",
423
+ "ENGINE_NOTICE_CODES",
424
+ "PermissionResult",
425
+ "PreToolUseResult",
426
+ "RECOMMENDED_SENSITIVE_PATTERNS",
427
+ "TaskSpec"
428
+ ],
429
+ "server": [
430
+ "AskRequest",
431
+ "AutoModeVerdict",
432
+ "CLASSIFIER_PARSE_FAILURE_DENY_MESSAGE",
433
+ "CompoundReadonlyVerdict",
434
+ "ENGINE_NOTICE_CODES",
435
+ "PermissionResult",
436
+ "PreToolUseResult",
437
+ "RECOMMENDED_SENSITIVE_PATTERNS",
438
+ "ReversibilityVerdict",
439
+ "TaskSpec",
440
+ "thinkingOffExpressible"
441
+ ],
442
+ "sdk": [
443
+ "AskRequest",
444
+ "PermissionResult",
445
+ "PreToolUseResult",
446
+ "TaskSpec"
447
+ ],
448
+ "note": "scanned cli@116d081d server@565d02fc sdk@17a8533 — a name listed is MENTIONED there today, which is evidence of consumption, not proof of it"
449
+ },
450
+ "breakingCount": 3,
451
+ "breakingItems": [
452
+ "closed set lost members: RECOMMENDED_SENSITIVE_PATTERNS -.claude*,.sema",
453
+ "export removed: CLASSIFIER_PARSE_FAILURE_DENY_MESSAGE (variable)",
454
+ "export removed: thinkingOffExpressible (function)"
455
+ ],
456
+ "toResolvedAt": "0ef667ab5a0122c0c73b9635de5035dab4a472dc"
457
+ }
@@ -1,68 +0,0 @@
1
- /** The read-face containment state. `"roots"` = the containment judgment runs.
2
- * `"open"` = the containment step is skipped (canonicalization, deny set, UNC out-of-set refusal
3
- * and the type gates all still run). */
4
- export type ReadFace = "open" | "roots";
5
- /** Loud value gate: a `readFace` seat carries exactly "open" | "roots" — anything else (case
6
- * variants, truthy garbage) refuses at wiring time, never folds to a default. Exported
7
- * module-internally (not on the package surface) so prepare's unconditional config-guard leg can
8
- * screen the seats on runs that never mount hands. The resolver itself also runs on every hands-less
9
- * leg; this screen still fires first, so a garbage value refuses before any leg-shape branching. */
10
- export declare function assertReadFaceValue(v: unknown, seat: string): ReadFace | undefined;
11
- /** Inputs to {@link resolveReadFace} — all structural/declaration facts, never permission modes
12
- * (a deliberate axis separation: this shape carries facts, not verdicts). */
13
- export interface ReadFaceInputs {
14
- /** TaskSpec.readFace (raw — validated here). The TASK layer: may only tighten under governance. */
15
- specReadFace?: unknown;
16
- /** RunnerDeps.readFace / HandsToolkitOptions.readFace (raw) — the DEPLOYMENT's own declaration. */
17
- depsReadFace?: unknown;
18
- /** The verifier read-only mount (`handsReadOnly` / toolkit `readOnly`): its containment is a
19
- * LOAD-BEARING wall (bash_readonly is genuinely confined by it) — never openable. */
20
- readOnlyMount: boolean;
21
- /** Org governance declared (`RunnerDeps.permissionRuleStore.partitions.org === true`): default roots; the task layer
22
- * may not open (tighten-only under governance; the deps layer, being the deployment's own
23
- * declaration, still may). */
24
- orgGoverned: boolean;
25
- /** Is the FULL shell (`core.bash@1`) structurally reachable on this mount? Computed BEFORE
26
- * tool-band assembly from spec-time facts (env kind / handsReadOnly / Bash exclusion — every
27
- * exclusion source is spec-time-frozen, so this is always computable). When false, the roots fence
28
- * is the ONLY read boundary, so no IMPLICIT default may open the face; an EXPLICIT "open" on
29
- * either seat still wins (row 4 of the order is a default, not a clamp). */
30
- fullShellReachable: boolean;
31
- /** Observation hook for the ONE silent branch of the order: row 1's deployment-seat clamp
32
- * (readOnly mount + deps "open" + NO task seat). Fired exactly when the deps declaration was the
33
- * deciding seat and the mount overrode it — not when a task-level "roots" pinned the same value
34
- * anyway (the mount changed nothing there, and announcing it would claim a false cause), and
35
- * never on the throw rows (those are already loud). The resolver stays the single owner of the
36
- * clamp predicate; stations own delivery/dedup ({@link deploymentReadFaceClampNotice}). */
37
- onDeploymentClamp?: () => void;
38
- }
39
- /**
40
- * The ONE resolution order, first hit wins. prepare-task AND createHandsToolkit both call this — a
41
- * library-direct mount gets identical validation and identical defaults.
42
- *
43
- * 1. read-only (verifier) mount → ROOTS; an explicit "open" on the TASK seat is a genuine
44
- * per-call CONTRADICTION and refuses loudly (never silently pick a side). An "open" on the
45
- * DEPLOYMENT seat alone is a deployment-wide default, not a per-task assertion — it silently
46
- * CLAMPS to roots (stricter-wins), the same seat distinction row 2 draws for org governance.
47
- * 2. org-governed: TaskSpec "open" refuses (task layer only tightens); deps "open" wins;
48
- * otherwise ROOTS.
49
- * 3. explicit seat: spec ?? deps.
50
- * 4. bash-less mount: ROOTS (the fence is the only read boundary there — "the fence guards
51
- * nothing bash reaches anyway" does not hold, so no implicit default may open it).
52
- * 5. default: ROOTS — the engine never opens implicitly.
53
- */
54
- export declare function resolveReadFace(i: ReadFaceInputs): ReadFace;
55
- /**
56
- * The ONE text of the deployment-clamp announcement (`config.read_face_deployment_clamped`).
57
- * Both stations deliver THIS object through their own `deliverEngineNotice` call (prepare-task with
58
- * the `RunnerDeps.onNotice` seat, once per notice sink — the sink, not the deps object, because the
59
- * Runner rebuilds its deps; `createHandsToolkit` with its band-local `HandsToolkitOptions.onNotice`
60
- * seat — toolkit creation is itself the one-per-mount boot moment, and an absent seat prints the
61
- * same line via `console.warn`). Built here, import-free, so the message can never fork between
62
- * the stations.
63
- */
64
- export declare function deploymentReadFaceClampNotice(): {
65
- code: string;
66
- message: string;
67
- detail: Record<string, unknown>;
68
- };
@@ -1,47 +0,0 @@
1
- export function assertReadFaceValue(v, seat) {
2
- if (v === undefined)
3
- return undefined;
4
- if (v === "open" || v === "roots")
5
- return v;
6
- const e = new Error(`${seat}: invalid readFace value ${JSON.stringify(v)} — expected "open" or "roots" (bad values refuse loudly; nothing falls back to a default).`);
7
- e.code = "config.read_face_invalid";
8
- throw e;
9
- }
10
- export function resolveReadFace(i) {
11
- const spec = assertReadFaceValue(i.specReadFace, "TaskSpec.readFace");
12
- const deps = assertReadFaceValue(i.depsReadFace, "readFace (deployment seat)");
13
- if (i.readOnlyMount) {
14
- if (spec === "open") {
15
- const e = new Error(`readFace: "open" contradicts the read-only (verifier) mount — that mount's containment is load-bearing (its read-only shell face is confined by it) and is never openable. Drop the readFace declaration or the readOnly mount.`);
16
- e.code = "config.read_face_readonly_conflict";
17
- throw e;
18
- }
19
- if (deps === "open" && spec === undefined)
20
- i.onDeploymentClamp?.();
21
- return "roots";
22
- }
23
- if (i.orgGoverned) {
24
- if (spec === "open") {
25
- const e = new Error(`TaskSpec.readFace: "open" is refused under organization governance — the task layer may only tighten (set RunnerDeps.readFace: "open" if the DEPLOYMENT declares the open read face).`);
26
- e.code = "config.read_face_org_task_escalation";
27
- throw e;
28
- }
29
- if (spec === "roots")
30
- return "roots";
31
- return deps ?? "roots";
32
- }
33
- if (spec !== undefined)
34
- return spec;
35
- if (deps !== undefined)
36
- return deps;
37
- if (!i.fullShellReachable)
38
- return "roots";
39
- return "roots";
40
- }
41
- export function deploymentReadFaceClampNotice() {
42
- return {
43
- code: "config.read_face_deployment_clamped",
44
- message: `readFace (deployment seat): the deployment-wide "open" declaration is not in force on this read-only (verifier) mount — clamped to "roots" (stricter-wins: the mount's containment is load-bearing and never openable). Other mounts still honor "open".`,
45
- detail: { seat: "readFace (deployment seat)", declared: "open", inForce: "roots", cause: "read_only_mount" },
46
- };
47
- }