@integrity-labs/agt-cli 0.28.853 → 0.28.854

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.
@@ -16,7 +16,7 @@ import {
16
16
  parseEnvIntegrations,
17
17
  shellQuote,
18
18
  summarizeUnanswerablePane
19
- } from "./chunk-XCAI3GSF.js";
19
+ } from "./chunk-2E2NKILK.js";
20
20
  import {
21
21
  BIND_FAILURE_QUARANTINE_THRESHOLD,
22
22
  INTEGRATIONS_SECTION_END,
@@ -76,7 +76,7 @@ import {
76
76
  sessionTranscriptDir,
77
77
  worseConnectivityOutcome,
78
78
  wrapScheduledTaskPrompt
79
- } from "./chunk-WUXQVP7A.js";
79
+ } from "./chunk-4Z4GFQAD.js";
80
80
  import {
81
81
  parsePsRows
82
82
  } from "./chunk-XWVM4KPK.js";
@@ -6566,7 +6566,7 @@ function exchangeFailureKind(err) {
6566
6566
  }
6567
6567
 
6568
6568
  // src/lib/api-client.ts
6569
- var agtCliVersion = true ? "0.28.853" : "dev";
6569
+ var agtCliVersion = true ? "0.28.854" : "dev";
6570
6570
  var lastConfigHash = null;
