all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe47:111c
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: da406c9b-fe5c-45b1-9af6-5b129919f142
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe47:111c
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.205
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.228
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe47:111c
        region: null
        slot: null
  vars:
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job flake8 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#32>'
      - '<Job flake8 explicit: None implied: None source: osism/release/.zuul.yaml@main#14>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: adb019ed010f4ec6a5b24f8d7ca8f1a1
      build_refs:
      - branch: main
        change: '2587'
        change_message: "drift: add rolling_pin rolling-tag detector\n\n## What\n\nAdds
          a new drift detector, `rolling_pin`, to the drift-detection tooling. It\nflags
          any `release/<version>/base.yml` `docker_images` pin whose **value** is
          a\nrolling/mutable tag (`latest`, `main`, `master`, `stable`, `edge`, `nightly`,\n`rolling`,
          `dev`, `devel`, `develop`, `head`, `current` \u2014 case-insensitive\ndenylist).
          Such pins deploy non-reproducible images.\n\n## Why\n\nA rolling tag on
          a deployed image escaped **every** existing check, because the\ndead `base.yml`
          pin happened to *agree* with whatever actually deployed:\n\n- `release_vs_manager`
          \u2014 skips it (unwired to the manager render)\n- `role_unpinned` \u2014
          treats it as pinned (it *has* a `base.yml` pin)\n- `role_shadows` \u2014
          silent, because `base.yml` == the role default (`latest` == `latest`)\n\n`substation`
          is the exemplar: `substation: latest`, deployed via its role, never\nreproducible,
          invisible to the report.\n\n## Design\n\n- **Value-only detection** \u2014
          reads `base.yml` alone; does not model deploy paths.\n  The only thing a
          deploy-scoped condition would additionally exclude today is one\n  mirror-only
          rolling pin (`sonic_vs`), which is cheaper to allowlist than to model\n
          \ both paths.\n- **Denylist, not a not-semver heuristic** \u2014 so odd-but-immutable
          tags (e.g.\n  `6.1-23.10_beta`) are never mistaken for rolling.\n\n## Allowlist\n\n-
          `tempest` \u2014 kolla-built test image, `latest` by design\n- `sonic_vs`
          \u2014 mirror/testbed-only, not deployed via a role or the manager render\n\n`substation`
          is **deliberately not allowlisted**: upstream\n`ghcr.io/cloudnull/substation`
          publishes immutable tags, so it can be pinned to a\nconcrete tag and wired.\n\n
          \ - osism/issues#1404\n\n## \u26A0\uFE0F Behavioural impact\n\nThis makes
          the drift job report **`substation` as a new actionable finding \u2192\nexit
          1**. That is the intended point of the change (surfacing a previously\ninvisible
          reproducibility bug), not a regression \u2014 the fix is tracked separately.\n\n##
          Testing\n\n- `tox -e drift-test` \u2014 339 tests pass (6 new in `test_rolling_pin.py`)\n-
          `black` / `flake8` / `yamllint` clean (pre-commit + manual)\n- End-to-end
          against the real `latest/base.yml`: flags exactly the three rolling\n  pins
          \u2192 `tempest`/`sonic_vs` suppressed, `substation` surfaces as the sole
          live\n  finding.\n\n## Note\n\n`develop` was added to the denylist for completeness/consistency
          with `dev`/`devel`\n(all conventional rolling branch tags); no current image
          pin uses it.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/release/pull/2587
        commit_id: 0547274b2ae0f08b60a14283b98155212c5a80b3
        patchset: 0547274b2ae0f08b60a14283b98155212c5a80b3
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/release
          name: osism/release
          short_name: release
        src_dir: src/github.com/osism/release
        topic: null
      buildset: 4cf483e9e5fd46a5a014ce28c952d7a7
      buildset_refs:
      - branch: main
        change: '2587'
        change_message: "drift: add rolling_pin rolling-tag detector\n\n## What\n\nAdds
          a new drift detector, `rolling_pin`, to the drift-detection tooling. It\nflags
          any `release/<version>/base.yml` `docker_images` pin whose **value** is
          a\nrolling/mutable tag (`latest`, `main`, `master`, `stable`, `edge`, `nightly`,\n`rolling`,
          `dev`, `devel`, `develop`, `head`, `current` \u2014 case-insensitive\ndenylist).
          Such pins deploy non-reproducible images.\n\n## Why\n\nA rolling tag on
          a deployed image escaped **every** existing check, because the\ndead `base.yml`
          pin happened to *agree* with whatever actually deployed:\n\n- `release_vs_manager`
          \u2014 skips it (unwired to the manager render)\n- `role_unpinned` \u2014
          treats it as pinned (it *has* a `base.yml` pin)\n- `role_shadows` \u2014
          silent, because `base.yml` == the role default (`latest` == `latest`)\n\n`substation`
          is the exemplar: `substation: latest`, deployed via its role, never\nreproducible,
          invisible to the report.\n\n## Design\n\n- **Value-only detection** \u2014
          reads `base.yml` alone; does not model deploy paths.\n  The only thing a
          deploy-scoped condition would additionally exclude today is one\n  mirror-only
          rolling pin (`sonic_vs`), which is cheaper to allowlist than to model\n
          \ both paths.\n- **Denylist, not a not-semver heuristic** \u2014 so odd-but-immutable
          tags (e.g.\n  `6.1-23.10_beta`) are never mistaken for rolling.\n\n## Allowlist\n\n-
          `tempest` \u2014 kolla-built test image, `latest` by design\n- `sonic_vs`
          \u2014 mirror/testbed-only, not deployed via a role or the manager render\n\n`substation`
          is **deliberately not allowlisted**: upstream\n`ghcr.io/cloudnull/substation`
          publishes immutable tags, so it can be pinned to a\nconcrete tag and wired.\n\n
          \ - osism/issues#1404\n\n## \u26A0\uFE0F Behavioural impact\n\nThis makes
          the drift job report **`substation` as a new actionable finding \u2192\nexit
          1**. That is the intended point of the change (surfacing a previously\ninvisible
          reproducibility bug), not a regression \u2014 the fix is tracked separately.\n\n##
          Testing\n\n- `tox -e drift-test` \u2014 339 tests pass (6 new in `test_rolling_pin.py`)\n-
          `black` / `flake8` / `yamllint` clean (pre-commit + manual)\n- End-to-end
          against the real `latest/base.yml`: flags exactly the three rolling\n  pins
          \u2192 `tempest`/`sonic_vs` suppressed, `substation` surfaces as the sole
          live\n  finding.\n\n## Note\n\n`develop` was added to the denylist for completeness/consistency
          with `dev`/`devel`\n(all conventional rolling branch tags); no current image
          pin uses it.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/release/pull/2587
        commit_id: 0547274b2ae0f08b60a14283b98155212c5a80b3
        patchset: 0547274b2ae0f08b60a14283b98155212c5a80b3
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/release
          name: osism/release
          short_name: release
        src_dir: src/github.com/osism/release
        topic: null
      change: '2587'
      change_message: "drift: add rolling_pin rolling-tag detector\n\n## What\n\nAdds
        a new drift detector, `rolling_pin`, to the drift-detection tooling. It\nflags
        any `release/<version>/base.yml` `docker_images` pin whose **value** is a\nrolling/mutable
        tag (`latest`, `main`, `master`, `stable`, `edge`, `nightly`,\n`rolling`,
        `dev`, `devel`, `develop`, `head`, `current` \u2014 case-insensitive\ndenylist).
        Such pins deploy non-reproducible images.\n\n## Why\n\nA rolling tag on a
        deployed image escaped **every** existing check, because the\ndead `base.yml`
        pin happened to *agree* with whatever actually deployed:\n\n- `release_vs_manager`
        \u2014 skips it (unwired to the manager render)\n- `role_unpinned` \u2014
        treats it as pinned (it *has* a `base.yml` pin)\n- `role_shadows` \u2014 silent,
        because `base.yml` == the role default (`latest` == `latest`)\n\n`substation`
        is the exemplar: `substation: latest`, deployed via its role, never\nreproducible,
        invisible to the report.\n\n## Design\n\n- **Value-only detection** \u2014
        reads `base.yml` alone; does not model deploy paths.\n  The only thing a deploy-scoped
        condition would additionally exclude today is one\n  mirror-only rolling pin
        (`sonic_vs`), which is cheaper to allowlist than to model\n  both paths.\n-
        **Denylist, not a not-semver heuristic** \u2014 so odd-but-immutable tags
        (e.g.\n  `6.1-23.10_beta`) are never mistaken for rolling.\n\n## Allowlist\n\n-
        `tempest` \u2014 kolla-built test image, `latest` by design\n- `sonic_vs`
        \u2014 mirror/testbed-only, not deployed via a role or the manager render\n\n`substation`
        is **deliberately not allowlisted**: upstream\n`ghcr.io/cloudnull/substation`
        publishes immutable tags, so it can be pinned to a\nconcrete tag and wired.\n\n
        \ - osism/issues#1404\n\n## \u26A0\uFE0F Behavioural impact\n\nThis makes
        the drift job report **`substation` as a new actionable finding \u2192\nexit
        1**. That is the intended point of the change (surfacing a previously\ninvisible
        reproducibility bug), not a regression \u2014 the fix is tracked separately.\n\n##
        Testing\n\n- `tox -e drift-test` \u2014 339 tests pass (6 new in `test_rolling_pin.py`)\n-
        `black` / `flake8` / `yamllint` clean (pre-commit + manual)\n- End-to-end
        against the real `latest/base.yml`: flags exactly the three rolling\n  pins
        \u2192 `tempest`/`sonic_vs` suppressed, `substation` surfaces as the sole
        live\n  finding.\n\n## Note\n\n`develop` was added to the denylist for completeness/consistency
        with `dev`/`devel`\n(all conventional rolling branch tags); no current image
        pin uses it.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n"
      change_url: https://github.com/osism/release/pull/2587
      child_jobs: []
      commit_id: 0547274b2ae0f08b60a14283b98155212c5a80b3
      event_id: d1ab5120-8084-11f1-8302-5acc5f33b34c
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/adb019ed010f4ec6a5b24f8d7ca8f1a1/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/adb019ed010f4ec6a5b24f8d7ca8f1a1/work/logs
        result_data_file: /var/lib/zuul/builds/adb019ed010f4ec6a5b24f8d7ca8f1a1/work/results.json
        src_root: /var/lib/zuul/builds/adb019ed010f4ec6a5b24f8d7ca8f1a1/work/src
        work_root: /var/lib/zuul/builds/adb019ed010f4ec6a5b24f8d7ca8f1a1/work
      include_vars: []
      items:
      - branch: main
        change: '2587'
        change_message: "drift: add rolling_pin rolling-tag detector\n\n## What\n\nAdds
          a new drift detector, `rolling_pin`, to the drift-detection tooling. It\nflags
          any `release/<version>/base.yml` `docker_images` pin whose **value** is
          a\nrolling/mutable tag (`latest`, `main`, `master`, `stable`, `edge`, `nightly`,\n`rolling`,
          `dev`, `devel`, `develop`, `head`, `current` \u2014 case-insensitive\ndenylist).
          Such pins deploy non-reproducible images.\n\n## Why\n\nA rolling tag on
          a deployed image escaped **every** existing check, because the\ndead `base.yml`
          pin happened to *agree* with whatever actually deployed:\n\n- `release_vs_manager`
          \u2014 skips it (unwired to the manager render)\n- `role_unpinned` \u2014
          treats it as pinned (it *has* a `base.yml` pin)\n- `role_shadows` \u2014
          silent, because `base.yml` == the role default (`latest` == `latest`)\n\n`substation`
          is the exemplar: `substation: latest`, deployed via its role, never\nreproducible,
          invisible to the report.\n\n## Design\n\n- **Value-only detection** \u2014
          reads `base.yml` alone; does not model deploy paths.\n  The only thing a
          deploy-scoped condition would additionally exclude today is one\n  mirror-only
          rolling pin (`sonic_vs`), which is cheaper to allowlist than to model\n
          \ both paths.\n- **Denylist, not a not-semver heuristic** \u2014 so odd-but-immutable
          tags (e.g.\n  `6.1-23.10_beta`) are never mistaken for rolling.\n\n## Allowlist\n\n-
          `tempest` \u2014 kolla-built test image, `latest` by design\n- `sonic_vs`
          \u2014 mirror/testbed-only, not deployed via a role or the manager render\n\n`substation`
          is **deliberately not allowlisted**: upstream\n`ghcr.io/cloudnull/substation`
          publishes immutable tags, so it can be pinned to a\nconcrete tag and wired.\n\n
          \ - osism/issues#1404\n\n## \u26A0\uFE0F Behavioural impact\n\nThis makes
          the drift job report **`substation` as a new actionable finding \u2192\nexit
          1**. That is the intended point of the change (surfacing a previously\ninvisible
          reproducibility bug), not a regression \u2014 the fix is tracked separately.\n\n##
          Testing\n\n- `tox -e drift-test` \u2014 339 tests pass (6 new in `test_rolling_pin.py`)\n-
          `black` / `flake8` / `yamllint` clean (pre-commit + manual)\n- End-to-end
          against the real `latest/base.yml`: flags exactly the three rolling\n  pins
          \u2192 `tempest`/`sonic_vs` suppressed, `substation` surfaces as the sole
          live\n  finding.\n\n## Note\n\n`develop` was added to the denylist for completeness/consistency
          with `dev`/`devel`\n(all conventional rolling branch tags); no current image
          pin uses it.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/release/pull/2587
        commit_id: 0547274b2ae0f08b60a14283b98155212c5a80b3
        patchset: 0547274b2ae0f08b60a14283b98155212c5a80b3
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/release
          name: osism/release
          short_name: release
          src_dir: src/github.com/osism/release
        topic: null
      job: flake8
      jobtags: []
      max_attempts: 3
      message: ZHJpZnQ6IGFkZCByb2xsaW5nX3BpbiByb2xsaW5nLXRhZyBkZXRlY3RvcgoKIyMgV2hhdAoKQWRkcyBhIG5ldyBkcmlmdCBkZXRlY3RvciwgYHJvbGxpbmdfcGluYCwgdG8gdGhlIGRyaWZ0LWRldGVjdGlvbiB0b29saW5nLiBJdApmbGFncyBhbnkgYHJlbGVhc2UvPHZlcnNpb24+L2Jhc2UueW1sYCBgZG9ja2VyX2ltYWdlc2AgcGluIHdob3NlICoqdmFsdWUqKiBpcyBhCnJvbGxpbmcvbXV0YWJsZSB0YWcgKGBsYXRlc3RgLCBgbWFpbmAsIGBtYXN0ZXJgLCBgc3RhYmxlYCwgYGVkZ2VgLCBgbmlnaHRseWAsCmByb2xsaW5nYCwgYGRldmAsIGBkZXZlbGAsIGBkZXZlbG9wYCwgYGhlYWRgLCBgY3VycmVudGAg4oCUIGNhc2UtaW5zZW5zaXRpdmUKZGVueWxpc3QpLiBTdWNoIHBpbnMgZGVwbG95IG5vbi1yZXByb2R1Y2libGUgaW1hZ2VzLgoKIyMgV2h5CgpBIHJvbGxpbmcgdGFnIG9uIGEgZGVwbG95ZWQgaW1hZ2UgZXNjYXBlZCAqKmV2ZXJ5KiogZXhpc3RpbmcgY2hlY2ssIGJlY2F1c2UgdGhlCmRlYWQgYGJhc2UueW1sYCBwaW4gaGFwcGVuZWQgdG8gKmFncmVlKiB3aXRoIHdoYXRldmVyIGFjdHVhbGx5IGRlcGxveWVkOgoKLSBgcmVsZWFzZV92c19tYW5hZ2VyYCDigJQgc2tpcHMgaXQgKHVud2lyZWQgdG8gdGhlIG1hbmFnZXIgcmVuZGVyKQotIGByb2xlX3VucGlubmVkYCDigJQgdHJlYXRzIGl0IGFzIHBpbm5lZCAoaXQgKmhhcyogYSBgYmFzZS55bWxgIHBpbikKLSBgcm9sZV9zaGFkb3dzYCDigJQgc2lsZW50LCBiZWNhdXNlIGBiYXNlLnltbGAgPT0gdGhlIHJvbGUgZGVmYXVsdCAoYGxhdGVzdGAgPT0gYGxhdGVzdGApCgpgc3Vic3RhdGlvbmAgaXMgdGhlIGV4ZW1wbGFyOiBgc3Vic3RhdGlvbjogbGF0ZXN0YCwgZGVwbG95ZWQgdmlhIGl0cyByb2xlLCBuZXZlcgpyZXByb2R1Y2libGUsIGludmlzaWJsZSB0byB0aGUgcmVwb3J0LgoKIyMgRGVzaWduCgotICoqVmFsdWUtb25seSBkZXRlY3Rpb24qKiDigJQgcmVhZHMgYGJhc2UueW1sYCBhbG9uZTsgZG9lcyBub3QgbW9kZWwgZGVwbG95IHBhdGhzLgogIFRoZSBvbmx5IHRoaW5nIGEgZGVwbG95LXNjb3BlZCBjb25kaXRpb24gd291bGQgYWRkaXRpb25hbGx5IGV4Y2x1ZGUgdG9kYXkgaXMgb25lCiAgbWlycm9yLW9ubHkgcm9sbGluZyBwaW4gKGBzb25pY192c2ApLCB3aGljaCBpcyBjaGVhcGVyIHRvIGFsbG93bGlzdCB0aGFuIHRvIG1vZGVsCiAgYm90aCBwYXRocy4KLSAqKkRlbnlsaXN0LCBub3QgYSBub3Qtc2VtdmVyIGhldXJpc3RpYyoqIOKAlCBzbyBvZGQtYnV0LWltbXV0YWJsZSB0YWdzIChlLmcuCiAgYDYuMS0yMy4xMF9iZXRhYCkgYXJlIG5ldmVyIG1pc3Rha2VuIGZvciByb2xsaW5nLgoKIyMgQWxsb3dsaXN0CgotIGB0ZW1wZXN0YCDigJQga29sbGEtYnVpbHQgdGVzdCBpbWFnZSwgYGxhdGVzdGAgYnkgZGVzaWduCi0gYHNvbmljX3ZzYCDigJQgbWlycm9yL3Rlc3RiZWQtb25seSwgbm90IGRlcGxveWVkIHZpYSBhIHJvbGUgb3IgdGhlIG1hbmFnZXIgcmVuZGVyCgpgc3Vic3RhdGlvbmAgaXMgKipkZWxpYmVyYXRlbHkgbm90IGFsbG93bGlzdGVkKio6IHVwc3RyZWFtCmBnaGNyLmlvL2Nsb3VkbnVsbC9zdWJzdGF0aW9uYCBwdWJsaXNoZXMgaW1tdXRhYmxlIHRhZ3MsIHNvIGl0IGNhbiBiZSBwaW5uZWQgdG8gYQpjb25jcmV0ZSB0YWcgYW5kIHdpcmVkLgoKICAtIG9zaXNtL2lzc3VlcyMxNDA0CgojIyDimqDvuI8gQmVoYXZpb3VyYWwgaW1wYWN0CgpUaGlzIG1ha2VzIHRoZSBkcmlmdCBqb2IgcmVwb3J0ICoqYHN1YnN0YXRpb25gIGFzIGEgbmV3IGFjdGlvbmFibGUgZmluZGluZyDihpIKZXhpdCAxKiouIFRoYXQgaXMgdGhlIGludGVuZGVkIHBvaW50IG9mIHRoZSBjaGFuZ2UgKHN1cmZhY2luZyBhIHByZXZpb3VzbHkKaW52aXNpYmxlIHJlcHJvZHVjaWJpbGl0eSBidWcpLCBub3QgYSByZWdyZXNzaW9uIOKAlCB0aGUgZml4IGlzIHRyYWNrZWQgc2VwYXJhdGVseS4KCiMjIFRlc3RpbmcKCi0gYHRveCAtZSBkcmlmdC10ZXN0YCDigJQgMzM5IHRlc3RzIHBhc3MgKDYgbmV3IGluIGB0ZXN0X3JvbGxpbmdfcGluLnB5YCkKLSBgYmxhY2tgIC8gYGZsYWtlOGAgLyBgeWFtbGxpbnRgIGNsZWFuIChwcmUtY29tbWl0ICsgbWFudWFsKQotIEVuZC10by1lbmQgYWdhaW5zdCB0aGUgcmVhbCBgbGF0ZXN0L2Jhc2UueW1sYDogZmxhZ3MgZXhhY3RseSB0aGUgdGhyZWUgcm9sbGluZwogIHBpbnMg4oaSIGB0ZW1wZXN0YC9gc29uaWNfdnNgIHN1cHByZXNzZWQsIGBzdWJzdGF0aW9uYCBzdXJmYWNlcyBhcyB0aGUgc29sZSBsaXZlCiAgZmluZGluZy4KCiMjIE5vdGUKCmBkZXZlbG9wYCB3YXMgYWRkZWQgdG8gdGhlIGRlbnlsaXN0IGZvciBjb21wbGV0ZW5lc3MvY29uc2lzdGVuY3kgd2l0aCBgZGV2YC9gZGV2ZWxgCihhbGwgY29udmVudGlvbmFsIHJvbGxpbmcgYnJhbmNoIHRhZ3MpOyBubyBjdXJyZW50IGltYWdlIHBpbiB1c2VzIGl0LgoK8J+kliBHZW5lcmF0ZWQgd2l0aCBbQ2xhdWRlIENvZGVdKGh0dHBzOi8vY2xhdWRlLmNvbS9jbGF1ZGUtY29kZSkK
      patchset: 0547274b2ae0f08b60a14283b98155212c5a80b3
      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: 1d71e58c93442038e695a5d883d57a603182c7ae
          untrusted/project_0/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 1d71e58c93442038e695a5d883d57a603182c7ae
          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
        playbooks:
        - path: untrusted/project_0/github.com/osism/zuul-jobs/playbooks/flake8/run.yaml
          roles:
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_0/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_0/zuul-config/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_1/openinfra-zuul-jobs
            link_target: untrusted/project_2/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_1/openinfra-zuul-jobs/roles
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_2/zuul-jobs
            link_target: untrusted/project_0/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_2/zuul-jobs/roles
      post_review: false
      post_timeout: 1800
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/osism/release
        name: osism/release
        short_name: release
        src_dir: src/github.com/osism/release
      projects:
        github.com/osism/release:
          canonical_hostname: github.com
          canonical_name: github.com/osism/release
          checkout: main
          checkout_description: zuul branch
          commit: 71b47f2982d0b51ca35894d51247e6fbdc58f8d5
          name: osism/release
          required: false
          short_name: release
          src_dir: src/github.com/osism/release
      ref: refs/pull/2587/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
