{
  "repo": "core",
  "version": "7.47.0",
  "from": "d3d1a70f250fad85ace0bf4e792e75bf18373690",
  "to": "v7.47.0",
  "added": [
    {
      "name": "ASK_FACES",
      "kind": "variable",
      "tier": "advanced",
      "at": [
        "src/core/ask-origin.ts:707",
        "src/index.ts:1472"
      ],
      "criteriaCovered": false,
      "breaking": false
    },
    {
      "name": "AskFace",
      "kind": "type",
      "tier": "advanced",
      "at": [
        "src/core/ask-origin.ts:708",
        "src/index.ts:1472"
      ],
      "criteriaCovered": false,
      "breaking": false
    },
    {
      "name": "askFaceOf",
      "kind": "function",
      "tier": "advanced",
      "at": [
        "src/core/ask-origin.ts:713",
        "src/index.ts:1472"
      ],
      "criteriaCovered": false,
      "breaking": false
    },
    {
      "name": "releasableAskClassesFor",
      "kind": "function",
      "tier": "advanced",
      "at": [
        "src/core/ask-origin.ts:751",
        "src/index.ts:1472"
      ],
      "criteriaCovered": false,
      "breaking": false
    }
  ],
  "removed": [
    {
      "name": "RELEASABLE_ASK_CLASSES",
      "kind": "variable",
      "tier": "advanced",
      "at": [
        "src/core/ask-origin.ts:711",
        "src/index.ts:1472"
      ],
      "breaking": true
    }
  ],
  "changed": [],
  "narrowed": [
    {
      "id": "F33",
      "source": "behaviorFlips.summary",
      "text": "BEHAVIOR NARROWING (#1402): a `Bash(...)` command rule — deny, ask or allow, from a task policy, the deployment's policy, a person's stored rows, the org partition or the allow lists — judges a `Monitor` call by its `command`, as it judges a `Bash` call."
    },
    {
      "id": "F34",
      "source": "behaviorFlips.summary",
      "text": "BEHAVIOR NARROWING (#1402): a `Monitor(<command>)` rule text is refused at compile time (`invalid.command_rule`, naming the `Bash(<command>)` spelling); `Monitor(command:…)` is the primary-field refusal."
    },
    {
      "id": "F35",
      "source": "behaviorFlips.summary",
      "text": "BEHAVIOR NARROWING (#1421, #1445 merged): a launcher that runs a program named by no word of its own hands it an argv its row composes, read as that program reads its own — `sudo -s` / `-i` / `--shell` / `--login` with a command hand the shell the command as escaped `-c` text (`$NAME` still expands); `su` / `runuser` hand the program `-c TEXT` and the words after the user (the user is a name, not text); su's `-s PROGRAM` names the program (a shell's row, or the program's own); a program the text does not spell (`-s \"$X\"`, `-m` / `-p`) is read as its command line and as a shell; `runuser -u USER CMD` runs CMD as the program."
    },
    {
      "id": "F40",
      "source": "behaviorFlips.summary",
      "text": "BEHAVIOR NARROWING (#1421 r3b; one rule for every command): a character inside a bracket class that quotes or a backslash protect is a literal member — the path reader judges every class holding one as any one character (`?`, as the glob matcher reads a POSIX class), a well-formed class read as bash forms it — ending where bash ends it (a `[:…:]` / `[=…=]` / `[.….]` unit skipped whole, a quoted `]` closing nothing), no class where a `/` stands inside the brackets; a malformed unit (`[[:alpha]]`, `[[:a]x/y:]`, `[a[=b]c=]`) is not, its outer `[` read as a literal where bash reads a member (KL-7470-d, unchanged from v7.46.x) — and every class the matcher widens (a quoted character, or a `[:…:]` / `[=…=]` / `[.….]` unit) judging the name it spells beside its matches. The deny table and the dangerous-delete judge therefore see every name the shell could match in a whole word (and some it would not) — not in a part cut out of a word (an attached option value `grep --file=…` / `grep -f…`, `dd if=`'s value, an assignment's value), which is matched by its own quote-removed text while bash matches the whole word (KL-7470-c, a live miss unchanged from v7.46.x: `grep --file=[\"!\"a]* x` beside a plain `--file=apple` opens a denied `apple` on every arm; #1466). Reach: `Bash` commands whose words carry such a class, written literally or through a settled value; the text handed to a launched or re-reading shell is unchanged."
    }
  ],
  "closedSetMembers": [
    {
      "set": "ASK_FACES",
      "at": [
        "src/core/ask-origin.ts:707"
      ],
      "newSet": true,
      "added": [
        "other",
        "shell"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "AskFace",
      "at": [
        "src/core/ask-origin.ts:708",
        "src/index.ts:1472"
      ],
      "newSet": true,
      "added": [
        "other",
        "shell"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "MODE_RELEASE_REASONS",
      "at": [
        "src/core/ask-origin.ts:765"
      ],
      "newSet": false,
      "added": [
        "write_protection_unresolved"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "ToolFaceDeclaration.ruleFace.grammar",
      "at": [
        "src/core/tool-face.ts:232"
      ],
      "newSet": true,
      "added": [
        "command"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    }
  ],
  "closedSetsUnreadable": [],
  "typeKeys": [
    {
      "type": "AskClassFacts",
      "at": [
        "src/core/ask-origin.ts:780"
      ],
      "added": [
        "askFace"
      ],
      "addedDetail": [
        {
          "key": "askFace",
          "optional": true
        }
      ],
      "addedRequired": [],
      "removed": [],
      "breaking": false,
      "criteriaCovered": true
    },
    {
      "type": "LexedWord",
      "at": [
        "src/shell/lex.ts:184"
      ],
      "via": "ShellReadSegment.argv",
      "added": [
        "judged"
      ],
      "addedDetail": [
        {
          "key": "judged",
          "optional": true
        }
      ],
      "addedRequired": [],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "type": "ReadCandidate",
      "at": [
        "src/tools/fs/shell-read-plan.ts:125"
      ],
      "added": [
        "pattern"
      ],
      "addedDetail": [
        {
          "key": "pattern",
          "optional": true
        }
      ],
      "addedRequired": [],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "type": "ToolFaceDeclaration",
      "at": [
        "src/core/tool-face.ts:216"
      ],
      "added": [
        "ruleFace.grammar"
      ],
      "addedDetail": [
        {
          "key": "ruleFace.grammar",
          "optional": true
        }
      ],
      "addedRequired": [],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "type": "WordExpansion",
      "at": [
        "src/shell/lex.ts:134"
      ],
      "via": "ShellReadSegment.argv.pieces.expansion",
      "added": [
        "pattern",
        "pattern.folded",
        "pattern.judged",
        "pattern.written"
      ],
      "addedDetail": [
        {
          "key": "pattern",
          "optional": true
        },
        {
          "key": "pattern.folded",
          "optional": false
        },
        {
          "key": "pattern.judged",
          "optional": false
        },
        {
          "key": "pattern.written",
          "optional": false
        }
      ],
      "addedRequired": [],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    }
  ],
  "typeKeysUnreadableArms": [],
  "typeKeysFlattenedCount": 228,
  "signatures": [
    {
      "name": "foldArbitrationRow",
      "at": [
        "src/core/ask-origin.ts:860"
      ],
      "from": [
        "(classes: ReadonlySet<AskClass>, readFace?: ContainmentFace): ModeArbitrationRow"
      ],
      "to": [
        "(classes: ReadonlySet<AskClass>, readFace?: ContainmentFace, askFace?: AskFace): ModeArbitrationRow"
      ],
      "changes": [
        {
          "aspect": "param",
          "detail": "+optional param `askFace?: AskFace`",
          "breaking": false
        }
      ],
      "breaking": false,
      "criteriaCovered": false
    }
  ],
  "declarationMoves": [],
  "mintMoves": [],
  "criteriaObserves": [
    {
      "kind": "taskEventField",
      "name": "tool_end.gate",
      "assertions": [
        "G43.a",
        "G43.c",
        "G46.c"
      ]
    },
    {
      "kind": "typeMember",
      "name": "AskClassFacts.askFace",
      "assertions": [
        "G47.a",
        "G47.b"
      ]
    },
    {
      "kind": "typeMember",
      "name": "AskRequest.askClass",
      "assertions": [
        "G45.a",
        "G45.b",
        "G45.e",
        "G45.f",
        "G45.g",
        "G45.h",
        "G45.i",
        "G45.k"
      ]
    },
    {
      "kind": "typeMember",
      "name": "AskRequest.classes",
      "assertions": [
        "G43.b",
        "G45.c",
        "G45.d"
      ]
    },
    {
      "kind": "typeMember",
      "name": "AskRequest.message",
      "assertions": [
        "G45.a",
        "G45.b",
        "G45.d",
        "G45.f",
        "G45.g",
        "G45.h"
      ]
    },
    {
      "kind": "typeMember",
      "name": "GateOutcome.disposition",
      "assertions": [
        "G43.a",
        "G43.b",
        "G43.c",
        "G45.i",
        "G45.j",
        "G45.l",
        "G46.a",
        "G46.b",
        "G46.c",
        "G46.d"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ModeRelease.reason",
      "assertions": [
        "G46.a",
        "G46.d",
        "G47.b"
      ]
    },
    {
      "kind": "typeMember",
      "name": "PermissionRuleIssue.code",
      "assertions": [
        "G44.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "PermissionRuleIssue.message",
      "assertions": [
        "G44.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ToolCatalogEntry.face",
      "assertions": [
        "G44.b"
      ]
    }
  ],
  "consumersHint": {
    "cli": [
      "AskClassFacts",
      "LexedWord",
      "MODE_RELEASE_REASONS",
      "RELEASABLE_ASK_CLASSES",
      "ReadCandidate",
      "foldArbitrationRow"
    ],
    "server": [
      "LexedWord",
      "MODE_RELEASE_REASONS",
      "RELEASABLE_ASK_CLASSES",
      "ReadCandidate",
      "foldArbitrationRow"
    ],
    "sdk": [
      "RELEASABLE_ASK_CLASSES"
    ],
    "note": "scanned cli@b43004f0 server@b5d7c626 sdk@f6f9666 — 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 (AskClassFacts, ToolFaceDeclaration)"
  },
  "breakingCount": 1,
  "breakingItems": [
    "export removed: RELEASABLE_ASK_CLASSES (variable)"
  ],
  "toResolvedAt": "931d1bd694bf8b8e1376209647db753133079ee8"
}
