all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe12:fc84
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      docker_namespace: osism
      docker_registry: osism.harbor.regio.digital
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 56c54834-0a19-45a9-b453-c3dc9c47607c
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe12:fc84
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.102
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.109
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe12:fc84
        region: null
        slot: null
  vars:
    docker_namespace: osism
    docker_registry: osism.harbor.regio.digital
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job container-image-python-osism-build explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/python-osism/.zuul.yaml@main#79>'
      - '<Job container-image-python-osism-build explicit: None implied: None source:
        osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 7ad740c8a4f94822b8c2a3042d248909
      build_refs:
      - branch: main
        change: '2556'
        change_message: "DO NOT MERGE: measure race-test detection rate\n\n**Throwaway
          measurement PR \u2014 do not review, do not merge. Closed once it reports
          a number.**\n\nStacked on the semaphore integration-test branch, so the
          diff also contains that work:\n\n- osism/python-osism#2548\n\n**Question:**
          when `RedisSemaphore.acquire` loses its atomicity, how reliably does the
          new many-client race test actually catch it *on a Zuul node*?\n\nThe test
          executes its race exactly once per pytest session, so detection is probabilistic.
          Measured locally against the same `redis:7-alpine` container the integration
          job starts, it caught this mutant in **54 of 60** cold-process runs \u2014
          but a CI node has a different core count, different CPU speed, and neighbours,
          and every one of those widens or narrows the window between the capacity
          check and the reservation.\n\n| environment | detected |\n|---|---|\n| fakeredis,
          in-process | 0 / 100 |\n| local, 8 cores pinned | 56 / 60 |\n| local, 2
          cores pinned | 58 / 60 |\n| local, 1 core pinned | 60 / 60 |\n| local, cold
          process per run | 54 / 60 |\n| **Zuul node** | **this run** |\n\n**The mutant**
          splits the atomic `EVAL` back into `ZREMRANGEBYSCORE` / `ZCARD` / `ZADD`
          as three round trips, so two clients can observe the same free slot and
          both take it. It deliberately keeps the per-iteration reclaim boundary,
          so the separate stale-boundary defect is *not* reintroduced \u2014 which
          is what makes this measurement meaningful: the unit suite stays green, and
          the integration job is the only check that can catch this.\n\n**How to read
          a run:**\n\n- `python-osism-unit-tests` green **and** `python-osism-integration-tests`
          red \u21D2 detected.\n- Both green \u21D2 the mutant survived a real CI
          run. That is the outcome worth knowing about.\n\nNothing else is modified
          \u2014 no playbook change, no `.zuul.yaml` change, no test change \u2014
          so each pipeline run is one honest sample of the committed test running
          the way it will actually run. Further samples come from `recheck` comments
          on this PR.\n\nIf detection on a Zuul node lands near the local ~90%, the
          single-round race is a real but low-probability gap and repeating the race
          inside the test is a cheap hardening. If it lands materially lower, the
          test cannot be relied on as the sole guard for the atomicity guarantee and
          repeating it is required, not optional.\n\n\U0001F916 Generated with [Claude
          Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2556
        commit_id: 39588f7afb3f8dc4123849b06fe4020b278076e2
        patchset: 39588f7afb3f8dc4123849b06fe4020b278076e2
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          name: osism/python-osism
          short_name: python-osism
        src_dir: src/github.com/osism/python-osism
        topic: null
      buildset: 7286d83d7533462697cfae9960287932
      buildset_refs:
      - branch: main
        change: '2556'
        change_message: "DO NOT MERGE: measure race-test detection rate\n\n**Throwaway
          measurement PR \u2014 do not review, do not merge. Closed once it reports
          a number.**\n\nStacked on the semaphore integration-test branch, so the
          diff also contains that work:\n\n- osism/python-osism#2548\n\n**Question:**
          when `RedisSemaphore.acquire` loses its atomicity, how reliably does the
          new many-client race test actually catch it *on a Zuul node*?\n\nThe test
          executes its race exactly once per pytest session, so detection is probabilistic.
          Measured locally against the same `redis:7-alpine` container the integration
          job starts, it caught this mutant in **54 of 60** cold-process runs \u2014
          but a CI node has a different core count, different CPU speed, and neighbours,
          and every one of those widens or narrows the window between the capacity
          check and the reservation.\n\n| environment | detected |\n|---|---|\n| fakeredis,
          in-process | 0 / 100 |\n| local, 8 cores pinned | 56 / 60 |\n| local, 2
          cores pinned | 58 / 60 |\n| local, 1 core pinned | 60 / 60 |\n| local, cold
          process per run | 54 / 60 |\n| **Zuul node** | **this run** |\n\n**The mutant**
          splits the atomic `EVAL` back into `ZREMRANGEBYSCORE` / `ZCARD` / `ZADD`
          as three round trips, so two clients can observe the same free slot and
          both take it. It deliberately keeps the per-iteration reclaim boundary,
          so the separate stale-boundary defect is *not* reintroduced \u2014 which
          is what makes this measurement meaningful: the unit suite stays green, and
          the integration job is the only check that can catch this.\n\n**How to read
          a run:**\n\n- `python-osism-unit-tests` green **and** `python-osism-integration-tests`
          red \u21D2 detected.\n- Both green \u21D2 the mutant survived a real CI
          run. That is the outcome worth knowing about.\n\nNothing else is modified
          \u2014 no playbook change, no `.zuul.yaml` change, no test change \u2014
          so each pipeline run is one honest sample of the committed test running
          the way it will actually run. Further samples come from `recheck` comments
          on this PR.\n\nIf detection on a Zuul node lands near the local ~90%, the
          single-round race is a real but low-probability gap and repeating the race
          inside the test is a cheap hardening. If it lands materially lower, the
          test cannot be relied on as the sole guard for the atomicity guarantee and
          repeating it is required, not optional.\n\n\U0001F916 Generated with [Claude
          Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2556
        commit_id: 39588f7afb3f8dc4123849b06fe4020b278076e2
        patchset: 39588f7afb3f8dc4123849b06fe4020b278076e2
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          name: osism/python-osism
          short_name: python-osism
        src_dir: src/github.com/osism/python-osism
        topic: null
      change: '2556'
      change_message: "DO NOT MERGE: measure race-test detection rate\n\n**Throwaway
        measurement PR \u2014 do not review, do not merge. Closed once it reports
        a number.**\n\nStacked on the semaphore integration-test branch, so the diff
        also contains that work:\n\n- osism/python-osism#2548\n\n**Question:** when
        `RedisSemaphore.acquire` loses its atomicity, how reliably does the new many-client
        race test actually catch it *on a Zuul node*?\n\nThe test executes its race
        exactly once per pytest session, so detection is probabilistic. Measured locally
        against the same `redis:7-alpine` container the integration job starts, it
        caught this mutant in **54 of 60** cold-process runs \u2014 but a CI node
        has a different core count, different CPU speed, and neighbours, and every
        one of those widens or narrows the window between the capacity check and the
        reservation.\n\n| environment | detected |\n|---|---|\n| fakeredis, in-process
        | 0 / 100 |\n| local, 8 cores pinned | 56 / 60 |\n| local, 2 cores pinned
        | 58 / 60 |\n| local, 1 core pinned | 60 / 60 |\n| local, cold process per
        run | 54 / 60 |\n| **Zuul node** | **this run** |\n\n**The mutant** splits
        the atomic `EVAL` back into `ZREMRANGEBYSCORE` / `ZCARD` / `ZADD` as three
        round trips, so two clients can observe the same free slot and both take it.
        It deliberately keeps the per-iteration reclaim boundary, so the separate
        stale-boundary defect is *not* reintroduced \u2014 which is what makes this
        measurement meaningful: the unit suite stays green, and the integration job
        is the only check that can catch this.\n\n**How to read a run:**\n\n- `python-osism-unit-tests`
        green **and** `python-osism-integration-tests` red \u21D2 detected.\n- Both
        green \u21D2 the mutant survived a real CI run. That is the outcome worth
        knowing about.\n\nNothing else is modified \u2014 no playbook change, no `.zuul.yaml`
        change, no test change \u2014 so each pipeline run is one honest sample of
        the committed test running the way it will actually run. Further samples come
        from `recheck` comments on this PR.\n\nIf detection on a Zuul node lands near
        the local ~90%, the single-round race is a real but low-probability gap and
        repeating the race inside the test is a cheap hardening. If it lands materially
        lower, the test cannot be relied on as the sole guard for the atomicity guarantee
        and repeating it is required, not optional.\n\n\U0001F916 Generated with [Claude
        Code](https://claude.com/claude-code)\n"
      change_url: https://github.com/osism/python-osism/pull/2556
      child_jobs: []
      commit_id: 39588f7afb3f8dc4123849b06fe4020b278076e2
      event_id: fea2cda0-9003-11f1-9b44-a3decdb4ccd0
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/7ad740c8a4f94822b8c2a3042d248909/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/7ad740c8a4f94822b8c2a3042d248909/work/logs
        result_data_file: /var/lib/zuul/builds/7ad740c8a4f94822b8c2a3042d248909/work/results.json
        src_root: /var/lib/zuul/builds/7ad740c8a4f94822b8c2a3042d248909/work/src
        work_root: /var/lib/zuul/builds/7ad740c8a4f94822b8c2a3042d248909/work
      include_vars: []
      items:
      - branch: main
        change: '2556'
        change_message: "DO NOT MERGE: measure race-test detection rate\n\n**Throwaway
          measurement PR \u2014 do not review, do not merge. Closed once it reports
          a number.**\n\nStacked on the semaphore integration-test branch, so the
          diff also contains that work:\n\n- osism/python-osism#2548\n\n**Question:**
          when `RedisSemaphore.acquire` loses its atomicity, how reliably does the
          new many-client race test actually catch it *on a Zuul node*?\n\nThe test
          executes its race exactly once per pytest session, so detection is probabilistic.
          Measured locally against the same `redis:7-alpine` container the integration
          job starts, it caught this mutant in **54 of 60** cold-process runs \u2014
          but a CI node has a different core count, different CPU speed, and neighbours,
          and every one of those widens or narrows the window between the capacity
          check and the reservation.\n\n| environment | detected |\n|---|---|\n| fakeredis,
          in-process | 0 / 100 |\n| local, 8 cores pinned | 56 / 60 |\n| local, 2
          cores pinned | 58 / 60 |\n| local, 1 core pinned | 60 / 60 |\n| local, cold
          process per run | 54 / 60 |\n| **Zuul node** | **this run** |\n\n**The mutant**
          splits the atomic `EVAL` back into `ZREMRANGEBYSCORE` / `ZCARD` / `ZADD`
          as three round trips, so two clients can observe the same free slot and
          both take it. It deliberately keeps the per-iteration reclaim boundary,
          so the separate stale-boundary defect is *not* reintroduced \u2014 which
          is what makes this measurement meaningful: the unit suite stays green, and
          the integration job is the only check that can catch this.\n\n**How to read
          a run:**\n\n- `python-osism-unit-tests` green **and** `python-osism-integration-tests`
          red \u21D2 detected.\n- Both green \u21D2 the mutant survived a real CI
          run. That is the outcome worth knowing about.\n\nNothing else is modified
          \u2014 no playbook change, no `.zuul.yaml` change, no test change \u2014
          so each pipeline run is one honest sample of the committed test running
          the way it will actually run. Further samples come from `recheck` comments
          on this PR.\n\nIf detection on a Zuul node lands near the local ~90%, the
          single-round race is a real but low-probability gap and repeating the race
          inside the test is a cheap hardening. If it lands materially lower, the
          test cannot be relied on as the sole guard for the atomicity guarantee and
          repeating it is required, not optional.\n\n\U0001F916 Generated with [Claude
          Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2556
        commit_id: 39588f7afb3f8dc4123849b06fe4020b278076e2
        patchset: 39588f7afb3f8dc4123849b06fe4020b278076e2
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          name: osism/python-osism
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
        topic: null
      job: container-image-python-osism-build
      jobtags: []
      max_attempts: 3
      message: RE8gTk9UIE1FUkdFOiBtZWFzdXJlIHJhY2UtdGVzdCBkZXRlY3Rpb24gcmF0ZQoKKipUaHJvd2F3YXkgbWVhc3VyZW1lbnQgUFIg4oCUIGRvIG5vdCByZXZpZXcsIGRvIG5vdCBtZXJnZS4gQ2xvc2VkIG9uY2UgaXQgcmVwb3J0cyBhIG51bWJlci4qKgoKU3RhY2tlZCBvbiB0aGUgc2VtYXBob3JlIGludGVncmF0aW9uLXRlc3QgYnJhbmNoLCBzbyB0aGUgZGlmZiBhbHNvIGNvbnRhaW5zIHRoYXQgd29yazoKCi0gb3Npc20vcHl0aG9uLW9zaXNtIzI1NDgKCioqUXVlc3Rpb246Kiogd2hlbiBgUmVkaXNTZW1hcGhvcmUuYWNxdWlyZWAgbG9zZXMgaXRzIGF0b21pY2l0eSwgaG93IHJlbGlhYmx5IGRvZXMgdGhlIG5ldyBtYW55LWNsaWVudCByYWNlIHRlc3QgYWN0dWFsbHkgY2F0Y2ggaXQgKm9uIGEgWnV1bCBub2RlKj8KClRoZSB0ZXN0IGV4ZWN1dGVzIGl0cyByYWNlIGV4YWN0bHkgb25jZSBwZXIgcHl0ZXN0IHNlc3Npb24sIHNvIGRldGVjdGlvbiBpcyBwcm9iYWJpbGlzdGljLiBNZWFzdXJlZCBsb2NhbGx5IGFnYWluc3QgdGhlIHNhbWUgYHJlZGlzOjctYWxwaW5lYCBjb250YWluZXIgdGhlIGludGVncmF0aW9uIGpvYiBzdGFydHMsIGl0IGNhdWdodCB0aGlzIG11dGFudCBpbiAqKjU0IG9mIDYwKiogY29sZC1wcm9jZXNzIHJ1bnMg4oCUIGJ1dCBhIENJIG5vZGUgaGFzIGEgZGlmZmVyZW50IGNvcmUgY291bnQsIGRpZmZlcmVudCBDUFUgc3BlZWQsIGFuZCBuZWlnaGJvdXJzLCBhbmQgZXZlcnkgb25lIG9mIHRob3NlIHdpZGVucyBvciBuYXJyb3dzIHRoZSB3aW5kb3cgYmV0d2VlbiB0aGUgY2FwYWNpdHkgY2hlY2sgYW5kIHRoZSByZXNlcnZhdGlvbi4KCnwgZW52aXJvbm1lbnQgfCBkZXRlY3RlZCB8CnwtLS18LS0tfAp8IGZha2VyZWRpcywgaW4tcHJvY2VzcyB8IDAgLyAxMDAgfAp8IGxvY2FsLCA4IGNvcmVzIHBpbm5lZCB8IDU2IC8gNjAgfAp8IGxvY2FsLCAyIGNvcmVzIHBpbm5lZCB8IDU4IC8gNjAgfAp8IGxvY2FsLCAxIGNvcmUgcGlubmVkIHwgNjAgLyA2MCB8CnwgbG9jYWwsIGNvbGQgcHJvY2VzcyBwZXIgcnVuIHwgNTQgLyA2MCB8CnwgKipadXVsIG5vZGUqKiB8ICoqdGhpcyBydW4qKiB8CgoqKlRoZSBtdXRhbnQqKiBzcGxpdHMgdGhlIGF0b21pYyBgRVZBTGAgYmFjayBpbnRvIGBaUkVNUkFOR0VCWVNDT1JFYCAvIGBaQ0FSRGAgLyBgWkFERGAgYXMgdGhyZWUgcm91bmQgdHJpcHMsIHNvIHR3byBjbGllbnRzIGNhbiBvYnNlcnZlIHRoZSBzYW1lIGZyZWUgc2xvdCBhbmQgYm90aCB0YWtlIGl0LiBJdCBkZWxpYmVyYXRlbHkga2VlcHMgdGhlIHBlci1pdGVyYXRpb24gcmVjbGFpbSBib3VuZGFyeSwgc28gdGhlIHNlcGFyYXRlIHN0YWxlLWJvdW5kYXJ5IGRlZmVjdCBpcyAqbm90KiByZWludHJvZHVjZWQg4oCUIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhpcyBtZWFzdXJlbWVudCBtZWFuaW5nZnVsOiB0aGUgdW5pdCBzdWl0ZSBzdGF5cyBncmVlbiwgYW5kIHRoZSBpbnRlZ3JhdGlvbiBqb2IgaXMgdGhlIG9ubHkgY2hlY2sgdGhhdCBjYW4gY2F0Y2ggdGhpcy4KCioqSG93IHRvIHJlYWQgYSBydW46KioKCi0gYHB5dGhvbi1vc2lzbS11bml0LXRlc3RzYCBncmVlbiAqKmFuZCoqIGBweXRob24tb3Npc20taW50ZWdyYXRpb24tdGVzdHNgIHJlZCDih5IgZGV0ZWN0ZWQuCi0gQm90aCBncmVlbiDih5IgdGhlIG11dGFudCBzdXJ2aXZlZCBhIHJlYWwgQ0kgcnVuLiBUaGF0IGlzIHRoZSBvdXRjb21lIHdvcnRoIGtub3dpbmcgYWJvdXQuCgpOb3RoaW5nIGVsc2UgaXMgbW9kaWZpZWQg4oCUIG5vIHBsYXlib29rIGNoYW5nZSwgbm8gYC56dXVsLnlhbWxgIGNoYW5nZSwgbm8gdGVzdCBjaGFuZ2Ug4oCUIHNvIGVhY2ggcGlwZWxpbmUgcnVuIGlzIG9uZSBob25lc3Qgc2FtcGxlIG9mIHRoZSBjb21taXR0ZWQgdGVzdCBydW5uaW5nIHRoZSB3YXkgaXQgd2lsbCBhY3R1YWxseSBydW4uIEZ1cnRoZXIgc2FtcGxlcyBjb21lIGZyb20gYHJlY2hlY2tgIGNvbW1lbnRzIG9uIHRoaXMgUFIuCgpJZiBkZXRlY3Rpb24gb24gYSBadXVsIG5vZGUgbGFuZHMgbmVhciB0aGUgbG9jYWwgfjkwJSwgdGhlIHNpbmdsZS1yb3VuZCByYWNlIGlzIGEgcmVhbCBidXQgbG93LXByb2JhYmlsaXR5IGdhcCBhbmQgcmVwZWF0aW5nIHRoZSByYWNlIGluc2lkZSB0aGUgdGVzdCBpcyBhIGNoZWFwIGhhcmRlbmluZy4gSWYgaXQgbGFuZHMgbWF0ZXJpYWxseSBsb3dlciwgdGhlIHRlc3QgY2Fubm90IGJlIHJlbGllZCBvbiBhcyB0aGUgc29sZSBndWFyZCBmb3IgdGhlIGF0b21pY2l0eSBndWFyYW50ZWUgYW5kIHJlcGVhdGluZyBpdCBpcyByZXF1aXJlZCwgbm90IG9wdGlvbmFsLgoK8J+kliBHZW5lcmF0ZWQgd2l0aCBbQ2xhdWRlIENvZGVdKGh0dHBzOi8vY2xhdWRlLmNvbS9jbGF1ZGUtY29kZSkK
      patchset: 39588f7afb3f8dc4123849b06fe4020b278076e2
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 71b711c422c10c242a8f785dc6d41ed9d12e9cd3
          trusted/project_1/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 242732586e2cba04d04867d3e302888c766bc231
          trusted/project_2/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: dcb06ea8a3ad422cc9d98b376216617b2daa6a02
          untrusted/project_0/github.com/osism/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: b5471b11bcf3e9d77078d9146f7c81e5358a1c36
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 71b711c422c10c242a8f785dc6d41ed9d12e9cd3
          untrusted/project_2/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 242732586e2cba04d04867d3e302888c766bc231
          untrusted/project_3/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: dcb06ea8a3ad422cc9d98b376216617b2daa6a02
        playbooks:
        - path: untrusted/project_0/github.com/osism/python-osism/playbooks/build.yml
          roles:
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_1/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_1/zuul-config/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_2/openinfra-zuul-jobs
            link_target: untrusted/project_2/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_2/openinfra-zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_3/zuul-jobs
            link_target: untrusted/project_3/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_3/zuul-jobs/roles
      post_review: false
      post_timeout: 1800
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/osism/python-osism
        name: osism/python-osism
        short_name: python-osism
        src_dir: src/github.com/osism/python-osism
      projects:
        github.com/osism/python-osism:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          checkout: main
          checkout_description: zuul branch
          commit: b5471b11bcf3e9d77078d9146f7c81e5358a1c36
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2556/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
