{
  "repo": "core",
  "version": "7.28.1",
  "from": "cba36ff92ab9b8a3912e984f6a20263bd6a4c16b",
  "to": "v7.28.1",
  "added": [],
  "removed": [],
  "changed": [],
  "narrowed": [
    {
      "id": "F2",
      "source": "behaviorFlips.summary",
      "text": "NARROWING (#994 S0, shell read boundary): a command carrying an unclosed `'`, `\\\"` or `$'` is a PARSE FAILURE in every mode — no words, no segments, the plan's `unreadable` floor — where the strict faces used to re-read it quote-blind and vouch for the words that reading invented. Bash itself runs nothing on such a command."
    },
    {
      "id": "F3",
      "source": "behaviorFlips.summary",
      "text": "NARROWING (#994 S0, merged-tree adversarial round 1): a word the lexer cannot settle refuses ITS OWN reading, not the whole text — the plan keeps every segment beside it and carries the refusal sentence as its `unreadable` floor, so a deny row named elsewhere in the same command still outranks the floor (`deny > ask`). Where nothing is denied, the floor is a mandated ask, never a vouched run."
    },
    {
      "id": "F4",
      "source": "behaviorFlips.summary",
      "text": "NARROWING (#994 S0, merged-tree adversarial round 2): an unprovable directory move no longer relocates the base to a fiction — a `cd` target minted from an unresolved word is `unresolvable`, the base is LOST, and a later relative read is judged for DENY ROWS ONLY against `ReadCandidate.floorBases`, the bases the text was certainly standing in at that moment (the declared cwd when nothing had moved)."
    },
    {
      "id": "F5",
      "source": "behaviorFlips.summary",
      "text": "NARROWING / ALIGNMENT (#994 S0 fallout, persisted-rule import): a rule body whose `$'…'` never closes is refused as `invalid.unbalanced_quotes` rather than `invalid.not_simple_command` — the same closed set, NO new member, and the `'` / `\"` spellings (which already read that way) are unchanged. The lexer now refuses an unbalanced body before the lane-shape reader sees it, so the rule parser asks the balance question first and keeps the code an import report has always grouped it under."
    }
  ],
  "closedSetMembers": [
    {
      "set": "BASH_ONLY_CONSTRUCTS",
      "at": [
        "src/shell/lex.ts:111"
      ],
      "newSet": true,
      "added": [
        "ansi_c_quoting",
        "append_assignment",
        "brace_expansion",
        "compound_assignment",
        "here_string",
        "locale_string",
        "process_substitution",
        "redirect_both",
        "subscript_assignment"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "BashOnlyConstruct",
      "at": [
        "src/shell/lex.ts:122"
      ],
      "newSet": true,
      "added": [
        "ansi_c_quoting",
        "append_assignment",
        "brace_expansion",
        "compound_assignment",
        "here_string",
        "locale_string",
        "process_substitution",
        "redirect_both",
        "subscript_assignment"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "EXPANSION_KINDS",
      "at": [
        "src/shell/lex.ts:44"
      ],
      "newSet": true,
      "added": [
        "arithmetic",
        "brace",
        "command",
        "glob",
        "parameter",
        "process",
        "tilde"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "ExpansionKind",
      "at": [
        "src/shell/lex.ts:45"
      ],
      "newSet": true,
      "added": [
        "arithmetic",
        "brace",
        "command",
        "glob",
        "parameter",
        "process",
        "tilde"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "PARSE_FAILURE_REASONS",
      "at": [
        "src/shell/lex.ts:75"
      ],
      "newSet": true,
      "added": [
        "background_operator",
        "heredoc_delimiter_expands",
        "heredoc_without_delimiter",
        "redirect_without_target",
        "undelimited_substitution",
        "unterminated_ansi_c",
        "unterminated_command_substitution",
        "unterminated_compound_value",
        "unterminated_double_quote",
        "unterminated_heredoc",
        "unterminated_parameter_expansion",
        "unterminated_process_substitution",
        "unterminated_single_quote",
        "unterminated_subscript"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "ParseFailureReason",
      "at": [
        "src/shell/lex.ts:91"
      ],
      "newSet": true,
      "added": [
        "background_operator",
        "heredoc_delimiter_expands",
        "heredoc_without_delimiter",
        "redirect_without_target",
        "undelimited_substitution",
        "unterminated_ansi_c",
        "unterminated_command_substitution",
        "unterminated_compound_value",
        "unterminated_double_quote",
        "unterminated_heredoc",
        "unterminated_parameter_expansion",
        "unterminated_process_substitution",
        "unterminated_single_quote",
        "unterminated_subscript"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "QUOTE_KINDS",
      "at": [
        "src/shell/lex.ts:39"
      ],
      "newSet": true,
      "added": [
        "\"",
        "$\"",
        "$'",
        "'",
        "\\"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "QuoteKind",
      "at": [
        "src/shell/lex.ts:40"
      ],
      "newSet": true,
      "added": [
        "\"",
        "$\"",
        "$'",
        "'",
        "\\"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "UNRESOLVED_REASONS",
      "at": [
        "src/shell/lex.ts:49"
      ],
      "newSet": true,
      "added": [
        "ansi_c_escape",
        "compound_array_value",
        "locale_string",
        "parameter_text",
        "subscript_text"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "set": "UnresolvedReason",
      "at": [
        "src/shell/lex.ts:50"
      ],
      "newSet": true,
      "added": [
        "ansi_c_escape",
        "compound_array_value",
        "locale_string",
        "parameter_text",
        "subscript_text"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    }
  ],
  "closedSetsUnreadable": [],
  "typeKeys": [
    {
      "type": "LexedWord",
      "at": [
        "src/shell/lex.ts:198"
      ],
      "via": "ShellReadSegment.argv",
      "added": [
        "assignment",
        "atCommandPosition",
        "expansions",
        "pieces",
        "quotedSpans",
        "unresolved"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": false
    },
    {
      "type": "ReadCandidate",
      "at": [
        "src/tools/fs/shell-read-plan.ts:110"
      ],
      "added": [
        "floorBases"
      ],
      "removed": [],
      "breaking": false,
      "criteriaCovered": true
    }
  ],
  "typeKeysUnreadableArms": [],
  "typeKeysFlattenedCount": 213,
  "declarationMoves": [
    {
      "name": "LenientConnector",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "LexMode",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "LexOptions",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "LexedCommand",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "LexedGroup",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "LexedHeredoc",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "LexedRedirect",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "LexedSegment",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "LexedToken",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "LexedWord",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "QuoteOpen",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "SHELL_CONTROL_PREFIXES",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-program-position.ts"
      ],
      "to": [
        "src/shell/lex.ts",
        "src/tools/fs/bash-program-position.ts"
      ]
    },
    {
      "name": "SUBSTITUTION_PLACEHOLDER",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "SegmentTokens",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "ShellSegmentConnector",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts",
        "src/tools/fs/bash-readonly-classifier.ts"
      ],
      "to": [
        "src/shell/lex.ts",
        "src/tools/fs/bash-readonly-classifier.ts"
      ]
    },
    {
      "name": "ansiCQuoteClose",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "dollarOpensQuote",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "lexShellText",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "literalTildeSpelling",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "quoteMask",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "substitutionsInHeredocBody",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    },
    {
      "name": "wordsOf",
      "kind": null,
      "onSurface": false,
      "from": [
        "src/tools/fs/bash-lexer.ts"
      ],
      "to": [
        "src/shell/lex.ts"
      ]
    }
  ],
  "mintMoves": [],
  "criteriaObserves": [
    {
      "kind": "taskEventField",
      "name": "tool_end.gate",
      "assertions": [
        "G1.a",
        "G2.b",
        "G3.a",
        "G4.b"
      ]
    },
    {
      "kind": "taskEventField",
      "name": "tool_end.isError",
      "assertions": [
        "G1.b",
        "G4.b"
      ]
    },
    {
      "kind": "taskEventField",
      "name": "tool_end.structured",
      "assertions": [
        "G1.b",
        "G2.b",
        "G3.a",
        "G4.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "AskRequest.mandated",
      "assertions": [
        "G1.a",
        "G2.a",
        "G3.b"
      ]
    },
    {
      "kind": "typeMember",
      "name": "AskRequest.probeReason",
      "assertions": [
        "G2.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ReadCandidate.floorBases",
      "assertions": [
        "G4.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "RuleReject.code",
      "assertions": [
        "G5.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "ShellReadPlan.unreadable",
      "assertions": [
        "G3.b"
      ]
    }
  ],
  "consumersHint": {
    "cli": [],
    "server": [
      "ReadCandidate"
    ],
    "sdk": [],
    "note": "scanned cli@41e83b0c server@5532ec7b sdk@074194f — a name listed is MENTIONED there today, which is evidence of consumption, not proof of it"
  },
  "breakingCount": 0,
  "breakingItems": [],
  "toResolvedAt": "228eabc7adbae3961b847fb9b598dcbee4593b86"
}
