Skip to content

Verification (issue-462) ​

Run on 2026-10-06 on branch claude/github-issue-462-r9n2t7, using uv 0.12.23 (the repository requires >=0.12,<0.13). GitHub is ghfakes.FakeGitHubClient for core, CLI, service and dispatcher tests, and the github_replay HTTP double for the client test, with the signed-URL download replaced by a stub (ghapi._urlopen). The suite's autouse fixture refuses any real socket.

Activities ​

  • [x] T1–T6 and T7–T8 written first and seen red against the code before the change.
  • [x] T1–T9 green after the change.
  • [x] T13 poll-ingress CI (added on review), red with the change stashed, then green.
  • [x] T10 full suite, ruff (lint and format), pyright, markdownlint, config validation.
  • [x] T11 security review (security-review.md).

T1–T6: red before the change ​

text
$ cd cli && uv run python -m pytest -q -k "462 or job_log or github_verbs_are_tools" \
    tests/test_ghapi.py tests/test_github_ops.py tests/test_github_verbs_cli.py \
    tests/test_github_verbs_integration.py tests/test_mcp_integration.py
FAILED tests/test_ghapi.py::test_issue_462_job_log_tail_reads_the_redirect_and_fetches_it_without_the_token
FAILED tests/test_ghapi.py::test_issue_462_a_long_log_keeps_only_its_tail_and_says_when_it_was_cut
FAILED tests/test_ghapi.py::test_abuse_462_a_log_redirect_that_is_not_https_is_refused
FAILED tests/test_ghapi.py::test_abuse_462_a_bad_job_id_is_refused_before_any_request
FAILED tests/test_ghapi.py::test_issue_462_a_job_without_a_log_is_an_error_with_githubs_status
FAILED tests/test_github_ops.py::test_issue_462_pr_checks_lists_every_check_with_the_failing_logs
FAILED tests/test_github_ops.py::test_issue_462_pr_checks_failing_filters_and_log_lines_0_fetches_no_log
FAILED tests/test_github_ops.py::test_issue_462_pr_checks_fetches_at_most_five_logs
FAILED tests/test_github_ops.py::test_issue_462_a_log_that_cannot_be_read_does_not_fail_the_read
FAILED tests/test_github_ops.py::test_issue_462_a_startup_failure_is_failing
FAILED tests/test_github_ops.py::test_issue_462_pr_checks_of_a_missing_pull_request_is_exit_1
FAILED tests/test_github_ops.py::test_issue_462_a_long_summary_is_capped - At...
FAILED tests/test_github_ops.py::test_abuse_462_pr_checks_refuses_before_any_request[12-]
FAILED tests/test_github_ops.py::test_abuse_462_pr_checks_refuses_before_any_request[github:evil.example/octo/repo#12-]
FAILED tests/test_github_ops.py::test_abuse_462_pr_checks_refuses_a_negative_log_line_count
FAILED tests/test_github_verbs_cli.py::test_issue_462_pr_checks_prints_the_failing_checks_with_their_logs
FAILED tests/test_github_verbs_integration.py::test_issue_462_the_service_lists_a_pull_requests_failing_checks
FAILED tests/test_mcp_integration.py::test_the_github_verbs_are_tools - Asser...
18 failed, 234 deselected in 2.46s

T7–T8: red before the change ​

The gate's module did not exist, so both files failed at collection:

text
$ cd cli && uv run python -m pytest -q tests/test_cimonitor.py tests/test_ci_autofix_integration.py
ERROR tests/test_cimonitor.py
ERROR tests/test_ci_autofix_integration.py
!!!!!!!!!!!!!!!!!!! Interrupted: 2 errors during collection !!!!!!!!!!!!!!!!!!!!
2 errors in 0.19s

T1–T9: green after the change ​

text
$ cd cli && uv run python -m pytest -q -k "462 or job_log or github_verbs_are_tools" \
    tests/test_ghapi.py tests/test_github_ops.py tests/test_github_verbs_cli.py \
    tests/test_github_verbs_integration.py tests/test_mcp_integration.py
18 passed, 234 deselected in 5.54s

$ cd cli && uv run python -m pytest -q tests/test_cimonitor.py \
    tests/test_ci_autofix_integration.py tests/test_api_contract_parity.py \
    tests/test_docs_parity.py tests/test_config_schema_parity.py tests/test_routing.py
260 passed in 5.33s

test_api_contract_parity.py is green only because the authored contract names GET /api/v1/pull-requests/checks (listPullRequestChecks). test_docs_parity.py is green only because routing-options.md documents ci.autofix and ci.maxAttempts with their type and default. test_routing.py's settled-vocabulary test was extended with the two ci-* outcomes, as its docstring requires of a new settlement.

T13: CI on the poll ingress (added on review) ​

Written in the same step as the code, so "red" here is the suite run against the poller and schema with the change stashed (the test file imports PollCiConfig, which did not exist):

text
$ git stash push -- cli/the_loop/poller cli/the_loop/schemas .the-loop/cli-config.schema.json
$ cd cli && uv run python -m pytest -q tests/test_poll_ci.py
ERROR tests/test_poll_ci.py
!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
$ git stash pop

$ cd cli && uv run python -m pytest -q tests/test_poll_ci.py tests/test_docs_parity.py \
    tests/test_config_schema_parity.py tests/test_poller.py \
    tests/test_poller_integration.py tests/test_poll_daemon_integration.py
287 passed in 34.51s

T10: the full suite and the hooks ​

text
$ cd cli && uv run python -m pytest -q
5483 passed, 1 skipped, 2 warnings in 235.16s (0:03:55)

$ uv run ruff check cli hooks
All checks passed!

$ uv run ruff format --check cli hooks
417 files already formatted

$ uv run pyright cli
0 errors, 0 warnings, 0 informations

$ npx --yes markdownlint-cli2@0.18.1 "**/*.md"
Summary: 0 error(s)

$ uv run python scripts/validate_config.py
VALID   .the-loop/cli-config.yaml
VALID   skills/the-loop/templates/cli-config.yaml

Results ​

ActivityCommandOutcomeEvidence
T1 clientpytest tests/test_ghapi.py -k 462pass (red first)above
T2 corepytest tests/test_github_ops.py -k issue_462pass (red first)above
T3 abusepytest tests/test_github_ops.py -k abuse_462pass (red first)above
T4 CLIpytest tests/test_github_verbs_cli.py -k 462pass (red first)above
T5 integrationpytest tests/test_github_verbs_integration.py -k 462pass (red first)above
T6 contract / MCPtest_api_contract_parity.py, test_mcp_integration.pypass (MCP red first)above
T7 gate unitpytest tests/test_cimonitor.pypass (red first)above
T8 gate integrationpytest tests/test_ci_autofix_integration.pypass (red first)above
T9 configtest_cimonitor.py -k schema, parity tests, validate_config.pypassabove
T10 regressionfull suite + hookspassabove
T11 securityreviewpasssecurity-review.md
T12—n/ano UI; the only stored data is the poll ledger's ciSeen map
T13 poll CIpytest tests/test_poll_ci.pypass (red with the change stashed)above

Released under the MIT License.