Skip to content

ci: report-only dwell (soak) check for main -> stable (inbox#20/#21) - #397

Merged
bryan-minimal merged 1 commit into
mainfrom
feat/dwell-soak-report
Jul 14, 2026
Merged

ci: report-only dwell (soak) check for main -> stable (inbox#20/#21)#397
bryan-minimal merged 1 commit into
mainfrom
feat/dwell-soak-report

Conversation

@bryan-minimal

Copy link
Copy Markdown
Member

Why

The soak gate for mainstable promotion is dwell — how long a package's current version has lived on main (git-derived) — per the key reframe in gominimal/inbox#20. The two supporting-data checks already landed report-only (#279 upstream version-age, #280 stable runtime-closure); the dwell signal itself was the missing piece. This adds it, report-only, matching the "spec-first, gate later" strategy.

What

.github/scripts/dwell_report.py — for each package, finds the commit date at which its current main version was introduced (a single git log -S pickaxe on the quoted version token, first-parent — so a non-version edit to build.ncl doesn't reset the clock, and a version prefix like 1.2.3 can't false-match 1.2.30). Compares main vs stable and classifies each package:

  • promotable — differs from stable and has dwelled ≥ 7d in main
  • soaking — differs from stable, < 7d
  • · already in stable

Pure git: no minimal dump, no network, no secrets. Runs the full catalog in ~10s.

.github/workflows/dwell.yml — runs it:

  • workflow_dispatch + daily schedule → full-catalog "what's promotable to stable" dashboard
  • pull_request into stable → per-changed-package dwell (the promotion gate preview)

Hardened exactly like version-age.yml (pinned action SHA, env-passed SHAs, contents: read, report-only) and must not be added to branch-protection required checks.

Sample output (full catalog, today)

70 promotable · 77 soaking · 0 dwell-unknown · 229 already in stable.

package main version dwell (days) stable version status
bun 1.3.14 35 1.3.13 ✅ promotable
binutils 2.46.1 31 2.46.0 ✅ promotable
caddy 2.11.4 32 2.11.3 ✅ promotable
abseil-cpp 20260526.0 2 20250814.1 ⏳ soaking (2/7d)
codex 0.144.1 2 0.130.0 ⏳ soaking (2/7d)

Notes

  • Validated locally on Python 3.9 and the CI runner's 3.12 (git %cI emits a trailing Z, normalized for fromisoformat compatibility below 3.11).
  • The pull_request: [stable] trigger activates once this file reaches stable (GitHub reads the workflow from the PR base branch); the dispatch/schedule modes work immediately from main.
  • Report-only: never blocks, intentionally excluded from required checks. Wire to required only after watching it run on real promotions (inbox#20 strategy).

Closes part of gominimal/inbox#20 (dwell soak criterion) · building block for gominimal/inbox#21.

🤖 Generated with Claude Code

The soak gate for main -> stable promotion is DWELL: how long a package's
current version has lived on `main` (git-derived), per inbox#20's key reframe.
#279 (upstream version-age) and #280 (stable closure) landed; the dwell signal
itself was the missing piece. This adds it, report-only.

`dwell_report.py` computes, per package, the commit date at which its current
`main` version was introduced (a single `git log -S` pickaxe on the quoted
version token, first-parent), and compares `main` vs `stable` to classify each
package: promotable (dwelled >= 7d and differs from stable), soaking (< 7d), or
already in stable. Pure git — no `minimal dump`, no network, no secrets.

`dwell.yml` runs it on workflow_dispatch + a daily schedule (the "what's
promotable to stable" dashboard over the full catalog) and on pull_request into
`stable` (per-changed-package dwell — the promotion gate preview). Hardened to
stay green exactly like version-age.yml (pinned action SHA, env-passed SHAs,
contents:read, report-only) and MUST NOT be a required check.

Matches the "report-only spec first" strategy: observe what it would gate on
real promotions before wiring it to required.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 55 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4bb59075-f2ec-4e21-bd62-9b0f81a3e311

📥 Commits

Reviewing files that changed from the base of the PR and between cd4b09d and 136e066.

📒 Files selected for processing (2)
  • .github/scripts/dwell_report.py
  • .github/workflows/dwell.yml
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/dwell-soak-report

Comment @coderabbitai help to get the list of available commands.

@bryan-minimal
bryan-minimal added this pull request to the merge queue Jul 14, 2026
Merged via the queue into main with commit d436682 Jul 14, 2026
6 checks passed
@bryan-minimal
bryan-minimal deleted the feat/dwell-soak-report branch July 14, 2026 19:31
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.

2 participants