{
  "repo": "core",
  "version": "7.49.2",
  "from": "57363d52a115a659d902a81e8aad865ed98e2419",
  "to": "50ffffb636bb70863f86ee9a74aee0c0a82891a0",
  "added": [],
  "removed": [],
  "changed": [],
  "narrowed": [],
  "closedSetMembers": [
    {
      "set": "SHELL_READ_FINDINGS",
      "at": [
        "src/tools/fs/shell-read-judge.ts:34"
      ],
      "newSet": false,
      "added": [
        "unanswered"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    }
  ],
  "closedSetsUnreadable": [],
  "typeKeys": [],
  "typeKeysUnreadableArms": [],
  "typeKeysFlattenedCount": 223,
  "signatures": [
    {
      "name": "ShellReadBoundary.writeTargetJudge",
      "at": [
        "src/tools/fs/shell-read-judge.ts:191"
      ],
      "from": [
        "(target: string, opts?: { readonly signal?: AbortSignal; readonly canonical?: true; }): Promise<\"protected\" | \"guarded\" | undefined>"
      ],
      "to": [
        "(target: string, opts: { readonly fs: ObservedFilesystem; readonly signal?: AbortSignal; readonly canonical?: true; }): Promise<\"protected\" | \"guarded\" | undefined>"
      ],
      "changes": [
        {
          "aspect": "param",
          "detail": "param 2 `opts` type changed, direction not read: { readonly [ -> fs: ObservedFilesystem; readonly ]signal?: AbortSignal; re…",
          "breaking": true,
          "uncertain": true
        },
        {
          "aspect": "param",
          "detail": "param 2 `opts` is now required",
          "breaking": true
        }
      ],
      "uncertain": "param 2 `opts` type changed, direction not read: { readonly [ -> fs: ObservedFilesystem; readonly ]signal?: AbortSignal; re… — the direction of a type change is not read syntactically, so it is reported breaking: check whether existing call sites still type-check before writing the BREAKING line",
      "breaking": true,
      "criteriaCovered": false
    }
  ],
  "declarationMoves": [],
  "mintMoves": [],
  "criteriaObserves": [
    {
      "kind": "taskEventField",
      "name": "tool_end.gate",
      "assertions": [
        "G3.a",
        "G4.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "AskRequest.askClass",
      "assertions": [
        "G1.b"
      ]
    },
    {
      "kind": "typeMember",
      "name": "AskRequest.requiresRealApproval",
      "assertions": [
        "G1.a",
        "G2.a",
        "G3.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "RedactionFinding.kind",
      "assertions": [
        "G5.a",
        "G5.b"
      ]
    },
    {
      "kind": "typeMember",
      "name": "RedactionFinding.span",
      "assertions": [
        "G5.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ShellReadVerdict.face",
      "assertions": [
        "G1.a",
        "G2.a",
        "G3.b"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ToolCatalogEntry.mountedBy",
      "assertions": [
        "G4.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ToolSpec.pathTarget",
      "assertions": [
        "G4.b"
      ]
    }
  ],
  "consumersHint": {
    "cli": [
      "SHELL_READ_FINDINGS",
      "ShellReadBoundary"
    ],
    "server": [],
    "sdk": [],
    "note": "scanned cli@1aef2b83 server@5a38b2ce sdk@46baee2 — a name listed is MENTIONED there today, which is evidence of consumption, not proof of it. Ledger files (**/docs/core-consumption/**, **/docs/wire-consumption/**, **/*LEDGER*.json) are not evidence of use — server: 2 name(s) matched ONLY in bookkeeping files and were set aside (SHELL_READ_FINDINGS, ShellReadBoundary)"
  },
  "breakingCount": 1,
  "breakingItems": [
    "signature changed: ShellReadBoundary.writeTargetJudge — param 2 `opts` type changed, direction not read: { readonly [ -> fs: ObservedFilesystem; readonly ]signal?: AbortSignal; re…; param 2 `opts` is now required"
  ]
}
