Skip to content

docs(release): document admin-created desktop release tags - #1694

Merged
kalvinnchau merged 1 commit into
mainfrom
ci/desktop-release-tag-param
Oct 28, 2026
Merged

kalvinnchau merged 1 commit into
mainfrom
ci/desktop-release-tag-param

Conversation

@kalvinnchau

@kalvinnchau kalvinnchau commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Summary

This documents how to create desktop-v* release tags before the release GitHub App exists.

  • Ruleset: the desktop-release-tags tag ruleset restricts creating, updating, deleting and force-pushing refs/tags/desktop-v*. Its only bypass actor is the repository admin role.
  • Tagging: a repository admin creates each annotated tag by hand on a commit in main history. docs/releases.md gives the commands.
  • Later: once the App exists, the setup step makes it the ruleset's only bypass actor, and Desktop release tag (desktop-release-tag.yml) works unchanged.

An earlier version of this PR added a release_tag_version input to Desktop previews that tagged with the workflow token. I removed it because the workflow token cannot bypass the ruleset, so that path would only fail.

Validation

  • node --test tests/integration/packaging.test.mjs passes.
  • This is a docs-only change, so there is no workflow or script behavior to exercise.

🤖 Generated with Claude Code

@kalvinnchau
kalvinnchau requested a review from a team as a code owner October 27, 2026 04:22

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account.

Please add the required Signed-off-by trailer to commit ed88ebd: the pinned repository policy requires one on every PR commit, but this commit has only co-author trailers. The hosted DCO check is green; the commit message still lacks the stated certification. Preserve the existing co-author credits.

No actionable code defects found after Rocket, Mantis, Groot and integration review. Head ed88ebdab3757ef87f8a5e6dfff922efd1f5a321; base 64020ded90882f5e7609b76d8778c4f1f27a3dac. Source only: no tests or workflows run; live tag permissions and downstream release consumers remain unverified.

@kalvinnchau
kalvinnchau force-pushed the ci/desktop-release-tag-param branch from ed88ebd to b539c17 Compare October 27, 2026 09:33
@kalvinnchau

Copy link
Copy Markdown
Contributor Author

🤖 Fixed. I amended the commit with git commit --amend --signoff and force-pushed it as b539c17fa. It now carries Signed-off-by: Kalvin Chau <[email protected]>, and both co-author trailers are still there. Only the message changed: git diff ed88ebdab b539c17fa is empty.

@kalvinnchau
kalvinnchau force-pushed the ci/desktop-release-tag-param branch from b539c17 to b6376ba Compare October 27, 2026 15:41
until the release app exists, the desktop-v* tag ruleset lets only the
repository admin role bypass it, and an admin tags a main commit by hand.
the workflow token cannot bypass the ruleset, so no workflow creates these
tags in the meantime.

Co-authored-by: peon <9ac6794b000690b7e814eb1805ad32405d0bec7d52838de3a86cf967565dacc0@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Kalvin Chau <[email protected]>
@kalvinnchau
kalvinnchau force-pushed the ci/desktop-release-tag-param branch from b6376ba to 78cb441 Compare October 27, 2026 15:42
@kalvinnchau kalvinnchau changed the title ci(release): publish desktop release tags from desktop previews docs(release): document admin-created desktop release tags Oct 27, 2026

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account: no changes requested after Rocket, Mantis, Groot and integration review. The prior missing DCO sign-off is fixed; the manual annotated-tag instructions and later App-only transition are consistent with the existing release machinery.

Head 78cb4413f35cdb2de86718301d48e93475039bba; base 7a2bf581b966932eeb851155a78c9ee84515d7a6. Source only: no tests or workflows run; CI, live ruleset/bypass permissions and downstream release consumers remain unverified.

@kazemek21 kazemek21 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kyle reviewed this PR and the Nexus review-tracker notes and approved with no comments.

Posted by Codex (gpt-6.1-sol) on behalf of kylez.

@kalvinnchau
kalvinnchau merged commit 5d44072 into main Oct 28, 2026
36 checks passed
@kalvinnchau
kalvinnchau deleted the ci/desktop-release-tag-param branch October 28, 2026 21:59
matt2e added a commit that referenced this pull request Nov 5, 2026
…2607)

## Problem

The PR flake check repeated only the tests in files a pull request
edited. If a product change made an unedited test racy, the check
selected nothing. #2000 repeated one emoji journey and skipped the seven
other specs that load `emoji.html`. Five of its flaky journeys were in
those specs.

## What changes

`scripts/flake-check.mjs select` now selects in two tiers:

- **Tier 1, edited tests.** This is exactly the old rule: same
repetitions, both engines. The budget never trims it, even when tier 1
alone goes over.
- **Tier 2, related tests**, run as whole files:
- Browser specs that import a changed helper, or that open a
`tests/fixtures/*.html` page whose module graph holds a changed source
file, stylesheet or patched package. One rolldown build of every spec
and fixture page supplies the graph and writes nothing (1,027 modules in
about 1 s).
- Vitest files related to the changed modules through Vitest's module
graph. This is the graph the pre-push `vitest related` uses.

Picks are ranked by specificity: the smallest route that holds a changed
file comes first, and the cheaper test wins a tie. A test named after a
changed module ranks ahead of that order (`ComposerAttachments.tsx` →
`composer-attachments.spec.mjs`). The step summary marks those rows as a
naming heuristic, not graph evidence. Tier 2 adds picks in rank order
while each lane's predicted wall time (`flake_browser` and
`flake_vitest`) stays within **9 minutes** (`LANE_BUDGET_MINUTES`;
`--budget=<minutes>` overrides it). The 40-journey and 20-Vitest-file
caps still apply, and the pick that crosses a cap still runs.

