Skip to content

docs(runbooks): retire the 2026-07-22 PR-landing runbook - #473

Merged
RonenMars merged 1 commit into
mainfrom
docs/retire-land-open-prs-runbook
Aug 1, 2026
Merged

docs(runbooks): retire the 2026-07-22 PR-landing runbook#473
RonenMars merged 1 commit into
mainfrom
docs/retire-land-open-prs-runbook

Conversation

@RonenMars

Copy link
Copy Markdown
Owner

Why

The runbook described itself as a "live procedure — edit it as PRs land", but the chain it sequenced is gone.

Verified 2026-08-01 — every PR it orchestrated is CLOSED with mergedAt=null, i.e. closed, not merged:

#339 #341 #343 #345 #346 #347 #353 #354 #355 #356 #357 #358 #359
#360 #361 #362 #363 #364 #368 #372 #373 #376 #385 #386 #387

The work reached main through the integration branch instead, and the PRs were closed as redundant.
The integration branch the runbook treated as proof the set could coexist, integration-dev/v1.0.0-2026-07-22, has been deleted.

That invalidates the phase order, the per-PR loop, the pre-flight sweep, the decision to close #355, the conflict A–I resolutions, and the definition of done.
The only PR row still accurate is #291, which is still open and still excluded by standing request.

What changed

The body becomes a tombstone: what the runbook was for, what actually happened, and a table pointing at where each still-true trap now lives.
The file is kept rather than deleted so inbound links resolve and nobody rebuilds the same plan from the merge report.

Two of its four traps were already in docs/troubleshooting.md (the .claude/ worktree gotcha and serial SessionScreen verification). The other two are lifted there now under a new "CI signals" section, because both are repo-wide facts rather than properties of those branches:

  • a [skip-ci] head commit reports every required context green in seconds having run nothing
  • a stacked PR (base ≠ main) still gets full CI here, since test.yml's pull_request trigger has no branches: filter

Conflict J is obsolete for a separate reason: those ios/Podfile.lock checksums encode the checkout's absolute path, so resolving it was never meaningful. #469 added scripts/reset-podfile-lock-path-noise.sh, which drops that drift.

Two live findings, one already fixed

The runbook's [skip-ci] section claimed the required contexts were Type check, Unit tests, Integration tests, Lint. The ruleset actually required only Lint and Type check — unit and integration tests could not block a merge at all, which makes the [skip-ci] trap worse than documented, not better.

Its one outstanding post-merge action (add i18n to required checks, never done since #368) is now complete: Unit tests, Integration tests and i18n were added to the main ruleset on 2026-08-01. Confirmed safe first — all three report pass on a real chore/bump-** version-bump PR (#472), so the deploy pipeline's bumps are not deadlocked.

Note: .github/workflows/test.yml:25 carries the same wrong claim about which contexts are required. Left alone here to keep this docs-only.

Every PR the runbook sequenced — the 20-PR chain plus the #376 and #385/#386/#387 follow-ups — is closed with mergedAt=null.
The work reached main through the integration branch and the PRs were closed as redundant, and the integration branch it referenced, integration-dev/v1.0.0-2026-07-22, has been deleted.
That kills the phase order, the per-PR loop, the pre-flight sweep, the #355 close decision, the A-I conflict resolutions and the definition of done.

Replace the body with a tombstone recording what happened and where the still-true content went, and lift the two repo-wide CI traps into docs/troubleshooting.md (the two jest traps were already there).
Conflict J is obsolete for a separate reason: those Podfile.lock checksums encode the checkout path and are now dropped by scripts/reset-podfile-lock-path-noise.sh.
Its one post-merge action — make i18n a required status check — is done, along with Unit tests and Integration tests, which had never been required either.

[skip-ci]
@RonenMars
RonenMars merged commit c818bc0 into main Aug 1, 2026
10 checks passed
@RonenMars
RonenMars deleted the docs/retire-land-open-prs-runbook branch August 1, 2026 08:36
RonenMars added a commit that referenced this pull request Aug 1, 2026
)

Follow-up to #473, which retired
`docs/runbooks/2026-07-22-land-open-prs.md`. These are the stale
artefacts that survived it.

> **Note:** an earlier version of this description reproduced the
literal bracketed skip tag while asserting the suite would run for real.
That sentence tripped the gate and skipped this PR's own suite. The
description now avoids the literal tag; see item 2.

## 1. `KICKOFF-landing-runbook.md` — deleted

It was the prompt that commissioned the runbook #473 retired. Everything
it references is gone: the worktree it tells you to run from
(`integration-dev/v1.0.0-2026-07-22`, deleted), the 20-PR chain, and the
`#355` close decision.
Nothing links to it — verified with `git grep` across `*.md`, `*.yml`,
`*.json`.
Its analysis survives in
[`docs/integration-merge-report-2026-07-22.md`](docs/integration-merge-report-2026-07-22.md)
and in the retired runbook's tombstone.

## 2. `.github/workflows/test.yml` — gate comment corrected (two wrong
claims)

**Which contexts are required.** The comment named four (`Type check`,
`Unit tests`, `Integration tests`, `Lint`). Two of those were never
required, and `i18n` has been required since 2026-08-01, so the true set
is five: `Lint`, `Type check`, `Unit tests`, `Integration tests`,
`i18n`.
It also said "branch protection". This repo uses a **ruleset** (`main
protection`), which is why `GET
/repos/:owner/:repo/branches/main/protection` answers `"Branch not
protected"` — a 404 already misread once as "protection is off". The
comment now points at `/rulesets`.

**What bracketing actually protects against.** The comment claimed the
tag is bracketed "so prose that merely mentions it does not accidentally
trip the skip". That is false, and this PR proved it: the haystack is
the commit message plus the PR title and body, matched with a literal
`grep -F`, so writing the bracketed tag in a description skips that PR's
suite. Bracketing only stops an *unbracketed* mention. The comment now
says so, and the hazard is recorded in `docs/troubleshooting.md` → "CI
signals".

Comment-only in the workflow; no behaviour change.

## 3. `CLAUDE.md` — base-branch rule points at `main`

It instructed opening PRs against `integration-merge-354-355-376`. That
branch **does not exist** on the remote (only an
`integration-merge-354-355-376-v2`), and all three open PRs target
`main`.

## Self-destruct notes

The `CLAUDE.md` note and the superseded runbook both exist only to cover
the in-flight `land/integration-prep` landing, so each now carries an
explicit instruction to delete it once
[`LANDING-integration-to-main.md`](LANDING-integration-to-main.md) is
done — including which row in `docs/runbooks/README.md` to remove with
it.
Same failure mode #473 documented: a doc tied to a moving branch set
outlives its subject unless it says when to die.

## Verification

- `test.yml` parses; all nine jobs intact (`gate, setup, typecheck,
unit, integration, lint, i18n, native-deps, e2e-maestro`).
- Every relative link in the changed files resolves.
- No remaining references to the deleted file.
- The suite below is a genuine run — check the durations, not just the
colour.
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.

1 participant