{
  "repo": "core",
  "version": "7.23.1",
  "from": "0f45a3d257bcdb5f38faaa7c75a6fa1298685402",
  "to": "v7.23.1",
  "added": [],
  "removed": [],
  "changed": [],
  "narrowed": [
    {
      "id": "F2",
      "source": "behaviorFlips.summary",
      "text": "FEWER CARDS, both seats (#892): a verb's FIRST OPERAND can be a slot its grammar fills rather than a file. `VerbOptionSlots.firstOperand` (`src/tools/fs/bash-readonly-classifier.ts:1562`) is a declaration ROW — grep's `pattern` (`:1621`), sed's `script` (`:1675`) — read with the same `OptionValueKind` vocabulary the option slots already use, and ONE reader (`suppliesFirstOperandSlot` `:1401`) answers \"did an option supply this slot instead\" for both walks that needed it (the boundary walk `:3441`/`:3459-3466`, the stdin-floor walk `:4007`/`:4012`). Rules: -1 (the verb-named branch and its private predicate are gone; a verb with no row keeps an ordinary first operand). WHO NEEDS IT: `sed -n '/error/p' app.log` — an everyday log-reading line whose script, spelled with slashes because it opens with an address regexp, was read as the absolute path `/error/p`, found outside the roots and mandated; the `-e` spelling of the same script was already exempt, so one invocation had two readings. WHO IS HURT: a probe pinned at `mandated` for a path-shaped sed script, including its deny-listed spelling — `sed <deny row>` and `sed -l <deny row>` now drop their card on the default/off and bypass tiers. COMPENSATION: the token is not a file under EITHER implementation (it is the script where `-l` takes no value and `-l`'s length argument where it does), so the verb-blind reading that recorded it as a read was an over-approximation, not a protection; the narrowing is exactly one operand wide and no other verb grew a row."
    },
    {
      "id": "G2",
      "source": "criteria.title",
      "text": "#892 — a verb's first operand can be a slot its grammar fills, and the narrowing is exactly one operand wide"
    }
  ],
  "closedSetMembers": [
    {
      "set": "QuoteOpen",
      "at": [
        "src/tools/fs/bash-lexer.ts:109"
      ],
      "newSet": true,
      "added": [
        "\"",
        "'"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "SHELL_SCAN_DECLINES",
      "at": [
        "src/tools/fs/bash-program-position.ts:346"
      ],
      "newSet": true,
      "added": [
        "stream_fed_operands",
        "unreadable_program_position"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    }
  ],
  "closedSetsUnreadable": [],
  "typeKeys": [],
  "declarationMoves": [
    {
      "name": "NOT_AUTO_ALLOWED",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-program-position.ts",
        "src/tools/fs/bash-readonly-classifier.ts"
      ],
      "to": [
        "src/tools/fs/bash-program-position.ts"
      ]
    },
    {
      "name": "traceHookCrash",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/core/runner/gate-exit.ts"
      ],
      "to": [
        "src/core/gate-crash-trace.ts"
      ]
    }
  ],
  "mintMoves": [],
  "criteriaObserves": [
    {
      "kind": "typeMember",
      "name": "AskRequest.message",
      "assertions": [
        "G5.a",
        "G5.b"
      ]
    },
    {
      "kind": "typeMember",
      "name": "AskRequest.origin",
      "assertions": [
        "G5.a",
        "G5.b",
        "G5.c"
      ]
    },
    {
      "kind": "typeMember",
      "name": "AskRequest.ruleOffersAbsence",
      "assertions": [
        "G1.d",
        "G3.b",
        "G3.d",
        "G4.c"
      ]
    },
    {
      "kind": "typeMember",
      "name": "AskRequest.toolName",
      "assertions": [
        "G5.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "BashReadonlyRootBoundary.denyMatch",
      "assertions": [
        "G1.c"
      ]
    },
    {
      "kind": "typeMember",
      "name": "CompoundReadonlyVerdict.outOfRootPaths",
      "assertions": [
        "G1.b",
        "G2.a",
        "G2.b",
        "G2.c",
        "G2.d"
      ]
    },
    {
      "kind": "typeMember",
      "name": "CompoundReadonlyVerdict.readDenied",
      "assertions": [
        "G1.b",
        "G2.b"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ReadRootGrantCandidate.dir",
      "assertions": [
        "G4.e"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ReversibilityVerdict.mandated",
      "assertions": [
        "G1.a",
        "G1.b",
        "G1.c",
        "G2.a",
        "G2.b",
        "G2.c",
        "G2.d",
        "G3.a",
        "G3.c",
        "G3.d",
        "G3.e",
        "G4.a",
        "G4.b",
        "G4.c",
        "G4.d",
        "G6.a",
        "G6.c",
        "G7.a",
        "G7.b",
        "G7.c"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ReversibilityVerdict.readRootCandidate",
      "assertions": [
        "G4.e"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ReversibilityVerdict.reversible",
      "assertions": [
        "G1.a",
        "G3.a",
        "G3.e",
        "G4.b",
        "G4.d",
        "G6.a",
        "G6.b",
        "G7.a",
        "G7.c"
      ]
    }
  ],
  "consumersHint": {
    "cli": [],
    "server": [],
    "sdk": [],
    "note": "scanned cli@879f19e9 server@1b232ad6 sdk@6209e5e — a name listed is MENTIONED there today, which is evidence of consumption, not proof of it"
  },
  "breakingCount": 0,
  "breakingItems": [],
  "toResolvedAt": "29f9c021a132099c91933bd71a58bd4da716bfac"
}
