@event4u/agent-config 17.0.0 → 17.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) 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 +104 -485
  5. package/README.md +2 -1
  6. package/dist/agent-src/contexts/execution/host-capability-manifest.md +5 -3
  7. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  8. package/dist/agent-src/templates/roadmaps.md +5 -1
  9. package/dist/cli-delegate/{chunk-IROAQ77A.js → chunk-3PK3VZHB.js} +107 -9
  10. package/dist/cli-delegate/{chunk-2SFOOFJJ.js → chunk-BZJ4Y3CI.js} +1 -1
  11. package/dist/cli-delegate/{chunk-CAL76ADI.js → chunk-CMZEKSNN.js} +52 -10
  12. package/dist/cli-delegate/{chunk-ESUNQ5XR.js → chunk-E3CFULNX.js} +22 -4
  13. package/dist/cli-delegate/{chunk-GOMILC3O.js → chunk-QBHEI5N4.js} +4 -3
  14. package/dist/cli-delegate/{chunk-SIOMDAKL.js → chunk-VYZGJLCA.js} +29 -39
  15. package/dist/cli-delegate/chunk-W5JXMF2T.js +77 -0
  16. package/dist/cli-delegate/{chunk-4SHNERBL.js → chunk-XIAPY44N.js} +1 -1
  17. package/dist/cli-delegate/{chunk-JHMMWNJ2.js → chunk-YHAPONWV.js} +1 -1
  18. package/dist/cli-delegate/cmd_conformance.js +9 -8
  19. package/dist/cli-delegate/cmd_doctor.js +4 -4
  20. package/dist/cli-delegate/cmd_doctor_neighbours.js +2 -2
  21. package/dist/cli-delegate/cmd_explain.js +1 -1
  22. package/dist/cli-delegate/cmd_export.js +6 -6
  23. package/dist/cli-delegate/cmd_fleet.js +3 -3
  24. package/dist/cli-delegate/cmd_preflight.js +3 -3
  25. package/dist/cli-delegate/cmd_prune.js +6 -6
  26. package/dist/cli-delegate/cmd_settings_migrate.js +6 -6
  27. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  28. package/dist/cli-delegate/cmd_sync.js +6 -6
  29. package/dist/cli-delegate/cmd_uninstall.js +6 -6
  30. package/dist/cli-delegate/cmd_update.js +9 -13
  31. package/dist/cli-delegate/cmd_validate.js +6 -6
  32. package/dist/discovery/deprecation-report.md +1 -1
  33. package/dist/discovery/discovery-manifest.json +4 -4
  34. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  35. package/dist/discovery/discovery-manifest.summary.md +1 -1
  36. package/dist/discovery/dormancy-report.md +1 -1
  37. package/dist/discovery/orphan-report.md +1 -1
  38. package/dist/discovery/packs.json +2 -2
  39. package/dist/discovery/trust-report.md +1 -1
  40. package/dist/discovery/workspaces.json +2 -2
  41. package/dist/hooks/dispatch.js +98 -74
  42. package/dist/hooks/dispatch.sha256 +1 -1
  43. package/dist/install/claudeRuleRewrite.js +10 -3
  44. package/dist/install/conflict.js +24 -2
  45. package/dist/install/conflictTracker.js +14 -3
  46. package/dist/install/install.mjs +222 -117
  47. package/dist/install/installThinLayer.js +1 -0
  48. package/dist/install/loggedWrites.js +142 -0
  49. package/dist/install/paths.js +12 -2
  50. package/dist/install/preserve.js +25 -4
  51. package/dist/install/txlog.js +10 -6
  52. package/dist/mcp/registry-manifest.json +2 -2
  53. package/dist/mcp/server.json +2 -2
  54. package/dist/mcp/server.mjs +845 -294
  55. package/dist/scripts/_lib/egress_rules.js +4 -1
  56. package/dist/scripts/_lib/identifier_redaction.js +35 -2
  57. package/dist/scripts/ai_council/seat_policy.js +7 -1
  58. package/dist/server/schemas/settings.js +1 -1
  59. package/package.json +1 -1
  60. package/src/config/ci-local-parity.yml +1 -1
  61. package/src/config/gate-coverage.yml +27 -7
  62. package/src/config/gate-violation-baselines.json +8 -2
  63. package/src/config/hook-bundle-budget.json +2 -2
  64. package/src/config/production-entries.json +18 -0
  65. package/src/config/release-gate-locality.yml +0 -7
  66. package/src/install/claudeRuleRewrite.ts +10 -1
  67. package/src/install/conflict.ts +24 -1
  68. package/src/install/conflictTracker.ts +18 -2
  69. package/src/install/installThinLayer.ts +6 -0
  70. package/src/install/loggedWrites.ts +148 -0
  71. package/src/install/paths.ts +11 -2
  72. package/src/install/preserve.ts +40 -4
  73. package/src/install/txlog.ts +10 -6
  74. package/src/scripts/_cli/cmd_conformance.ts +3 -2
  75. package/src/scripts/_cli/cmd_update.ts +15 -17
  76. package/src/scripts/_lib/council_settings_block.ts +9 -2
  77. package/src/scripts/_lib/egress_rules.ts +4 -1
  78. package/src/scripts/_lib/host_capability.ts +10 -5
  79. package/src/scripts/_lib/identifier_redaction.ts +38 -2
  80. package/src/scripts/_lib/price_freshness.ts +112 -0
  81. package/src/scripts/_lib/production_reach.ts +194 -0
  82. package/src/scripts/_lib/quota_parked.ts +17 -28
  83. package/src/scripts/_lib/release_findings_ingest.ts +13 -335
  84. package/src/scripts/_lib/tier_downshift_verdict.ts +81 -35
  85. package/src/scripts/ai_council/chairman.ts +5 -2
  86. package/src/scripts/ai_council/clients.ts +4 -3
  87. package/src/scripts/ai_council/free_hand_shadow.ts +24 -12
  88. package/src/scripts/ai_council/free_route_catalog.ts +142 -5
  89. package/src/scripts/ai_council/free_route_client.ts +4 -0
  90. package/src/scripts/ai_council/hand_payload.ts +115 -7
  91. package/src/scripts/ai_council/orchestrator.ts +7 -10
  92. package/src/scripts/ai_council/route_chooser.ts +1 -1
  93. package/src/scripts/ai_council/route_member.ts +66 -4
  94. package/src/scripts/ai_council/seat_policy.ts +8 -1
  95. package/src/scripts/ai_council/self_hosted_probe.ts +327 -0
  96. package/src/scripts/ai_council/status_surface.ts +2 -0
  97. package/src/scripts/ask_transport.ts +137 -15
  98. package/src/scripts/check_finding_dispositions.ts +25 -71
  99. package/src/scripts/check_release_pr_shape.ts +3 -3
  100. package/src/scripts/check_step_production_reach.ts +257 -0
  101. package/src/scripts/council_cli.ts +10 -8
  102. package/src/scripts/hook_manifest.json +1 -1
  103. package/src/scripts/hook_manifest.yaml +3 -0
  104. package/src/scripts/hooks/dispatch_hook.ts +2 -2
  105. package/src/scripts/hooks/payload_stub.ts +27 -0
  106. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +29 -70
  107. package/src/scripts/hooks/subagent_ledger_hook.ts +80 -0
  108. package/src/scripts/install.ts +2 -2
  109. package/src/scripts/lint_decision_classes.ts +34 -0
  110. package/src/scripts/lint_hook_manifest.ts +24 -0
  111. package/src/scripts/lint_roadmap_blockers.ts +52 -3
  112. package/src/scripts/release.ts +5 -9
  113. package/src/scripts/release_drill.ts +11 -165
  114. package/src/scripts/release_publication.ts +0 -9
  115. package/src/scripts/report_production_reach.ts +35 -0
  116. package/src/scripts/worker_reuse_shadow_report.ts +399 -1
  117. package/src/server/schemas/settings.ts +1 -1
  118. package/dist/cli-delegate/chunk-A4QJ6ENT.js +0 -50
  119. /package/dist/cli-delegate/{chunk-E6XNBVE4.js → chunk-KR5ZIFPO.js} +0 -0
