@event4u/agent-config 16.1.0 → 16.2.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 (217) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +237 -248
  5. package/dist/agent-src/commands/roadmap/process-full.md +1 -1
  6. package/dist/agent-src/commands/work.md +4 -0
  7. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +4 -8
  8. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  9. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
  10. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
  11. package/dist/agent-src/skills/design-review/SKILL.md +30 -4
  12. package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
  13. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +16 -1
  14. package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
  15. package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
  16. package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
  17. package/dist/agent-src/skills/ui-component-architect/SKILL.md +23 -0
  18. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  19. package/dist/agent-src/templates/roadmaps.md +30 -0
  20. package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  21. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +260 -21
  22. package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  23. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  24. package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
  25. package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  26. package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  27. package/dist/cli/python/knowledge_ingest.js +1 -1
  28. package/dist/cli/python/workspace_drive.js +1 -1
  29. package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-4XFP2Y3E.js} +1 -1
  30. package/dist/cli-delegate/{chunk-HDVVGPQW.js → chunk-7XGBX6ZH.js} +471 -387
  31. package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-FP36SWJD.js} +432 -144
  32. package/dist/cli-delegate/{chunk-UNCRJBT3.js → chunk-IGD6ERX6.js} +31 -0
  33. package/dist/cli-delegate/{chunk-FXYUYU4N.js → chunk-JNMVLWLR.js} +42 -1
  34. package/dist/cli-delegate/{chunk-QJWAUMJW.js → chunk-YJ72UIAK.js} +730 -15
  35. package/dist/cli-delegate/cmd_conformance.js +902 -782
  36. package/dist/cli-delegate/cmd_doctor.js +2 -2
  37. package/dist/cli-delegate/cmd_export.js +2 -2
  38. package/dist/cli-delegate/cmd_handoff.js +4 -4
  39. package/dist/cli-delegate/cmd_memory_get.js +1 -1
  40. package/dist/cli-delegate/cmd_prune.js +2 -2
  41. package/dist/cli-delegate/cmd_route_audit.js +1 -1
  42. package/dist/cli-delegate/cmd_session_recycle.js +2 -2
  43. package/dist/cli-delegate/cmd_settings_migrate.js +2 -2
  44. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  45. package/dist/cli-delegate/cmd_sync.js +2 -2
  46. package/dist/cli-delegate/cmd_uninstall.js +2 -2
  47. package/dist/cli-delegate/cmd_validate.js +2 -2
  48. package/dist/discovery/deprecation-report.md +1 -1
  49. package/dist/discovery/discovery-manifest.json +10 -10
  50. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  51. package/dist/discovery/discovery-manifest.summary.md +1 -1
  52. package/dist/discovery/dormancy-report.md +1 -1
  53. package/dist/discovery/orphan-report.md +1 -1
  54. package/dist/discovery/packs.json +2 -2
  55. package/dist/discovery/trust-report.md +1 -1
  56. package/dist/discovery/workspaces.json +2 -2
  57. package/dist/hooks/dispatch.js +6666 -2581
  58. package/dist/hooks/dispatch.sha256 +1 -0
  59. package/dist/install/install.mjs +848 -733
  60. package/dist/mcp/registry-manifest.json +2 -2
  61. package/dist/mcp/server.json +2 -2
  62. package/dist/mcp/server.mjs +2747 -1510
  63. package/dist/server/schemas/settings.js +23 -0
  64. package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
  65. package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
  66. package/dist/ui/index.html +2 -2
  67. package/docs/contracts/settings-classes.md +6 -4
  68. package/package.json +4 -4
  69. package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  70. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +260 -21
  71. package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  72. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  73. package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
  74. package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  75. package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  76. package/src/config/agent-settings.template.yml +29 -0
  77. package/src/config/ci-local-parity.yml +18 -0
  78. package/src/config/continuity-surface.json +2 -2
  79. package/src/config/gate-coverage.yml +234 -3
  80. package/src/config/gate-violation-baselines.json +7 -3
  81. package/src/config/hook-latency-budget.json +21 -0
  82. package/src/config/hook-token-budget.json +2 -2
  83. package/src/config/metric-registry.yml +114 -0
  84. package/src/config/placeholder-drift-budget.json +10 -0
  85. package/src/config/routing-coverage-seed.json +18 -4
  86. package/src/scripts/_cli/cmd_doctor.ts +5 -19
  87. package/src/scripts/_cli/doctor_execution.ts +100 -17
  88. package/src/scripts/_cli/doctor_network_posture.ts +226 -0
  89. package/src/scripts/_lib/body_portable.ts +102 -0
  90. package/src/scripts/_lib/cc_transcript.ts +132 -1
  91. package/src/scripts/_lib/concern_sla_window.ts +200 -0
  92. package/src/scripts/_lib/forge_protection.ts +114 -0
  93. package/src/scripts/_lib/forge_reader.ts +558 -0
  94. package/src/scripts/_lib/host_env_write.ts +111 -0
  95. package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
  96. package/src/scripts/_lib/obligations.ts +119 -8
  97. package/src/scripts/_lib/probe_inputs.ts +271 -0
  98. package/src/scripts/_lib/read_surface_scan.ts +322 -0
  99. package/src/scripts/_lib/release_highlights.ts +2 -1
  100. package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
  101. package/src/scripts/_lib/shell_write_shapes.ts +108 -0
  102. package/src/scripts/_lib/structural_hiding.ts +622 -0
  103. package/src/scripts/_lib/turn_end_refusals.ts +525 -4
  104. package/src/scripts/_lib/turn_end_transcript.ts +216 -0
  105. package/src/scripts/_lib/verification_command.ts +324 -0
  106. package/src/scripts/_lib/verification_evidence.ts +647 -0
  107. package/src/scripts/_lib/verify_clause.ts +280 -0
  108. package/src/scripts/ai_team/team_dispatch.ts +4 -0
  109. package/src/scripts/before_complete_hook.ts +340 -23
  110. package/src/scripts/bench_hook_latency.ts +412 -5
  111. package/src/scripts/cache_realization_report.ts +61 -1
  112. package/src/scripts/check_argument_hint.ts +287 -0
  113. package/src/scripts/check_claims.ts +125 -1
  114. package/src/scripts/check_enforcement_coverage.ts +38 -9
  115. package/src/scripts/check_enforcement_matrix.ts +245 -3
  116. package/src/scripts/check_finding_dispositions.ts +22 -3
  117. package/src/scripts/check_generator_sync.ts +71 -0
  118. package/src/scripts/check_host_docs_digest.ts +786 -0
  119. package/src/scripts/check_host_format_column.ts +559 -0
  120. package/src/scripts/check_input_references.ts +228 -0
  121. package/src/scripts/check_inputs_parity.ts +235 -0
  122. package/src/scripts/check_kernel_edit_ratified.ts +47 -5
  123. package/src/scripts/check_kill_switch_table.ts +294 -0
  124. package/src/scripts/check_placeholder_drift.ts +221 -0
  125. package/src/scripts/check_read_surface_coverage.ts +515 -0
  126. package/src/scripts/check_release_holds.ts +2 -1
  127. package/src/scripts/check_routing_coverage.ts +378 -11
  128. package/src/scripts/check_static_parity.ts +17 -0
  129. package/src/scripts/ci_settle.ts +145 -19
  130. package/src/scripts/closure_scan.ts +115 -1
  131. package/src/scripts/compile_hook_manifest.ts +60 -16
  132. package/src/scripts/external_sources_denylist.json +29 -4
  133. package/src/scripts/hook_manifest.json +1 -1
  134. package/src/scripts/hook_manifest.yaml +42 -5
  135. package/src/scripts/hooks/block_config_weakening.ts +229 -4
  136. package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
  137. package/src/scripts/hooks/block_plumbing_writes.ts +314 -0
  138. package/src/scripts/hooks/bundle_integrity.ts +291 -0
  139. package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
  140. package/src/scripts/hooks/code_graph_context_hook.ts +1 -2
  141. package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
  142. package/src/scripts/hooks/concern_registry.ts +2 -0
  143. package/src/scripts/hooks/concern_timings.ts +94 -0
  144. package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
  145. package/src/scripts/hooks/design_pass_hook.ts +100 -9
  146. package/src/scripts/hooks/design_slop_hook.ts +1 -2
  147. package/src/scripts/hooks/dispatch_hook.ts +25 -19
  148. package/src/scripts/hooks/edit_shape_hook.ts +1 -2
  149. package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
  150. package/src/scripts/hooks/evidence_independence.ts +1 -2
  151. package/src/scripts/hooks/exit_codes.ts +128 -0
  152. package/src/scripts/hooks/host_lowering.json +1 -0
  153. package/src/scripts/hooks/host_lowering.ts +128 -3
  154. package/src/scripts/hooks/host_lowering.yaml +262 -46
  155. package/src/scripts/hooks/host_semantics.ts +30 -2
  156. package/src/scripts/hooks/injection_budget.ts +9 -2
  157. package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
  158. package/src/scripts/hooks/journal_record_hook.ts +1 -2
  159. package/src/scripts/hooks/memory_recall_hook.ts +1 -2
  160. package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
  161. package/src/scripts/hooks/one_question_per_ask_hook.ts +25 -4
  162. package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
  163. package/src/scripts/hooks/permission_gate.ts +1 -2
  164. package/src/scripts/hooks/push_settle_hook.ts +1 -3
  165. package/src/scripts/hooks/replay_hook.ts +2 -1
  166. package/src/scripts/hooks/reread_guard_hook.ts +1 -2
  167. package/src/scripts/hooks/review_baseline_hook.ts +1 -2
  168. package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
  169. package/src/scripts/hooks/rule_inject_hook.ts +8 -5
  170. package/src/scripts/hooks/run_continuation_hook.ts +13 -15
  171. package/src/scripts/hooks/skill_route_hook.ts +1 -2
  172. package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
  173. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
  174. package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
  175. package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
  176. package/src/scripts/hooks/table_fingerprint.ts +49 -0
  177. package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
  178. package/src/scripts/hooks/telemetry_usage_hook.ts +1 -2
  179. package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
  180. package/src/scripts/hooks/turn_end_gate_hook.ts +337 -324
  181. package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
  182. package/src/scripts/install.ts +3 -4
  183. package/src/scripts/lint_deny_text.ts +419 -0
  184. package/src/scripts/lint_exit_codes.ts +262 -0
  185. package/src/scripts/lint_hook_manifest.ts +55 -0
  186. package/src/scripts/lint_roadmap_blockers.ts +78 -12
  187. package/src/scripts/lint_skill_descriptions.ts +1 -1
  188. package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
  189. package/src/scripts/mcp_server/prompts.ts +142 -1
  190. package/src/scripts/measure_skill_ranker_baseline.ts +305 -51
  191. package/src/scripts/measure_turn_end_gate.ts +193 -0
  192. package/src/scripts/memory_lookup.ts +1 -1
  193. package/src/scripts/prepack-check.mjs +53 -0
  194. package/src/scripts/release_publication.ts +13 -1
  195. package/src/scripts/report_invocation_surface.ts +383 -0
  196. package/src/scripts/report_obligation_carriers.ts +699 -0
  197. package/src/scripts/report_obligation_writer_split.ts +236 -0
  198. package/src/scripts/report_skill_menu_census.ts +208 -0
  199. package/src/scripts/report_standing_payload_by_host.ts +1 -1
  200. package/src/scripts/roadmap_verify_share.ts +213 -0
  201. package/src/scripts/schemas/command.schema.json +44 -0
  202. package/src/scripts/schemas/review-findings.schema.json +4 -0
  203. package/src/scripts/schemas/skill.schema.json +44 -0
  204. package/src/scripts/self_review_gate.ts +359 -10
  205. package/src/scripts/semantic_parity_census.ts +314 -0
  206. package/src/scripts/session_eol_report.ts +54 -1
  207. package/src/scripts/sweep_dead_scan_roots.ts +1 -1
  208. package/src/scripts/trigger_eval_grandfather.json +0 -2
  209. package/src/scripts/trigger_eval_rotation.ts +122 -27
  210. package/src/scripts/ui_conformance_probe.ts +156 -4
  211. package/src/scripts/update_prices.ts +85 -3
  212. package/src/scripts/write_bundle_digest.mjs +74 -0
  213. package/src/server/schemas/settings.ts +31 -0
  214. package/src/templates/consumer-settings/ONBOARDING.md +1 -0
  215. package/dist/ui/assets/index-DH1xc62v.js +0 -29
  216. package/dist/ui/assets/index-jSfMW8_t.css +0 -1
  217. /package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-7RQP4UDH.js} +0 -0