**Cost table.** `scripts/flake-check-costs.json` is checked in and
written by the new `flake-check costs [run-id…]` subcommand. By default
it reads the latest three green `main` push runs. It reads the required
lanes' Playwright and Vitest reports and stores median passing seconds
per journey title as [Chromium, WebKit], plus a median per Vitest file.
A test missing from the table falls back to its file's median, then to
the engine-wide median or the median of all Vitest files. I checked in
the table instead of fetching timings in CI for three reasons: `select`
stays reproducible from the commit, `flake_select` needs no token or
network, and the artifacts are about 100 MB per run and expire after 7
days. The current table comes from runs 41990511962, 41980968364 and
41979442279 (Nov 5): 1,049 journeys and 964 Vitest files in 181 KB.

**Lane model.** I fit the model to hosted PR runs from Nov 4–5. The
median predicted/actual ratio is 0.95 for the browser lane and 1.02 for
Vitest.

- Browser shard: 105 s of overhead + 1.11 × the shard's summed test time
× 10 repetitions / 2 workers, then × 1.22 for imbalance when there is
more than one shard.
- Vitest batch: 26 s + 5 × (5.7 s + 0.72 × max(sum / 2, slowest file)).

The step summary gains a Tier column. It also shows each lane's
predicted time against the budget, with the edited-only time beside it,
and the related picks dropped for time and for the cap.

`docs/contributing.md` describes the tiers and the budget. It also
corrects "at most eight" shards to sixteen (`MAX_SHARDS`).

## For reviewers: the budget takes the longest fitting prefix

Tier 2 does **not** stop at the first pick that would go over the
budget. It takes the longest rank-order prefix whose predicted lane
fits. Browser shards grow with the selection (one shard per five
journeys), so a longer prefix can predict a *shorter* lane than a
shorter prefix. In the 248-PR replay, stopping at the first overrun
would have trimmed browser picks in 45 PRs. In 44 of those, the cap-only
selection already fit, and 40 predicted a slower lane after trimming.
#2000 would have kept 2 related journeys at 8.6 minutes instead of 46 at
6.2, and lost both of its flaky specs. Ranks are never skipped. The
Vitest lane only grows with each pick, so both rules give the same
result there. A unit test covers the non-monotonic case, and that test
fails under a first-overrun loop.

## Validation

Replays of `select <merge>^1 <merge>` in detached checkouts of each
merge commit. Selection before this PR → after:

| PR | Edited Vitest / journeys | Related journeys | Related Vitest |
Browser lane (min) | Vitest lane (min) | Flaky targets kept |
| --- | --- | --- | --- | --- | --- | --- |
| #2000 0944c1d | 1 / 1 | 0 → 46 (12 specs, incl. reactions-polish,
message-overlays) | 0 → 4 | 6.2 | 1.5 | yes |
| #1361 5992e69 | 2 / 0 | 0 → 40 (incl. composer-attachments, by name)
| 0 → 0 (budget) | 8.0 | 9.4 (edited alone 9.4) | yes |
| #2291 83b72a3 | 2 / 153 | 0 → 0 (budget) | 0 → 18 | 15.3 (edited
alone 15.3) | 6.6 | n/a |
| #1910 e7ae7b1 | 3 / 0 | 0 → 53 | 0 → 10 | 5.7 | 9.0 | n/a |

Lane times are this PR's predictions. Without the budget (the first
commit alone), the Vitest lane would have been 9.8 min for #2000, 16.3
min for #1910 and 6.6 min for #2291, and #2291's browser lane 18.3 min.
`--budget=Infinity` reproduces the first commit's output byte for byte
on all four source PRs. In the first commit's replay, a spec-only PR
(#2557) and a docs-only PR (#1694) selected exactly what the old rule
selected.

- `node --test tests/integration/flake-check.test.mjs`: 20 pass. Biome
is clean, including the table.
- Local `select` time on a laptop: #2000 takes 49 s with a cold Vitest
cache and 6 s warm (13 s before); #1361 takes 63 s cold and 8 s warm (19
s before). CI runs cold, within the select job's 5-minute limit. These
are local measurements, not hosted ones.

## Cost and known gaps

- **Runner-minutes grow about 7.5×.** In a replay of the 248 PRs merged
Nov 2–4, flake runner-minutes per run averaged about 11.4 under the old
rule and about 84 with related selection. Almost every source PR fills
the 40/20 caps, and the caps are what bound the cost. The budget limits
wall time only: against the first commit it moves the mean from 84.6 to
84.0 and the max from 381 to 319 (#2291). Lane wall time stays about 6–7
minutes for most PRs, and the highest predicted lanes fall from 16.7 to
13.7 minutes (browser) and from 16.3 to 10.4 (Vitest). All 11 Vitest
lanes still over 9 minutes are over on edited tests alone. The lanes
stay advisory, and repetitions, timeouts and workers are unchanged.
- **Not yet run in hosted CI.** This PR's own run will be the first.
- **Cost table drift.** Timings go stale until someone reruns
`flake-check costs`.
- **Model error.** Predicted/actual ranges from 0.73 to 1.23 (p10–p90)
for the browser lane and from 0.75 to 1.58 for Vitest. A Vitest
`file:line` filter is charged for its whole file.
- **Full-app journeys.** Journeys that load the full app rather than a
fixture page are reached only through helpers. This misses #1729, #2108
and #1969, which a coverage-map follow-up would address. A patched
package reaches browser specs but not Vitest files.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: Matt Toohey <[email protected]>
Co-authored-by: Claude Fable 5.1 <[email protected]>
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.

3 participants