[
  {
    "id": "P1",
    "path": "docs/postgres/03-locking/deadlocks.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": [
        "scenarios/postgres/03-locking/deadlock-avoidance.yaml",
        "scenarios/postgres/03-locking/deadlock.yaml"
      ],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-DEADLOCKS",
        "https://www.postgresql.org/docs/18/runtime-config-locks.html#GUC-DEADLOCK-TIMEOUT"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "4a8d251a51e37e7c0ec2f61cacf6e275459ca097d8c7b6a5489850120bb3112b",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "babaa78f3a3546fe78f8c6ff62530a14b9df4262f4781bc4421e6f2b85f908f8",
        "schedule_occurrences": []
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/deadlock-avoidance.yaml",
        "transcript": "docs/postgres/03-locking/parts/deadlock-avoidance.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/deadlock-avoidance.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/deadlock-avoidance.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      },
      {
        "scenario": "scenarios/postgres/03-locking/deadlock.yaml",
        "transcript": "docs/postgres/03-locking/parts/deadlock.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/deadlock.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/deadlock.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P2",
    "path": "docs/postgres/03-locking/lock-queues.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/lock-queue-fifo.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/functions-info.html#FUNCTIONS-INFO-SESSION",
        "https://www.postgresql.org/docs/18/view-pg-locks.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "1924b548bbac54ee65709f73f85da5df503dd5772761990a2bf1c554526ec120",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "8746575ecc29ef7d8092ff9bf02b2de982df794badf823feffd2e00dd233a291",
        "schedule_occurrences": []
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/lock-queue-fifo.yaml",
        "transcript": "docs/postgres/03-locking/parts/lock-queue-fifo.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/lock-queue-fifo.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/lock-queue-fifo.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P3",
    "path": "docs/postgres/03-locking/monitoring-locks.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/monitoring-locks.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/view-pg-locks.html",
        "https://www.postgresql.org/docs/18/monitoring-stats.html#MONITORING-PG-STAT-ACTIVITY-VIEW",
        "https://www.postgresql.org/docs/18/functions-info.html#FUNCTIONS-INFO-SESSION"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "a37717a076da70c455026a007e58e3e7a3a063bf3d709faaf3a2108ed402ce4d",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "5d89b2fa46fb38df41b5b69df6be7ba9184b16e5ecbd5664718fff9a073516d4",
        "schedule_occurrences": []
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/monitoring-locks.yaml",
        "transcript": "docs/postgres/03-locking/parts/monitoring-locks.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/monitoring-locks.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/monitoring-locks.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P4",
    "path": "docs/postgres/03-locking/nowait-skip-locked.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": [
        "scenarios/postgres/03-locking/lock-timeout.yaml",
        "scenarios/postgres/03-locking/nowait.yaml",
        "scenarios/postgres/03-locking/skip-locked.yaml"
      ],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/sql-select.html#SQL-FOR-UPDATE-SHARE",
        "https://www.postgresql.org/docs/18/runtime-config-client.html#GUC-LOCK-TIMEOUT",
        "https://www.postgresql.org/docs/18/sql-rollback.html",
        "https://www.postgresql.org/docs/18/sql-rollback-to.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "49da8431be15c93214cb79abc8108f1bd98faa2696a5e47edbb14da8ca2e2e9d",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "38322e313ba197a543d5949ef1b196eb001497a1186187b60894cc4d15fbaefd",
        "schedule_occurrences": []
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/lock-timeout.yaml",
        "transcript": "docs/postgres/03-locking/parts/lock-timeout.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/lock-timeout.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/lock-timeout.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      },
      {
        "scenario": "scenarios/postgres/03-locking/nowait.yaml",
        "transcript": "docs/postgres/03-locking/parts/nowait.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/nowait.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/nowait.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      },
      {
        "scenario": "scenarios/postgres/03-locking/skip-locked.yaml",
        "transcript": "docs/postgres/03-locking/parts/skip-locked.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/skip-locked.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/skip-locked.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P5",
    "path": "docs/postgres/03-locking/row-locks.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": [
        "scenarios/postgres/03-locking/fk-key-share.yaml",
        "scenarios/postgres/03-locking/for-update-blocks.yaml",
        "scenarios/postgres/03-locking/lock-mode-matrix.yaml"
      ],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-ROWS",
        "https://www.postgresql.org/docs/18/explicit-locking.html#ROW-LOCK-COMPATIBILITY",
        "https://www.postgresql.org/docs/18/sql-select.html#SQL-FOR-UPDATE-SHARE",
        "https://github.com/postgres/postgres/blob/REL_18_STABLE/src/backend/utils/adt/ri_triggers.c"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "3022e3c905c218dbf675cc67a775ac57536e181e0f37b28b5fed4abdcd611524",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "e2d42c6aeafec1b6ec07c1277b74e1f799b6cc32fea2678a402f59ae3cc4172e",
        "schedule_occurrences": []
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/fk-key-share.yaml",
        "transcript": "docs/postgres/03-locking/parts/fk-key-share.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/fk-key-share.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/fk-key-share.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      },
      {
        "scenario": "scenarios/postgres/03-locking/for-update-blocks.yaml",
        "transcript": "docs/postgres/03-locking/parts/for-update-blocks.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/for-update-blocks.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/for-update-blocks.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      },
      {
        "scenario": "scenarios/postgres/03-locking/lock-mode-matrix.yaml",
        "transcript": "docs/postgres/03-locking/parts/lock-mode-matrix.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/lock-mode-matrix.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/lock-mode-matrix.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P6",
    "path": "docs/postgres/03-locking/table-locks-and-ddl.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": [
        "scenarios/postgres/03-locking/alter-table-outage.yaml",
        "scenarios/postgres/03-locking/ddl-lock-timeout.yaml"
      ],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-TABLES",
        "https://www.postgresql.org/docs/18/sql-altertable.html",
        "https://www.postgresql.org/docs/18/runtime-config-client.html#GUC-LOCK-TIMEOUT",
        "https://www.postgresql.org/docs/18/sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "e7056db74325c0704f3ba193b1fdbd1d9729477707029c538b37f6efdcc711b9",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "ab6158105ef17f61631138525b9162bccbc5beb7045bb39e7b2d545be9738b7b",
        "schedule_occurrences": []
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/alter-table-outage.yaml",
        "transcript": "docs/postgres/03-locking/parts/alter-table-outage.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/alter-table-outage.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/alter-table-outage.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      },
      {
        "scenario": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml",
        "transcript": "docs/postgres/03-locking/parts/ddl-lock-timeout.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/ddl-lock-timeout.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/ddl-lock-timeout.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P7",
    "path": "docs/postgres/04-mvcc/dead-tuples-and-bloat.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/routine-vacuuming.html#VACUUM-FOR-SPACE-RECOVERY",
        "https://www.postgresql.org/docs/18/pageinspect.html",
        "https://www.postgresql.org/docs/18/monitoring-stats.html#MONITORING-PG-STAT-ALL-TABLES-VIEW",
        "https://www.postgresql.org/docs/18/storage-hot.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "5e8bb2e07ef80bfe3e3aeb87b9d91b98f701aa04814164cbb027eb586e5138f8",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "227d7f5a4297016a4f424a583cd203fc277cdbbeff5baa1cd00de1d4bf5a9ea1",
        "schedule_occurrences": []
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml",
        "transcript": "docs/postgres/04-mvcc/parts/dead-tuples-and-bloat.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/04-mvcc/dead-tuples-and-bloat.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/04-mvcc/dead-tuples-and-bloat.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P8",
    "path": "docs/postgres/04-mvcc/long-transactions.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/04-mvcc/long-transactions.ts"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/routine-vacuuming.html#VACUUM-FOR-SPACE-RECOVERY",
        "https://www.postgresql.org/docs/18/monitoring-stats.html#MONITORING-PG-STAT-ACTIVITY-VIEW",
        "https://www.postgresql.org/docs/18/runtime-config-client.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "188e3908199aaa39e8118ff8a65add9821dc83cb03bb7e6d2b6c6fce07230e61",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "c295bbb046a8bc1ac46616efd7b8e6a71e940006f80aa1d2e963c5333175dfb4",
        "schedule_occurrences": []
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/04-mvcc/long-transactions.ts",
        "transcript": "docs/postgres/04-mvcc/parts/long-transactions.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/04-mvcc/long-transactions.ts",
        "llms": "docs/public/llms-full.txt#section=postgres/04-mvcc/long-transactions.ts",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P9",
    "path": "docs/postgres/04-mvcc/row-versions.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/04-mvcc/row-versions.ts"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/ddl-system-columns.html",
        "https://www.postgresql.org/docs/18/pageinspect.html",
        "https://www.postgresql.org/docs/18/storage-hot.html",
        "https://www.postgresql.org/docs/18/functions-info.html#FUNCTIONS-PG-SNAPSHOT",
        "https://www.postgresql.org/docs/18/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "986cf7b7fcdd2debe1d3e59c49bbab0c7061c3880f305ca150a9258ca4dba0f3",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "ab69a0ef3634367dcd975f51190b821e94c48f3d1c227e3636f92516707e46ce",
        "schedule_occurrences": []
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/04-mvcc/row-versions.ts",
        "transcript": "docs/postgres/04-mvcc/parts/row-versions.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/04-mvcc/row-versions.ts",
        "llms": "docs/public/llms-full.txt#section=postgres/04-mvcc/row-versions.ts",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P10",
    "path": "docs/postgres/04-mvcc/snapshots-under-the-hood.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/functions-info.html#FUNCTIONS-PG-SNAPSHOT",
        "https://www.postgresql.org/docs/18/transaction-id.html",
        "https://www.postgresql.org/docs/18/transaction-iso.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "7e5a2e20b71a377b703fa39357a0f6ca492917216842878e10095849ce8fc9a3",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "1ec3283ce65ae9e3f21eb2143e8336c9642426fef04c9454e7e60b196589f0b7",
        "schedule_occurrences": []
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts",
        "transcript": "docs/postgres/04-mvcc/parts/snapshots-under-the-hood.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/04-mvcc/snapshots-under-the-hood.ts",
        "llms": "docs/public/llms-full.txt#section=postgres/04-mvcc/snapshots-under-the-hood.ts",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P11",
    "path": "docs/postgres/04-mvcc/vacuum.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/04-mvcc/vacuum.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/routine-vacuuming.html#VACUUM-FOR-SPACE-RECOVERY",
        "https://www.postgresql.org/docs/18/sql-vacuum.html",
        "https://www.postgresql.org/docs/18/pageinspect.html",
        "https://www.postgresql.org/docs/18/storage-hot.html",
        "https://www.postgresql.org/docs/18/runtime-config-vacuum.html#GUC-VACUUM-TRUNCATE",
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-TABLES",
        "https://github.com/postgres/postgres/blob/REL_18_STABLE/src/include/storage/itemid.h"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "56696c0f0fe3e955127554bced120917a15644639d11bd6e0b6558c803fc3370",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "a7d997381322bd379140be021e109841c04fbae815c5fc2a1afe71013c30ac31",
        "schedule_occurrences": []
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/04-mvcc/vacuum.yaml",
        "transcript": "docs/postgres/04-mvcc/parts/vacuum.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/04-mvcc/vacuum.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/04-mvcc/vacuum.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P12",
    "path": "docs/postgres/04-mvcc/wraparound.md",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": [],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND",
        "https://www.postgresql.org/docs/18/runtime-config-vacuum.html",
        "https://www.postgresql.org/docs/18/catalog-pg-database.html",
        "https://www.postgresql.org/docs/18/functions-info.html#FUNCTIONS-PG-SNAPSHOT"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "78b9f00854712fe2e3dc46d68a799b21962ab56ab614ae7b0bd39a3a2bb9aa4e",
        "schedule_occurrences": []
      },
      "current": {
        "sha256": "815ecbc02139a55a3f0931b2fc89777f28caa1e4fad67b4b0456a7eec504f328",
        "schedule_occurrences": []
      }
    },
    "mirrors": []
  },
  {
    "id": "P13",
    "path": "scenarios/postgres/03-locking/alter-table-outage.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/alter-table-outage.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-TABLES",
        "https://www.postgresql.org/docs/18/sql-altertable.html",
        "https://www.postgresql.org/docs/18/runtime-config-client.html#GUC-LOCK-TIMEOUT",
        "https://www.postgresql.org/docs/18/sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "787e4cbb6157cc7cff79b036fc70c4224302dc011f4b44292c366fc7904d8710",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[0]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A is any long-lived transaction that has touched the table — a report, a stuck job…"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[1]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[2]",
            "session": "A",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "A": "SELECT balance FROM accounts WHERE id = 1",
              "tl": "SELECT (a long-lived transaction)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[3]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The migration needs ACCESS EXCLUSIVE, so it waits for A. Expected. But now —"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[4]",
            "session": "B",
            "sql": "ALTER TABLE accounts ADD COLUMN note text",
            "fields": {
              "B": "ALTER TABLE accounts ADD COLUMN note text",
              "blocks": "p1",
              "tl": "ALTER TABLE … ADD COLUMN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "— every new query on the table queues behind the *waiting* ALTER. This is the outage."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[6]",
            "session": "C",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "C": "SELECT balance FROM accounts WHERE id = 1",
              "blocks": "p2",
              "tl": "SELECT — just a read!"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT balance FROM accounts WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[7]",
            "session": "M",
            "sql": "SELECT waiter.application_name AS waiter, blocker.application_name AS blocker\nFROM pg_stat_activity waiter\nJOIN pg_stat_activity blocker ON blocker.pid = ANY (pg_blocking_pids(waiter.pid))\nWHERE waiter.wait_event_type = 'Lock'\nORDER BY waiter.application_name, blocker.application_name\n",
            "fields": {
              "M": "SELECT waiter.application_name AS waiter, blocker.application_name AS blocker\nFROM pg_stat_activity waiter\nJOIN pg_stat_activity blocker ON blocker.pid = ANY (pg_blocking_pids(waiter.pid))\nWHERE waiter.wait_event_type = 'Lock'\nORDER BY waiter.application_name, blocker.application_name\n",
              "expect": [
                {
                  "waiter": "B",
                  "blocker": "A"
                },
                {
                  "waiter": "C",
                  "blocker": "B"
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT balance FROM accounts WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT balance FROM accounts WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[8]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Only when A ends does the pile-up drain — migration first, then the reads."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT balance FROM accounts WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT balance FROM accounts WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[9]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT balance FROM accounts WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT balance FROM accounts WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[10]",
            "session": "B",
            "sql": "ALTER TABLE accounts ADD COLUMN note text",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT balance FROM accounts WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT balance FROM accounts WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[11]",
            "session": "C",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "success": "p2"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT balance FROM accounts WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "dceac638b22531fda2f2a4a231de64bbbb71fad2334df7231520d2039eb79650",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[0]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A reads accounts inside an explicit transaction and retains its table lock."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[1]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[2]",
            "session": "A",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "A": "SELECT balance FROM accounts WHERE id = 1",
              "tl": "SELECT (a long-lived transaction)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[3]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The migration needs ACCESS EXCLUSIVE, so it waits for A. Expected. But now —"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[4]",
            "session": "B",
            "sql": "ALTER TABLE accounts ADD COLUMN note text",
            "fields": {
              "B": "ALTER TABLE accounts ADD COLUMN note text",
              "blocks": "p1",
              "tl": "ALTER TABLE … ADD COLUMN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "C's new SELECT now waits behind the queued ALTER request."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[6]",
            "session": "C",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "C": "SELECT balance FROM accounts WHERE id = 1",
              "blocks": "p2",
              "tl": "SELECT — just a read!"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT balance FROM accounts WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[7]",
            "session": "M",
            "sql": "SELECT waiter.application_name AS waiter, blocker.application_name AS blocker\nFROM pg_stat_activity waiter\nJOIN pg_stat_activity blocker ON blocker.pid = ANY (pg_blocking_pids(waiter.pid))\nWHERE waiter.wait_event_type = 'Lock'\nORDER BY waiter.application_name, blocker.application_name\n",
            "fields": {
              "M": "SELECT waiter.application_name AS waiter, blocker.application_name AS blocker\nFROM pg_stat_activity waiter\nJOIN pg_stat_activity blocker ON blocker.pid = ANY (pg_blocking_pids(waiter.pid))\nWHERE waiter.wait_event_type = 'Lock'\nORDER BY waiter.application_name, blocker.application_name\n",
              "expect": [
                {
                  "waiter": "B",
                  "blocker": "A"
                },
                {
                  "waiter": "C",
                  "blocker": "B"
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT balance FROM accounts WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT balance FROM accounts WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[8]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A commits; B's standalone ALTER and C's read then complete."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT balance FROM accounts WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT balance FROM accounts WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[9]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT balance FROM accounts WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "ALTER TABLE accounts ADD COLUMN note text"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT balance FROM accounts WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[10]",
            "session": "B",
            "sql": "ALTER TABLE accounts ADD COLUMN note text",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"ALTER TABLE accounts ADD COLUMN note text\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT balance FROM accounts WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT balance FROM accounts WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/alter-table-outage.yaml#steps[11]",
            "session": "C",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "success": "p2",
              "expect": [
                {
                  "balance": 100
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT balance FROM accounts WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/alter-table-outage.yaml",
        "transcript": "docs/postgres/03-locking/parts/alter-table-outage.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/alter-table-outage.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/alter-table-outage.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P14",
    "path": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/ddl-lock-timeout.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-TABLES",
        "https://www.postgresql.org/docs/18/sql-altertable.html",
        "https://www.postgresql.org/docs/18/runtime-config-client.html#GUC-LOCK-TIMEOUT",
        "https://www.postgresql.org/docs/18/sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "55d751a32d3594319c0169c6184939abd71940481ee50fa39ffc1a5fafb74cf0",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[1]",
            "session": "A",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "A": "SELECT balance FROM accounts WHERE id = 1",
              "comment": "the same long transaction as before",
              "tl": "SELECT (long-lived txn) → holds ACCESS SHARE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[2]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Same migration — but this time it gives up after 100ms instead of camping in the queue."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[3]",
            "session": "B",
            "sql": "SET lock_timeout = '100ms'",
            "fields": {
              "B": "SET lock_timeout = '100ms'"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[4]",
            "session": "B",
            "sql": "ALTER TABLE accounts ADD COLUMN note text",
            "fields": {
              "B.fails": "ALTER TABLE accounts ADD COLUMN note text",
              "error": "55P03",
              "tl": "ALTER TABLE … → gives up after 100ms"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "No waiting ALTER in the queue means no outage: C's read is instant."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[6]",
            "session": "C",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "C": "SELECT balance FROM accounts WHERE id = 1",
              "expect": [
                {
                  "balance": 100
                }
              ],
              "tl": "SELECT → instant, nothing queued behind the ALTER"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[7]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[8]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Retry the migration when it can actually get the lock — now it sails through."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[9]",
            "session": "B",
            "sql": "ALTER TABLE accounts ADD COLUMN note text",
            "fields": {
              "B": "ALTER TABLE accounts ADD COLUMN note text",
              "tl": "ALTER TABLE … (retry sails through)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "ec82d448b8084a17f51b836f60a70b02a9bfc99838b94747aca72b8030c1e9cc",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[1]",
            "session": "A",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "A": "SELECT balance FROM accounts WHERE id = 1",
              "comment": "the same long transaction as before",
              "tl": "SELECT (long-lived txn) → holds ACCESS SHARE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[2]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Same migration — but this time it gives up after 100ms instead of camping in the queue."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[3]",
            "session": "B",
            "sql": "SET lock_timeout = '100ms'",
            "fields": {
              "B": "SET lock_timeout = '100ms'"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[4]",
            "session": "B",
            "sql": "ALTER TABLE accounts ADD COLUMN note text",
            "fields": {
              "B.fails": "ALTER TABLE accounts ADD COLUMN note text",
              "error": "55P03",
              "tl": "ALTER TABLE … → gives up after 100ms"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "After B's timeout removes its request, C's read returns 100. No read during B's wait is tested."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[6]",
            "session": "C",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "C": "SELECT balance FROM accounts WHERE id = 1",
              "expect": [
                {
                  "balance": 100
                }
              ],
              "tl": "SELECT after ALTER timeout → 100"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[7]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[8]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Retry the migration when it can actually get the lock — now it sails through."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[9]",
            "session": "B",
            "sql": "ALTER TABLE accounts ADD COLUMN note text",
            "fields": {
              "B": "ALTER TABLE accounts ADD COLUMN note text",
              "tl": "ALTER TABLE … (retry completes)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml#steps[10]",
            "session": "C",
            "sql": "SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'accounts' AND column_name = 'note'",
            "fields": {
              "C": "SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'accounts' AND column_name = 'note'",
              "expect": [
                {
                  "column_name": "note"
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/ddl-lock-timeout.yaml",
        "transcript": "docs/postgres/03-locking/parts/ddl-lock-timeout.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/ddl-lock-timeout.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/ddl-lock-timeout.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P15",
    "path": "scenarios/postgres/03-locking/deadlock-avoidance.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/deadlock-avoidance.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-DEADLOCKS",
        "https://www.postgresql.org/docs/18/runtime-config-locks.html#GUC-DEADLOCK-TIMEOUT"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "191db2e320d5873f3c0807b1c58ce91a5283b6dfe0e5485119f87936a3a0066d",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[0]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Both transfers grab *all* their row locks up front, ordered by id."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[1]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[2]",
            "session": "A",
            "sql": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE",
            "fields": {
              "A": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE",
              "tl": "SELECT id IN (1,2) … FOR UPDATE → locks both, in id order"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[3]",
            "session": "B",
            "sql": "BEGIN",
            "fields": {
              "B": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[4]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE",
            "fields": {
              "B": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE",
              "blocks": "p1",
              "tl": "SELECT id IN (1,2) … FOR UPDATE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "No cycle is possible: B parks at the first row and holds nothing A needs."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[6]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = balance - 10 WHERE id = 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[7]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance + 10 WHERE id = 2",
            "fields": {
              "A": "UPDATE accounts SET balance = balance + 10 WHERE id = 2"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[8]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT → releases both"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[9]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[10]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance - 25 WHERE id = 2",
            "fields": {
              "B": "UPDATE accounts SET balance = balance - 25 WHERE id = 2"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[11]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance + 25 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = balance + 25 WHERE id = 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[12]",
            "session": "B",
            "sql": "COMMIT",
            "fields": {
              "B": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[13]",
            "session": "A",
            "sql": "SELECT owner, balance FROM accounts ORDER BY id",
            "fields": {
              "A": "SELECT owner, balance FROM accounts ORDER BY id",
              "expect": [
                {
                  "owner": "alice",
                  "balance": 115
                },
                {
                  "owner": "bob",
                  "balance": 85
                }
              ],
              "comment": "both transfers landed — same workload, zero deadlocks"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "a8ebbc981323e8cd67500dc74a2631db831b4c96e7d33a7eb93a5f19f43b414e",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[0]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Both transfers grab *all* their row locks up front, ordered by id."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[1]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[2]",
            "session": "A",
            "sql": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE",
            "fields": {
              "A": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE",
              "tl": "SELECT id IN (1,2) … FOR UPDATE → locks both, in id order"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[3]",
            "session": "B",
            "sql": "BEGIN",
            "fields": {
              "B": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[4]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE",
            "fields": {
              "B": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE",
              "blocks": "p1",
              "tl": "SELECT id IN (1,2) … FOR UPDATE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "No cycle is possible: B parks at the first row and holds nothing A needs."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[6]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = balance - 10 WHERE id = 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[7]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance + 10 WHERE id = 2",
            "fields": {
              "A": "UPDATE accounts SET balance = balance + 10 WHERE id = 2"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[8]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT → releases both"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[9]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[10]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance - 25 WHERE id = 2",
            "fields": {
              "B": "UPDATE accounts SET balance = balance - 25 WHERE id = 2"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[11]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance + 25 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = balance + 25 WHERE id = 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[12]",
            "session": "B",
            "sql": "COMMIT",
            "fields": {
              "B": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock-avoidance.yaml#steps[13]",
            "session": "A",
            "sql": "SELECT owner, balance FROM accounts ORDER BY id",
            "fields": {
              "A": "SELECT owner, balance FROM accounts ORDER BY id",
              "expect": [
                {
                  "owner": "alice",
                  "balance": 115
                },
                {
                  "owner": "bob",
                  "balance": 85
                }
              ],
              "comment": "both transfers committed in this schedule"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/deadlock-avoidance.yaml",
        "transcript": "docs/postgres/03-locking/parts/deadlock-avoidance.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/deadlock-avoidance.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/deadlock-avoidance.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P16",
    "path": "scenarios/postgres/03-locking/deadlock.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/deadlock.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-DEADLOCKS",
        "https://www.postgresql.org/docs/18/runtime-config-locks.html#GUC-DEADLOCK-TIMEOUT"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "bd6dd9bd6c03fdd8fe13b7456964e356764d19c4f9f2e48471978af7efde46bb",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[0]",
            "session": "A",
            "sql": "SET deadlock_timeout = '10s'",
            "fields": {
              "A": "SET deadlock_timeout = '10s'",
              "comment": "In production the victim is effectively arbitrary — whichever waiter's deadlock_timeout (default 1s) fires first runs the check and aborts itself. We pin it here so the transcript is reproducible: B checks first."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[1]",
            "session": "B",
            "sql": "SET deadlock_timeout = '50ms'",
            "fields": {
              "B": "SET deadlock_timeout = '50ms'"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[2]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A transfers 10 from alice to bob; B transfers 25 from bob to alice."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[3]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[4]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
              "comment": "A locks alice",
              "tl": "locks alice (id=1)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[5]",
            "session": "B",
            "sql": "BEGIN",
            "fields": {
              "B": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[6]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance - 25 WHERE id = 2",
            "fields": {
              "B": "UPDATE accounts SET balance = balance - 25 WHERE id = 2",
              "comment": "B locks bob",
              "tl": "locks bob (id=2)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A now needs bob's row (B has it) — it waits."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[8]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance + 10 WHERE id = 2",
            "fields": {
              "A": "UPDATE accounts SET balance = balance + 10 WHERE id = 2",
              "blocks": "p1",
              "tl": "needs bob (id=2)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 2"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[9]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "B now needs alice's row (A has it). A waits for B, B waits for A: a cycle."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 2\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 2"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[10]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance + 25 WHERE id = 1",
            "fields": {
              "B.fails": "UPDATE accounts SET balance = balance + 25 WHERE id = 1",
              "error": "40P01",
              "comment": "deadlock_detected — B is aborted…",
              "tl": "needs alice (id=1)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 2\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 2"
              },
              "B": {
                "phase": "explicit failed (database effects aborted; awaits transaction end)",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[11]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The victim's abort frees bob's row, so A's stuck UPDATE completes."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 2\"}; B={\"phase\":\"explicit failed (database effects aborted; awaits transaction end)\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 2"
              },
              "B": {
                "phase": "explicit failed (database effects aborted; awaits transaction end)",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[12]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance + 10 WHERE id = 2",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 2\"}; B={\"phase\":\"explicit failed (database effects aborted; awaits transaction end)\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "explicit failed (database effects aborted; awaits transaction end)",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[13]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"explicit failed (database effects aborted; awaits transaction end)\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "explicit failed (database effects aborted; awaits transaction end)",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[14]",
            "session": "B",
            "sql": "ROLLBACK",
            "fields": {
              "B": "ROLLBACK"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"explicit failed (database effects aborted; awaits transaction end)\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[15]",
            "session": "A",
            "sql": "SELECT owner, balance FROM accounts ORDER BY id",
            "fields": {
              "A": "SELECT owner, balance FROM accounts ORDER BY id",
              "expect": [
                {
                  "owner": "alice",
                  "balance": 90
                },
                {
                  "owner": "bob",
                  "balance": 110
                }
              ],
              "comment": "A's transfer survived; B's evaporated — retry it"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "715816bfadc774d3defc5ccf36bc870984bf3af9ecf768b0fe999bf7fabe3238",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[0]",
            "session": "A",
            "sql": "SET deadlock_timeout = '10s'",
            "fields": {
              "A": "SET deadlock_timeout = '10s'",
              "comment": "General victim choice must not be relied on. These unequal detection timeouts make B the observed victim in this controlled schedule; no universal minimum cycle duration is asserted."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[1]",
            "session": "B",
            "sql": "SET deadlock_timeout = '50ms'",
            "fields": {
              "B": "SET deadlock_timeout = '50ms'"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[2]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A transfers 10 from alice to bob; B transfers 25 from bob to alice."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[3]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[4]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
              "comment": "A locks alice",
              "tl": "locks alice (id=1)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[5]",
            "session": "B",
            "sql": "BEGIN",
            "fields": {
              "B": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[6]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance - 25 WHERE id = 2",
            "fields": {
              "B": "UPDATE accounts SET balance = balance - 25 WHERE id = 2",
              "comment": "B locks bob",
              "tl": "locks bob (id=2)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A now needs bob's row (B has it) — it waits."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[8]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance + 10 WHERE id = 2",
            "fields": {
              "A": "UPDATE accounts SET balance = balance + 10 WHERE id = 2",
              "blocks": "p1",
              "tl": "needs bob (id=2)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 2"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[9]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "B now needs alice's row (A has it). A waits for B, B waits for A: a cycle."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 2\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 2"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[10]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance + 25 WHERE id = 1",
            "fields": {
              "B.fails": "UPDATE accounts SET balance = balance + 25 WHERE id = 1",
              "error": "40P01",
              "comment": "deadlock_detected — B is aborted…",
              "tl": "needs alice (id=1)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 2\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 2"
              },
              "B": {
                "phase": "explicit failed (database effects aborted; awaits transaction end)",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[11]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The victim's abort frees bob's row, so A's stuck UPDATE completes."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 2\"}; B={\"phase\":\"explicit failed (database effects aborted; awaits transaction end)\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 2"
              },
              "B": {
                "phase": "explicit failed (database effects aborted; awaits transaction end)",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[12]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance + 10 WHERE id = 2",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 2\"}; B={\"phase\":\"explicit failed (database effects aborted; awaits transaction end)\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "explicit failed (database effects aborted; awaits transaction end)",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[13]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"explicit failed (database effects aborted; awaits transaction end)\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "explicit failed (database effects aborted; awaits transaction end)",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[14]",
            "session": "B",
            "sql": "ROLLBACK",
            "fields": {
              "B": "ROLLBACK"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"explicit failed (database effects aborted; awaits transaction end)\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/deadlock.yaml#steps[15]",
            "session": "A",
            "sql": "SELECT owner, balance FROM accounts ORDER BY id",
            "fields": {
              "A": "SELECT owner, balance FROM accounts ORDER BY id",
              "expect": [
                {
                  "owner": "alice",
                  "balance": 90
                },
                {
                  "owner": "bob",
                  "balance": 110
                }
              ],
              "comment": "A's transfer committed; B's database changes did not commit"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"10s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"50ms\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "10s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "50ms"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/deadlock.yaml",
        "transcript": "docs/postgres/03-locking/parts/deadlock.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/deadlock.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/deadlock.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P17",
    "path": "scenarios/postgres/03-locking/fk-key-share.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/fk-key-share.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-ROWS",
        "https://www.postgresql.org/docs/18/explicit-locking.html#ROW-LOCK-COMPATIBILITY",
        "https://www.postgresql.org/docs/18/sql-select.html#SQL-FOR-UPDATE-SHARE",
        "https://github.com/postgres/postgres/blob/REL_18_STABLE/src/backend/utils/adt/ri_triggers.c"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "1b3a3bf492e459ed78f4e1eba726c4b2ab76e5951ea7885228567bb4a8e5746b",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[1]",
            "session": "A",
            "sql": "INSERT INTO orders VALUES (1, 1)",
            "fields": {
              "A": "INSERT INTO orders VALUES (1, 1)",
              "comment": "FK check locks customers row 1 FOR KEY SHARE",
              "tl": "INSERT child → FK locks parent FOR KEY SHARE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[2]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "FOR KEY SHARE doesn't mind non-key updates — B can change the balance."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[3]",
            "session": "B",
            "sql": "UPDATE customers SET balance = 50 WHERE id = 1",
            "fields": {
              "B": "UPDATE customers SET balance = 50 WHERE id = 1",
              "tl": "UPDATE parent balance → allowed (non-key)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[4]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "But DELETE needs the strongest row lock (FOR UPDATE) — B has to wait."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[5]",
            "session": "B",
            "sql": "DELETE FROM customers WHERE id = 1",
            "fields": {
              "B": "DELETE FROM customers WHERE id = 1",
              "blocks": "p1",
              "tl": "DELETE parent → needs FOR UPDATE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "DELETE FROM customers WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[6]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"DELETE FROM customers WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "DELETE FROM customers WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A's order is now committed, so B's DELETE resumes — straight into the FK."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"DELETE FROM customers WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "DELETE FROM customers WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[8]",
            "session": "B",
            "sql": "DELETE FROM customers WHERE id = 1",
            "fields": {
              "failure": "p1",
              "error": "23503"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"DELETE FROM customers WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[9]",
            "session": "B",
            "sql": "SELECT balance FROM customers WHERE id = 1",
            "fields": {
              "B": "SELECT balance FROM customers WHERE id = 1",
              "expect": [
                {
                  "balance": 50
                }
              ],
              "comment": "the parent survived, with B's earlier non-key update intact"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "be2b6c367e209147d9cd00fa9918d25718a76827468e8308cbb8760ae6d01bc0",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[1]",
            "session": "A",
            "sql": "INSERT INTO orders VALUES (1, 1)",
            "fields": {
              "A": "INSERT INTO orders VALUES (1, 1)",
              "comment": "FK check locks customers row 1 FOR KEY SHARE",
              "tl": "INSERT child → FK locks parent FOR KEY SHARE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[2]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "FOR KEY SHARE doesn't mind non-key updates — B can change the balance."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[3]",
            "session": "B",
            "sql": "UPDATE customers SET balance = 50 WHERE id = 1",
            "fields": {
              "B": "UPDATE customers SET balance = 50 WHERE id = 1",
              "tl": "UPDATE parent balance → allowed (non-key)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[4]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "But DELETE needs the strongest row lock (FOR UPDATE) — B has to wait."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[5]",
            "session": "B",
            "sql": "DELETE FROM customers WHERE id = 1",
            "fields": {
              "B": "DELETE FROM customers WHERE id = 1",
              "blocks": "p1",
              "tl": "DELETE parent → needs FOR UPDATE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "DELETE FROM customers WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[6]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"DELETE FROM customers WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "DELETE FROM customers WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A's order is now committed, so B's DELETE resumes — straight into the FK."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"DELETE FROM customers WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "DELETE FROM customers WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[8]",
            "session": "B",
            "sql": "DELETE FROM customers WHERE id = 1",
            "fields": {
              "failure": "p1",
              "error": "23503"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"DELETE FROM customers WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/fk-key-share.yaml#steps[9]",
            "session": "B",
            "sql": "SELECT balance FROM customers WHERE id = 1",
            "fields": {
              "B": "SELECT balance FROM customers WHERE id = 1",
              "expect": [
                {
                  "balance": 50
                }
              ],
              "comment": "the parent survived, with B's earlier non-key update intact"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/fk-key-share.yaml",
        "transcript": "docs/postgres/03-locking/parts/fk-key-share.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/fk-key-share.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/fk-key-share.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P18",
    "path": "scenarios/postgres/03-locking/for-update-blocks.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/for-update-blocks.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-ROWS",
        "https://www.postgresql.org/docs/18/explicit-locking.html#ROW-LOCK-COMPATIBILITY",
        "https://www.postgresql.org/docs/18/sql-select.html#SQL-FOR-UPDATE-SHARE",
        "https://github.com/postgres/postgres/blob/REL_18_STABLE/src/backend/utils/adt/ri_triggers.c"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "e7ec34c4b4bab1282d70ddc0d3a6cc8fde6211733d17cbcb0ea76932d00cb2e7",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[1]",
            "session": "A",
            "sql": "SELECT * FROM accounts WHERE id = 1 FOR UPDATE",
            "fields": {
              "A": "SELECT * FROM accounts WHERE id = 1 FOR UPDATE",
              "tl": "SELECT … FOR UPDATE (locks the row)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[2]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Reading the locked row costs B nothing — MVCC readers don't take row locks."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[3]",
            "session": "B",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "B": "SELECT balance FROM accounts WHERE id = 1",
              "expect": [
                {
                  "balance": 100
                }
              ],
              "tl": "SELECT balance → 100 (readers don't block)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[4]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Writing to it is another story: B's UPDATE must wait for A."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[5]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
              "blocks": "p1",
              "tl": "UPDATE -10"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance - 10 WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[6]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = 150 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = 150 WHERE id = 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance - 10 WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance - 10 WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[7]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "comment": "releases the row lock",
              "tl": "COMMIT (releases the lock)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance - 10 WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance - 10 WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[8]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance - 10 WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[9]",
            "session": "B",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "B": "SELECT balance FROM accounts WHERE id = 1",
              "expect": [
                {
                  "balance": 140
                }
              ],
              "comment": "B's -10 applied on top of A's committed 150"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "8e0f475793c80dcd328a444276d1a079115f70870e99d029e0a025a467fc7250",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[1]",
            "session": "A",
            "sql": "SELECT * FROM accounts WHERE id = 1 FOR UPDATE",
            "fields": {
              "A": "SELECT * FROM accounts WHERE id = 1 FOR UPDATE",
              "tl": "SELECT … FOR UPDATE (locks the row)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[2]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "B's ordinary SELECT reads the row without a conflicting row-lock request; cost is not measured."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[3]",
            "session": "B",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "B": "SELECT balance FROM accounts WHERE id = 1",
              "expect": [
                {
                  "balance": 100
                }
              ],
              "tl": "ordinary SELECT → 100"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[4]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Writing to it is another story: B's UPDATE must wait for A."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[5]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
              "blocks": "p1",
              "tl": "UPDATE -10"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance - 10 WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[6]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = 150 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = 150 WHERE id = 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance - 10 WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance - 10 WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[7]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "comment": "releases the row lock",
              "tl": "COMMIT (releases the lock)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance - 10 WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance - 10 WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[8]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance - 10 WHERE id = 1",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance - 10 WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/for-update-blocks.yaml#steps[9]",
            "session": "B",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "B": "SELECT balance FROM accounts WHERE id = 1",
              "expect": [
                {
                  "balance": 140
                }
              ],
              "comment": "B's -10 applied on top of A's committed 150"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/for-update-blocks.yaml",
        "transcript": "docs/postgres/03-locking/parts/for-update-blocks.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/for-update-blocks.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/for-update-blocks.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P19",
    "path": "scenarios/postgres/03-locking/lock-mode-matrix.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/lock-mode-matrix.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-ROWS",
        "https://www.postgresql.org/docs/18/explicit-locking.html#ROW-LOCK-COMPATIBILITY",
        "https://www.postgresql.org/docs/18/sql-select.html#SQL-FOR-UPDATE-SHARE",
        "https://github.com/postgres/postgres/blob/REL_18_STABLE/src/backend/utils/adt/ri_triggers.c"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "3ffa874f2f750bcbc9b64873f997658c81a5ad8226699cc6e3ef3eb87dcc6e0d",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[0]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Two FOR SHARE locks on the same row coexist happily…"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[1]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[2]",
            "session": "A",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR SHARE",
            "fields": {
              "A": "SELECT id FROM accounts WHERE id = 1 FOR SHARE",
              "tl": "SELECT … FOR SHARE (A)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[3]",
            "session": "B",
            "sql": "BEGIN",
            "fields": {
              "B": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[4]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR SHARE",
            "fields": {
              "B": "SELECT id FROM accounts WHERE id = 1 FOR SHARE",
              "tl": "SELECT … FOR SHARE (B) → coexists"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[5]",
            "session": "B",
            "sql": "COMMIT",
            "fields": {
              "B": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[6]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "…but FOR SHARE still blocks a plain UPDATE (which takes FOR NO KEY UPDATE)."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[7]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = 200 WHERE id = 1",
              "blocks": "p1",
              "tl": "UPDATE → FOR NO KEY UPDATE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 200 WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[8]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT (releases A's FOR SHARE)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 200 WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 200 WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[9]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 1",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 200 WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[10]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The weakest lock, FOR KEY SHARE, even coexists with a running UPDATE…"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[11]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[12]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = 300 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = 300 WHERE id = 1",
              "tl": "UPDATE → FOR NO KEY UPDATE (A)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[13]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR KEY SHARE",
            "fields": {
              "B": "SELECT id FROM accounts WHERE id = 1 FOR KEY SHARE",
              "tl": "SELECT … FOR KEY SHARE → coexists with the UPDATE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[14]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "…while the strongest, FOR UPDATE, has to wait for it."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[15]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE",
            "fields": {
              "B": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE",
              "blocks": "p2",
              "tl": "SELECT … FOR UPDATE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[16]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT (releases A)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id = 1 FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[17]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE",
            "fields": {
              "success": "p2"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id = 1 FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "b255fb4acb537c54ab22b54719987f6e67916061858ed86bccf899dee6a05cdf",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[0]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Two FOR SHARE locks on the same row coexist happily…"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[1]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[2]",
            "session": "A",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR SHARE",
            "fields": {
              "A": "SELECT id FROM accounts WHERE id = 1 FOR SHARE",
              "tl": "SELECT … FOR SHARE (A)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[3]",
            "session": "B",
            "sql": "BEGIN",
            "fields": {
              "B": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[4]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR SHARE",
            "fields": {
              "B": "SELECT id FROM accounts WHERE id = 1 FOR SHARE",
              "tl": "SELECT … FOR SHARE (B) → coexists"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[5]",
            "session": "B",
            "sql": "COMMIT",
            "fields": {
              "B": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[6]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "…but FOR SHARE still blocks a plain UPDATE (which takes FOR NO KEY UPDATE)."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[7]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = 200 WHERE id = 1",
              "blocks": "p1",
              "tl": "UPDATE → FOR NO KEY UPDATE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 200 WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[8]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT (releases A's FOR SHARE)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 200 WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 200 WHERE id = 1"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[9]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 1",
            "fields": {
              "success": "p1",
              "affected": 1
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 200 WHERE id = 1\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[10]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The weakest lock, FOR KEY SHARE, even coexists with a running UPDATE…"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[11]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[12]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = 300 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = 300 WHERE id = 1",
              "tl": "UPDATE → FOR NO KEY UPDATE (A)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[13]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR KEY SHARE",
            "fields": {
              "B": "SELECT id FROM accounts WHERE id = 1 FOR KEY SHARE",
              "tl": "SELECT … FOR KEY SHARE → coexists with the UPDATE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[14]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "…while the strongest, FOR UPDATE, has to wait for it."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[15]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE",
            "fields": {
              "B": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE",
              "blocks": "p2",
              "tl": "SELECT … FOR UPDATE"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[16]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT (releases A)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id = 1 FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-mode-matrix.yaml#steps[17]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE",
            "fields": {
              "success": "p2",
              "expect": [
                {
                  "id": 1
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"SELECT id FROM accounts WHERE id = 1 FOR UPDATE\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/lock-mode-matrix.yaml",
        "transcript": "docs/postgres/03-locking/parts/lock-mode-matrix.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/lock-mode-matrix.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/lock-mode-matrix.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P20",
    "path": "scenarios/postgres/03-locking/lock-queue-fifo.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/lock-queue-fifo.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/functions-info.html#FUNCTIONS-INFO-SESSION",
        "https://www.postgresql.org/docs/18/view-pg-locks.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "ed2ff5e4ee730da008c45204499dd0d132a19f2ba2cfd4a148161bb93c28390d",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[1]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance + 1 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = balance + 1 WHERE id = 1",
              "tl": "UPDATE +1 (takes the row lock)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[2]",
            "session": "B",
            "sql": "BEGIN",
            "fields": {
              "B": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[3]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance + 10 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = balance + 10 WHERE id = 1",
              "blocks": "p1",
              "tl": "UPDATE +10"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[4]",
            "session": "C",
            "sql": "UPDATE accounts SET balance = balance + 100 WHERE id = 1",
            "fields": {
              "C": "UPDATE accounts SET balance = balance + 100 WHERE id = 1",
              "blocks": "p2",
              "tl": "UPDATE +100"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A fourth session, M, can watch the pile-up in pg_stat_activity."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[6]",
            "session": "M",
            "sql": "SELECT application_name AS waiting, pg_blocking_pids(pid) AS blocked_by\nFROM pg_stat_activity\nWHERE wait_event_type = 'Lock'\nORDER BY application_name\n",
            "fields": {
              "M": "SELECT application_name AS waiting, pg_blocking_pids(pid) AS blocked_by\nFROM pg_stat_activity\nWHERE wait_event_type = 'Lock'\nORDER BY application_name\n",
              "expect": [
                {
                  "waiting": "B"
                },
                {
                  "waiting": "C"
                }
              ],
              "tl": "who's waiting? → B and C"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A commits. The lock goes to B — the head of the queue — not to C."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[8]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT → lock passes to B"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[9]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance + 10 WHERE id = 1",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[10]",
            "session": null,
            "sql": null,
            "fields": {
              "locked": "C"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[11]",
            "session": "M",
            "sql": "SELECT application_name AS waiting, pg_blocking_pids(pid) AS blocked_by\nFROM pg_stat_activity\nWHERE wait_event_type = 'Lock'\nORDER BY application_name\n",
            "fields": {
              "M": "SELECT application_name AS waiting, pg_blocking_pids(pid) AS blocked_by\nFROM pg_stat_activity\nWHERE wait_event_type = 'Lock'\nORDER BY application_name\n",
              "expect": [
                {
                  "waiting": "C"
                }
              ],
              "comment": "C is still in line, now behind B"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[12]",
            "session": "B",
            "sql": "COMMIT",
            "fields": {
              "B": "COMMIT",
              "tl": "COMMIT → lock passes to C"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[13]",
            "session": "C",
            "sql": "UPDATE accounts SET balance = balance + 100 WHERE id = 1",
            "fields": {
              "success": "p2"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[14]",
            "session": "C",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "C": "SELECT balance FROM accounts WHERE id = 1",
              "expect": [
                {
                  "balance": 211
                }
              ],
              "comment": "100 + 1 + 10 + 100 — every update landed, in queue order"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "c91477412ef25683982f04dcdad86b2a6062176c385967756472239d9b99bf78",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[1]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = balance + 1 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = balance + 1 WHERE id = 1",
              "tl": "UPDATE +1 (takes the row lock)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[2]",
            "session": "B",
            "sql": "BEGIN",
            "fields": {
              "B": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[3]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance + 10 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = balance + 10 WHERE id = 1",
              "blocks": "p1",
              "tl": "UPDATE +10"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[4]",
            "session": "C",
            "sql": "UPDATE accounts SET balance = balance + 100 WHERE id = 1",
            "fields": {
              "C": "UPDATE accounts SET balance = balance + 100 WHERE id = 1",
              "blocks": "p2",
              "tl": "UPDATE +100"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A fourth session, M, can watch the pile-up in pg_stat_activity."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[6]",
            "session": "M",
            "sql": "SELECT application_name AS waiting, pg_blocking_pids(pid) AS blocked_by\nFROM pg_stat_activity\nWHERE wait_event_type = 'Lock'\nORDER BY application_name\n",
            "fields": {
              "M": "SELECT application_name AS waiting, pg_blocking_pids(pid) AS blocked_by\nFROM pg_stat_activity\nWHERE wait_event_type = 'Lock'\nORDER BY application_name\n",
              "expect": [
                {
                  "waiting": "B"
                },
                {
                  "waiting": "C"
                }
              ],
              "tl": "who's waiting? → B and C"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A commits. B completes while C is observed waiting again."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[8]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT → lock passes to B"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 10 WHERE id = 1"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[9]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = balance + 10 WHERE id = 1",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 10 WHERE id = 1\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[10]",
            "session": null,
            "sql": null,
            "fields": {
              "locked": "C"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[11]",
            "session": "M",
            "sql": "SELECT application_name AS waiting, pg_blocking_pids(pid) AS blocked_by\nFROM pg_stat_activity\nWHERE wait_event_type = 'Lock'\nORDER BY application_name\n",
            "fields": {
              "M": "SELECT application_name AS waiting, pg_blocking_pids(pid) AS blocked_by\nFROM pg_stat_activity\nWHERE wait_event_type = 'Lock'\nORDER BY application_name\n",
              "expect": [
                {
                  "waiting": "C"
                }
              ],
              "comment": "C is still in line, now behind B"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[12]",
            "session": "B",
            "sql": "COMMIT",
            "fields": {
              "B": "COMMIT",
              "tl": "COMMIT → lock passes to C"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = balance + 100 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[13]",
            "session": "C",
            "sql": "UPDATE accounts SET balance = balance + 100 WHERE id = 1",
            "fields": {
              "success": "p2"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = balance + 100 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-queue-fifo.yaml#steps[14]",
            "session": "C",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "C": "SELECT balance FROM accounts WHERE id = 1",
              "expect": [
                {
                  "balance": 211
                }
              ],
              "comment": "100 + 1 + 10 + 100 — every update landed, in queue order"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/lock-queue-fifo.yaml",
        "transcript": "docs/postgres/03-locking/parts/lock-queue-fifo.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/lock-queue-fifo.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/lock-queue-fifo.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P21",
    "path": "scenarios/postgres/03-locking/lock-timeout.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/lock-timeout.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/sql-select.html#SQL-FOR-UPDATE-SHARE",
        "https://www.postgresql.org/docs/18/runtime-config-client.html#GUC-LOCK-TIMEOUT",
        "https://www.postgresql.org/docs/18/sql-rollback.html",
        "https://www.postgresql.org/docs/18/sql-rollback-to.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "58eedd7bba68a4ee439feea4351d439ad6f3a177f9a66b0fc5ca7d0d2d5a90d5",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[1]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = 200 WHERE id = 1",
              "tl": "UPDATE 200 (locks row 1)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[2]",
            "session": "B",
            "sql": "SET lock_timeout = '100ms'",
            "fields": {
              "B": "SET lock_timeout = '100ms'"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[3]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "B queues for the row lock like anyone else — but gives up after 100ms."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[4]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 300 WHERE id = 1",
            "fields": {
              "B.fails": "UPDATE accounts SET balance = 300 WHERE id = 1",
              "error": "55P03",
              "comment": "lock_not_available, raised after the timeout",
              "tl": "UPDATE 300 → gives up after 100ms"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The failure canceled only B's statement — a retry after A commits works."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[6]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[7]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 300 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = 300 WHERE id = 1",
              "tl": "UPDATE 300 (retry succeeds)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[8]",
            "session": "B",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "B": "SELECT balance FROM accounts WHERE id = 1",
              "expect": [
                {
                  "balance": 300
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "a9dfa662cf646ace0fed682f3d2c308920534ce4f2c6f1b6e78e0d49ee17c468",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[1]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = 200 WHERE id = 1",
              "tl": "UPDATE 200 (locks row 1)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[2]",
            "session": "B",
            "sql": "SET lock_timeout = '100ms'",
            "fields": {
              "B": "SET lock_timeout = '100ms'"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[3]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "B queues for the row lock like anyone else — but gives up after 100ms."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[4]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 300 WHERE id = 1",
            "fields": {
              "B.fails": "UPDATE accounts SET balance = 300 WHERE id = 1",
              "error": "55P03",
              "comment": "lock_not_available, raised after the timeout",
              "tl": "UPDATE 300 → gives up after 100ms"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "B's failed standalone statement ends its implicit transaction; a fresh attempt after A commits works here."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[6]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[7]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 300 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = 300 WHERE id = 1",
              "tl": "UPDATE 300 (retry succeeds)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/lock-timeout.yaml#steps[8]",
            "session": "B",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "fields": {
              "B": "SELECT balance FROM accounts WHERE id = 1",
              "expect": [
                {
                  "balance": 300
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"100ms\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "100ms",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/lock-timeout.yaml",
        "transcript": "docs/postgres/03-locking/parts/lock-timeout.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/lock-timeout.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/lock-timeout.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P22",
    "path": "scenarios/postgres/03-locking/monitoring-locks.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/monitoring-locks.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/view-pg-locks.html",
        "https://www.postgresql.org/docs/18/monitoring-stats.html#MONITORING-PG-STAT-ACTIVITY-VIEW",
        "https://www.postgresql.org/docs/18/functions-info.html#FUNCTIONS-INFO-SESSION"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "7968ddf364ff22667782b393cbf8c0245d454a9ac1d085b3f122da458c82145f",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[1]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = 200 WHERE id = 1",
              "tl": "UPDATE (takes the row lock)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[2]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "One innocent UPDATE = four locks: table, index, its own xid, its own virtual xid."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[3]",
            "session": "M",
            "sql": "SELECT l.locktype, l.relation::regclass AS relation, l.mode, l.granted\nFROM pg_locks l JOIN pg_stat_activity a ON a.pid = l.pid\nWHERE a.application_name = 'A'\nORDER BY l.locktype, l.relation::regclass::text, l.mode\n",
            "fields": {
              "M": "SELECT l.locktype, l.relation::regclass AS relation, l.mode, l.granted\nFROM pg_locks l JOIN pg_stat_activity a ON a.pid = l.pid\nWHERE a.application_name = 'A'\nORDER BY l.locktype, l.relation::regclass::text, l.mode\n",
              "expect": [
                {
                  "locktype": "relation",
                  "relation": "accounts",
                  "mode": "RowExclusiveLock",
                  "granted": true
                },
                {
                  "locktype": "relation",
                  "relation": "accounts_pkey",
                  "mode": "RowExclusiveLock",
                  "granted": true
                },
                {
                  "locktype": "transactionid",
                  "relation": null,
                  "mode": "ExclusiveLock",
                  "granted": true
                },
                {
                  "locktype": "virtualxid",
                  "relation": null,
                  "mode": "ExclusiveLock",
                  "granted": true
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[4]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 300 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = 300 WHERE id = 1",
              "blocks": "p1",
              "tl": "UPDATE → waits on A"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The waiter's tell: a lock row with granted = f — it wants A's transaction id."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[6]",
            "session": "M",
            "sql": "SELECT l.locktype, l.mode, l.granted\nFROM pg_locks l JOIN pg_stat_activity a ON a.pid = l.pid\nWHERE a.application_name = 'B' AND NOT l.granted\n",
            "fields": {
              "M": "SELECT l.locktype, l.mode, l.granted\nFROM pg_locks l JOIN pg_stat_activity a ON a.pid = l.pid\nWHERE a.application_name = 'B' AND NOT l.granted\n",
              "expect": [
                {
                  "locktype": "transactionid",
                  "mode": "ShareLock",
                  "granted": false
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "You rarely need to decode pg_locks by hand — pg_blocking_pids() names the culprit."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[8]",
            "session": "M",
            "sql": "SELECT waiter.application_name AS waiter, blocker.application_name AS blocker\nFROM pg_stat_activity waiter\nJOIN pg_stat_activity blocker ON blocker.pid = ANY (pg_blocking_pids(waiter.pid))\nWHERE waiter.wait_event_type = 'Lock'\nORDER BY waiter.application_name, blocker.application_name\n",
            "fields": {
              "M": "SELECT waiter.application_name AS waiter, blocker.application_name AS blocker\nFROM pg_stat_activity waiter\nJOIN pg_stat_activity blocker ON blocker.pid = ANY (pg_blocking_pids(waiter.pid))\nWHERE waiter.wait_event_type = 'Lock'\nORDER BY waiter.application_name, blocker.application_name\n",
              "expect": [
                {
                  "waiter": "B",
                  "blocker": "A"
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[9]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[10]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 300 WHERE id = 1",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "5eea52c84fc712dcbf404558bbbff9f49634c2a4964ac8c123e5e64ade371fbe",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[1]",
            "session": "A",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 1",
            "fields": {
              "A": "UPDATE accounts SET balance = 200 WHERE id = 1",
              "tl": "UPDATE (takes the row lock)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[2]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "This UPDATE's inspected lock entries: table, index, assigned xid and virtual xid."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[3]",
            "session": "M",
            "sql": "SELECT l.locktype, l.relation::regclass AS relation, l.mode, l.granted\nFROM pg_locks l JOIN pg_stat_activity a ON a.pid = l.pid\nWHERE a.application_name = 'A'\nORDER BY l.locktype, l.relation::regclass::text, l.mode\n",
            "fields": {
              "M": "SELECT l.locktype, l.relation::regclass AS relation, l.mode, l.granted\nFROM pg_locks l JOIN pg_stat_activity a ON a.pid = l.pid\nWHERE a.application_name = 'A'\nORDER BY l.locktype, l.relation::regclass::text, l.mode\n",
              "expect": [
                {
                  "locktype": "relation",
                  "relation": "accounts",
                  "mode": "RowExclusiveLock",
                  "granted": true
                },
                {
                  "locktype": "relation",
                  "relation": "accounts_pkey",
                  "mode": "RowExclusiveLock",
                  "granted": true
                },
                {
                  "locktype": "transactionid",
                  "relation": null,
                  "mode": "ExclusiveLock",
                  "granted": true
                },
                {
                  "locktype": "virtualxid",
                  "relation": null,
                  "mode": "ExclusiveLock",
                  "granted": true
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[4]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 300 WHERE id = 1",
            "fields": {
              "B": "UPDATE accounts SET balance = 300 WHERE id = 1",
              "blocks": "p1",
              "tl": "UPDATE → waits on A"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The waiter's tell: a lock row with granted = f — it wants A's transaction id."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[6]",
            "session": "M",
            "sql": "SELECT l.locktype, l.mode, l.granted\nFROM pg_locks l JOIN pg_stat_activity a ON a.pid = l.pid\nWHERE a.application_name = 'B' AND NOT l.granted\n",
            "fields": {
              "M": "SELECT l.locktype, l.mode, l.granted\nFROM pg_locks l JOIN pg_stat_activity a ON a.pid = l.pid\nWHERE a.application_name = 'B' AND NOT l.granted\n",
              "expect": [
                {
                  "locktype": "transactionid",
                  "mode": "ShareLock",
                  "granted": false
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "You rarely need to decode pg_locks by hand — pg_blocking_pids() names the culprit."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[8]",
            "session": "M",
            "sql": "SELECT waiter.application_name AS waiter, blocker.application_name AS blocker\nFROM pg_stat_activity waiter\nJOIN pg_stat_activity blocker ON blocker.pid = ANY (pg_blocking_pids(waiter.pid))\nWHERE waiter.wait_event_type = 'Lock'\nORDER BY waiter.application_name, blocker.application_name\n",
            "fields": {
              "M": "SELECT waiter.application_name AS waiter, blocker.application_name AS blocker\nFROM pg_stat_activity waiter\nJOIN pg_stat_activity blocker ON blocker.pid = ANY (pg_blocking_pids(waiter.pid))\nWHERE waiter.wait_event_type = 'Lock'\nORDER BY waiter.application_name, blocker.application_name\n",
              "expect": [
                {
                  "waiter": "B",
                  "blocker": "A"
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[9]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "implicit active pending",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s",
                "pending": "UPDATE accounts SET balance = 300 WHERE id = 1"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/monitoring-locks.yaml#steps[10]",
            "session": "B",
            "sql": "UPDATE accounts SET balance = 300 WHERE id = 1",
            "fields": {
              "success": "p1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"implicit active pending\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\",\"pending\":\"UPDATE accounts SET balance = 300 WHERE id = 1\"}; M={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "M": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/monitoring-locks.yaml",
        "transcript": "docs/postgres/03-locking/parts/monitoring-locks.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/monitoring-locks.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/monitoring-locks.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P23",
    "path": "scenarios/postgres/03-locking/nowait.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/nowait.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/sql-select.html#SQL-FOR-UPDATE-SHARE",
        "https://www.postgresql.org/docs/18/runtime-config-client.html#GUC-LOCK-TIMEOUT",
        "https://www.postgresql.org/docs/18/sql-rollback.html",
        "https://www.postgresql.org/docs/18/sql-rollback-to.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "15f93408e3180097d7e17e92b8f3c69a014beb8b4fc9ac0a25dd2ccf1ae3b704",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[1]",
            "session": "A",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE",
            "fields": {
              "A": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE",
              "tl": "SELECT … FOR UPDATE (locks row 1)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[2]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE NOWAIT",
            "fields": {
              "B.fails": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE NOWAIT",
              "error": "55P03",
              "comment": "lock_not_available — instantly, no waiting",
              "tl": "… FOR UPDATE NOWAIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[3]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Once A is done, the same statement succeeds."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[4]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT (releases the lock)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[5]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE NOWAIT",
            "fields": {
              "B": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE NOWAIT",
              "expect": [
                {
                  "id": 1
                }
              ],
              "tl": "… NOWAIT → row 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "7338e8a76ee61d0f202c303a5a6606e3397dc84b68f574af5c693b663d1d4ee5",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[0]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[1]",
            "session": "A",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE",
            "fields": {
              "A": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE",
              "tl": "SELECT … FOR UPDATE (locks row 1)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[2]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE NOWAIT",
            "fields": {
              "B.fails": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE NOWAIT",
              "error": "55P03",
              "comment": "lock_not_available from the conflicting row-lock request",
              "tl": "… FOR UPDATE NOWAIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[3]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Once A is done, the same statement succeeds."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[4]",
            "session": "A",
            "sql": "COMMIT",
            "fields": {
              "A": "COMMIT",
              "tl": "COMMIT (releases the lock)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/nowait.yaml#steps[5]",
            "session": "B",
            "sql": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE NOWAIT",
            "fields": {
              "B": "SELECT id FROM accounts WHERE id = 1 FOR UPDATE NOWAIT",
              "expect": [
                {
                  "id": 1
                }
              ],
              "tl": "… NOWAIT → row 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/nowait.yaml",
        "transcript": "docs/postgres/03-locking/parts/nowait.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/nowait.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/nowait.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P24",
    "path": "scenarios/postgres/03-locking/skip-locked.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/03-locking/skip-locked.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/sql-select.html#SQL-FOR-UPDATE-SHARE",
        "https://www.postgresql.org/docs/18/runtime-config-client.html#GUC-LOCK-TIMEOUT",
        "https://www.postgresql.org/docs/18/sql-rollback.html",
        "https://www.postgresql.org/docs/18/sql-rollback-to.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "c5a6d8a5b0464801647729e9e84d34d5091211f64f4941e07829d909f6adffc4",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[0]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Four workers run the exact same query at the same time."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[1]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[2]",
            "session": "A",
            "sql": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
            "fields": {
              "A": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
              "expect": [
                {
                  "id": 1
                }
              ],
              "tl": "SKIP LOCKED → job 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[3]",
            "session": "B",
            "sql": "BEGIN",
            "fields": {
              "B": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[4]",
            "session": "B",
            "sql": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
            "fields": {
              "B": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
              "expect": [
                {
                  "id": 2
                }
              ],
              "comment": "job 1 is locked by A — skipped, no waiting",
              "tl": "SKIP LOCKED → job 2 (skips 1)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[5]",
            "session": "C",
            "sql": "BEGIN",
            "fields": {
              "C": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[6]",
            "session": "C",
            "sql": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
            "fields": {
              "C": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
              "expect": [
                {
                  "id": 3
                }
              ],
              "tl": "SKIP LOCKED → job 3 (skips 1, 2)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Worker D finds the queue empty — an instant answer, not a wait."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[8]",
            "session": "D",
            "sql": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
            "fields": {
              "D": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
              "expect": [],
              "tl": "SKIP LOCKED → nothing free"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[9]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "A worker crash (rollback) puts its job straight back on the queue."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[10]",
            "session": "A",
            "sql": "ROLLBACK",
            "fields": {
              "A": "ROLLBACK",
              "tl": "ROLLBACK → job 1 back on the queue"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[11]",
            "session": "D",
            "sql": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
            "fields": {
              "D": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
              "expect": [
                {
                  "id": 1
                }
              ],
              "tl": "SKIP LOCKED → job 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[12]",
            "session": "B",
            "sql": "COMMIT",
            "fields": {
              "B": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[13]",
            "session": "C",
            "sql": "COMMIT",
            "fields": {
              "C": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "3f4789cd78289b0d51a8bb45547d9eba1bc7b49304bef7f448f5a9e56064ecc2",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[0]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Four sessions run the same query in the listed order with overlapping transactions."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[1]",
            "session": "A",
            "sql": "BEGIN",
            "fields": {
              "A": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[2]",
            "session": "A",
            "sql": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
            "fields": {
              "A": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
              "expect": [
                {
                  "id": 1
                }
              ],
              "tl": "SKIP LOCKED → job 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[3]",
            "session": "B",
            "sql": "BEGIN",
            "fields": {
              "B": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[4]",
            "session": "B",
            "sql": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
            "fields": {
              "B": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
              "expect": [
                {
                  "id": 2
                }
              ],
              "comment": "job 1 is locked by A — skipped, no waiting",
              "tl": "SKIP LOCKED → job 2 (skips 1)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[5]",
            "session": "C",
            "sql": "BEGIN",
            "fields": {
              "C": "BEGIN"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[6]",
            "session": "C",
            "sql": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
            "fields": {
              "C": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
              "expect": [
                {
                  "id": 3
                }
              ],
              "tl": "SKIP LOCKED → job 3 (skips 1, 2)"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "D finds no lockable row in this query; three rows still exist."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[8]",
            "session": "D",
            "sql": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
            "fields": {
              "D": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
              "expect": [],
              "tl": "SKIP LOCKED → nothing free"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[9]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Explicit ROLLBACK releases A's row lock; a process crash is not injected."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[10]",
            "session": "A",
            "sql": "ROLLBACK",
            "fields": {
              "A": "ROLLBACK",
              "tl": "ROLLBACK → job 1 back on the queue"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[11]",
            "session": "D",
            "sql": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
            "fields": {
              "D": "SELECT * FROM jobs ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED",
              "expect": [
                {
                  "id": 1
                }
              ],
              "tl": "SKIP LOCKED → job 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[12]",
            "session": "B",
            "sql": "COMMIT",
            "fields": {
              "B": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/03-locking/skip-locked.yaml#steps[13]",
            "session": "C",
            "sql": "COMMIT",
            "fields": {
              "C": "COMMIT"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; D={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "D": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/03-locking/skip-locked.yaml",
        "transcript": "docs/postgres/03-locking/parts/skip-locked.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/03-locking/skip-locked.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/03-locking/skip-locked.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P25",
    "path": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/routine-vacuuming.html#VACUUM-FOR-SPACE-RECOVERY",
        "https://www.postgresql.org/docs/18/pageinspect.html",
        "https://www.postgresql.org/docs/18/monitoring-stats.html#MONITORING-PG-STAT-ALL-TABLES-VIEW",
        "https://www.postgresql.org/docs/18/storage-hot.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "fad256972fbc81e094a9452e106add2ffae554142e702c1ceadbe89b88233b1e",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[0]",
            "session": "A",
            "sql": "INSERT INTO counters VALUES (1, 0) RETURNING xmin, n",
            "fields": {
              "A": "INSERT INTO counters VALUES (1, 0) RETURNING xmin, n",
              "capture": "x0"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[1]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Three updates to one row. Watch each one get a fresh xid — and leave a corpse."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[2]",
            "session": "A",
            "sql": "UPDATE counters SET n = 1 WHERE id = 1 RETURNING xmin, n",
            "fields": {
              "A": "UPDATE counters SET n = 1 WHERE id = 1 RETURNING xmin, n",
              "capture": "x1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[3]",
            "session": "A",
            "sql": "UPDATE counters SET n = 2 WHERE id = 1 RETURNING xmin, n",
            "fields": {
              "A": "UPDATE counters SET n = 2 WHERE id = 1 RETURNING xmin, n",
              "capture": "x2"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[4]",
            "session": "A",
            "sql": "UPDATE counters SET n = 3 WHERE id = 1 RETURNING xmin, n",
            "fields": {
              "A": "UPDATE counters SET n = 3 WHERE id = 1 RETURNING xmin, n",
              "capture": "x3"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "SELECT sees one row. The page holds four tuples — a version chain, three of them dead."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[6]",
            "session": "A",
            "sql": "SELECT n FROM counters",
            "fields": {
              "A": "SELECT n FROM counters"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[7]",
            "session": "A",
            "sql": "SELECT lp, t_xmin, t_xmax, t_ctid\nFROM heap_page_items(get_raw_page('counters', 0)) ORDER BY lp\n",
            "fields": {
              "A": "SELECT lp, t_xmin, t_xmax, t_ctid\nFROM heap_page_items(get_raw_page('counters', 0)) ORDER BY lp\n",
              "expect": [
                {
                  "lp": 1,
                  "t_xmin": "${x0.xmin}",
                  "t_xmax": "${x1.xmin}",
                  "t_ctid": "(0,2)"
                },
                {
                  "lp": 2,
                  "t_xmin": "${x1.xmin}",
                  "t_xmax": "${x2.xmin}",
                  "t_ctid": "(0,3)"
                },
                {
                  "lp": 3,
                  "t_xmin": "${x2.xmin}",
                  "t_xmax": "${x3.xmin}",
                  "t_ctid": "(0,4)"
                },
                {
                  "lp": 4,
                  "t_xmin": "${x3.xmin}",
                  "t_xmax": 0,
                  "t_ctid": "(0,4)"
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[8]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The same effect at scale: 1000 rows fit in 5 pages of 8 kB."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[9]",
            "session": "A",
            "sql": "INSERT INTO bloat SELECT g, 'x' FROM generate_series(1, 1000) g",
            "fields": {
              "A": "INSERT INTO bloat SELECT g, 'x' FROM generate_series(1, 1000) g"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[10]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 5
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[11]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "One UPDATE of every row = a full second copy of the table."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[12]",
            "session": "A",
            "sql": "UPDATE bloat SET filler = 'y'",
            "fields": {
              "A": "UPDATE bloat SET filler = 'y'"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[13]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 9
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[14]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Now delete everything. Zero rows — and not a single byte returned."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[15]",
            "session": "A",
            "sql": "DELETE FROM bloat",
            "fields": {
              "A": "DELETE FROM bloat"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[16]",
            "session": "A",
            "sql": "SELECT count(*)::int AS live_rows FROM bloat",
            "fields": {
              "A": "SELECT count(*)::int AS live_rows FROM bloat",
              "expect": [
                {
                  "live_rows": 0
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[17]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 9
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "abb2940c369bba6eed3b614207aa80820c08dfe6f469ed723ed63fa727f199c6",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[0]",
            "session": "A",
            "sql": "INSERT INTO counters VALUES (1, 0) RETURNING xmin, n",
            "fields": {
              "A": "INSERT INTO counters VALUES (1, 0) RETURNING xmin, n",
              "capture": "x0"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[1]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Three updates to one row. Watch each one get a fresh xid — and leave a corpse."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[2]",
            "session": "A",
            "sql": "UPDATE counters SET n = 1 WHERE id = 1 RETURNING xmin, n",
            "fields": {
              "A": "UPDATE counters SET n = 1 WHERE id = 1 RETURNING xmin, n",
              "capture": "x1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[3]",
            "session": "A",
            "sql": "UPDATE counters SET n = 2 WHERE id = 1 RETURNING xmin, n",
            "fields": {
              "A": "UPDATE counters SET n = 2 WHERE id = 1 RETURNING xmin, n",
              "capture": "x2"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[4]",
            "session": "A",
            "sql": "UPDATE counters SET n = 3 WHERE id = 1 RETURNING xmin, n",
            "fields": {
              "A": "UPDATE counters SET n = 3 WHERE id = 1 RETURNING xmin, n",
              "capture": "x3"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "SELECT sees one row. The page holds four tuples — a version chain, three of them dead."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[6]",
            "session": "A",
            "sql": "SELECT n FROM counters",
            "fields": {
              "A": "SELECT n FROM counters",
              "expect": [
                {
                  "n": 3
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[7]",
            "session": "A",
            "sql": "SELECT lp, t_xmin, t_xmax, t_ctid\nFROM heap_page_items(get_raw_page('counters', 0)) ORDER BY lp\n",
            "fields": {
              "A": "SELECT lp, t_xmin, t_xmax, t_ctid\nFROM heap_page_items(get_raw_page('counters', 0)) ORDER BY lp\n",
              "expect": [
                {
                  "lp": 1,
                  "t_xmin": "${x0.xmin}",
                  "t_xmax": "${x1.xmin}",
                  "t_ctid": "(0,2)"
                },
                {
                  "lp": 2,
                  "t_xmin": "${x1.xmin}",
                  "t_xmax": "${x2.xmin}",
                  "t_ctid": "(0,3)"
                },
                {
                  "lp": 3,
                  "t_xmin": "${x2.xmin}",
                  "t_xmax": "${x3.xmin}",
                  "t_ctid": "(0,4)"
                },
                {
                  "lp": 4,
                  "t_xmin": "${x3.xmin}",
                  "t_xmax": 0,
                  "t_ctid": "(0,4)"
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[8]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The same effect at scale: 1000 rows fit in 5 pages of 8 kB."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[9]",
            "session": "A",
            "sql": "INSERT INTO bloat SELECT g, 'x' FROM generate_series(1, 1000) g",
            "fields": {
              "A": "INSERT INTO bloat SELECT g, 'x' FROM generate_series(1, 1000) g"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[10]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 5
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[11]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "This UPDATE of all 1000 rows grows the heap from 5 to 9 pages, not an exact doubling."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[12]",
            "session": "A",
            "sql": "UPDATE bloat SET filler = 'y'",
            "fields": {
              "A": "UPDATE bloat SET filler = 'y'"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[13]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 9
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[14]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Now delete everything. Zero rows — and not a single byte returned."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[15]",
            "session": "A",
            "sql": "DELETE FROM bloat",
            "fields": {
              "A": "DELETE FROM bloat"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[16]",
            "session": "A",
            "sql": "SELECT count(*)::int AS live_rows FROM bloat",
            "fields": {
              "A": "SELECT count(*)::int AS live_rows FROM bloat",
              "expect": [
                {
                  "live_rows": 0
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml#steps[17]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 9
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml",
        "transcript": "docs/postgres/04-mvcc/parts/dead-tuples-and-bloat.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/04-mvcc/dead-tuples-and-bloat.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/04-mvcc/dead-tuples-and-bloat.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P26",
    "path": "scenarios/postgres/04-mvcc/long-transactions.ts",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/04-mvcc/long-transactions.ts"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/routine-vacuuming.html#VACUUM-FOR-SPACE-RECOVERY",
        "https://www.postgresql.org/docs/18/monitoring-stats.html#MONITORING-PG-STAT-ACTIVITY-VIEW",
        "https://www.postgresql.org/docs/18/runtime-config-client.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "a48bc2d5cc1134fe892455a62ea6213de290060b8d98153ec4adaa4e542f0f69",
        "schedule_occurrences": [
          {
            "start": 17,
            "finish": 17,
            "session": "A",
            "sql": "BEGIN ISOLATION LEVEL REPEATABLE READ",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[0]"
          },
          {
            "start": 18,
            "finish": 18,
            "session": "A",
            "sql": "SELECT xmin, id, status FROM jobs",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[1]"
          },
          {
            "start": 21,
            "finish": 21,
            "session": "B",
            "sql": "UPDATE jobs SET status = 'running' WHERE id = 1 RETURNING xmin, status",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[2]"
          },
          {
            "start": 22,
            "finish": 22,
            "session": "B",
            "sql": "UPDATE jobs SET status = 'done' WHERE id = 1 RETURNING xmin, status",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[3]"
          },
          {
            "start": 23,
            "finish": 23,
            "session": "B",
            "sql": "UPDATE jobs SET status = 'archived' WHERE id = 1 RETURNING xmin, status",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[4]"
          },
          {
            "start": 31,
            "finish": 33,
            "session": "B",
            "sql": "SELECT lp, t_xmin, t_xmax, t_ctid\n      FROM heap_page_items(get_raw_page('jobs', 0)) ORDER BY lp",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[5]"
          },
          {
            "start": 36,
            "finish": 36,
            "session": "B",
            "sql": "VACUUM jobs",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[6]"
          },
          {
            "start": 40,
            "finish": 42,
            "session": "B",
            "sql": "SELECT lp, t_xmin, t_xmax, t_ctid\n      FROM heap_page_items(get_raw_page('jobs', 0)) ORDER BY lp",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[7]"
          },
          {
            "start": 46,
            "finish": 46,
            "session": "A",
            "sql": "SELECT id, status FROM jobs",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[8]"
          },
          {
            "start": 48,
            "finish": 48,
            "session": "A",
            "sql": "COMMIT",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[9]"
          },
          {
            "start": 50,
            "finish": 50,
            "session": "B",
            "sql": "VACUUM jobs",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[10]"
          },
          {
            "start": 52,
            "finish": 54,
            "session": "B",
            "sql": "SELECT lp, lp_flags, t_xmin, t_xmax, t_ctid\n      FROM heap_page_items(get_raw_page('jobs', 0)) ORDER BY lp",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[11]"
          }
        ]
      },
      "current": {
        "sha256": "54918a48d201a4004ed1a83623b5ed8de5a17ae3670aa98a195cd4bb956ac21a",
        "schedule_occurrences": [
          {
            "start": 17,
            "finish": 17,
            "session": "A",
            "sql": "BEGIN ISOLATION LEVEL REPEATABLE READ",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[0]"
          },
          {
            "start": 18,
            "finish": 18,
            "session": "A",
            "sql": "SELECT xmin, id, status FROM jobs",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[1]"
          },
          {
            "start": 21,
            "finish": 21,
            "session": "B",
            "sql": "UPDATE jobs SET status = 'running' WHERE id = 1 RETURNING xmin, status",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[2]"
          },
          {
            "start": 22,
            "finish": 22,
            "session": "B",
            "sql": "UPDATE jobs SET status = 'done' WHERE id = 1 RETURNING xmin, status",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[3]"
          },
          {
            "start": 23,
            "finish": 23,
            "session": "B",
            "sql": "UPDATE jobs SET status = 'archived' WHERE id = 1 RETURNING xmin, status",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[4]"
          },
          {
            "start": 31,
            "finish": 33,
            "session": "B",
            "sql": "SELECT lp, t_xmin, t_xmax, t_ctid\n      FROM heap_page_items(get_raw_page('jobs', 0)) ORDER BY lp",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[5]"
          },
          {
            "start": 36,
            "finish": 36,
            "session": "B",
            "sql": "VACUUM jobs",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[6]"
          },
          {
            "start": 40,
            "finish": 42,
            "session": "B",
            "sql": "SELECT lp, t_xmin, t_xmax, t_ctid\n      FROM heap_page_items(get_raw_page('jobs', 0)) ORDER BY lp",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[7]"
          },
          {
            "start": 46,
            "finish": 46,
            "session": "A",
            "sql": "SELECT id, status FROM jobs",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[8]"
          },
          {
            "start": 48,
            "finish": 48,
            "session": "A",
            "sql": "COMMIT",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[9]"
          },
          {
            "start": 50,
            "finish": 50,
            "session": "B",
            "sql": "VACUUM jobs",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[10]"
          },
          {
            "start": 52,
            "finish": 54,
            "session": "B",
            "sql": "SELECT lp, lp_flags, t_xmin, t_xmax, t_ctid\n      FROM heap_page_items(get_raw_page('jobs', 0)) ORDER BY lp",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/long-transactions.ts#run.operation[11]"
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/04-mvcc/long-transactions.ts",
        "transcript": "docs/postgres/04-mvcc/parts/long-transactions.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/04-mvcc/long-transactions.ts",
        "llms": "docs/public/llms-full.txt#section=postgres/04-mvcc/long-transactions.ts",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P27",
    "path": "scenarios/postgres/04-mvcc/row-versions.ts",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/04-mvcc/row-versions.ts"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/ddl-system-columns.html",
        "https://www.postgresql.org/docs/18/pageinspect.html",
        "https://www.postgresql.org/docs/18/storage-hot.html",
        "https://www.postgresql.org/docs/18/functions-info.html#FUNCTIONS-PG-SNAPSHOT",
        "https://www.postgresql.org/docs/18/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "d2cc61375af1a0caaaba81a61af21a0fb297850091704c4f85ec6f126609ab45",
        "schedule_occurrences": [
          {
            "start": 19,
            "finish": 19,
            "session": "A",
            "sql": "SELECT xmin, xmax, ctid, balance FROM accounts WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[0]"
          },
          {
            "start": 22,
            "finish": 22,
            "session": "B",
            "sql": "BEGIN ISOLATION LEVEL REPEATABLE READ",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[1]"
          },
          {
            "start": 23,
            "finish": 23,
            "session": "B",
            "sql": "SELECT xmin, xmax, ctid, balance FROM accounts WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[2]"
          },
          {
            "start": 27,
            "finish": 29,
            "session": "A",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 1\n      RETURNING xmin, xmax, ctid, balance",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[3]"
          },
          {
            "start": 33,
            "finish": 33,
            "session": "B",
            "sql": "SELECT xmin, xmax, ctid, balance FROM accounts WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[4]"
          },
          {
            "start": 36,
            "finish": 36,
            "session": "B",
            "sql": "COMMIT",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[5]"
          },
          {
            "start": 38,
            "finish": 38,
            "session": "B",
            "sql": "SELECT xmin, xmax, ctid, balance FROM accounts WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[6]"
          },
          {
            "start": 42,
            "finish": 44,
            "session": "A",
            "sql": "SELECT lp, t_xmin, t_xmax, t_ctid\n      FROM heap_page_items(get_raw_page('accounts', 0)) ORDER BY lp",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[7]"
          },
          {
            "start": 53,
            "finish": 53,
            "session": "A",
            "sql": "DELETE FROM accounts WHERE id = 1 RETURNING xmin, xmax, ctid",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[8]"
          },
          {
            "start": 57,
            "finish": 57,
            "session": "A",
            "sql": "SELECT count(*)::int AS live_rows FROM accounts",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[9]"
          },
          {
            "start": 61,
            "finish": 63,
            "session": "A",
            "sql": "SELECT lp, t_xmin, t_xmax, t_ctid\n      FROM heap_page_items(get_raw_page('accounts', 0)) ORDER BY lp",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[10]"
          }
        ]
      },
      "current": {
        "sha256": "cff6c4002f3fd407a10bb23436f53915bbf0ba3d875b8000233248017d41f1ee",
        "schedule_occurrences": [
          {
            "start": 19,
            "finish": 19,
            "session": "A",
            "sql": "SELECT xmin, xmax, ctid, balance FROM accounts WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[0]"
          },
          {
            "start": 22,
            "finish": 22,
            "session": "B",
            "sql": "BEGIN ISOLATION LEVEL REPEATABLE READ",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[1]"
          },
          {
            "start": 23,
            "finish": 23,
            "session": "B",
            "sql": "SELECT xmin, xmax, ctid, balance FROM accounts WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[2]"
          },
          {
            "start": 27,
            "finish": 29,
            "session": "A",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 1\n      RETURNING xmin, xmax, ctid, balance",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[3]"
          },
          {
            "start": 33,
            "finish": 33,
            "session": "B",
            "sql": "SELECT xmin, xmax, ctid, balance FROM accounts WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[4]"
          },
          {
            "start": 36,
            "finish": 36,
            "session": "B",
            "sql": "COMMIT",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[5]"
          },
          {
            "start": 38,
            "finish": 38,
            "session": "B",
            "sql": "SELECT xmin, xmax, ctid, balance FROM accounts WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[6]"
          },
          {
            "start": 42,
            "finish": 44,
            "session": "A",
            "sql": "SELECT lp, t_xmin, t_xmax, t_ctid\n      FROM heap_page_items(get_raw_page('accounts', 0)) ORDER BY lp",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[7]"
          },
          {
            "start": 55,
            "finish": 55,
            "session": "A",
            "sql": "DELETE FROM accounts WHERE id = 1 RETURNING xmin, xmax, ctid",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[8]"
          },
          {
            "start": 59,
            "finish": 59,
            "session": "A",
            "sql": "SELECT count(*)::int AS live_rows FROM accounts",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[9]"
          },
          {
            "start": 63,
            "finish": 65,
            "session": "A",
            "sql": "SELECT lp, t_xmin, t_xmax, t_ctid\n      FROM heap_page_items(get_raw_page('accounts', 0)) ORDER BY lp",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/row-versions.ts#run.operation[10]"
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/04-mvcc/row-versions.ts",
        "transcript": "docs/postgres/04-mvcc/parts/row-versions.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/04-mvcc/row-versions.ts",
        "llms": "docs/public/llms-full.txt#section=postgres/04-mvcc/row-versions.ts",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P28",
    "path": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/functions-info.html#FUNCTIONS-PG-SNAPSHOT",
        "https://www.postgresql.org/docs/18/transaction-id.html",
        "https://www.postgresql.org/docs/18/transaction-iso.html"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "22394bd122f13653efbceddc382b6d66fb97f3afbd8468a08982e8fa9d1e438d",
        "schedule_occurrences": [
          {
            "start": 16,
            "finish": 16,
            "session": "A",
            "sql": "BEGIN",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[0]"
          },
          {
            "start": 17,
            "finish": 17,
            "session": "A",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[1]"
          },
          {
            "start": 18,
            "finish": 18,
            "session": "A",
            "sql": "SELECT pg_current_xact_id_if_assigned() AS xid",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[2]"
          },
          {
            "start": 21,
            "finish": 21,
            "session": "A",
            "sql": "UPDATE accounts SET balance = 150 WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[3]"
          },
          {
            "start": 22,
            "finish": 22,
            "session": "A",
            "sql": "SELECT pg_current_xact_id_if_assigned() AS xid",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[4]"
          },
          {
            "start": 27,
            "finish": 27,
            "session": "B",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 2 RETURNING xmin, balance",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[5]"
          },
          {
            "start": 31,
            "finish": 31,
            "session": "C",
            "sql": "BEGIN ISOLATION LEVEL REPEATABLE READ",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[6]"
          },
          {
            "start": 32,
            "finish": 34,
            "session": "C",
            "sql": "SELECT pg_snapshot_xmin(pg_current_snapshot()) AS xmin,\n             pg_snapshot_xmax(pg_current_snapshot()) AS xmax",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[7]"
          },
          {
            "start": 41,
            "finish": 41,
            "session": "C",
            "sql": "SELECT pg_snapshot_xip(pg_current_snapshot()) AS xid",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[8]"
          },
          {
            "start": 45,
            "finish": 45,
            "session": "C",
            "sql": "SELECT id, owner, balance FROM accounts ORDER BY id",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[9]"
          },
          {
            "start": 51,
            "finish": 51,
            "session": "A",
            "sql": "COMMIT",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[10]"
          },
          {
            "start": 53,
            "finish": 53,
            "session": "C",
            "sql": "SELECT id, owner, balance FROM accounts ORDER BY id",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[11]"
          },
          {
            "start": 56,
            "finish": 56,
            "session": "C",
            "sql": "COMMIT",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[12]"
          },
          {
            "start": 58,
            "finish": 58,
            "session": "C",
            "sql": "SELECT id, owner, balance FROM accounts ORDER BY id",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[13]"
          }
        ]
      },
      "current": {
        "sha256": "0a2984a81816b00d2efd35e1895269c94128079fb634c209cff4fec913004576",
        "schedule_occurrences": [
          {
            "start": 18,
            "finish": 18,
            "session": "A",
            "sql": "BEGIN",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[0]"
          },
          {
            "start": 19,
            "finish": 19,
            "session": "A",
            "sql": "SELECT balance FROM accounts WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[1]"
          },
          {
            "start": 20,
            "finish": 20,
            "session": "A",
            "sql": "SELECT pg_current_xact_id_if_assigned() AS xid",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[2]"
          },
          {
            "start": 23,
            "finish": 23,
            "session": "A",
            "sql": "UPDATE accounts SET balance = 150 WHERE id = 1",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[3]"
          },
          {
            "start": 24,
            "finish": 24,
            "session": "A",
            "sql": "SELECT pg_current_xact_id_if_assigned() AS xid",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[4]"
          },
          {
            "start": 29,
            "finish": 29,
            "session": "B",
            "sql": "UPDATE accounts SET balance = 200 WHERE id = 2 RETURNING xmin, balance",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[5]"
          },
          {
            "start": 33,
            "finish": 33,
            "session": "C",
            "sql": "BEGIN ISOLATION LEVEL REPEATABLE READ",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[6]"
          },
          {
            "start": 34,
            "finish": 36,
            "session": "C",
            "sql": "SELECT pg_snapshot_xmin(pg_current_snapshot()) AS xmin,\n             pg_snapshot_xmax(pg_current_snapshot()) AS xmax",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[7]"
          },
          {
            "start": 43,
            "finish": 43,
            "session": "C",
            "sql": "SELECT pg_snapshot_xip(pg_current_snapshot()) AS xid",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[8]"
          },
          {
            "start": 47,
            "finish": 47,
            "session": "C",
            "sql": "SELECT id, owner, balance FROM accounts ORDER BY id",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "explicit active",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[9]"
          },
          {
            "start": 53,
            "finish": 53,
            "session": "A",
            "sql": "COMMIT",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"explicit active\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[10]"
          },
          {
            "start": 55,
            "finish": 55,
            "session": "C",
            "sql": "SELECT id, owner, balance FROM accounts ORDER BY id",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "explicit active",
                "level": "REPEATABLE READ",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[11]"
          },
          {
            "start": 58,
            "finish": 58,
            "session": "C",
            "sql": "COMMIT",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"explicit active\",\"level\":\"REPEATABLE READ\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[12]"
          },
          {
            "start": 60,
            "finish": 60,
            "session": "C",
            "sql": "SELECT id, owner, balance FROM accounts ORDER BY id",
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; B={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}; C={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "B": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              },
              "C": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            },
            "occurrence": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts#run.operation[13]"
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts",
        "transcript": "docs/postgres/04-mvcc/parts/snapshots-under-the-hood.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/04-mvcc/snapshots-under-the-hood.ts",
        "llms": "docs/public/llms-full.txt#section=postgres/04-mvcc/snapshots-under-the-hood.ts",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P29",
    "path": "scenarios/postgres/04-mvcc/vacuum.yaml",
    "engine": "PostgreSQL",
    "observed_version": "18.6",
    "manual_version": "18",
    "evidence": {
      "scenarios": ["scenarios/postgres/04-mvcc/vacuum.yaml"],
      "official_manual_sections": [
        "https://www.postgresql.org/docs/18/routine-vacuuming.html#VACUUM-FOR-SPACE-RECOVERY",
        "https://www.postgresql.org/docs/18/sql-vacuum.html",
        "https://www.postgresql.org/docs/18/pageinspect.html",
        "https://www.postgresql.org/docs/18/storage-hot.html",
        "https://www.postgresql.org/docs/18/runtime-config-vacuum.html#GUC-VACUUM-TRUNCATE",
        "https://www.postgresql.org/docs/18/explicit-locking.html#LOCKING-TABLES",
        "https://github.com/postgres/postgres/blob/REL_18_STABLE/src/include/storage/itemid.h"
      ]
    },
    "revisions": {
      "base": {
        "sha256": "27c6e4feddef08cf527d0dfb23c1a75e6b4aec3e39267d3127649eee4992bb08",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[0]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Three updates leave three dead tuples on the page (the bloat lesson showed the chain)."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[1]",
            "session": "A",
            "sql": "UPDATE counters SET n = 1 WHERE id = 1",
            "fields": {
              "A": "UPDATE counters SET n = 1 WHERE id = 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[2]",
            "session": "A",
            "sql": "UPDATE counters SET n = 2 WHERE id = 1",
            "fields": {
              "A": "UPDATE counters SET n = 2 WHERE id = 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[3]",
            "session": "A",
            "sql": "UPDATE counters SET n = 3 WHERE id = 1 RETURNING xmin, n",
            "fields": {
              "A": "UPDATE counters SET n = 3 WHERE id = 1 RETURNING xmin, n",
              "capture": "last"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[4]",
            "session": "A",
            "sql": "VACUUM counters",
            "fields": {
              "A": "VACUUM counters"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "After VACUUM: slot 1 is a redirect to the live version, slots 2–3 are unused (reusable), only slot 4 still holds a tuple. The corpses are gone."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[6]",
            "session": "A",
            "sql": "SELECT lp, lp_flags, t_xmin, t_xmax, t_ctid\nFROM heap_page_items(get_raw_page('counters', 0)) ORDER BY lp\n",
            "fields": {
              "A": "SELECT lp, lp_flags, t_xmin, t_xmax, t_ctid\nFROM heap_page_items(get_raw_page('counters', 0)) ORDER BY lp\n",
              "expect": [
                {
                  "lp": 1,
                  "lp_flags": 2,
                  "t_xmin": null,
                  "t_xmax": null,
                  "t_ctid": null
                },
                {
                  "lp": 2,
                  "lp_flags": 0,
                  "t_xmin": null,
                  "t_xmax": null,
                  "t_ctid": null
                },
                {
                  "lp": 3,
                  "lp_flags": 0,
                  "t_xmin": null,
                  "t_xmax": null,
                  "t_ctid": null
                },
                {
                  "lp": 4,
                  "lp_flags": 1,
                  "t_xmin": "${last.xmin}",
                  "t_xmax": 0,
                  "t_ctid": "(0,4)"
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The freed space is immediately reusable: the next INSERT lands in slot 2."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[8]",
            "session": "A",
            "sql": "INSERT INTO counters VALUES (2, 0) RETURNING ctid, id",
            "fields": {
              "A": "INSERT INTO counters VALUES (2, 0) RETURNING ctid, id",
              "expect": [
                {
                  "ctid": "(0,2)"
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[9]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Same story at file level — 1000 rows in 5 pages, doubled to 9 by an UPDATE of every row."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[10]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 5
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[11]",
            "session": "A",
            "sql": "UPDATE bloat SET filler = 'y'",
            "fields": {
              "A": "UPDATE bloat SET filler = 'y'"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[12]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 9
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[13]",
            "session": "A",
            "sql": "VACUUM bloat",
            "fields": {
              "A": "VACUUM bloat"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[14]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "VACUUM cleaned 1000 dead tuples — and the file is still 9 pages. The space is free *inside* the file."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[15]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 9
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[16]",
            "session": "A",
            "sql": "VACUUM FULL bloat",
            "fields": {
              "A": "VACUUM FULL bloat"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[17]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "VACUUM FULL rewrites the table from scratch — back to 5 pages. The price: it holds ACCESS EXCLUSIVE for the whole rewrite."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[18]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 5
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      },
      "current": {
        "sha256": "922fc933ee71390ad3c03da2f1bf7dc35e12ddd0c1198782c646fb8b85b10ace",
        "schedule_occurrences": [
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[0]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Three updates leave three dead tuples on the page (the bloat lesson showed the chain)."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[1]",
            "session": "A",
            "sql": "UPDATE counters SET n = 1 WHERE id = 1",
            "fields": {
              "A": "UPDATE counters SET n = 1 WHERE id = 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[2]",
            "session": "A",
            "sql": "UPDATE counters SET n = 2 WHERE id = 1",
            "fields": {
              "A": "UPDATE counters SET n = 2 WHERE id = 1"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[3]",
            "session": "A",
            "sql": "UPDATE counters SET n = 3 WHERE id = 1 RETURNING xmin, n",
            "fields": {
              "A": "UPDATE counters SET n = 3 WHERE id = 1 RETURNING xmin, n",
              "capture": "last"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[4]",
            "session": "A",
            "sql": "VACUUM counters",
            "fields": {
              "A": "VACUUM counters"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[5]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "After VACUUM: slot 1 is a redirect to the live version, slots 2–3 are unused (reusable), only slot 4 still holds a tuple. The corpses are gone."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[6]",
            "session": "A",
            "sql": "SELECT lp, lp_flags, t_xmin, t_xmax, t_ctid\nFROM heap_page_items(get_raw_page('counters', 0)) ORDER BY lp\n",
            "fields": {
              "A": "SELECT lp, lp_flags, t_xmin, t_xmax, t_ctid\nFROM heap_page_items(get_raw_page('counters', 0)) ORDER BY lp\n",
              "expect": [
                {
                  "lp": 1,
                  "lp_flags": 2,
                  "t_xmin": null,
                  "t_xmax": null,
                  "t_ctid": null
                },
                {
                  "lp": 2,
                  "lp_flags": 0,
                  "t_xmin": null,
                  "t_xmax": null,
                  "t_ctid": null
                },
                {
                  "lp": 3,
                  "lp_flags": 0,
                  "t_xmin": null,
                  "t_xmax": null,
                  "t_ctid": null
                },
                {
                  "lp": 4,
                  "lp_flags": 1,
                  "t_xmin": "${last.xmin}",
                  "t_xmax": 0,
                  "t_ctid": "(0,4)"
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[7]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "The freed space is immediately reusable: the next INSERT lands in slot 2."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[8]",
            "session": "A",
            "sql": "INSERT INTO counters VALUES (2, 0) RETURNING ctid, id",
            "fields": {
              "A": "INSERT INTO counters VALUES (2, 0) RETURNING ctid, id",
              "expect": [
                {
                  "ctid": "(0,2)"
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[9]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "At file level this 1000-row heap grows from 5 to 9 pages after UPDATE."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[10]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 5
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[11]",
            "session": "A",
            "sql": "UPDATE bloat SET filler = 'y'",
            "fields": {
              "A": "UPDATE bloat SET filler = 'y'"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[12]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 9
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[13]",
            "session": "A",
            "sql": "VACUUM bloat",
            "fields": {
              "A": "VACUUM bloat"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[14]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "Standard VACUUM completes and the asserted file size remains 9 pages. This size observation does not count reclaimed tuples or reusable bytes."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[15]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 9
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[16]",
            "session": "A",
            "sql": "VACUUM FULL bloat",
            "fields": {
              "A": "VACUUM FULL bloat"
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[17]",
            "session": null,
            "sql": null,
            "fields": {
              "note": "VACUUM FULL rewrites the table from scratch — back to 5 pages. The price: it holds ACCESS EXCLUSIVE for the whole rewrite."
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          },
          {
            "occurrence": "scenarios/postgres/04-mvcc/vacuum.yaml#steps[18]",
            "session": "A",
            "sql": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
            "fields": {
              "A": "SELECT (pg_relation_size('bloat') / 8192)::int AS pages",
              "expect": [
                {
                  "pages": 5
                }
              ]
            },
            "scope": "PostgreSQL 18.6; ordered schedule state before operation: A={\"phase\":\"standalone\",\"level\":\"READ COMMITTED\",\"lock_timeout\":\"0\",\"deadlock_timeout\":\"1s\"}",
            "state_after": {
              "A": {
                "phase": "standalone",
                "level": "READ COMMITTED",
                "lock_timeout": "0",
                "deadlock_timeout": "1s"
              }
            }
          }
        ]
      }
    },
    "mirrors": [
      {
        "scenario": "scenarios/postgres/04-mvcc/vacuum.yaml",
        "transcript": "docs/postgres/04-mvcc/parts/vacuum.md",
        "ledger": "docs/public/ledger.jsonl#scenario=postgres/04-mvcc/vacuum.yaml",
        "llms": "docs/public/llms-full.txt#section=postgres/04-mvcc/vacuum.yaml",
        "metadata": "lead included scenario claim supplies built description/TechArticle where configured"
      }
    ]
  },
  {
    "id": "P30",
    "path": "docs/.vitepress/config.ts",
    "scope": "Editorial chapter navigation/coverage labels; no additional universal database claim",
    "evidence": {
      "scenarios": [
        "scenarios/postgres/03-locking/alter-table-outage.yaml",
        "scenarios/postgres/03-locking/ddl-lock-timeout.yaml",
        "scenarios/postgres/03-locking/deadlock-avoidance.yaml",
        "scenarios/postgres/03-locking/deadlock.yaml",
        "scenarios/postgres/03-locking/fk-key-share.yaml",
        "scenarios/postgres/03-locking/for-update-blocks.yaml",
        "scenarios/postgres/03-locking/lock-mode-matrix.yaml",
        "scenarios/postgres/03-locking/lock-queue-fifo.yaml",
        "scenarios/postgres/03-locking/lock-timeout.yaml",
        "scenarios/postgres/03-locking/monitoring-locks.yaml",
        "scenarios/postgres/03-locking/nowait.yaml",
        "scenarios/postgres/03-locking/skip-locked.yaml",
        "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml",
        "scenarios/postgres/04-mvcc/long-transactions.ts",
        "scenarios/postgres/04-mvcc/row-versions.ts",
        "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts",
        "scenarios/postgres/04-mvcc/vacuum.yaml"
      ]
    },
    "revisions": {}
  },
  {
    "id": "P31",
    "path": "README.md",
    "scope": "Editorial chapter navigation/coverage labels; no additional universal database claim",
    "evidence": {
      "scenarios": [
        "scenarios/postgres/03-locking/alter-table-outage.yaml",
        "scenarios/postgres/03-locking/ddl-lock-timeout.yaml",
        "scenarios/postgres/03-locking/deadlock-avoidance.yaml",
        "scenarios/postgres/03-locking/deadlock.yaml",
        "scenarios/postgres/03-locking/fk-key-share.yaml",
        "scenarios/postgres/03-locking/for-update-blocks.yaml",
        "scenarios/postgres/03-locking/lock-mode-matrix.yaml",
        "scenarios/postgres/03-locking/lock-queue-fifo.yaml",
        "scenarios/postgres/03-locking/lock-timeout.yaml",
        "scenarios/postgres/03-locking/monitoring-locks.yaml",
        "scenarios/postgres/03-locking/nowait.yaml",
        "scenarios/postgres/03-locking/skip-locked.yaml",
        "scenarios/postgres/04-mvcc/dead-tuples-and-bloat.yaml",
        "scenarios/postgres/04-mvcc/long-transactions.ts",
        "scenarios/postgres/04-mvcc/row-versions.ts",
        "scenarios/postgres/04-mvcc/snapshots-under-the-hood.ts",
        "scenarios/postgres/04-mvcc/vacuum.yaml"
      ]
    },
    "revisions": {}
  }
]