@@ -4001,10 +4001,10 @@ var require_resolve_block_map = __commonJS({
4001
4001
  let offset = bm.offset;
4002
4002
  let commentEnd = null;
4003
4003
  for (const collItem of bm.items) {
4004
- const { start, key, sep: sep10, value } = collItem;
4004
+ const { start, key, sep: sep11, value } = collItem;
4005
4005
  const keyProps = resolveProps.resolveProps(start, {
4006
4006
  indicator: "explicit-key-ind",
4007
- next: key ?? sep10?.[0],
4007
+ next: key ?? sep11?.[0],
4008
4008
  offset,
4009
4009
  onError,
4010
4010
  parentIndent: bm.indent,
@@ -4018,7 +4018,7 @@ var require_resolve_block_map = __commonJS({
4018
4018
  else if ("indent" in key && key.indent !== bm.indent)
4019
4019
  onError(offset, "BAD_INDENT", startColMsg);
4020
4020
  }
4021
- if (!keyProps.anchor && !keyProps.tag && !sep10) {
4021
+ if (!keyProps.anchor && !keyProps.tag && !sep11) {
4022
4022
  commentEnd = keyProps.end;
4023
4023
  if (keyProps.comment) {
4024
4024
  if (map.comment)
@@ -4042,7 +4042,7 @@ var require_resolve_block_map = __commonJS({
4042
4042
  ctx.atKey = false;
4043
4043
  if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))
4044
4044
  onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique");
4045
- const valueProps = resolveProps.resolveProps(sep10 ?? [], {
4045
+ const valueProps = resolveProps.resolveProps(sep11 ?? [], {
4046
4046
  indicator: "map-value-ind",
4047
4047
  next: value,
4048
4048
  offset: keyNode.range[2],
@@ -4058,7 +4058,7 @@ var require_resolve_block_map = __commonJS({
4058
4058
  if (ctx.options.strict && keyProps.start < valueProps.found.offset - 1024)
4059
4059
  onError(keyNode.range, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit block mapping key");
4060
4060
  }
4061
- const valueNode = value ? composeNode(ctx, value, valueProps, onError) : composeEmptyNode(ctx, offset, sep10, null, valueProps, onError);
4061
+ const valueNode = value ? composeNode(ctx, value, valueProps, onError) : composeEmptyNode(ctx, offset, sep11, null, valueProps, onError);
4062
4062
  if (ctx.schema.compat)
4063
4063
  utilFlowIndentCheck.flowIndentCheck(bm.indent, value, onError);
4064
4064
  offset = valueNode.range[2];
@@ -4149,7 +4149,7 @@ var require_resolve_end = __commonJS({
4149
4149
  let comment = "";
4150
4150
  if (end) {
4151
4151
  let hasSpace = false;
4152
- let sep10 = "";
4152
+ let sep11 = "";
4153
4153
  for (const token of end) {
4154
4154
  const { source, type } = token;
4155
4155
  switch (type) {
@@ -4163,13 +4163,13 @@ var require_resolve_end = __commonJS({
4163
4163
  if (!comment)
4164
4164
  comment = cb;
4165
4165
  else
4166
- comment += sep10 + cb;
4167
- sep10 = "";
4166
+ comment += sep11 + cb;
4167
+ sep11 = "";
4168
4168
  break;
4169
4169
  }
4170
4170
  case "newline":
4171
4171
  if (comment)
4172
- sep10 += source;
4172
+ sep11 += source;
4173
4173
  hasSpace = true;
4174
4174
  break;
4175
4175
  default:
@@ -4212,18 +4212,18 @@ var require_resolve_flow_collection = __commonJS({
4212
4212
  let offset = fc.offset + fc.start.source.length;
4213
4213
  for (let i = 0; i < fc.items.length; ++i) {
4214
4214
  const collItem = fc.items[i];
4215
- const { start, key, sep: sep10, value } = collItem;
4215
+ const { start, key, sep: sep11, value } = collItem;
4216
4216
  const props = resolveProps.resolveProps(start, {
4217
4217
  flow: fcName,
4218
4218
  indicator: "explicit-key-ind",
4219
- next: key ?? sep10?.[0],
4219
+ next: key ?? sep11?.[0],
4220
4220
  offset,
4221
4221
  onError,
4222
4222
  parentIndent: fc.indent,
4223
4223
  startOnNewline: false
4224
4224
  });
4225
4225
  if (!props.found) {
4226
- if (!props.anchor && !props.tag && !sep10 && !value) {
4226
+ if (!props.anchor && !props.tag && !sep11 && !value) {
4227
4227
  if (i === 0 && props.comma)
4228
4228
  onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`);
4229
4229
  else if (i < fc.items.length - 1)
@@ -4277,8 +4277,8 @@ var require_resolve_flow_collection = __commonJS({
4277
4277
  }
4278
4278
  }
4279
4279
  }
4280
- if (!isMap && !sep10 && !props.found) {
4281
- const valueNode = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, sep10, null, props, onError);
4280
+ if (!isMap && !sep11 && !props.found) {
4281
+ const valueNode = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, sep11, null, props, onError);
4282
4282
  coll.items.push(valueNode);
4283
4283
  offset = valueNode.range[2];
4284
4284
  if (isBlock(value))
@@ -4290,7 +4290,7 @@ var require_resolve_flow_collection = __commonJS({
4290
4290
  if (isBlock(key))
4291
4291
  onError(keyNode.range, "BLOCK_IN_FLOW", blockMsg);
4292
4292
  ctx.atKey = false;
4293
- const valueProps = resolveProps.resolveProps(sep10 ?? [], {
4293
+ const valueProps = resolveProps.resolveProps(sep11 ?? [], {
4294
4294
  flow: fcName,
4295
4295
  indicator: "map-value-ind",
4296
4296
  next: value,
@@ -4301,8 +4301,8 @@ var require_resolve_flow_collection = __commonJS({
4301
4301
  });
4302
4302
  if (valueProps.found) {
4303
4303
  if (!isMap && !props.found && ctx.options.strict) {
4304
- if (sep10)
4305
- for (const st of sep10) {
4304
+ if (sep11)
4305
+ for (const st of sep11) {
4306
4306
  if (st === valueProps.found)
4307
4307
  break;
4308
4308
  if (st.type === "newline") {
@@ -4319,7 +4319,7 @@ var require_resolve_flow_collection = __commonJS({
4319
4319
  else
4320
4320
  onError(valueProps.start, "MISSING_CHAR", `Missing , or : between ${fcName} items`);
4321
4321
  }
4322
- const valueNode = value ? composeNode(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode(ctx, valueProps.end, sep10, null, valueProps, onError) : null;
4322
+ const valueNode = value ? composeNode(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode(ctx, valueProps.end, sep11, null, valueProps, onError) : null;
4323
4323
  if (valueNode) {
4324
4324
  if (isBlock(value))
4325
4325
  onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg);
@@ -4499,7 +4499,7 @@ var require_resolve_block_scalar = __commonJS({
4499
4499
  chompStart = i + 1;
4500
4500
  }
4501
4501
  let value = "";
4502
- let sep10 = "";
4502
+ let sep11 = "";
4503
4503
  let prevMoreIndented = false;
4504
4504
  for (let i = 0; i < contentStart; ++i)
4505
4505
  value += lines[i][0].slice(trimIndent) + "\n";
@@ -4516,24 +4516,24 @@ var require_resolve_block_scalar = __commonJS({
4516
4516
  indent = "";
4517
4517
  }
4518
4518
  if (type === Scalar.Scalar.BLOCK_LITERAL) {
4519
- value += sep10 + indent.slice(trimIndent) + content;
4520
- sep10 = "\n";
4519
+ value += sep11 + indent.slice(trimIndent) + content;
4520
+ sep11 = "\n";
4521
4521
  } else if (indent.length > trimIndent || content[0] === " ") {
4522
- if (sep10 === " ")
4523
- sep10 = "\n";
4524
- else if (!prevMoreIndented && sep10 === "\n")
4525
- sep10 = "\n\n";
4526
- value += sep10 + indent.slice(trimIndent) + content;
4527
- sep10 = "\n";
4522
+ if (sep11 === " ")
4523
+ sep11 = "\n";
4524
+ else if (!prevMoreIndented && sep11 === "\n")
4525
+ sep11 = "\n\n";
4526
+ value += sep11 + indent.slice(trimIndent) + content;
4527
+ sep11 = "\n";
4528
4528
  prevMoreIndented = true;
4529
4529
  } else if (content === "") {
4530
- if (sep10 === "\n")
4530
+ if (sep11 === "\n")
4531
4531
  value += "\n";
4532
4532
  else
4533
- sep10 = "\n";
4533
+ sep11 = "\n";
4534
4534
  } else {
4535
- value += sep10 + content;
4536
- sep10 = " ";
4535
+ value += sep11 + content;
4536
+ sep11 = " ";
4537
4537
  prevMoreIndented = false;
4538
4538
  }
4539
4539
  }
@@ -4715,25 +4715,25 @@ var require_resolve_flow_scalar = __commonJS({
4715
4715
  if (!match)
4716
4716
  return source;
4717
4717
  let res = match[1];
4718
- let sep10 = " ";
4718
+ let sep11 = " ";
4719
4719
  let pos = first.lastIndex;
4720
4720
  line.lastIndex = pos;
4721
4721
  while (match = line.exec(source)) {
4722
4722
  if (match[1] === "") {
4723
- if (sep10 === "\n")
4724
- res += sep10;
4723
+ if (sep11 === "\n")
4724
+ res += sep11;
4725
4725
  else
4726
- sep10 = "\n";
4726
+ sep11 = "\n";
4727
4727
  } else {
4728
- res += sep10 + match[1];
4729
- sep10 = " ";
4728
+ res += sep11 + match[1];
4729
+ sep11 = " ";
4730
4730
  }
4731
4731
  pos = line.lastIndex;
4732
4732
  }
4733
4733
  const last = /[ \t]*(.*)/sy;
4734
4734
  last.lastIndex = pos;
4735
4735
  match = last.exec(source);
4736
- return res + sep10 + (match?.[1] ?? "");
4736
+ return res + sep11 + (match?.[1] ?? "");
4737
4737
  }
4738
4738
  function doubleQuotedValue(source, onError) {
4739
4739
  let res = "";
@@ -5543,14 +5543,14 @@ var require_cst_stringify = __commonJS({
5543
5543
  }
5544
5544
  }
5545
5545
  }
5546
- function stringifyItem({ start, key, sep: sep10, value }) {
5546
+ function stringifyItem({ start, key, sep: sep11, value }) {
5547
5547
  let res = "";
5548
5548
  for (const st of start)
5549
5549
  res += st.source;
5550
5550
  if (key)
5551
5551
  res += stringifyToken(key);
5552
- if (sep10)
5553
- for (const st of sep10)
5552
+ if (sep11)
5553
+ for (const st of sep11)
5554
5554
  res += st.source;
5555
5555
  if (value)
5556
5556
  res += stringifyToken(value);
@@ -6717,18 +6717,18 @@ var require_parser = __commonJS({
6717
6717
  if (this.type === "map-value-ind") {
6718
6718
  const prev = getPrevProps(this.peek(2));
6719
6719
  const start = getFirstKeyStartProps(prev);
6720
- let sep10;
6720
+ let sep11;
6721
6721
  if (scalar.end) {
6722
- sep10 = scalar.end;
6723
- sep10.push(this.sourceToken);
6722
+ sep11 = scalar.end;
6723
+ sep11.push(this.sourceToken);
6724
6724
  delete scalar.end;
6725
6725
  } else
6726
- sep10 = [this.sourceToken];
6726
+ sep11 = [this.sourceToken];
6727
6727
  const map = {
6728
6728
  type: "block-map",
6729
6729
  offset: scalar.offset,
6730
6730
  indent: scalar.indent,
6731
- items: [{ start, key: scalar, sep: sep10 }]
6731
+ items: [{ start, key: scalar, sep: sep11 }]
6732
6732
  };
6733
6733
  this.onKeyLine = true;
6734
6734
  this.stack[this.stack.length - 1] = map;
@@ -6881,15 +6881,15 @@ var require_parser = __commonJS({
6881
6881
  } else if (isFlowToken(it.key) && !includesToken(it.sep, "newline")) {
6882
6882
  const start2 = getFirstKeyStartProps(it.start);
6883
6883
  const key = it.key;
6884
- const sep10 = it.sep;
6885
- sep10.push(this.sourceToken);
6884
+ const sep11 = it.sep;
6885
+ sep11.push(this.sourceToken);
6886
6886
  delete it.key;
6887
6887
  delete it.sep;
6888
6888
  this.stack.push({
6889
6889
  type: "block-map",
6890
6890
  offset: this.offset,
6891
6891
  indent: this.indent,
6892
- items: [{ start: start2, key, sep: sep10 }]
6892
+ items: [{ start: start2, key, sep: sep11 }]
6893
6893
  });
6894
6894
  } else if (start.length > 0) {
6895
6895
  it.sep = it.sep.concat(start, this.sourceToken);
@@ -7083,13 +7083,13 @@ var require_parser = __commonJS({
7083
7083
  const prev = getPrevProps(parent);
7084
7084
  const start = getFirstKeyStartProps(prev);
7085
7085
  fixFlowSeqItems(fc);
7086
- const sep10 = fc.end.splice(1, fc.end.length);
7087
- sep10.push(this.sourceToken);
7086
+ const sep11 = fc.end.splice(1, fc.end.length);
7087
+ sep11.push(this.sourceToken);
7088
7088
  const map = {
7089
7089
  type: "block-map",
7090
7090
  offset: fc.offset,
7091
7091
  indent: fc.indent,
7092
- items: [{ start, key: fc, sep: sep10 }]
7092
+ items: [{ start, key: fc, sep: sep11 }]
7093
7093
  };
7094
7094
  this.onKeyLine = true;
7095
7095
  this.stack[this.stack.length - 1] = map;
@@ -8482,7 +8482,8 @@ function probeHostCapabilities(hostId) {
8482
8482
  const base = resolveHostCapabilities(hostId);
8483
8483
  const flag = process2.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS;
8484
8484
  const probedAgentTeams = typeof flag === "string" && flag !== "";
8485
- return { ...base, agent_teams: base.agent_teams || probedAgentTeams };
8485
+ const probedResume = probedAgentTeams && hostId === "claude";
8486
+ return { ...base, agent_teams: base.agent_teams || probedAgentTeams, worker_resume: base.worker_resume || probedResume };
8486
8487
  }
8487
8488
  var CAPABILITY_FIELDS = [
8488
8489
  "subagent_spawn",
@@ -8504,9 +8505,9 @@ function describeHostCapabilities(hostId) {
8504
8505
  const probedAgentTeams = typeof flag === "string" && flag !== "";
8505
8506
  const sources = {};
8506
8507
  for (const field of CAPABILITY_FIELDS) {
8507
- if (row !== void 0 && typeof row[field] === "boolean") {
8508
+ if (row !== void 0 && typeof row[field] === "boolean" && !(row[field] === false && manifest[field] === true)) {
8508
8509
  sources[field] = "registry";
8509
- } else if (field === "agent_teams" && probedAgentTeams) {
8510
+ } else if ((field === "agent_teams" || field === "worker_resume" && hostId === "claude") && probedAgentTeams) {
8510
8511
  sources[field] = "live-probe";
8511
8512
  } else {
8512
8513
  sources[field] = "default";
@@ -10091,14 +10092,21 @@ function recordedHashesWithLedger(root, env) {
10091
10092
  var SIDECAR_SUFFIX = ".agent-config.new";
10092
10093
  var EXIT_COMPLETED_WITH_CONFLICTS = 3;
10093
10094
  function isLedgerMigration(inputs) {
10094
- if (!inputs.exists || inputs.force) return false;
10095
+ if (!inputs.exists || inputs.force || inputs.loggedWrite === true) return false;
10095
10096
  if (inputs.ledgerListed !== true) return false;
10096
10097
  if (inputs.onDiskSha256 === null) return false;
10097
10098
  return classifyOwnership(inputs.recordedSha256, inputs.onDiskSha256) === "unknown";
10098
10099
  }
10100
+ function logProofApplies(inputs) {
10101
+ if (!inputs.exists || inputs.force || inputs.onDiskSha256 === null) return false;
10102
+ const ownership = classifyOwnership(inputs.recordedSha256, inputs.onDiskSha256);
10103
+ if (ownership === "recorded-modified") return inputs.recordedIsStaged === true;
10104
+ return ownership === "unknown" && isLedgerMigration({ ...inputs, loggedWrite: false });
10105
+ }
10099
10106
  function decideDeployWrite(inputs) {
10100
10107
  if (!inputs.exists) return "write";
10101
10108
  if (inputs.force) return "write";
10109
+ if (inputs.loggedWrite === true && logProofApplies(inputs)) return "write";
10102
10110
  const ownership = classifyOwnership(inputs.recordedSha256, inputs.onDiskSha256);
10103
10111
  if (ownership === "recorded-modified") return "preserve";
10104
10112
  if (ownership === "unknown" && isLedgerMigration(inputs)) {
@@ -10123,12 +10131,125 @@ function foreignSidecarMessage(target, sidecar) {
10123
10131
  return `Refusing to replace ${sidecar}: it already exists with different content and this install cannot show it wrote it. Package content for ${target} was NOT staged. Move or delete that file and re-run, or rerun with --force to replace the managed file instead.`;
10124
10132
  }
10125
10133
 
10134
+ // src/install/loggedWrites.ts
10135
+ import { gunzipSync } from "node:zlib";
10136
+ import { existsSync as existsSync5, readdirSync as readdirSync5, readFileSync as readFileSync10, realpathSync as realpathSync3, statSync as statSync4 } from "node:fs";
10137
+ import { basename as basename3, dirname as dirname4, join as join12, relative as relative2, resolve as resolve4, sep as sep3 } from "node:path";
10138
+
10139
+ // src/install/paths.ts
10140
+ import { homedir as homedir6, tmpdir } from "node:os";
10141
+ import { join as join11 } from "node:path";
10142
+ var INSTALL_ROOT_SUBPATH = ".event4u/agent-config";
10143
+ var INSTALL_LOG_FILENAME = "install-log.jsonl";
10144
+ function resolveHome(home) {
10145
+ if (home && home.length > 0) {
10146
+ return home;
10147
+ }
10148
+ const fromOs = homedir6();
10149
+ if (!fromOs) {
10150
+ throw new Error(
10151
+ "Cannot resolve home directory \u2014 both $HOME (POSIX) and $USERPROFILE (Windows) are unset."
10152
+ );
10153
+ }
10154
+ return fromOs;
10155
+ }
10156
+ function getInstallRoot(home) {
10157
+ return join11(resolveHome(home), INSTALL_ROOT_SUBPATH);
10158
+ }
10159
+ function getLogPath(home) {
10160
+ const configHome = home ? void 0 : process.env["EVENT4U_CONFIG_HOME"];
10161
+ if (configHome) return join11(configHome, INSTALL_LOG_FILENAME);
10162
+ return join11(getInstallRoot(home), INSTALL_LOG_FILENAME);
10163
+ }
10164
+
10165
+ // src/install/loggedWrites.ts
10166
+ var WRITE_MARKER = '"kind":"write"';
10167
+ var fileCache = /* @__PURE__ */ new Map();
10168
+ var dirRealpaths = /* @__PURE__ */ new Map();
10169
+ function canonicalPath(p) {
10170
+ const abs = resolve4(p);
10171
+ const dir = dirname4(abs);
10172
+ let real = dirRealpaths.get(dir);
10173
+ if (real === void 0) {
10174
+ try {
10175
+ real = realpathSync3(dir);
10176
+ } catch {
10177
+ real = dir;
10178
+ }
10179
+ dirRealpaths.set(dir, real);
10180
+ }
10181
+ return join12(real, basename3(abs));
10182
+ }
10183
+ function logFiles(logPath) {
10184
+ const dir = dirname4(logPath);
10185
+ if (!existsSync5(dir)) return [];
10186
+ const stem = basename3(logPath).replace(/\.jsonl$/, "");
10187
+ try {
10188
+ return readdirSync5(dir).filter((n) => n.startsWith(stem) && (n.endsWith(".jsonl") || n.endsWith(".jsonl.gz"))).map((n) => join12(dir, n)).sort();
10189
+ } catch {
10190
+ return [];
10191
+ }
10192
+ }
10193
+ function writesIn(file) {
10194
+ let stamp;
10195
+ try {
10196
+ const st = statSync4(file);
10197
+ stamp = `${st.size}:${Math.trunc(st.mtimeMs)}`;
10198
+ } catch {
10199
+ return [];
10200
+ }
10201
+ const cached = fileCache.get(file);
10202
+ if (cached !== void 0 && cached.stamp === stamp) return cached.entries;
10203
+ let text = "";
10204
+ try {
10205
+ const raw = readFileSync10(file);
10206
+ text = (file.endsWith(".gz") ? gunzipSync(raw) : raw).toString("utf8");
10207
+ } catch {
10208
+ text = "";
10209
+ }
10210
+ const entries = [];
10211
+ for (const line of text.split("\n")) {
10212
+ if (!line.includes(WRITE_MARKER)) continue;
10213
+ let entry;
10214
+ try {
10215
+ entry = JSON.parse(line);
10216
+ } catch {
10217
+ continue;
10218
+ }
10219
+ if (typeof entry.path !== "string" || typeof entry.sha256 !== "string" || entry.sha256 === "") continue;
10220
+ entries.push([canonicalPath(entry.path), entry.sha256]);
10221
+ }
10222
+ fileCache.set(file, { stamp, entries });
10223
+ return entries;
10224
+ }
10225
+ function loggedWriteDigests(logPath = getLogPath()) {
10226
+ const writes = /* @__PURE__ */ new Map();
10227
+ for (const file of logFiles(logPath)) {
10228
+ for (const [target, sha] of writesIn(file)) {
10229
+ let set = writes.get(target);
10230
+ if (set === void 0) writes.set(target, set = /* @__PURE__ */ new Set());
10231
+ set.add(sha);
10232
+ }
10233
+ }
10234
+ return writes;
10235
+ }
10236
+ function onlyDeployed(anchor, currentFiles, log) {
10237
+ return (target) => {
10238
+ const rel = relative2(resolve4(anchor), resolve4(target)).split(sep3).join("/");
10239
+ if (currentFiles.has(rel)) log(target);
10240
+ };
10241
+ }
10242
+ function wroteTheseBytes(target, onDiskSha256, writes) {
10243
+ return writes.get(canonicalPath(target))?.has(onDiskSha256) === true;
10244
+ }
10245
+
10126
10246
  // src/install/conflictTracker.ts
10127
10247
  function createConflictTracker(host) {
10128
10248
  const conflictState = {
10129
10249
  root: null,
10130
10250
  recorded: null,
10131
10251
  ledgerFiles: null,
10252
+ logged: null,
10132
10253
  preserved: [],
10133
10254
  migrated: /* @__PURE__ */ new Set(),
10134
10255
  staged: /* @__PURE__ */ new Map()
@@ -10227,6 +10348,7 @@ function createConflictTracker(host) {
10227
10348
  conflictState.root = root;
10228
10349
  conflictState.recorded = null;
10229
10350
  conflictState.ledgerFiles = null;
10351
+ conflictState.logged = null;
10230
10352
  conflictState.preserved = [];
10231
10353
  conflictState.migrated = /* @__PURE__ */ new Set();
10232
10354
  conflictState.staged = /* @__PURE__ */ new Map();
@@ -10239,13 +10361,17 @@ function createConflictTracker(host) {
10239
10361
  */
10240
10362
  resolve(target, force, would) {
10241
10363
  const exists = pathExists(target);
10242
- const base = {
10364
+ const recordedSha256 = exists ? recordedHashFor(target) : void 0;
10365
+ const unproven = {
10243
10366
  exists,
10244
- recordedSha256: exists ? recordedHashFor(target) : void 0,
10367
+ recordedSha256,
10245
10368
  onDiskSha256: exists ? sha256OfFile(target) : null,
10246
10369
  force,
10247
- ledgerListed: exists && ledgerLists(target)
10370
+ ledgerListed: exists && ledgerLists(target),
10371
+ recordedIsStaged: typeof recordedSha256 === "string" && recordedSha256 === recordedHashFor(sidecarPathFor(target))
10248
10372
  };
10373
+ const loggedWrite = logProofApplies(unproven) && wroteTheseBytes(target, unproven.onDiskSha256, conflictState.logged ??= loggedWriteDigests());
10374
+ const base = { ...unproven, loggedWrite };
10249
10375
  const migrating = isLedgerMigration(base);
10250
10376
  const decision = decideDeployWrite(
10251
10377
  migrating ? { ...base, packagedSha256: wouldWriteDigest(target, would) } : base
@@ -10302,9 +10428,9 @@ function createConflictTracker(host) {
10302
10428
 
10303
10429
  // src/install/manifestFiles.ts
10304
10430
  var YAML3 = __toESM(require_dist(), 1);
10305
- import { existsSync as existsSync5, readFileSync as readFileSync10 } from "node:fs";
10306
- import { homedir as homedir6 } from "node:os";
10307
- import { isAbsolute as isAbsolute3, join as join12, resolve as resolve5 } from "node:path";
10431
+ import { existsSync as existsSync6, readFileSync as readFileSync11 } from "node:fs";
10432
+ import { homedir as homedir7 } from "node:os";
10433
+ import { isAbsolute as isAbsolute3, join as join14, resolve as resolve6 } from "node:path";
10308
10434
  function fileEntry(p, kind, hashContent) {
10309
10435
  return { path: p, kind, sha256: hashContent ? sha256OfFile(p) : null };
10310
10436
  }
@@ -10327,28 +10453,28 @@ function filesByToolFromBridges(tools, projectRoot, scope, bridgeMarker) {
10327
10453
  for (const toolId of [...tools].sort()) {
10328
10454
  const marker = bridgeMarker(toolId, scope);
10329
10455
  if (!marker) continue;
10330
- const markerPath = isAbsolute3(marker) ? marker : join12(projectRoot, marker);
10456
+ const markerPath = isAbsolute3(marker) ? marker : join14(projectRoot, marker);
10331
10457
  out[toolId] = [fileEntry(markerPath, "bridge", false)];
10332
10458
  }
10333
10459
  return out;
10334
10460
  }
10335
10461
  function expanduser6(p) {
10336
- if (p === "~") return homedir6();
10462
+ if (p === "~") return homedir7();
10337
10463
  if (p.startsWith("~/") || process.platform === "win32" && p.startsWith("~\\")) {
10338
- return join12(homedir6(), p.slice(2));
10464
+ return join14(homedir7(), p.slice(2));
10339
10465
  }
10340
10466
  return p;
10341
10467
  }
10342
10468
  function resolveRecorded(raw, projectRoot) {
10343
10469
  const expanded = expanduser6(raw);
10344
- return isAbsolute3(expanded) ? resolve5(expanded) : resolve5(projectRoot, expanded);
10470
+ return isAbsolute3(expanded) ? resolve6(expanded) : resolve6(projectRoot, expanded);
10345
10471
  }
10346
10472
  function readRecordedByTool(manifestPath, projectRoot) {
10347
10473
  const out = /* @__PURE__ */ new Map();
10348
- if (!existsSync5(manifestPath)) return out;
10474
+ if (!existsSync6(manifestPath)) return out;
10349
10475
  let doc;
10350
10476
  try {
10351
- doc = YAML3.parse(readFileSync10(manifestPath, "utf8"));
10477
+ doc = YAML3.parse(readFileSync11(manifestPath, "utf8"));
10352
10478
  } catch {
10353
10479
  return out;
10354
10480
  }
@@ -10402,7 +10528,7 @@ function reconcileToolFiles(fresh, prior, preserved) {
10402
10528
  const seen = /* @__PURE__ */ new Set();
10403
10529
  for (const entry of fresh) {
10404
10530
  const raw = entry["path"];
10405
- if (typeof raw === "string") seen.add(resolve5(expanduser6(raw)));
10531
+ if (typeof raw === "string") seen.add(resolve6(expanduser6(raw)));
10406
10532
  }
10407
10533
  const out = [...fresh];
10408
10534
  for (const file of prior.files) {
@@ -10418,7 +10544,7 @@ function preservedIndex(preservedTargets, staged) {
10418
10544
  for (const target of preservedTargets) {
10419
10545
  const sidecar = sidecarPathFor(target);
10420
10546
  const sha = staged.get(sidecar) ?? null;
10421
- out.set(resolve5(target), {
10547
+ out.set(resolve6(target), {
10422
10548
  sha256: sha,
10423
10549
  sidecar: sha === null ? null : { path: sidecar, kind: "sidecar", sha256: sha }
10424
10550
  });
@@ -11393,17 +11519,17 @@ import {
11393
11519
  fsyncSync,
11394
11520
  mkdirSync as mkdirSync6,
11395
11521
  openSync as openSync3,
11396
- readFileSync as readFileSync16,
11522
+ readFileSync as readFileSync17,
11397
11523
  renameSync as renameSync6,
11398
11524
  unlinkSync as unlinkSync6,
11399
11525
  writeSync
11400
11526
  } from "node:fs";
11401
- import { dirname as dirname7, join as join19 } from "node:path";
11527
+ import { dirname as dirname8, join as join21 } from "node:path";
11402
11528
  function atomicWriteFile(target, data, options = {}) {
11403
11529
  const mode = options.mode ?? 420;
11404
- const parent = dirname7(target);
11530
+ const parent = dirname8(target);
11405
11531
  mkdirSync6(parent, { recursive: true });
11406
- const tmp = join19(parent, `.tmp.${process.pid}.${randSuffix()}`);
11532
+ const tmp = join21(parent, `.tmp.${process.pid}.${randSuffix()}`);
11407
11533
  let fd = null;
11408
11534
  try {
11409
11535
  fd = openSync3(tmp, "w", mode);
@@ -11430,12 +11556,12 @@ function atomicWriteFile(target, data, options = {}) {
11430
11556
  function atomicAppendLine(target, line) {
11431
11557
  let existing = "";
11432
11558
  try {
11433
- existing = readFileSync16(target, "utf8");
11559
+ existing = readFileSync17(target, "utf8");
11434
11560
  } catch {
11435
11561
  existing = "";
11436
11562
  }
11437
- const sep10 = existing.length > 0 && !existing.endsWith("\n") ? "\n" : "";
11438
- atomicWriteFile(target, `${existing}${sep10}${line}
11563
+ const sep11 = existing.length > 0 && !existing.endsWith("\n") ? "\n" : "";
11564
+ atomicWriteFile(target, `${existing}${sep11}${line}
11439
11565
  `);
11440
11566
  }
11441
11567
  function randSuffix() {
@@ -13081,8 +13207,8 @@ function ruleFileArrives(sourcePath, scope) {
13081
13207
  if (!sourcePath.endsWith(".md")) {
13082
13208
  return true;
13083
13209
  }
13084
- const basename9 = path25.basename(sourcePath);
13085
- if (COMPAT_ALWAYS_EXCLUDED.includes(basename9)) {
13210
+ const basename10 = path25.basename(sourcePath);
13211
+ if (COMPAT_ALWAYS_EXCLUDED.includes(basename10)) {
13086
13212
  return false;
13087
13213
  }
13088
13214
  return rule_in_scope(sourcePath, scope.workspaces, scope.packs, scope.roles ?? null);
@@ -13293,8 +13419,8 @@ function _withPreservedKeys(rendered, original) {
13293
13419
  }
13294
13420
  return ["---", ...keep, "---", "", rendered].join("\n");
13295
13421
  }
13296
- function rewriteAndReport(rulesDir, quiet, info2, warn2, wrappers, preserved = /* @__PURE__ */ new Set()) {
13297
- const result = rewriteClaudeRules(rulesDir, preserved);
13422
+ function rewriteAndReport(rulesDir, quiet, info2, warn2, wrappers, preserved = /* @__PURE__ */ new Set(), onWrite) {
13423
+ const result = rewriteClaudeRules(rulesDir, preserved, onWrite);
13298
13424
  if (wrappers && !quiet) {
13299
13425
  if (wrappers.wrapped.length > 0) {
13300
13426
  info2(
@@ -13348,7 +13474,7 @@ function renderClaudeRule(sourceText) {
13348
13474
  lines.push(pyRstrip(body) + "\n");
13349
13475
  return { text: lines.join("\n"), globs: plan.globs, dropped: plan.dropped };
13350
13476
  }
13351
- function rewriteClaudeRules(rulesDir, preserved = /* @__PURE__ */ new Set()) {
13477
+ function rewriteClaudeRules(rulesDir, preserved = /* @__PURE__ */ new Set(), onWrite) {
13352
13478
  const result = { rewritten: 0, scoped: [], dropped: [], failed: [] };
13353
13479
  let entries;
13354
13480
  try {
@@ -13386,6 +13512,7 @@ function rewriteClaudeRules(rulesDir, preserved = /* @__PURE__ */ new Set()) {
13386
13512
  });
13387
13513
  continue;
13388
13514
  }
13515
+ onWrite?.(full);
13389
13516
  result.rewritten += 1;
13390
13517
  }
13391
13518
  const stem = name.slice(0, -3);
@@ -14041,6 +14168,7 @@ function thinInstalledRuleLayer(opts) {
14041
14168
  try {
14042
14169
  if (next !== installed) {
14043
14170
  fs33.writeFileSync(target, next, "utf-8");
14171
+ opts.onWrite?.(target);
14044
14172
  rewritten += 1;
14045
14173
  }
14046
14174
  thinned += 1;
@@ -14483,8 +14611,8 @@ function installerThinsHost(_hostId, _opts = {}) {
14483
14611
  }
14484
14612
 
14485
14613
  // src/install/wizard-plan.ts
14486
- import { homedir as homedir14 } from "node:os";
14487
- import { isAbsolute as isAbsolute7, join as join37, resolve as resolve19 } from "node:path";
14614
+ import { homedir as homedir15 } from "node:os";
14615
+ import { isAbsolute as isAbsolute7, join as join39, resolve as resolve20 } from "node:path";
14488
14616
  var USER_SCOPE_PATHS = {
14489
14617
  "claude-code": "~/.claude/",
14490
14618
  "claude-desktop": "~/Library/Application Support/Claude/",
@@ -14570,7 +14698,7 @@ function dryRunTargetLines(global, tools, projectTarget) {
14570
14698
  for (const tool of tools) {
14571
14699
  const anchor = USER_SCOPE_PATHS[tool];
14572
14700
  if (anchor === void 0) continue;
14573
- out += ` ${tool} \u2192 ${anchor.startsWith("~/") ? join37(homedir14(), anchor.slice(2)) : anchor}
14701
+ out += ` ${tool} \u2192 ${anchor.startsWith("~/") ? join39(homedir15(), anchor.slice(2)) : anchor}
14574
14702
  `;
14575
14703
  }
14576
14704
  out += " phases: project payload sync \u2014 skipped (global installs write user-scope paths only)\n";
@@ -19115,7 +19243,7 @@ var settingsSchema = external_exports.object({
19115
19243
  egress: external_exports.object({
19116
19244
  placeholders: external_exports.object({
19117
19245
  mode: external_exports.enum(["off", "observe", "protect", "strict"]).default("off").describe(
19118
- "Dispatcher egress stage (docs/contracts/egress-placeholders-v1.md). off (default) = nothing. observe = detect and count listed values in prompts and tool bodies, types and counts only, and change nothing a hook concern sees. protect = also give every recording and advisory concern a copy with each value replaced by a placeholder token, so local stores keep tokens; guards still see the original. strict = as protect until the host rewrite exists. No mode yet changes what reaches the model; the rule table holds credential rules only. Project layers only."
19246
+ "Dispatcher egress stage (docs/contracts/egress-placeholders-v1.md). off (default) = nothing. observe = detect and count listed values in prompts and tool bodies, types and counts only, and change nothing a hook concern sees. protect = also give every recording and advisory concern a copy with each value replaced by a placeholder token, so local stores keep tokens; guards still see the original. strict = as protect until the host rewrite exists. No mode yet changes what reaches the model; the rule table holds credential rows and the validated identifier rows. Project layers only."
19119
19247
  )
19120
19248
  }).default({})
19121
19249
  }).default({}),
@@ -21370,33 +21498,9 @@ var SCOPE_DETECT_AI_DIRS = [
21370
21498
  ".kilocode"
21371
21499
  ];
21372
21500
 
21373
- // src/install/paths.ts
21374
- import { homedir as homedir15, tmpdir as tmpdir3 } from "node:os";
21375
- import { join as join40 } from "node:path";
21376
- var INSTALL_ROOT_SUBPATH = ".event4u/agent-config";
21377
- var INSTALL_LOG_FILENAME = "install-log.jsonl";
21378
- function resolveHome(home) {
21379
- if (home && home.length > 0) {
21380
- return home;
21381
- }
21382
- const fromOs = homedir15();
21383
- if (!fromOs) {
21384
- throw new Error(
21385
- "Cannot resolve home directory \u2014 both $HOME (POSIX) and $USERPROFILE (Windows) are unset."
21386
- );
21387
- }
21388
- return fromOs;
21389
- }
21390
- function getInstallRoot(home) {
21391
- return join40(resolveHome(home), INSTALL_ROOT_SUBPATH);
21392
- }
21393
- function getLogPath(home) {
21394
- return join40(getInstallRoot(home), INSTALL_LOG_FILENAME);
21395
- }
21396
-
21397
21501
  // src/install/txlog.ts
21398
21502
  import { createGzip } from "node:zlib";
21399
- import { createReadStream, createWriteStream, existsSync as existsSync17, readFileSync as readFileSync35, renameSync as renameSync8, statSync as statSync13, unlinkSync as unlinkSync8 } from "node:fs";
21503
+ import { createReadStream, createWriteStream, existsSync as existsSync18, readFileSync as readFileSync36, renameSync as renameSync8, statSync as statSync14, unlinkSync as unlinkSync8 } from "node:fs";
21400
21504
  import { pipeline } from "node:stream/promises";
21401
21505
  var ROTATION_MAX_BYTES = 10 * 1024 * 1024;
21402
21506
  var ROTATION_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1e3;
@@ -21407,12 +21511,12 @@ function appendTxLog(logPath, entry) {
21407
21511
  atomicAppendLine(logPath, JSON.stringify(entry));
21408
21512
  }
21409
21513
  function shouldRotate(logPath, now = /* @__PURE__ */ new Date()) {
21410
- if (!existsSync17(logPath)) {
21514
+ if (!existsSync18(logPath)) {
21411
21515
  return false;
21412
21516
  }
21413
21517
  let size = 0;
21414
21518
  try {
21415
- size = statSync13(logPath).size;
21519
+ size = statSync14(logPath).size;
21416
21520
  } catch {
21417
21521
  return false;
21418
21522
  }
@@ -21426,7 +21530,7 @@ function shouldRotate(logPath, now = /* @__PURE__ */ new Date()) {
21426
21530
  return now.getTime() - firstTs >= ROTATION_MAX_AGE_MS;
21427
21531
  }
21428
21532
  function rotateLogSync(logPath) {
21429
- if (!existsSync17(logPath)) {
21533
+ if (!existsSync18(logPath)) {
21430
21534
  return;
21431
21535
  }
21432
21536
  const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
@@ -21445,7 +21549,7 @@ async function gzipInPlace(source) {
21445
21549
  }
21446
21550
  function readFirstTimestamp(logPath) {
21447
21551
  try {
21448
- const raw = readFileSync35(logPath, "utf8");
21552
+ const raw = readFileSync36(logPath, "utf8");
21449
21553
  const firstLine = raw.split("\n", 1)[0] ?? "";
21450
21554
  const parsed = tryParseEntry(firstLine);
21451
21555
  if (parsed === null) return null;
@@ -23550,7 +23654,8 @@ function _deploy_global_content(tools, force, package_root, lockfile_path2) {
23550
23654
  info,
23551
23655
  warn,
23552
23656
  res,
23553
- preserved_now
23657
+ preserved_now,
23658
+ onlyDeployed(anchor, current_files, (p) => _log_tx_entry("write", p))
23554
23659
  );
23555
23660
  deployClaudeCarrier({
23556
23661
  packageRoot: package_root,
@@ -23560,7 +23665,7 @@ function _deploy_global_content(tools, force, package_root, lockfile_path2) {
23560
23665
  warn,
23561
23666
  userPin: state.FULL_PIN,
23562
23667
  wantsThin: installerThinsHost(tool_id, { packageRoot: package_root }),
23563
- thin: (bodyLinkRoot) => describeThinInstalledLayer(thinInstalledRuleLayer({ rulesDir: path38.join(anchor, "rules"), packageRoot: package_root, preserved: preserved_now, bodyLinkRoot }))
23668
+ thin: (bodyLinkRoot) => describeThinInstalledLayer(thinInstalledRuleLayer({ rulesDir: path38.join(anchor, "rules"), packageRoot: package_root, preserved: preserved_now, bodyLinkRoot, onWrite: onlyDeployed(anchor, current_files, (p) => _log_tx_entry("write", p)) }))
23564
23669
  });
23565
23670
  if (!state.QUIET) for (const l of installReceiptBudgetLines(package_root, void 0, { thisDeploy: /* @__PURE__ */ new Map([[anchor, current_files]]) })) info(l);
23566
23671
  }