{
  "repo": "core",
  "version": "7.23.5",
  "from": "0a77a55f973aa9bc0d816abcf25cccb21039bda6",
  "to": "v7.23.5",
  "added": [],
  "removed": [],
  "changed": [],
  "narrowed": [
    {
      "id": "F3",
      "source": "behaviorFlips.summary",
      "text": "NARROWING of the retry ladder, no key change (#933): a fetch throw the RUNTIME raised while BUILDING the request (a base URL carrying userinfo, a malformed URL/method/header name, a GET with a body) is classified by `classifyFetchThrow` (`src/brain/errors.ts:328`) as `invalid_request` — not `network` — and never retried; `AssistantMessage.isApiErrorMessage` is deliberately absent on this class (nothing reached the wire). A base URL with userinfo is refused at brain CONSTRUCTION by `assertBaseUrlWithoutCredentials` (`src/brain/route-adjudicator.ts:91`) in all three factories and in the shared `resolveRequestRoot` for `Model.baseUrl` (rules −2; the message never echoes the password). Structural discriminator, two evidence forms: a transport error carries a `cause` with a connect code, or the `fetch failed` shell sentence; a bare `TypeError` with neither is a build refusal. WHO IS AFFECTED: an operator who saw a ~3-minute retry ladder on a deterministic configuration error (deploy on cli 1.0.121)."
    },
    {
      "id": "F7",
      "source": "behaviorFlips.summary",
      "text": "NARROWING, `Monitor` tool (#938): the shell faces' execute-time canonical recheck (`createShellCanonicalRecheck`, `src/tools/fs/fs-bash.ts`, extracted verbatim from the Bash tool) is mounted on `Monitor` from the same `readBoundary` option; a watch whose established operands resolve outside the roots or onto a deny row is refused as the whole call result before `registerMonitor` (no task_id, no stream), with a pre-spawn cancellation guard. WHO IS AFFECTED: a deployment that watched a symlinked or globbed deny-listed file through Monitor at zero refusals."
    }
  ],
  "closedSetMembers": [
    {
      "set": "FetchThrowClass",
      "at": [
        "src/brain/errors.ts:327"
      ],
      "newSet": true,
      "added": [
        "request_unbuildable",
        "transport"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    }
  ],
  "closedSetsUnreadable": [],
  "typeKeys": [
    {
      "type": "MonitorToolOptions",
      "at": [
        "src/tools/monitor.ts:61"
      ],
      "added": [
        "readBoundary"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "type": "WorkflowRunSummary",
      "at": [
        "src/core/workflow-run-store.ts:35"
      ],
      "added": [
        "errorCode"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": true
    }
  ],
  "declarationMoves": [
    {
      "name": "PROBE_REASON_MAX",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/core/checkpoint-store.ts"
      ],
      "to": [
        "src/core/checkpoint-store.ts",
        "src/core/untrusted-text.ts"
      ]
    }
  ],
  "mintMoves": [],
  "criteriaObserves": [
    {
      "kind": "taskEventField",
      "name": "tool_end.isError",
      "assertions": [
        "G2.a",
        "G2.b",
        "G4.a",
        "G4.b"
      ]
    },
    {
      "kind": "taskEventField",
      "name": "tool_end.structured",
      "assertions": [
        "G1.b"
      ]
    },
    {
      "kind": "typeMember",
      "name": "PersistedRule.rule",
      "assertions": [
        "G3.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ReversibilityVerdict.boundaryDeclined",
      "assertions": [
        "G3.b"
      ]
    },
    {
      "kind": "typeMember",
      "name": "WorkflowRunSummary.errorCode",
      "assertions": [
        "G1.a"
      ]
    }
  ],
  "consumersHint": {
    "cli": [],
    "server": [
      "MonitorToolOptions",
      "WorkflowRunSummary"
    ],
    "sdk": [
      "WorkflowRunSummary"
    ],
    "note": "scanned cli@c38ebaf9 server@3793eaf4 sdk@ace0d09 — a name listed is MENTIONED there today, which is evidence of consumption, not proof of it"
  },
  "breakingCount": 0,
  "breakingItems": [],
  "toResolvedAt": "a11cee1b37ecec0004b3b2e31a6d5d51370dfa52"
}