@@ -24,10 +24,10 @@
24
24
  *
25
25
  * PRIVACY BY CONSTRUCTION — never widen this file to record content.
26
26
  *
27
- * The record type has exactly three fields and NONE of them can hold free
27
+ * The record type has exactly four fields and NONE of them can hold free
28
28
  * text: a timestamp, a tool NAME (an id-shaped enum — `Read`, `Bash`,
29
29
  * `Grep` — the same single host string `orchestration_record_hook` already
30
- * records), and a BYTE COUNT. A tool result routinely carries file
30
+ * records), and TWO BYTE COUNTS. A tool result routinely carries file
31
31
  * contents, command output, secrets in an env dump, and customer data from
32
32
  * an API response. None of it reaches this file's output, because the
33
33
  * output has no field able to carry it. A record shape that cannot hold a
@@ -47,6 +47,34 @@
47
47
  * identical while the cost came back. The `RESULT_KEYS` literals below are the
48
48
  * key NAMES this concern looks under, not a read of the body.
49
49
  *
50
+ * TWO COUNTS, ONE OF THEM REDUNDANT TODAY. `raw_bytes` is what
51
+ * the host handed the dispatcher; `delivered_bytes` is what reached the
52
+ * model. Today they are EQUAL BY CONSTRUCTION, and the construction is
53
+ * checkable: nothing under `src/` or `docs/` emits the host's result-rewrite
54
+ * field, so no concern can rewrite a tool result on its way past. That
55
+ * absence is a grep, and the grep lives in this concern's test rather than
56
+ * in this sentence - a claim in a comment is not falsifiable, and naming the
57
+ * field here would put a match in the very tree the grep sweeps.
58
+ *
59
+ * Recording both NOW is what makes a later reduction measurable instead of
60
+ * asserted. With one field, a future release that starts trimming results
61
+ * has no before-number and can only claim an improvement; with two, the
62
+ * delta is in the census the day the trimming lands. The cost of the second
63
+ * field is one integer per line in one workspace — see the gate below.
64
+ *
65
+ * DEFAULT OFF OUTSIDE THE MAINTAINER WORKSPACE. A byte counter on every
66
+ * tool call in every consumer install is
67
+ * the cheapest possible way to add a second unread instrument: it costs a
68
+ * write per tool call, accumulates volume, and answers a question only this
69
+ * package's maintainers have asked. So {@link resolvesMaintainerWorkspace}
70
+ * gates the write, and with no maintainer workspace resolved a dispatch
71
+ * writes nothing at all — not an empty line, not a file.
72
+ *
73
+ * A consumer who WANTS the census sets `AGENT_CONFIG_TOOL_BYTE_CENSUS=1`.
74
+ * That is a deliberate opt-in and it is the only other way the write
75
+ * happens; there is no settings key, because a key would put the decision in
76
+ * a file this concern would then have to parse on the hot path.
77
+ *
50
78
  * ── Always exit 0 ─────────────────────────────────────────────────────
51
79
  *
52
80
  * A `warn` (exit 2) is read as a hard BLOCK on this host, and this concern
@@ -56,8 +84,8 @@
56
84
  *
57
85
  * ── Absence is recorded, not inferred ─────────────────────────────────
58
86
  *
59
- * A payload carrying no readable result writes a line with `bytes: null`
60
- * and `measurable: false` rather than writing nothing. The two cases are
87
+ * A payload carrying no readable result writes a line with both byte fields
88
+ * null and `measurable: false` rather than writing nothing. The two cases are
61
89
  * otherwise byte-identical in the output — "this host does not carry tool
62
90
  * results in its PostToolUse payload" and "no tools ran" would produce the
63
91
  * same empty file, and the first is a finding about the instrument's own
@@ -72,8 +100,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
72
100
  import { is_replay_mode } from './state_io.js';
73
101
  import { readHookStdin } from './hook_stdin.js';
74
102
  import { stubbedBytes } from './payload_stub.js';
75
-
76
- const EXIT_ALLOW = 0;
103
+ import { EXIT_ALLOW } from './exit_codes.js';
77
104
 
78
105
  type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
79
106
  type JsonObject = { [k: string]: JsonValue };
@@ -85,7 +112,7 @@ function isObject(v: unknown): v is JsonObject {
85
112
  /**
86
113
  * Census file, relative to the consumer repo root. Sibling of
87
114
  * `injection-census.jsonl` in the same directory and the same
88
- * `{ts, …, bytes}` line shape — one family, two units: that file counts
115
+ * `{ts, …, bytes}` line family — one family, two units: that file counts
89
116
  * bytes this suite injects, this one counts bytes the host's tools do.
90
117
  * Gitignored via `/agents/runtime/`.
91
118
  */
@@ -169,13 +196,65 @@ function censusFile(consumerRoot: string): string {
169
196
  export interface CensusLine {
170
197
  ts: string;
171
198
  tool: string | null;
172
- bytes: number | null;
199
+ /** UTF-8 bytes the host handed the dispatcher. `null` ⇒ unmeasurable. */
200
+ raw_bytes: number | null;
201
+ /**
202
+ * UTF-8 bytes that reached the model.
203
+ *
204
+ * Equal to {@link CensusLine.raw_bytes} by construction today — nothing in
205
+ * this tree rewrites a tool result. It is recorded anyway so that a later
206
+ * reduction is a measured delta rather than a claim. See the header.
207
+ */
208
+ delivered_bytes: number | null;
173
209
  /** `false` ⇒ the payload carried no readable result. See the header. */
174
210
  measurable: boolean;
175
211
  }
176
212
 
213
+ /** `package.json.name` of the workspace this census is for. */
214
+ export const MAINTAINER_PACKAGE_NAME = '@event4u/agent-config';
215
+
216
+ /** Deliberate consumer opt-in. Any other value, or unset, leaves the census off. */
217
+ export const CENSUS_OPT_IN_ENV = 'AGENT_CONFIG_TOOL_BYTE_CENSUS';
218
+
219
+ /** Memoised per root: this is read once per dispatched tool call otherwise. */
220
+ const _maintainerCache = new Map<string, boolean>();
221
+
222
+ /** Test seam — the cache would otherwise outlive a fixture root's contents. */
223
+ export function _resetMaintainerCache(): void {
224
+ _maintainerCache.clear();
225
+ }
226
+
227
+ /**
228
+ * Does this root resolve the maintainer workspace?
229
+ *
230
+ * Read off `package.json.name`, which is the cheapest unambiguous marker of
231
+ * the one workspace whose `workspaces: [agent-config-maintainer]` artefacts
232
+ * are active. A settings key was rejected: it would put a YAML parse on the
233
+ * post_tool_use path for a decision that never changes within a checkout.
234
+ *
235
+ * Any failure — no `package.json`, unreadable, unparseable, a different name
236
+ * — resolves to FALSE. The default is silence, which is the safe direction
237
+ * for an instrument nobody in that workspace is going to read.
238
+ */
239
+ export function resolvesMaintainerWorkspace(consumerRoot: string): boolean {
240
+ if (process.env[CENSUS_OPT_IN_ENV] === '1') return true;
241
+ const cached = _maintainerCache.get(consumerRoot);
242
+ if (cached !== undefined) return cached;
243
+ let verdict = false;
244
+ try {
245
+ const raw = fs.readFileSync(path.join(consumerRoot, 'package.json'), 'utf8');
246
+ const parsed = JSON.parse(raw) as unknown;
247
+ verdict = isObject(parsed) && parsed['name'] === MAINTAINER_PACKAGE_NAME;
248
+ } catch {
249
+ verdict = false;
250
+ }
251
+ _maintainerCache.set(consumerRoot, verdict);
252
+ return verdict;
253
+ }
254
+
177
255
  export function _appendCensusLine(consumerRoot: string, line: CensusLine): void {
178
256
  if (is_replay_mode()) return;
257
+ if (!resolvesMaintainerWorkspace(consumerRoot)) return;
179
258
  const file = censusFile(consumerRoot);
180
259
  fs.mkdirSync(path.dirname(file), { recursive: true });
181
260
  fs.appendFileSync(file, `${JSON.stringify(line)}\n`, 'utf8');
@@ -193,7 +272,12 @@ export function processEnvelope(envelope: JsonValue, consumerRoot: string): numb
193
272
  _appendCensusLine(consumerRoot, {
194
273
  ts: new Date().toISOString(),
195
274
  tool: _toolName(payload, envelope),
196
- bytes,
275
+ raw_bytes: bytes,
276
+ // Equal BY CONSTRUCTION, not by copy-as-convenience: no concern
277
+ // can rewrite a result between the host and the model, because
278
+ // nothing under src/ or docs/ emits the host's rewrite field. The
279
+ // test pins that as a grep; naming the field here would match it.
280
+ delivered_bytes: bytes,
197
281
  measurable: bytes !== null,
198
282
  });
199
283
  } catch {