Skip to content

Release v0.2.3 - #650

Merged
Birfy merged 1 commit into
mainfrom
release/v0.2.3
Oct 21, 2026
Merged

Birfy merged 1 commit into
mainfrom
release/v0.2.3

Conversation

@Birfy

@Birfy Birfy commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator

Daily mechanical release: folds the changelog fragments into ## [0.2.3] - 2026-10-22 and bumps the core to 0.2.3. Covered by the standing approval for mechanical release PRs (maintainer decision 2026-10-19 07:02 Asia/Shanghai).

What changed (only the mechanical release files)

  • CHANGELOG.md: changelog.mjs release 0.2.3 --date 2026-10-22 folded 29 fragments; changelog.d/* fragments removed. No hand edits.
  • core/package.json, core/package-lock.json: 0.2.2 to 0.2.3.
  • patches/ds-bot/0007-version-and-tooling.patch: its three version lines bumped by hand; ds-bot-patches.mjs generate was not run because this container has no git binary.

Since v0.2.2: 37 squash-merged commits on main.

Ran at the tip (Node 22.23.3, fresh tarball of main fe79de66)

  • changelog.mjs check and release (29 fragments), check-release-version.mjs 0.2.3, release-notes.mjs 0.2.3: ok.
  • Branch diff reviewed: 33 files — the four mechanical files modified plus 29 fragment deletions; nothing else.
  • Preflight: no release for 0.2.3 yet; the latest Test on main (fe79de66) green (tests-ok, package, all three plugin jobs); 29 fragments at the time of the run.

Not run: ds-bot-patches.mjs generate / check (no git binary in this container), check-pack.mjs, npm ci + npm run harness + TZ=UTC npm run verify (no checkout dependency tree, 2 GiB memory), smoke test, typecheck, actionlint — the tests-ok and package CI jobs at the tip cover the build and the tests. No tag or release is created by this PR; the tag is pushed after the merge and release.yml publishes the GitHub release from the CHANGELOG section.

Tier: T3 (release metadata / core/package.json), under the standing approval; needs green tests-ok at the tip.

Docs-not-needed: release metadata only (changelog, version bump, generated patch); no subsystem contract changes.

Daily mechanical release: folds the changelog fragments into `## [0.2.3] - 2026-10-22` and bumps the core to `0.2.3`. Covered by the standing approval for mechanical release PRs (AGENTS.md).
@github-actions github-actions Bot added the risk:T3 Risk tier T3 (needs a human approval), set by the controller from the diff label Oct 21, 2026
@Birfy

Birfy commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator Author

Enqueued by: Chief (owner proxy — Release had no injected credential this round: DSH_SECRET_GITHUB_TOKEN length 0, connector refused, anonymous 401 Bad credentials).

  • Head: 2128cc359c9c5a095ef4408b2dc7b8adce20881d, mergeable: clean, no hold.
  • Checks at that sha: 8/8 completed / success.
  • This is a mechanical release PR under the standing approval recorded in AGENTS.md ("Standing approval: mechanical release PRs", maintainer decision 2026-10-19 07:02 Asia/Shanghai), so the review gate does not apply to it; the risk tier is risk:T3.
  • Release will tag v0.2.3 and publish the release once this merges; if it cannot because the credential is still missing, that is reported, not retried blindly.

Written by: Chief (owner proxy).

@Birfy
Birfy added this pull request to the merge queue Oct 21, 2026
Merged via the queue into main with commit 6438cb2 Oct 21, 2026
8 checks passed
@Birfy
Birfy deleted the release/v0.2.3 branch October 21, 2026 18:34
Birfy added a commit to Birfy/FlyBot that referenced this pull request Oct 23, 2026
…wLab#694)

Written-by: Dev

Adds `.github/scripts/audit-merges.mjs`: a read-only check that every
merge on `main` went through the merge queue, and exits 1 naming the
ones that did not.

Fixes ThinkFlowLab#689

Tip SHA: 2372531

## Reproduce

`ThinkFlowLab#650` and `ThinkFlowLab#680` are build commits whose `Merge gate` run had failed,
and `main` was pushed to them anyway — the runs API, live:

```text
ThinkFlowLab#680  run 39730969259  Merge gate  failure  2026-10-22T05:57:11Z  head 6b9820b  branch gh-readonly-queue/main/pr-680-8e80237b
      main moved to 6b9820b at 05:58:58Z, merged_by Birfy
ThinkFlowLab#650  run 39653640861  Merge gate  failure  2026-10-21T18:32:27Z  head 6438cb2  branch gh-readonly-queue/main/pr-650-fe79de66
      main moved to 6438cb2 at 18:34:05Z, merged_by Birfy
ThinkFlowLab#672  run 39720497176  Merge gate  success  2026-10-22T04:06:23Z  head 93e5234
ThinkFlowLab#674  run 39722858008  Merge gate  success  2026-10-22T04:31:32Z  head 9393d55
```

Nothing in the repository tells the two shapes apart: the only
`merge_group` record of the landed commit is refused, and no check looks
at what landed.

One correction to the issue's step 4, because a fixture pins it:
`head_sha=` on the runs endpoint returns **every** workflow's run for
that entry. On `ThinkFlowLab#680` the `Test` run of the same entry is `success`
(39730969253), so "at least one run with `conclusion === 'success'`"
would call that bypass a queue merge. The check therefore matches the
**`Merge gate`** workflow (`path === .github/workflows/merge-gate.yml`),
and a green `Test` run proves nothing about the gate.

## What changed

`.github/scripts/audit-merges.mjs` (new, ~200 lines, no new dependency),
its cases and four fixtures:

- `auditCommit({sha, pulls, runs})` — one commit in, one finding or
`null` out. No pull request → `direct commit: <sha>`. A successful
`Merge gate` run whose `head_sha` is this commit → queue merge.
Otherwise `bypassed queue: #<pr> <sha12> (merge_group: failure|absent)`,
where `absent` means the gate never judged this commit and `failure`
means it did and did not pass.
- `audit({commits, pullsFor, runsFor})` — the walk, over data already
fetched; `main({api, repo, limit})` — the CLI entry point the same shape
as `merge-gate.mjs` (`GH_REPO`, `GH_TOKEN`, `--limit`, default 50),
printing the lines and exiting 1 when there is a finding.
- Read-only: no comment, label, merge or ref push. It walks
`/commits?sha=main`, `/commits/{sha}/pulls`,
`/actions/runs?event=merge_group&head_sha={sha}`.

The line shape is fixed because two readers depend on it (the Maintainer
patrol and a hand run). A direct push is reported on its own line and is
not counted as a bypass.

## What I ran

At this tip, on the extracted tree:

- `TZ=UTC node --test .github/scripts/audit-merges.test.mjs` → **9/9**
- `TZ=UTC node --test ".github/scripts/*.test.mjs"` → **173/173**

Against the real repository, through this script's own `main()` with its
`api` injected over the same REST paths `gh api` uses (`gh` is not
installed on this box), at main `b5de55d0`, `--limit 40`:

```text
bypassed queue: ThinkFlowLab#680 6b9820b (merge_group: failure)
bypassed queue: ThinkFlowLab#636 8e80237 (merge_group: failure)
bypassed queue: ThinkFlowLab#650 6438cb2 (merge_group: failure)
...
audit-merges: 40 commits on main, 31 bypassed the queue, 0 direct
exit code: 1
```

`ThinkFlowLab#672` and `ThinkFlowLab#674` produce no line, which is the acceptance condition.
The older entries read `absent` because they predate the queue (with
`--limit 50`: 41 bypassed, 0 direct, exit 1).

## Red without the source change

Three mutations of the guard, each reverting only `audit-merges.mjs`:

- the success test becomes "any `merge_group` run exists on the commit"
(the issue's literal step 4) → **5 of 9 red**, including the `ThinkFlowLab#680`
fixture: the green `Test` run is read as the gate passing.
- the workflow filter is dropped, keeping `conclusion === 'success'` →
**4 of 9 red**, same bypass fixture.
- the `head_sha` match is dropped → **1 red**, the "a green gate run on
a different commit says nothing about this one" guard.

Restored → 9/9.

## Not run

- CI at this tip has not finished yet; no workflow runs this script
(wiring it into a routine is out of scope in the issue).
- `gh` CLI is absent on this box, so the live run above used the
injected `api` rather than the real `gh api`; the paths are identical
and the CI job that would call it has `gh` on the runner.
- The suite's four `ds-bot-patches` cases pass here (`173/173`); in a
tree without `git` they are the known four reds.

## Risk

**T3** — `.github/**`, per `.github/agent/risk-rules.json`; needs a PASS
at this tip and a maintainer approve.

Docs-not-needed: a read-only `.github/scripts` check and its cases; no
subsystem doc owns `.github/`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:T3 Risk tier T3 (needs a human approval), set by the controller from the diff

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant