diff --git a/CHANGELOG.md b/CHANGELOG.md index 701d2b9896..5626956b61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,22 @@ this file. The format follows Keep a Changelog, and versioned releases follow Semantic Versioning where the repository publishes a release. ## [Unreleased] +- **Fix a stale `test_strix_quick_gate.sh` assertion left broken by the `#1630` + scheduler-cadence lengthening.** `pr-review-merge-scheduler.yml`'s repository-local + heartbeat was changed from a quarter-hourly `cron: "*/30 * * * *"` to an hourly + `cron: "30 * * * *"` (see `docs/doctoring/actions-queue-saturation-hourly-sweep.md`), + and the Python regression `tests/test_actions_queue_saturation_scheduler_cadence.py` + was updated to match at the time — but the parallel bash contract in + `scripts/ci/test_strix_quick_gate.sh` still asserted the literal old string, so + every PR whose required `exact-head-path-policy` check ran this script against a + current `main` checkout failed on an assertion the workflow file itself could no + longer satisfy, regardless of the PR's own diff. Updated the assertion to the + current cron string and corrected an adjacent stale "15-minute organization sweep + / 30-minute scheduled scan" description to the current hourly/hourly cadence. + Verified: `bash scripts/ci/test_strix_quick_gate.sh` now passes against unmodified + `main` (confirmed failing before this fix, on the same clean clone); full suite + unaffected (2600+ passed, 100% coverage, 100% docstrings) since this is a + bash-only assertion string with no Python-side counterpart to update. - **Consolidate the two genuinely duplicate quality-CI callers behind one reusable `workflow_call` gate; leave the other six alone.** An audit of the 8 `.github/workflows/*-quality-ci.yml` bootstrap-templated files found only one pair — diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index ab0d473b64..5eb704cc74 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -2628,6 +2628,71 @@ Higgins, S. S., Crepalde, N., & Fernandes, L. (2021). Segmented multiplexity: A **Evidence / acceptance.** Permanent tests forbid retry/deadline/sampling symbols in the caller and prove one gateway request, one attempt annotation, control-character-safe telemetry, missing-value rejection, valid trailing-comma normalization, and exact changed-line guidance. Fresh exact-head repository checks and reviews remain the admission authority; predecessor-head evidence is not transferable. The remaining runtime work is to preserve distinct `request_too_large`, discovery, rate-limit, provider transport, malformed-output, stale-head, and sandbox-command-timeout categories in hosted logs. +## 2026-09-02 `test_strix_quick_gate.sh` stale cron assertion left broken by the `#1630` cadence lengthening + +**Problem.** The required `exact-head-path-policy` check (which runs `bash +scripts/ci/test_strix_quick_gate.sh` against the exact PR head) was failing on +multiple, unrelated open PRs (observed directly on `.github#1476`, a PR whose own +diff never touches this script or the scheduler workflow) with: + +``` +FAIL: scheduler wakes frequently enough to clear auto-merge PRs that become stale +after their initial PR events (missing 'cron: "*/30 * * * *"') +``` + +**Root cause.** `#1630` (referenced in `docs/doctoring/actions-queue-saturation-hourly-sweep.md`) +deliberately lengthened `pr-review-merge-scheduler.yml`'s repository-local heartbeat +from a quarter-hourly `cron: "*/30 * * * *"` to an hourly `cron: "30 * * * *"` to +reduce Actions-capacity pressure during the sustained organization-wide queue +saturation this session repeatedly documented. The Python regression +`tests/test_actions_queue_saturation_scheduler_cadence.py` was correctly updated at +the time (it now asserts `'- cron: "30 * * * *"' in workflow` and explicitly +`'*/30 * * * *' not in workflow`) — but the parallel bash contract test, +`scripts/ci/test_strix_quick_gate.sh`, was not, and kept asserting the literal old +string. This is a genuine, reproducible defect on protected `main` itself, not a +symptom of any one PR being stale: I confirmed it by running the script directly +against an unmodified, freshly cloned `main` (commit `8c085835`) before making any +change, and it failed with the identical message. + +**Why this matters at organization scale.** `exact-head-path-policy` is a required +check for every PR touching Strix-quick-gate-covered paths, checked out against +each PR's own exact head but running this trusted base-branch script. Since the +assertion can never pass against the current, correctly-updated workflow file, this +was a standing, silent block on an unbounded number of unrelated PRs across the +whole `.github` PR queue until fixed at the root -- exactly the class of "root +cause outside any one PR's diff" issue this session's operating directive requires +be fixed at the canonical location rather than worked around per-PR. + +**Fix.** Updated the one stale assertion (`scripts/ci/test_strix_quick_gate.sh`) +from `'cron: "*/30 * * * *"'` to `'cron: "30 * * * *"'`, matching the workflow's +actual current value and the already-correct Python-side assertion. Also corrected +an adjacent stale human-readable description ("scheduler isolates the 15-minute +organization sweep from the separate 30-minute scheduled scan") to the current +hourly/hourly cadence -- both `org-queue-sweep` and this repository-local scan are +now hourly, so the old minute figures described a schedule that no longer exists. + +**Verification.** `bash scripts/ci/test_strix_quick_gate.sh` — confirmed FAIL on +unmodified `main` before the change, confirmed PASS after. Full suite: +`coverage run -m pytest tests -q` — all passed; `coverage report --fail-under=100` +— 100% on `scripts/ci/`; `interrogate` — 100%. This is a bash-string-only fix with +no Python production code touched, so the full-suite pass is a non-regression +check, not evidence the fix itself works — the direct before/after script run is +that evidence. + +**Risk of this fix itself.** Essentially none: a one-line literal-string update in +a test assertion, verified to both fail before and pass after against the exact +same unmodified `main` checkout. No workflow, script, or other test file changed. + +**Expected effect.** `exact-head-path-policy` stops failing organization-wide PRs +on this assertion once this fix reaches protected `main`; any PR whose branch has +already synced past this point (or syncs after) picks it up automatically. + +**Follow-up.** None identified — this closes the specific gap. If a future cadence +change lands again, the durable fix is process, not code: update every test that +asserts the literal cron string (currently exactly these two files) in the same PR +that changes the cron value, per this repo's own "contract tests pin workflows AND +prose" convention already stated in `CLAUDE.md`. + ## Item 4 fresh evidence: gateway 500 after a 649.5s "connecting" phase with `served_model=unknown` — 2026-09-03 **Status:** A live, current instance of item 4's still-open telemetry complaint, distinct from the already-resolved html4tree/900-second caller-repair-deadline case above (that mechanism was removed by PR #1672). Recorded here from a fresh, exact job log. Two distinct defects were found in the one error line below, both root-caused and both with a fix proposed but not yet merged: a caller-owned phase-mislabeling bug (this repository's own `scripts/ci/noema_review_gate.py`, see below) and a gateway-owned attribution gap (`contextual-orchestrator`'s `_invoke` failover loop, relayed to and fixed by the peer session with deep context in that repo, see below). diff --git a/scripts/ci/test_strix_quick_gate.sh b/scripts/ci/test_strix_quick_gate.sh index f846fb2597..56a2ad8fb5 100755 --- a/scripts/ci/test_strix_quick_gate.sh +++ b/scripts/ci/test_strix_quick_gate.sh @@ -1559,11 +1559,11 @@ assert_pr_review_merge_scheduler_uses_github_actions_bot_token() { assert_file_contains "$workflow_file" 'pull_request_target:' "scheduler can run as an organization required workflow without repository-local copies" assert_file_contains "$workflow_file" 'auto_merge_enabled' "scheduler rechecks already stale PRs as soon as native auto-merge is enabled" assert_file_contains "$workflow_file" 'workflows: ["Required OpenCode Review", "Strix Security Scan"]' "scheduler reruns after review or security evidence completion so approvals can trigger merge/update actions" - assert_file_contains "$workflow_file" 'cron: "*/30 * * * *"' "scheduler wakes frequently enough to clear auto-merge PRs that become stale after their initial PR events" + assert_file_contains "$workflow_file" 'cron: "30 * * * *"' "scheduler wakes frequently enough to clear auto-merge PRs that become stale after their initial PR events" assert_file_not_contains "$workflow_file" "github.event.pull_request.number == 240" "scheduler must not hard-code repository-specific PR bypasses" assert_file_contains "$workflow_file" "github.event_name == 'pull_request_target' && format('pr-{0}', github.event.pull_request.number)" "scheduler scopes pull_request_target concurrency to the active PR" assert_file_contains "$workflow_file" "github.event_name == 'workflow_run' && github.event.workflow_run.pull_requests[0].number && format('pr-{0}', github.event.workflow_run.pull_requests[0].number)" "scheduler scopes workflow_run concurrency to the completed review PR" - assert_file_contains "$workflow_file" "github.event_name == 'schedule' && format('schedule-{0}', github.event.schedule)" "scheduler isolates the 15-minute organization sweep from the separate 30-minute scheduled scan" + assert_file_contains "$workflow_file" "github.event_name == 'schedule' && format('schedule-{0}', github.event.schedule)" "scheduler isolates the hourly organization sweep from the separate hourly repository-local scan" assert_file_contains "$workflow_file" "github.event_name == 'repository_dispatch' && github.event.client_payload.target_repository != '' && github.event.client_payload.pr_number != ''" "scheduler scopes targeted manual queue scans to the requested PR" assert_file_contains "$workflow_file" "cancel-in-progress: \${{ github.event_name == 'pull_request_target' || github.event_name == 'pull_request_review' || github.event_name == 'repository_dispatch' || (github.event_name == 'workflow_run' && !github.event.workflow_run.pull_requests[0].number) }}" "scheduler cancels stale PR/review/manual queue scans instead of accumulating merge/update attempts" assert_file_contains "$workflow_file" "timeout-minutes: 60" "organization sweep has enough headroom to finish the complete repository walk"