6571
6571
  function setConfigHash(hash) {
6572
6572
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -10924,4 +10924,4 @@ export {
10924
10924
  managerInstallSystemUnitCommand,
10925
10925
  managerUninstallSystemUnitCommand
10926
10926
  };
10927
- //# sourceMappingURL=chunk-6BA2US4B.js.map
10927
+ //# sourceMappingURL=chunk-FHOLG6VL.js.map
@@ -100,7 +100,7 @@ async function spawnPairSession(session) {
100
100
  return { ok: true };
101
101
  } catch {
102
102
  }
103
- const { resolveClaudeBinary } = await import("./persistent-session-YGK7YHPR.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-N4DJ4VXZ.js");
104
104
  const claudeBin = resolveClaudeBinary();
105
105
  const pairEnv = {
106
106
  ...process.env,
@@ -373,4 +373,4 @@ export {
373
373
  startClaudePair,
374
374
  submitClaudePairCode
375
375
  };
376
- //# sourceMappingURL=claude-pair-runtime-CJXQTVSC.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-63TA3LT5.js.map
@@ -60,7 +60,7 @@ import {
60
60
  safeWriteJsonAtomic,
61
61
  setConfigHash,
62
62
  tripClass
63
- } from "../chunk-6BA2US4B.js";
63
+ } from "../chunk-FHOLG6VL.js";
64
64
  import {
65
65
  getProjectDir as getProjectDir2,
66
66
  getReadyTasks,
@@ -126,7 +126,7 @@ import {
126
126
  takeZombieDetection,
127
127
  toOpencodeModel,
128
128
  writeEgressAllowlist
129
- } from "../chunk-XCAI3GSF.js";
129
+ } from "../chunk-2E2NKILK.js";
130
130
  import {
131
131
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
132
132
  AnchorSessionClient,
@@ -221,7 +221,7 @@ import {
221
221
  subagentActivityAgeSeconds,
222
222
  sumTranscriptUsageInWindow,
223
223
  transcriptActivityAgeSeconds
224
- } from "../chunk-WUXQVP7A.js";
224
+ } from "../chunk-4Z4GFQAD.js";
225
225
  import {
226
226
  reapOrphanChannelMcps
227
227
  } from "../chunk-XWVM4KPK.js";
@@ -13000,7 +13000,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
13000
13000
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
13001
13001
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
13002
13002
  async function channelInboundActivityAgeSecondsFor(codeName) {
13003
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-NGWO3JK3.js");
13003
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-GYE5MIVB.js");
13004
13004
  const newest = newestPendingInboundActivityMtimeMs(dirname11(paneLogPath(codeName)));
13005
13005
  if (newest === null) return null;
13006
13006
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -13668,7 +13668,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
13668
13668
  var lastVersionCheckAt = 0;
13669
13669
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
13670
13670
  var lastResponsivenessProbeAt = 0;
13671
- var agtCliVersion = true ? "0.28.853" : "dev";
13671
+ var agtCliVersion = true ? "0.28.854" : "dev";
13672
13672
  function resolveBrewPath(execFileSync2) {
13673
13673
  try {
13674
13674
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -15258,7 +15258,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
15258
15258
  if (codeNames.length === 0) return;
15259
15259
  void (async () => {
15260
15260
  try {
15261
- const { collectDiagnostics } = await import("../persistent-session-YGK7YHPR.js");
15261
+ const { collectDiagnostics } = await import("../persistent-session-N4DJ4VXZ.js");
15262
15262
  await api.post("/host/heartbeat", {
15263
15263
  host_id: hostId,
15264
15264
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -15400,7 +15400,7 @@ async function pollCycleInner() {
15400
15400
  }
15401
15401
  try {
15402
15402
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
15403
- const { collectDiagnostics } = await import("../persistent-session-YGK7YHPR.js");
15403
+ const { collectDiagnostics } = await import("../persistent-session-N4DJ4VXZ.js");
15404
15404
  const diagCodeNames = [...agentState.persistentSessionAgents];
15405
15405
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor) : void 0;
15406
15406
  let tailscaleHostname;
@@ -15569,7 +15569,7 @@ async function pollCycleInner() {
15569
15569
  collectPanelessActivityProbes,
15570
15570
  getResponsivenessIntervalMs,
15571
15571
  occupancyQualificationClassifications
15572
- } = await import("../responsiveness-probe-NGWO3JK3.js");
15572
+ } = await import("../responsiveness-probe-GYE5MIVB.js");
15573
15573
  const probeIntervalMs = getResponsivenessIntervalMs();
15574
15574
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
15575
15575
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -15686,7 +15686,7 @@ async function pollCycleInner() {
15686
15686
  collectResponsivenessProbes,
15687
15687
  livePendingInboundOldestAgeSeconds,
15688
15688
  parkPendingInbound
15689
- } = await import("../responsiveness-probe-NGWO3JK3.js");
15689
+ } = await import("../responsiveness-probe-GYE5MIVB.js");
15690
15690
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
15691
15691
  const wedgeNow = /* @__PURE__ */ new Date();
15692
15692
  const liveAgents = agentState.persistentSessionAgents;
@@ -15842,7 +15842,7 @@ async function pollCycleInner() {
15842
15842
  }
15843
15843
  try {
15844
15844
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
15845
- const { probeSessionAuth } = await import("../session-auth-dead-4UZR5655.js");
15845
+ const { probeSessionAuth } = await import("../session-auth-dead-K6B6D3WR.js");
15846
15846
  const observations = [];
15847
15847
  const pendingCacheCommits = [];
15848
15848
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -20055,7 +20055,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
20055
20055
  try {
20056
20056
  const freshId = rotateSessionForWedge(codeName);
20057
20057
  consecutiveWedgeCycles.delete(codeName);
20058
- const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-NGWO3JK3.js");
20058
+ const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-GYE5MIVB.js");
20059
20059
  const { parked, deadLettered } = parkForRestart(codeName, /* @__PURE__ */ new Date());
20060
20060
  const parkNote = parked > 0 ? `, ${parked} inbound parked` : "";
20061
20061
  const deadNote = deadLettered > 0 ? `, ${deadLettered} undeliverable dead-lettered` : "";
@@ -20093,7 +20093,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
20093
20093
  void api.post("/host/restart-ack", { host_id: hostId, agent_id: agentId, restart_requested_at: requestedAt }).catch((err) => log(`[restart-lane] ack failed for '${codeName}': ${err.message}`));
20094
20094
  void (async () => {
20095
20095
  try {
20096
- const { collectDiagnostics } = await import("../persistent-session-YGK7YHPR.js");
20096
+ const { collectDiagnostics } = await import("../persistent-session-N4DJ4VXZ.js");
20097
20097
  await api.post("/host/heartbeat", {
20098
20098
  host_id: hostId,
20099
20099
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -20139,7 +20139,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
20139
20139
  }
20140
20140
  try {
20141
20141
  const hostId = await getHostId();
20142
- const { collectDiagnostics } = await import("../persistent-session-YGK7YHPR.js");
20142
+ const { collectDiagnostics } = await import("../persistent-session-N4DJ4VXZ.js");
20143
20143
  await api.post("/host/heartbeat", {
20144
20144
  host_id: hostId,
20145
20145
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -20775,7 +20775,7 @@ async function processClaudePairSessions(agents) {
20775
20775
  killPairSession,
20776
20776
  pairTmuxSession,
20777
20777
  finalizeClaudePairOnboarding
20778
- } = await import("../claude-pair-runtime-CJXQTVSC.js");
20778
+ } = await import("../claude-pair-runtime-63TA3LT5.js");
20779
20779
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
20780
20780
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
20781
20781
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -31462,6 +31462,110 @@ var HOURLY_BY_REGION = {
31462
31462
  };
31463
31463
  var KNOWN_PRICING_REGIONS = Object.keys(HOURLY_BY_REGION);
31464
31464
 
31465
+ // ../core/dist/guardrails/enforcer-registry.js
31466
+ var GUARDRAIL_ENFORCERS = [
31467
+ // ---- Enforced: this definition has its own enforcement point -------------
31468
+ {
31469
+ id: "email.domain_restrict",
31470
+ mechanism: "enforced",
31471
+ stage: "live",
31472
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
31473
+ effect: "enforceEmailDomainGuard runs at the top of both agent-egress paths; internal_only with zero verified domains takes an explicit AUDITED no-op branch rather than failing open silently."
31474
+ },
31475
+ {
31476
+ // MEASURED, and it corrects a claim ADR-0080 makes about this definition.
31477
+ //
31478
+ // The ADR reports calendar as `enforced` + `stage: 'shadow'`, blocked by
31479
+ // ENG-5868 (caller identity is not threaded to `callIntegrationTool`). Read
31480
+ // literally that says an org cannot get redaction today, and that is not
31481
+ // what the code does. `decideCalendarRedactionMode` (calendar-policy.ts) is
31482
+ // FAIL-CLOSED: with the caller unresolvable it returns `redact`, not
31483
+ // pass-through. `redactCalendarToolResponseIfNeeded` then calls
31484
+ // `applyRedactionToResponse` for every response whenever `config.stage` is
31485
+ // `enforce`. So an org that sets the stage gets real redaction — ENG-5868
31486
+ // costs the control its PRECISION (it cannot spare the principal), not its
31487
+ // ability to act.
31488
+ //
31489
+ // The stage is therefore per-ORG configuration, which ADR-0080 decision 1
31490
+ // is explicit is the effectiveness axis the static union deliberately does
31491
+ // not carry. `effectiveCalendarEnforcement` in the CLAUDE.md renderer owns
31492
+ // it, and since ENG-10104 caps `enforce` to `warn` whenever the org's stage
31493
+ // is not `enforce`.
31494
+ id: "calendar.confidentiality",
31495
+ mechanism: "enforced",
31496
+ stage: "live",
31497
+ enforcer: "packages/api/src/lib/calendar-confidentiality-guard.ts",
31498
+ effect: "at config.stage=enforce, redacts summary/description/attendees/location out of calendar read responses; at shadow/warn it writes a would_redact audit row and returns the response unchanged."
31499
+ },
31500
+ // ---- Delegated: read by another definition's enforcement point -----------
31501
+ //
31502
+ // Both can block, because their owner's point is live — which is the question
31503
+ // `guardrailCanBlock` asks and the right answer to it. It is NOT the whole
31504
+ // story for these two, and the gap has its own ticket: the org's email guard
31505
+ // STAGE is threaded into the prompt shape for `email.domain_restrict`'s id
31506
+ // alone (`host-runtime.ts`, the ENG-7829 fix), so a row of either id stored at
31507
+ // `enforce` on a shadow-stage org still renders under "must comply" with
31508
+ // nothing capping it. That is the effectiveness axis, not the mechanism one —
31509
+ // ENG-10110.
31510
+ {
31511
+ id: "email.require_approval",
31512
+ mechanism: "delegated",
31513
+ ownedBy: "email.domain_restrict",
31514
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
31515
+ effect: "routes a send to an approver instead of letting it leave."
31516
+ },
31517
+ {
31518
+ id: "email.mail_rules",
31519
+ mechanism: "delegated",
31520
+ ownedBy: "email.domain_restrict",
31521
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
31522
+ effect: "gates mail-rule creation/modification on the same egress path."
31523
+ },
31524
+ // ---- Advisory: seeded, applied, rendered — and read by nothing -----------
31525
+ //
31526
+ // These are NOT dead config. They are presented to operators in the console
31527
+ // and to agents in CLAUDE.md, three of them under a heading that promises the
31528
+ // violation is blocked. Listed individually rather than as a wildcard so that
31529
+ // fixing one is a one-line diff from `advisory` to `enforced`.
31530
+ //
31531
+ // The ticket is ENG-9800, not ENG-9874. ENG-9874 catalogued these and is
31532
+ // closed; a closed ticket tracks nothing, which is the same shrug an absent
31533
+ // one would be. ENG-9800 is the open sweep that owns making them real.
31534
+ {
31535
+ id: "require-approval-for-actions",
31536
+ mechanism: "advisory",
31537
+ reason: "unimplemented",
31538
+ ticket: "ENG-9800",
31539
+ note: `Rendered to agents as "violation blocks the action". Nothing reads it. The ENG-8562 incident is this guardrail's promise, unkept.`
31540
+ },
31541
+ {
31542
+ id: "data.pii_access",
31543
+ mechanism: "advisory",
31544
+ reason: "unimplemented",
31545
+ ticket: "ENG-9800",
31546
+ note: "Rendered as Enforced with block_export semantics; no export path consults it."
31547
+ },
31548
+ {
31549
+ id: "data.credential_access",
31550
+ mechanism: "advisory",
31551
+ reason: "unimplemented",
31552
+ ticket: "ENG-9800",
31553
+ note: "Rendered as Enforced with block_read/block_write; no credential path consults it."
31554
+ },
31555
+ { id: "comm.social_posting", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
31556
+ { id: "compliance.audit_all", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
31557
+ { id: "no-external-network", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
31558
+ { id: "no-pii-in-output", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
31559
+ { id: "restrict-file-access", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
31560
+ { id: "schedule.operating_hours", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
31561
+ { id: "spend.hourly_limit", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
31562
+ { id: "tool.allow_list", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
31563
+ { id: "tool.block_list", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
31564
+ { id: "tool.financial_txn", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
31565
+ { id: "working-hours-only", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" }
31566
+ ];
31567
+ var BY_ID = new Map(GUARDRAIL_ENFORCERS.map((e) => [e.id, e]));
31568
+
31465
31569
  // ../core/dist/provisioning/frameworks/claudecode/agent-rules.js
31466
31570
  var MAX_AGENT_RULES = 8;
31467
31571
  var MAX_AGENT_RULE_CHARS = 200;
package/dist/mcp/index.js CHANGED
@@ -24011,6 +24011,110 @@ var HOURLY_BY_REGION = {
24011
24011
  };
24012
24012
  var KNOWN_PRICING_REGIONS = Object.keys(HOURLY_BY_REGION);
24013
24013
 
24014
+ // ../core/dist/guardrails/enforcer-registry.js
24015
+ var GUARDRAIL_ENFORCERS = [
24016
+ // ---- Enforced: this definition has its own enforcement point -------------
24017
+ {
24018
+ id: "email.domain_restrict",
24019
+ mechanism: "enforced",
24020
+ stage: "live",
24021
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
24022
+ effect: "enforceEmailDomainGuard runs at the top of both agent-egress paths; internal_only with zero verified domains takes an explicit AUDITED no-op branch rather than failing open silently."
24023
+ },
24024
+ {
24025
+ // MEASURED, and it corrects a claim ADR-0080 makes about this definition.
24026
+ //
24027
+ // The ADR reports calendar as `enforced` + `stage: 'shadow'`, blocked by
24028
+ // ENG-5868 (caller identity is not threaded to `callIntegrationTool`). Read
24029
+ // literally that says an org cannot get redaction today, and that is not
24030
+ // what the code does. `decideCalendarRedactionMode` (calendar-policy.ts) is
24031
+ // FAIL-CLOSED: with the caller unresolvable it returns `redact`, not
24032
+ // pass-through. `redactCalendarToolResponseIfNeeded` then calls
24033
+ // `applyRedactionToResponse` for every response whenever `config.stage` is
24034
+ // `enforce`. So an org that sets the stage gets real redaction — ENG-5868
24035
+ // costs the control its PRECISION (it cannot spare the principal), not its
24036
+ // ability to act.
24037
+ //
24038
+ // The stage is therefore per-ORG configuration, which ADR-0080 decision 1
24039
+ // is explicit is the effectiveness axis the static union deliberately does
24040
+ // not carry. `effectiveCalendarEnforcement` in the CLAUDE.md renderer owns
24041
+ // it, and since ENG-10104 caps `enforce` to `warn` whenever the org's stage
24042
+ // is not `enforce`.
24043
+ id: "calendar.confidentiality",
24044
+ mechanism: "enforced",
24045
+ stage: "live",
24046
+ enforcer: "packages/api/src/lib/calendar-confidentiality-guard.ts",
24047
+ effect: "at config.stage=enforce, redacts summary/description/attendees/location out of calendar read responses; at shadow/warn it writes a would_redact audit row and returns the response unchanged."
24048
+ },
24049
+ // ---- Delegated: read by another definition's enforcement point -----------
24050
+ //
24051
+ // Both can block, because their owner's point is live — which is the question
24052
+ // `guardrailCanBlock` asks and the right answer to it. It is NOT the whole
24053
+ // story for these two, and the gap has its own ticket: the org's email guard
24054
+ // STAGE is threaded into the prompt shape for `email.domain_restrict`'s id
24055
+ // alone (`host-runtime.ts`, the ENG-7829 fix), so a row of either id stored at
24056
+ // `enforce` on a shadow-stage org still renders under "must comply" with
24057
+ // nothing capping it. That is the effectiveness axis, not the mechanism one —
24058
+ // ENG-10110.
24059
+ {
24060
+ id: "email.require_approval",
24061
+ mechanism: "delegated",
24062
+ ownedBy: "email.domain_restrict",
24063
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
24064
+ effect: "routes a send to an approver instead of letting it leave."
24065
+ },
24066
+ {
24067
+ id: "email.mail_rules",
24068
+ mechanism: "delegated",
24069
+ ownedBy: "email.domain_restrict",
24070
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
24071
+ effect: "gates mail-rule creation/modification on the same egress path."
24072
+ },
24073
+ // ---- Advisory: seeded, applied, rendered — and read by nothing -----------
24074
+ //
24075
+ // These are NOT dead config. They are presented to operators in the console
24076
+ // and to agents in CLAUDE.md, three of them under a heading that promises the
24077
+ // violation is blocked. Listed individually rather than as a wildcard so that
24078
+ // fixing one is a one-line diff from `advisory` to `enforced`.
24079
+ //
24080
+ // The ticket is ENG-9800, not ENG-9874. ENG-9874 catalogued these and is
24081
+ // closed; a closed ticket tracks nothing, which is the same shrug an absent
24082
+ // one would be. ENG-9800 is the open sweep that owns making them real.
24083
+ {
24084
+ id: "require-approval-for-actions",
24085
+ mechanism: "advisory",
24086
+ reason: "unimplemented",
24087
+ ticket: "ENG-9800",
24088
+ note: `Rendered to agents as "violation blocks the action". Nothing reads it. The ENG-8562 incident is this guardrail's promise, unkept.`
24089
+ },
24090
+ {
24091
+ id: "data.pii_access",
24092
+ mechanism: "advisory",
24093
+ reason: "unimplemented",
24094
+ ticket: "ENG-9800",
24095
+ note: "Rendered as Enforced with block_export semantics; no export path consults it."
24096
+ },
24097
+ {
24098
+ id: "data.credential_access",
24099
+ mechanism: "advisory",
24100
+ reason: "unimplemented",
24101
+ ticket: "ENG-9800",
24102
+ note: "Rendered as Enforced with block_read/block_write; no credential path consults it."
24103
+ },
24104
+ { id: "comm.social_posting", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
24105
+ { id: "compliance.audit_all", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
24106
+ { id: "no-external-network", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
24107
+ { id: "no-pii-in-output", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
24108
+ { id: "restrict-file-access", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
24109
+ { id: "schedule.operating_hours", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
24110
+ { id: "spend.hourly_limit", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
24111
+ { id: "tool.allow_list", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
24112
+ { id: "tool.block_list", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
24113
+ { id: "tool.financial_txn", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
24114
+ { id: "working-hours-only", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" }
24115
+ ];
24116
+ var BY_ID = new Map(GUARDRAIL_ENFORCERS.map((e) => [e.id, e]));
24117
+
24014
24118
  // ../core/dist/provisioning/frameworks/claudecode/agent-rules.js
24015
24119
  var MAX_AGENT_RULES = 8;
24016
24120
  var MAX_AGENT_RULE_CHARS = 200;
@@ -38167,6 +38167,110 @@ var HOURLY_BY_REGION = {
38167
38167
  };
38168
38168
  var KNOWN_PRICING_REGIONS = Object.keys(HOURLY_BY_REGION);
38169
38169
 
38170
+ // ../core/dist/guardrails/enforcer-registry.js
38171
+ var GUARDRAIL_ENFORCERS = [
38172
+ // ---- Enforced: this definition has its own enforcement point -------------
38173
+ {
38174
+ id: "email.domain_restrict",
38175
+ mechanism: "enforced",
38176
+ stage: "live",
38177
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
38178
+ effect: "enforceEmailDomainGuard runs at the top of both agent-egress paths; internal_only with zero verified domains takes an explicit AUDITED no-op branch rather than failing open silently."
38179
+ },
38180
+ {
38181
+ // MEASURED, and it corrects a claim ADR-0080 makes about this definition.
38182
+ //
38183
+ // The ADR reports calendar as `enforced` + `stage: 'shadow'`, blocked by
38184
+ // ENG-5868 (caller identity is not threaded to `callIntegrationTool`). Read
38185
+ // literally that says an org cannot get redaction today, and that is not
38186
+ // what the code does. `decideCalendarRedactionMode` (calendar-policy.ts) is
38187
+ // FAIL-CLOSED: with the caller unresolvable it returns `redact`, not
38188
+ // pass-through. `redactCalendarToolResponseIfNeeded` then calls
38189
+ // `applyRedactionToResponse` for every response whenever `config.stage` is
38190
+ // `enforce`. So an org that sets the stage gets real redaction — ENG-5868
38191
+ // costs the control its PRECISION (it cannot spare the principal), not its
38192
+ // ability to act.
38193
+ //
38194
+ // The stage is therefore per-ORG configuration, which ADR-0080 decision 1
38195
+ // is explicit is the effectiveness axis the static union deliberately does
38196
+ // not carry. `effectiveCalendarEnforcement` in the CLAUDE.md renderer owns
38197
+ // it, and since ENG-10104 caps `enforce` to `warn` whenever the org's stage
38198
+ // is not `enforce`.
38199
+ id: "calendar.confidentiality",
38200
+ mechanism: "enforced",
38201
+ stage: "live",
38202
+ enforcer: "packages/api/src/lib/calendar-confidentiality-guard.ts",
38203
+ effect: "at config.stage=enforce, redacts summary/description/attendees/location out of calendar read responses; at shadow/warn it writes a would_redact audit row and returns the response unchanged."
38204
+ },
38205
+ // ---- Delegated: read by another definition's enforcement point -----------
38206
+ //
38207
+ // Both can block, because their owner's point is live — which is the question
38208
+ // `guardrailCanBlock` asks and the right answer to it. It is NOT the whole
38209
+ // story for these two, and the gap has its own ticket: the org's email guard
38210
+ // STAGE is threaded into the prompt shape for `email.domain_restrict`'s id
38211
+ // alone (`host-runtime.ts`, the ENG-7829 fix), so a row of either id stored at
38212
+ // `enforce` on a shadow-stage org still renders under "must comply" with
38213
+ // nothing capping it. That is the effectiveness axis, not the mechanism one —
38214
+ // ENG-10110.
38215
+ {
38216
+ id: "email.require_approval",
38217
+ mechanism: "delegated",
38218
+ ownedBy: "email.domain_restrict",
38219
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
38220
+ effect: "routes a send to an approver instead of letting it leave."
38221
+ },
38222
+ {
38223
+ id: "email.mail_rules",
38224
+ mechanism: "delegated",
38225
+ ownedBy: "email.domain_restrict",
38226
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
38227
+ effect: "gates mail-rule creation/modification on the same egress path."
38228
+ },
38229
+ // ---- Advisory: seeded, applied, rendered — and read by nothing -----------
38230
+ //
38231
+ // These are NOT dead config. They are presented to operators in the console
38232
+ // and to agents in CLAUDE.md, three of them under a heading that promises the
38233
+ // violation is blocked. Listed individually rather than as a wildcard so that
38234
+ // fixing one is a one-line diff from `advisory` to `enforced`.
38235
+ //
38236
+ // The ticket is ENG-9800, not ENG-9874. ENG-9874 catalogued these and is
38237
+ // closed; a closed ticket tracks nothing, which is the same shrug an absent
38238
+ // one would be. ENG-9800 is the open sweep that owns making them real.
38239
+ {
38240
+ id: "require-approval-for-actions",
38241
+ mechanism: "advisory",
38242
+ reason: "unimplemented",
38243
+ ticket: "ENG-9800",
38244
+ note: `Rendered to agents as "violation blocks the action". Nothing reads it. The ENG-8562 incident is this guardrail's promise, unkept.`
38245
+ },
38246
+ {
38247
+ id: "data.pii_access",
38248
+ mechanism: "advisory",
38249
+ reason: "unimplemented",
38250
+ ticket: "ENG-9800",
38251
+ note: "Rendered as Enforced with block_export semantics; no export path consults it."
38252
+ },
38253
+ {
38254
+ id: "data.credential_access",
38255
+ mechanism: "advisory",
38256
+ reason: "unimplemented",
38257
+ ticket: "ENG-9800",
38258
+ note: "Rendered as Enforced with block_read/block_write; no credential path consults it."
38259
+ },
38260
+ { id: "comm.social_posting", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
38261
+ { id: "compliance.audit_all", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
38262
+ { id: "no-external-network", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
38263
+ { id: "no-pii-in-output", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
38264
+ { id: "restrict-file-access", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
38265
+ { id: "schedule.operating_hours", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
38266
+ { id: "spend.hourly_limit", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
38267
+ { id: "tool.allow_list", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
38268
+ { id: "tool.block_list", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
38269
+ { id: "tool.financial_txn", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
38270
+ { id: "working-hours-only", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" }
38271
+ ];
38272
+ var BY_ID = new Map(GUARDRAIL_ENFORCERS.map((e) => [e.id, e]));
38273
+
38170
38274
  // ../core/dist/provisioning/frameworks/claudecode/agent-rules.js
38171
38275
  var MAX_AGENT_RULES = 8;
38172
38276
  var MAX_AGENT_RULE_CHARS = 200;
@@ -32309,6 +32309,110 @@ var HOURLY_BY_REGION = {
32309
32309
  };
32310
32310
  var KNOWN_PRICING_REGIONS = Object.keys(HOURLY_BY_REGION);
32311
32311
 
32312
+ // ../core/dist/guardrails/enforcer-registry.js
32313
+ var GUARDRAIL_ENFORCERS = [
32314
+ // ---- Enforced: this definition has its own enforcement point -------------
32315
+ {
32316
+ id: "email.domain_restrict",
32317
+ mechanism: "enforced",
32318
+ stage: "live",
32319
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
32320
+ effect: "enforceEmailDomainGuard runs at the top of both agent-egress paths; internal_only with zero verified domains takes an explicit AUDITED no-op branch rather than failing open silently."
32321
+ },
32322
+ {
32323
+ // MEASURED, and it corrects a claim ADR-0080 makes about this definition.
32324
+ //
32325
+ // The ADR reports calendar as `enforced` + `stage: 'shadow'`, blocked by
32326
+ // ENG-5868 (caller identity is not threaded to `callIntegrationTool`). Read
32327
+ // literally that says an org cannot get redaction today, and that is not
32328
+ // what the code does. `decideCalendarRedactionMode` (calendar-policy.ts) is
32329
+ // FAIL-CLOSED: with the caller unresolvable it returns `redact`, not
32330
+ // pass-through. `redactCalendarToolResponseIfNeeded` then calls
32331
+ // `applyRedactionToResponse` for every response whenever `config.stage` is
32332
+ // `enforce`. So an org that sets the stage gets real redaction — ENG-5868
32333
+ // costs the control its PRECISION (it cannot spare the principal), not its
32334
+ // ability to act.
32335
+ //
32336
+ // The stage is therefore per-ORG configuration, which ADR-0080 decision 1
32337
+ // is explicit is the effectiveness axis the static union deliberately does
32338
+ // not carry. `effectiveCalendarEnforcement` in the CLAUDE.md renderer owns
32339
+ // it, and since ENG-10104 caps `enforce` to `warn` whenever the org's stage
32340
+ // is not `enforce`.
32341
+ id: "calendar.confidentiality",
32342
+ mechanism: "enforced",
32343
+ stage: "live",
32344
+ enforcer: "packages/api/src/lib/calendar-confidentiality-guard.ts",
32345
+ effect: "at config.stage=enforce, redacts summary/description/attendees/location out of calendar read responses; at shadow/warn it writes a would_redact audit row and returns the response unchanged."
32346
+ },
32347
+ // ---- Delegated: read by another definition's enforcement point -----------
32348
+ //
32349
+ // Both can block, because their owner's point is live — which is the question
32350
+ // `guardrailCanBlock` asks and the right answer to it. It is NOT the whole
32351
+ // story for these two, and the gap has its own ticket: the org's email guard
32352
+ // STAGE is threaded into the prompt shape for `email.domain_restrict`'s id
32353
+ // alone (`host-runtime.ts`, the ENG-7829 fix), so a row of either id stored at
32354
+ // `enforce` on a shadow-stage org still renders under "must comply" with
32355
+ // nothing capping it. That is the effectiveness axis, not the mechanism one —
32356
+ // ENG-10110.
32357
+ {
32358
+ id: "email.require_approval",
32359
+ mechanism: "delegated",
32360
+ ownedBy: "email.domain_restrict",
32361
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
32362
+ effect: "routes a send to an approver instead of letting it leave."
32363
+ },
32364
+ {
32365
+ id: "email.mail_rules",
32366
+ mechanism: "delegated",
32367
+ ownedBy: "email.domain_restrict",
32368
+ enforcer: "packages/api/src/lib/email-domain-guard.ts",
32369
+ effect: "gates mail-rule creation/modification on the same egress path."
32370
+ },
32371
+ // ---- Advisory: seeded, applied, rendered — and read by nothing -----------
32372
+ //
32373
+ // These are NOT dead config. They are presented to operators in the console
32374
+ // and to agents in CLAUDE.md, three of them under a heading that promises the
32375
+ // violation is blocked. Listed individually rather than as a wildcard so that
32376
+ // fixing one is a one-line diff from `advisory` to `enforced`.
32377
+ //
32378
+ // The ticket is ENG-9800, not ENG-9874. ENG-9874 catalogued these and is
32379
+ // closed; a closed ticket tracks nothing, which is the same shrug an absent
32380
+ // one would be. ENG-9800 is the open sweep that owns making them real.
32381
+ {
32382
+ id: "require-approval-for-actions",
32383
+ mechanism: "advisory",
32384
+ reason: "unimplemented",
32385
+ ticket: "ENG-9800",
32386
+ note: `Rendered to agents as "violation blocks the action". Nothing reads it. The ENG-8562 incident is this guardrail's promise, unkept.`
32387
+ },
32388
+ {
32389
+ id: "data.pii_access",
32390
+ mechanism: "advisory",
32391
+ reason: "unimplemented",
32392
+ ticket: "ENG-9800",
32393
+ note: "Rendered as Enforced with block_export semantics; no export path consults it."
32394
+ },
32395
+ {
32396
+ id: "data.credential_access",
32397
+ mechanism: "advisory",
32398
+ reason: "unimplemented",
32399
+ ticket: "ENG-9800",
32400
+ note: "Rendered as Enforced with block_read/block_write; no credential path consults it."
32401
+ },
32402
+ { id: "comm.social_posting", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
32403
+ { id: "compliance.audit_all", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
32404
+ { id: "no-external-network", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
32405
+ { id: "no-pii-in-output", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
32406
+ { id: "restrict-file-access", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
32407
+ { id: "schedule.operating_hours", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
32408
+ { id: "spend.hourly_limit", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
32409
+ { id: "tool.allow_list", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
32410
+ { id: "tool.block_list", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
32411
+ { id: "tool.financial_txn", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" },
32412
+ { id: "working-hours-only", mechanism: "advisory", reason: "unimplemented", ticket: "ENG-9800" }
32413
+ ];
32414
+ var BY_ID = new Map(GUARDRAIL_ENFORCERS.map((e) => [e.id, e]));
32415
+
32312
32416
  // ../core/dist/provisioning/frameworks/claudecode/agent-rules.js
32313
32417
  var MAX_AGENT_RULES = 8;
32314
32418
  var MAX_AGENT_RULE_CHARS = 200;