all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fedb:bb58
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: f9e7fce2-a939-4d27-a659-b325d6b726a9
        host_id: df70f2a3f3d0c26428f22685cfc722ebc48099d99e7332c39e017195
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fedb:bb58
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.107
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.221
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fedb:bb58
        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 python-osism-test-setup explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/python-osism/.zuul.yaml@main#128>'
      - '<Job python-osism-test-setup explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 81b7e7ba58db4b87b6d70c4110c18e2a
      build_refs:
      - branch: main
        change: '2434'
        change_message: "Add unit tests for osism/tasks/__init__.py\n\nCloses #2353\n\nAdds
          unit test coverage for the shared Celery-worker helpers in `osism/tasks/__init__.py`,
          which previously had no dedicated test module.\n\n### Change set (single
          commit)\n\n**876ab59 \u2014 Add unit tests for osism/tasks/__init__.py**\n\nIntroduces
          `tests/unit/tasks/test_init.py` (775 lines) covering the module-level helpers
          that back the Celery workers \u2014 none of which are Celery tasks themselves,
          so they are exercised directly without a broker:\n\n- **`HOST_PATTERN`**
          \u2014 the host-extraction regex: parametrized match/no-match cases, including
          the pinned `ok: [src -> dst]` delegation capture and documented gaps (`fatal:`
          lines, leading whitespace).\n- **`Config`** \u2014 the static flags (`task_default_queue`,
          `task_create_missing_queues`, `broker_connection_retry_on_startup`, `enable_utc`)
          and the complete `task_routes` queue mapping.\n- **`get_container_version`**\n-
          **`log_play_execution`**\n- **`run_ansible_in_environment`** and **`run_command`**
          \u2014 both subprocess runners, driven by a `make_process` helper that fakes
          `Popen.poll`/`stdout.readline`/`wait`.\n- **`handle_task`** \u2014 the CLI-side
          wait/revoke helper.\n\n### Notes for the reviewer\n\nTwo current behaviors
          are pinned as-is (characterization tests, not endorsements):\n- `run_command`
          with `locking=True` creates and releases a redlock but never calls `acquire()`.\n-
          Tuple arguments are not joined, because `run_ansible_in_environment` uses
          an exact-type list check.\n\n`Config.broker_url` / `Config.result_backend`
          precedence and `task_track_started` are already pinned by `tests/unit/tasks/test_config.py`
          (which reloads `osism.settings` / `osism.tasks` to exercise import-time
          resolution); this module deliberately does not duplicate them. Because `test_config.py`
          reloads `osism.tasks`, everything under test is accessed as a module attribute
          (`tasks.Config`, `tasks.get_container_version`, \u2026) rather than imported
          by name, so a binding cannot go stale depending on test order. Loguru output
          is invisible to pytest's `caplog`, so the `loguru_logs` fixture from `tests/conftest.py`
          is used for every \"warning/error logged\" assertion.\n\nNo divergence from
          the issue: the change is test-only and adds no production code.\n\n---\n\n_Implemented
          by [planwerk-agent](https://github.com/planwerk/planwerk-agent) 4c14036
          with Claude:claude-opus-4-8_"
        change_url: https://github.com/osism/python-osism/pull/2434
        commit_id: 876ab59a29d4ab058cccf9b64feac9d00e819712
        patchset: 876ab59a29d4ab058cccf9b64feac9d00e819712
        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: 5fe778fd057b415081aff459d85593f2
      buildset_refs:
      - branch: main
        change: '2434'
        change_message: "Add unit tests for osism/tasks/__init__.py\n\nCloses #2353\n\nAdds
          unit test coverage for the shared Celery-worker helpers in `osism/tasks/__init__.py`,
          which previously had no dedicated test module.\n\n### Change set (single
          commit)\n\n**876ab59 \u2014 Add unit tests for osism/tasks/__init__.py**\n\nIntroduces
          `tests/unit/tasks/test_init.py` (775 lines) covering the module-level helpers
          that back the Celery workers \u2014 none of which are Celery tasks themselves,
          so they are exercised directly without a broker:\n\n- **`HOST_PATTERN`**
          \u2014 the host-extraction regex: parametrized match/no-match cases, including
          the pinned `ok: [src -> dst]` delegation capture and documented gaps (`fatal:`
          lines, leading whitespace).\n- **`Config`** \u2014 the static flags (`task_default_queue`,
          `task_create_missing_queues`, `broker_connection_retry_on_startup`, `enable_utc`)
          and the complete `task_routes` queue mapping.\n- **`get_container_version`**\n-
          **`log_play_execution`**\n- **`run_ansible_in_environment`** and **`run_command`**
          \u2014 both subprocess runners, driven by a `make_process` helper that fakes
          `Popen.poll`/`stdout.readline`/`wait`.\n- **`handle_task`** \u2014 the CLI-side
          wait/revoke helper.\n\n### Notes for the reviewer\n\nTwo current behaviors
          are pinned as-is (characterization tests, not endorsements):\n- `run_command`
          with `locking=True` creates and releases a redlock but never calls `acquire()`.\n-
          Tuple arguments are not joined, because `run_ansible_in_environment` uses
          an exact-type list check.\n\n`Config.broker_url` / `Config.result_backend`
          precedence and `task_track_started` are already pinned by `tests/unit/tasks/test_config.py`
          (which reloads `osism.settings` / `osism.tasks` to exercise import-time
          resolution); this module deliberately does not duplicate them. Because `test_config.py`
          reloads `osism.tasks`, everything under test is accessed as a module attribute
          (`tasks.Config`, `tasks.get_container_version`, \u2026) rather than imported
          by name, so a binding cannot go stale depending on test order. Loguru output
          is invisible to pytest's `caplog`, so the `loguru_logs` fixture from `tests/conftest.py`
          is used for every \"warning/error logged\" assertion.\n\nNo divergence from
          the issue: the change is test-only and adds no production code.\n\n---\n\n_Implemented
          by [planwerk-agent](https://github.com/planwerk/planwerk-agent) 4c14036
          with Claude:claude-opus-4-8_"
        change_url: https://github.com/osism/python-osism/pull/2434
        commit_id: 876ab59a29d4ab058cccf9b64feac9d00e819712
        patchset: 876ab59a29d4ab058cccf9b64feac9d00e819712
        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: '2434'
      change_message: "Add unit tests for osism/tasks/__init__.py\n\nCloses #2353\n\nAdds
        unit test coverage for the shared Celery-worker helpers in `osism/tasks/__init__.py`,
        which previously had no dedicated test module.\n\n### Change set (single commit)\n\n**876ab59
        \u2014 Add unit tests for osism/tasks/__init__.py**\n\nIntroduces `tests/unit/tasks/test_init.py`
        (775 lines) covering the module-level helpers that back the Celery workers
        \u2014 none of which are Celery tasks themselves, so they are exercised directly
        without a broker:\n\n- **`HOST_PATTERN`** \u2014 the host-extraction regex:
        parametrized match/no-match cases, including the pinned `ok: [src -> dst]`
        delegation capture and documented gaps (`fatal:` lines, leading whitespace).\n-
        **`Config`** \u2014 the static flags (`task_default_queue`, `task_create_missing_queues`,
        `broker_connection_retry_on_startup`, `enable_utc`) and the complete `task_routes`
        queue mapping.\n- **`get_container_version`**\n- **`log_play_execution`**\n-
        **`run_ansible_in_environment`** and **`run_command`** \u2014 both subprocess
        runners, driven by a `make_process` helper that fakes `Popen.poll`/`stdout.readline`/`wait`.\n-
        **`handle_task`** \u2014 the CLI-side wait/revoke helper.\n\n### Notes for
        the reviewer\n\nTwo current behaviors are pinned as-is (characterization tests,
        not endorsements):\n- `run_command` with `locking=True` creates and releases
        a redlock but never calls `acquire()`.\n- Tuple arguments are not joined,
        because `run_ansible_in_environment` uses an exact-type list check.\n\n`Config.broker_url`
        / `Config.result_backend` precedence and `task_track_started` are already
        pinned by `tests/unit/tasks/test_config.py` (which reloads `osism.settings`
        / `osism.tasks` to exercise import-time resolution); this module deliberately
        does not duplicate them. Because `test_config.py` reloads `osism.tasks`, everything
        under test is accessed as a module attribute (`tasks.Config`, `tasks.get_container_version`,
        \u2026) rather than imported by name, so a binding cannot go stale depending
        on test order. Loguru output is invisible to pytest's `caplog`, so the `loguru_logs`
        fixture from `tests/conftest.py` is used for every \"warning/error logged\"
        assertion.\n\nNo divergence from the issue: the change is test-only and adds
        no production code.\n\n---\n\n_Implemented by [planwerk-agent](https://github.com/planwerk/planwerk-agent)
        4c14036 with Claude:claude-opus-4-8_"
      change_url: https://github.com/osism/python-osism/pull/2434
      child_jobs: []
      commit_id: 876ab59a29d4ab058cccf9b64feac9d00e819712
      event_id: 560bae80-787c-11f1-9d9f-00de1c0e830d
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/81b7e7ba58db4b87b6d70c4110c18e2a/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/81b7e7ba58db4b87b6d70c4110c18e2a/work/logs
        result_data_file: /var/lib/zuul/builds/81b7e7ba58db4b87b6d70c4110c18e2a/work/results.json
        src_root: /var/lib/zuul/builds/81b7e7ba58db4b87b6d70c4110c18e2a/work/src
        work_root: /var/lib/zuul/builds/81b7e7ba58db4b87b6d70c4110c18e2a/work
      include_vars: []
      items:
      - branch: main
        change: '2434'
        change_message: "Add unit tests for osism/tasks/__init__.py\n\nCloses #2353\n\nAdds
          unit test coverage for the shared Celery-worker helpers in `osism/tasks/__init__.py`,
          which previously had no dedicated test module.\n\n### Change set (single
          commit)\n\n**876ab59 \u2014 Add unit tests for osism/tasks/__init__.py**\n\nIntroduces
          `tests/unit/tasks/test_init.py` (775 lines) covering the module-level helpers
          that back the Celery workers \u2014 none of which are Celery tasks themselves,
          so they are exercised directly without a broker:\n\n- **`HOST_PATTERN`**
          \u2014 the host-extraction regex: parametrized match/no-match cases, including
          the pinned `ok: [src -> dst]` delegation capture and documented gaps (`fatal:`
          lines, leading whitespace).\n- **`Config`** \u2014 the static flags (`task_default_queue`,
          `task_create_missing_queues`, `broker_connection_retry_on_startup`, `enable_utc`)
          and the complete `task_routes` queue mapping.\n- **`get_container_version`**\n-
          **`log_play_execution`**\n- **`run_ansible_in_environment`** and **`run_command`**
          \u2014 both subprocess runners, driven by a `make_process` helper that fakes
          `Popen.poll`/`stdout.readline`/`wait`.\n- **`handle_task`** \u2014 the CLI-side
          wait/revoke helper.\n\n### Notes for the reviewer\n\nTwo current behaviors
          are pinned as-is (characterization tests, not endorsements):\n- `run_command`
          with `locking=True` creates and releases a redlock but never calls `acquire()`.\n-
          Tuple arguments are not joined, because `run_ansible_in_environment` uses
          an exact-type list check.\n\n`Config.broker_url` / `Config.result_backend`
          precedence and `task_track_started` are already pinned by `tests/unit/tasks/test_config.py`
          (which reloads `osism.settings` / `osism.tasks` to exercise import-time
          resolution); this module deliberately does not duplicate them. Because `test_config.py`
          reloads `osism.tasks`, everything under test is accessed as a module attribute
          (`tasks.Config`, `tasks.get_container_version`, \u2026) rather than imported
          by name, so a binding cannot go stale depending on test order. Loguru output
          is invisible to pytest's `caplog`, so the `loguru_logs` fixture from `tests/conftest.py`
          is used for every \"warning/error logged\" assertion.\n\nNo divergence from
          the issue: the change is test-only and adds no production code.\n\n---\n\n_Implemented
          by [planwerk-agent](https://github.com/planwerk/planwerk-agent) 4c14036
          with Claude:claude-opus-4-8_"
        change_url: https://github.com/osism/python-osism/pull/2434
        commit_id: 876ab59a29d4ab058cccf9b64feac9d00e819712
        patchset: 876ab59a29d4ab058cccf9b64feac9d00e819712
        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: python-osism-test-setup
      jobtags: []
      max_attempts: 3
      message: QWRkIHVuaXQgdGVzdHMgZm9yIG9zaXNtL3Rhc2tzL19faW5pdF9fLnB5CgpDbG9zZXMgIzIzNTMKCkFkZHMgdW5pdCB0ZXN0IGNvdmVyYWdlIGZvciB0aGUgc2hhcmVkIENlbGVyeS13b3JrZXIgaGVscGVycyBpbiBgb3Npc20vdGFza3MvX19pbml0X18ucHlgLCB3aGljaCBwcmV2aW91c2x5IGhhZCBubyBkZWRpY2F0ZWQgdGVzdCBtb2R1bGUuCgojIyMgQ2hhbmdlIHNldCAoc2luZ2xlIGNvbW1pdCkKCioqODc2YWI1OSDigJQgQWRkIHVuaXQgdGVzdHMgZm9yIG9zaXNtL3Rhc2tzL19faW5pdF9fLnB5KioKCkludHJvZHVjZXMgYHRlc3RzL3VuaXQvdGFza3MvdGVzdF9pbml0LnB5YCAoNzc1IGxpbmVzKSBjb3ZlcmluZyB0aGUgbW9kdWxlLWxldmVsIGhlbHBlcnMgdGhhdCBiYWNrIHRoZSBDZWxlcnkgd29ya2VycyDigJQgbm9uZSBvZiB3aGljaCBhcmUgQ2VsZXJ5IHRhc2tzIHRoZW1zZWx2ZXMsIHNvIHRoZXkgYXJlIGV4ZXJjaXNlZCBkaXJlY3RseSB3aXRob3V0IGEgYnJva2VyOgoKLSAqKmBIT1NUX1BBVFRFUk5gKiog4oCUIHRoZSBob3N0LWV4dHJhY3Rpb24gcmVnZXg6IHBhcmFtZXRyaXplZCBtYXRjaC9uby1tYXRjaCBjYXNlcywgaW5jbHVkaW5nIHRoZSBwaW5uZWQgYG9rOiBbc3JjIC0+IGRzdF1gIGRlbGVnYXRpb24gY2FwdHVyZSBhbmQgZG9jdW1lbnRlZCBnYXBzIChgZmF0YWw6YCBsaW5lcywgbGVhZGluZyB3aGl0ZXNwYWNlKS4KLSAqKmBDb25maWdgKiog4oCUIHRoZSBzdGF0aWMgZmxhZ3MgKGB0YXNrX2RlZmF1bHRfcXVldWVgLCBgdGFza19jcmVhdGVfbWlzc2luZ19xdWV1ZXNgLCBgYnJva2VyX2Nvbm5lY3Rpb25fcmV0cnlfb25fc3RhcnR1cGAsIGBlbmFibGVfdXRjYCkgYW5kIHRoZSBjb21wbGV0ZSBgdGFza19yb3V0ZXNgIHF1ZXVlIG1hcHBpbmcuCi0gKipgZ2V0X2NvbnRhaW5lcl92ZXJzaW9uYCoqCi0gKipgbG9nX3BsYXlfZXhlY3V0aW9uYCoqCi0gKipgcnVuX2Fuc2libGVfaW5fZW52aXJvbm1lbnRgKiogYW5kICoqYHJ1bl9jb21tYW5kYCoqIOKAlCBib3RoIHN1YnByb2Nlc3MgcnVubmVycywgZHJpdmVuIGJ5IGEgYG1ha2VfcHJvY2Vzc2AgaGVscGVyIHRoYXQgZmFrZXMgYFBvcGVuLnBvbGxgL2BzdGRvdXQucmVhZGxpbmVgL2B3YWl0YC4KLSAqKmBoYW5kbGVfdGFza2AqKiDigJQgdGhlIENMSS1zaWRlIHdhaXQvcmV2b2tlIGhlbHBlci4KCiMjIyBOb3RlcyBmb3IgdGhlIHJldmlld2VyCgpUd28gY3VycmVudCBiZWhhdmlvcnMgYXJlIHBpbm5lZCBhcy1pcyAoY2hhcmFjdGVyaXphdGlvbiB0ZXN0cywgbm90IGVuZG9yc2VtZW50cyk6Ci0gYHJ1bl9jb21tYW5kYCB3aXRoIGBsb2NraW5nPVRydWVgIGNyZWF0ZXMgYW5kIHJlbGVhc2VzIGEgcmVkbG9jayBidXQgbmV2ZXIgY2FsbHMgYGFjcXVpcmUoKWAuCi0gVHVwbGUgYXJndW1lbnRzIGFyZSBub3Qgam9pbmVkLCBiZWNhdXNlIGBydW5fYW5zaWJsZV9pbl9lbnZpcm9ubWVudGAgdXNlcyBhbiBleGFjdC10eXBlIGxpc3QgY2hlY2suCgpgQ29uZmlnLmJyb2tlcl91cmxgIC8gYENvbmZpZy5yZXN1bHRfYmFja2VuZGAgcHJlY2VkZW5jZSBhbmQgYHRhc2tfdHJhY2tfc3RhcnRlZGAgYXJlIGFscmVhZHkgcGlubmVkIGJ5IGB0ZXN0cy91bml0L3Rhc2tzL3Rlc3RfY29uZmlnLnB5YCAod2hpY2ggcmVsb2FkcyBgb3Npc20uc2V0dGluZ3NgIC8gYG9zaXNtLnRhc2tzYCB0byBleGVyY2lzZSBpbXBvcnQtdGltZSByZXNvbHV0aW9uKTsgdGhpcyBtb2R1bGUgZGVsaWJlcmF0ZWx5IGRvZXMgbm90IGR1cGxpY2F0ZSB0aGVtLiBCZWNhdXNlIGB0ZXN0X2NvbmZpZy5weWAgcmVsb2FkcyBgb3Npc20udGFza3NgLCBldmVyeXRoaW5nIHVuZGVyIHRlc3QgaXMgYWNjZXNzZWQgYXMgYSBtb2R1bGUgYXR0cmlidXRlIChgdGFza3MuQ29uZmlnYCwgYHRhc2tzLmdldF9jb250YWluZXJfdmVyc2lvbmAsIOKApikgcmF0aGVyIHRoYW4gaW1wb3J0ZWQgYnkgbmFtZSwgc28gYSBiaW5kaW5nIGNhbm5vdCBnbyBzdGFsZSBkZXBlbmRpbmcgb24gdGVzdCBvcmRlci4gTG9ndXJ1IG91dHB1dCBpcyBpbnZpc2libGUgdG8gcHl0ZXN0J3MgYGNhcGxvZ2AsIHNvIHRoZSBgbG9ndXJ1X2xvZ3NgIGZpeHR1cmUgZnJvbSBgdGVzdHMvY29uZnRlc3QucHlgIGlzIHVzZWQgZm9yIGV2ZXJ5ICJ3YXJuaW5nL2Vycm9yIGxvZ2dlZCIgYXNzZXJ0aW9uLgoKTm8gZGl2ZXJnZW5jZSBmcm9tIHRoZSBpc3N1ZTogdGhlIGNoYW5nZSBpcyB0ZXN0LW9ubHkgYW5kIGFkZHMgbm8gcHJvZHVjdGlvbiBjb2RlLgoKLS0tCgpfSW1wbGVtZW50ZWQgYnkgW3BsYW53ZXJrLWFnZW50XShodHRwczovL2dpdGh1Yi5jb20vcGxhbndlcmsvcGxhbndlcmstYWdlbnQpIDRjMTQwMzYgd2l0aCBDbGF1ZGU6Y2xhdWRlLW9wdXMtNC04Xw==
      patchset: 876ab59a29d4ab058cccf9b64feac9d00e819712
      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/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: 6c43cf224edb9f555e2893b5f9e82ea17b33b1da
          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: 1d71e58c93442038e695a5d883d57a603182c7ae
        playbooks:
        - path: untrusted/project_0/github.com/osism/python-osism/playbooks/test-setup.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: 6c43cf224edb9f555e2893b5f9e82ea17b33b1da
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2434/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
