Skip to content

Recover blocked release PRs with one targeted Fix run - #2021

Open
JacobStephens2 wants to merge 5 commits into
mainfrom
issue-2016
Open

JacobStephens2 wants to merge 5 commits into
mainfrom
issue-2016

Conversation

@JacobStephens2

@JacobStephens2 JacobStephens2 commented Nov 11, 2026 •

Copy link
Copy Markdown
Owner

Summary

Release PRs could wait forever on missing workflows or an obsolete head. Observe the captured PR throughout CI and delegate actionable recovery to the existing Fix run.

observe current release PR/head
  conflict or completed CI failure → one Fix(URL, --no-merge, --no-base-fix)
  changed content → validate exact bump → requested Experiment → refresh notes
  missing workflows → 300-second startup grace → recovery instructions
  green current head → tag → publish → merge

Persist the notes’ content base so an interrupted Fix cannot leave a resumed release with stale notes. Refresh unmarked legacy notes before tagging, and recognize repaired merge heads during interrupted failed-publication recovery. Refuse changed identity, state, branches, origin, version or extra source changes before tagging; cap head changes at five.

Closes #2016

Evidence

Execution evidence

  • Before: cargo test --test release checks::a_conflict_without_workflows_runs_one_targeted_fix_and_releases_the_repaired_head -- --exact --nocapture
    failed with 0 passed; 1 failed, printing waiting for CI on …/pull/4 until the ten-second fixture deadline. The fixture creates real competing Cargo version bumps and verifies a Git merge conflict.
    After: the same command passed: 1 passed; 0 failed.
  • Before: python3 /tmp/thirdshift-2016-spec-regressions/run.py (reviewer’s retained standalone regression) exited 101: Published repaired content with stale release notes: Old release notes: version diff starts at 0.1.0.
    After: the same command exited 0: 1 passed; 0 failed. Its regression is retained as checks::spec_resume_after_interrupted_fix_refreshes_release_notes.
  • Before: python3 /tmp/thirdshift-2016-followup-spec/run.py exited 101 with Published repaired legacy content with stale release notes.
    After: the same command passed: 1 passed; 0 failed. Kept as checks::an_unmarked_legacy_pr_repaired_before_resume_refreshes_its_notes.
  • Before: python3 /tmp/thirdshift-2016-spec-regressions/recovery.py exited 101, incorrectly refusing the repaired tag during interrupted publication recovery.
    After: the same command passed: 1 passed; 0 failed. Kept as checks::recovery_after_a_repaired_tag_resumes_between_branch_and_tag_pushes.
  • Initial release suite: cargo test --test release -- --test-threads=3 — 120 passed, 2 fixture entry points ignored, before the final review fixes.
  • The first scripts/affected-tests main run passed site and Console browser checks; its Rust run was interrupted to incorporate the final fixes.
  • The first final Rust run stopped on unchanged tokens::read_scope_cannot_read_security_findings: only the API/CLI age_seconds values differed by one second. cargo test --test console tokens::read_scope_cannot_read_security_findings -- --exact --nocapture passed in isolation (1 passed).
  • Final Rust validation: CI test job passed on exact final head 864c03fe6d76f35b8f1f309669bc509e6ff4be08: cargo nextest run — 4,244 passed, 97 skipped, test execution 1,504.784 seconds plus 89 seconds compilation. cargo fmt --check and cargo clippy --all-targets -- -D warnings passed in that job. CI used the repository's normal no-retry profile.
  • NEXTEST_TEST_THREADS=4 NEXTEST_RETRIES=1 scripts/affected-tests 1608e504 selected full Rust and release-generator checks for the final changes. Its duplicate Rust run was stopped after exact-head CI succeeded, following docs/testing.md's instruction to reuse successful CI. The one-second Console comparison had not failed again. python3 -m unittest discover -s scripts -p test_generate_release.py then passed 3 tests.
  • Earlier affected-test selection passed npm test --prefix site (116.77s), cargo build --locked (140.33s, compilation included), and npm test --prefix console (280.77s). Those source files did not change after that run; npm run docs:check --prefix site also passed.
  • Remote runner limitation: site/Console browser and Release artifact dependency installation encountered Temporary failure resolving azure.archive.ubuntu.com before the affected checks. Failed Release jobs were retried once; artifact jobs remain failed at dependency setup. Failed CI browser jobs are rerunning. The successful full Rust job is retained; no source or workflow change was made for the mirror outage.

Test seams: the real scripts/release.sh CLI, Git refs, PR/workflow observations through fake GitHub, and targeted Fix/Experiment/summary commands through fake Cargo/Harness adapters. All fixture children are bounded and owned; tests launch no real agent or release.

Visual evidence

Documentation at matching viewports and reading states; captures contain no personal data.

Release manual, 1440×900:

Before

After

Release manual, 390×844:

Before

After

Homepage, 1440×900:

Before

After

Homepage, 390×844:

Before

After

How it works, 1440×900:

Before

After

How it works, 390×844:

Before

After

Architecture, 1440×900:

Before

After

Architecture, 390×844:

Before

After

Review coverage

Standards: 2 P3 findings, both addressed by reusing the fake PR adapter and sharing the bounded script runner. Spec: 1 P2 finding, reproduced and fixed with a retained regression.

Both reviewers inspected every changed file, including generated site/docs/index.html. Generated exclusions: none. Changed files left unread: none. Reports and finding counts are retained with the Session trace.

Unaddressed findings

  • Standards: None.
  • Spec: None.

Merge Danger

Door: two-way

The script can be reverted. Release publication itself retains its existing immutable-tag and publication-before-merge safeguards.

Blast Radius: releases

Only maintainer release orchestration and its documentation/fixtures change. One automatic targeted Fix run may consume agent time when a release PR conflicts or completed CI fails.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

release.sh: recover conflicted release PRs with a targeted Fix run and refresh CI waits

1 participant