{
  "repo": "core",
  "version": "7.24.4",
  "from": "583db3a8918e747e8dab1c5e2f457cf79171bd3f",
  "to": "v7.24.4",
  "added": [],
  "removed": [],
  "changed": [],
  "narrowed": [
    {
      "id": "F1",
      "source": "behaviorFlips.summary",
      "text": "NARROWING (#978, P2, permissions): every rule source is re-read at every tool gate — a session-policy rule (`PUT /v1/sessions/:id/policy` on server; `sessionPolicyStore` in core) written after a run's first turn denies the matching call in the SAME run; and every rule denial is one minted sentence naming its source."
    }
  ],
  "closedSetMembers": [],
  "closedSetsUnreadable": [],
  "typeKeys": [],
  "declarationMoves": [],
  "mintMoves": [],
  "criteriaObserves": [
    {
      "kind": "taskEventField",
      "name": "tool_end.isError",
      "assertions": [
        "G1.a",
        "G1.b"
      ]
    },
    {
      "kind": "typeMember",
      "name": "BackgroundChildEvent.seq",
      "assertions": [
        "G2.a"
      ]
    },
    {
      "kind": "typeMember",
      "name": "SessionPermissionRules.toolDeny",
      "assertions": [
        "G1.a"
      ]
    }
  ],
  "consumersHint": {
    "cli": [],
    "server": [],
    "sdk": [],
    "note": "NOT SCANNED: sema-cli, sema-server, sema-sdk — an empty list for those repos means \"not checked out\", not \"no consumer\""
  },
  "breakingCount": 0,
  "breakingItems": [],
  "toResolvedAt": "5cbec5a04d5cd905a121a02e21c3c71087a7b4fe"
}
