Skip to content

Testing plan: a poll source's bare OWNER/REPO is on the GitHub the-loop resolves

Derived from bugfix.md and design.md, before tasks.md. Authored at test-planning; the results section is filled at verification.

This file is executable content. Commands below are what the agent runs; no credentials are involved.

Test matrix

#TypeApplies?Scope / what it provesWhere it runs
T1UnityesRepoSpec.parse / parse_repos with a default host (inherited, explicit wins, github.com unwritten, malformed refused, de-duplicated); from_source and build_provider carry default_host; the ticket's owns() regression and its negative half; describe() names the host; daemon._build_providers resolves the host from the CLI config and from $GH_HOSTuv run --project cli python -m pytest -q cli/tests/test_poller.py -k "default_host or inherit or describe or resolved_host"
T2Integration (scenario)yesScenario: A closed item on a bare enterprise source is reconciled — through poll_once, a tracked item on a source declared octo/repo under a resolved enterprise host disappears from the listing, reads as closed on that host, is stamped ended and closed through the dispatcheruv run --project cli python -m pytest -q cli/tests/test_poller_integration.py -k enterprise
T3Contract (OpenAPI / GraphQL SDL)n/a — no route or schema changes
T4End-to-endn/a — the daemon's process boundary is exercised by the existing test_poll_daemon_integration.py, which is unchanged by this fix; the host resolution it now performs is unit-tested at the helper
T5UI / visualn/a — no user-facing surface
T6Snapshotn/a — assertions on argv, specs and records
T7Performance / loadn/a — one resolver call per plan build, no per-cycle cost
T8Security / abuse caseyesone negative test per abuse case A1–A3 (bugfix.md § Security considerations); A4 by constructionuv run --project cli python -m pytest -q cli/tests/test_poller.py -k "malformed_default_host or inherits_the_default_host or github_com"
T9Accessibilityn/a — no user-facing surface
T10Migration / upgradeyesa github.com deployment is byte-identical: the issue-311 host tests and every pre-existing poller test unchanged and greenuv run --project cli python -m pytest -q cli/tests/test_poller.py cli/tests/test_poller_integration.py
T11Manual exploratoryn/a — no GitHub Enterprise deployment is reachable from this session; the reviewer's walk-through is the PR briefing's "what to check"
T12Lint / format / typecheck / config validation / full suiteyesthe repository's own gates, as pre-commit and CI run themmake check
T13Security review (gate)yesthe-loop checklist against A1–A4, recorded as evidence; tier 3 needs no human sign-offevidence/security-review.md

Scenarios & requirement trace

RowRequirement(s)Scenario / case
T1R1.1, R1.3test_repospec_inherits_a_default_host_unless_it_names_its_own
T1R1.2test_a_github_com_default_leaves_the_spec_unwritten
T1A1test_repospec_refuses_a_malformed_default_host
T1R1.1test_parse_repos_dedupes_an_inherited_host_against_a_written_one
T1R1.1, R1.3test_provider_from_source_binds_bare_repos_to_the_default_host
T1R1.1test_build_provider_carries_the_default_host
T1R1.4, R2.1, A2test_a_bare_repo_inherits_the_default_host_and_owns_its_refs (the ticket's assertion, inverted, plus the github.com twin refused)
T1R1.4test_a_bare_repos_reads_go_to_the_inherited_host (listing --repo, closure --hostname, scope_of)
T1R1.6test_describe_names_the_host_a_source_is_bound_to
T1R1.1, R1.5test_the_daemon_binds_sources_to_the_resolved_host[integrations.github.host / GH_HOST / none]
T2R2.2Scenario: A closed item on a bare enterprise source is reconciled
T8A1–A3the negative tests named above
T10A3the issue-311 host tests, test_build_provider_constructs_github (describe() for github.com unchanged)

Verification environment

  • Repositories: this repo only.
  • Services / containers: none. gh is faked at its injection point (GhClient's runner); the daemon helper is handed a config mapping and $GH_HOST is monkeypatched.
  • Fixtures & data: temp directories per test; ghe.corp.example as the host.
  • Credentials: none.
  • Bring-up: uv sync · Tear-down: none.

Evidence plan

RowEvidencePath under evidence/
T1, T2, T8, T10, T12command, counts, raw tail of the output; red → greenverification.md
T13the abuse-case table with verdicts and the tests that close eachsecurity-review.md

Verification activities

  • [x] T1 — the unit selection above
  • [x] T2 — the integration scenario
  • [x] T8 — the abuse-case selection
  • [x] T10 — the two poller suites in full
  • [x] T12 — make check
  • [x] T13 — evidence/security-review.md

Verification results

ActivityCommand / procedureOutcomeEvidence
T1uv run --project cli python -m pytest -q cli/tests/test_poller.py -k "default_host or inherit or describe or resolved_host"pass — 15 passed (all new; red first)evidence/verification.md
T2uv run --project cli python -m pytest -q cli/tests/test_poller_integration.py -k enterprisepass — 1 passed (new; red first)evidence/verification.md
T8… -k "malformed_default_host or inherits_the_default_host or github_com"pass — 7 passed (A1–A3)evidence/verification.md, evidence/security-review.md
T10uv run --project cli python -m pytest -q cli/tests/test_poller.py cli/tests/test_poller_integration.pypass — 232 passed, no pre-existing assertion changedevidence/verification.md
T12make checkpass — 3182 passed, 1 skipped; ruff, markdownlint, pyright and the config validation cleanevidence/verification.md
T13the-loop checklist over A1–A4pass; no human sign-off at tier 3evidence/security-review.md

Not executed: none.

Review comments

Appended by the-loop's record-feedback hook when a human gate approves with comments (issue-109). Append-only and attributed.

Released under the MIT License.