ci: collapse the two bot regeneration commits into one - #486
Merged
Merged
Conversation
20 tasks
Contributor
soothfast gatefinance-query |
- deploy-docs runs last and already builds the soothfast-routes target, so one landing can carry every regenerated artifact
- with no changelog or regen inputs the action's regen step finds nothing changed, so it mints no token and opens no pull request
- the bot's landing changes no image input, and deploy needs build-and-push so skipping one skips the VPS deploy too
- rust-cache saves only on a key miss, and the job now finishes before baseline can populate the key they share
Verdenroz
force-pushed
the
ci/collapse-bot-regeneration
branch
from
September 12, 2026 01:11
1408af8 to
4f545e7
Compare
Verdenroz
added a commit
that referenced
this pull request
Sep 12, 2026
## Description The generator behind `openapi.yaml`, `asyncapi.yaml`, `mcp-tools.json` and the Python SDK reads the hand-authored manifests in `server/spec/routes.rs` and `finance-query-mcp/spec/routes.rs`, not the axum router or the `#[tool]` impls. A route missing from its manifest is missing from both sides of a `spec gen --check` comparison, so the check passes green on exactly the mistake it looks like it would catch. `spec check`, which reconciles the manifests against the actual handlers, is the step with teeth there and it stays. Dropping the three `--check` steps lets the bot land the regenerated files after merge and makes `make sdk` convenience rather than a required step before opening a PR. The workflow half of #482 is here. The documentation half cannot be. `CLAUDE.md` and `.claude/**` are gitignored (`.gitignore:9` and `.gitignore:22`) and exist only as untracked files in each clone, so no commit can reach them. They still tell the reader that CI gates the generated specs with `spec gen --check` and `sdk gen --check`, which stops being true when this merges. The issue stays open until that drift is handled. ## Type of Change - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that causes existing functionality to change) - [ ] Documentation update - [x] Refactoring (no functional changes) - [ ] Performance improvement ## Changes - Removed the `spec gen --check` and `sdk gen --check` steps from the `Spec & SDK (server)` job. - Removed the `spec gen --check` step from the `Spec (MCP)` job. - Kept `spec check` in both jobs. It reconciles the route and tool manifests against the handlers and is unaffected by this change. - Kept `spec gate` and its `--from-committed` flag, with a comment recording why the flag is there and what a stale base spec looks like. ## Breaking Changes None. No library, server, or MCP code changes. The generated artifacts are still generated and still must not be hand-edited; only the point at which they get regenerated moves from before the PR to after the merge. ## Testing - [ ] Unit tests added/updated - [ ] Integration tests added/updated - [ ] Manual testing performed - [ ] All tests pass (`cargo test`) The change is YAML only, so no cargo gate applies and the boxes above stay unticked. What ran: - `python3 -c "import yaml; yaml.safe_load(open('.github/workflows/soothfast.yml'))"` parses. - `zizmor --no-online-audits .github/workflows/soothfast.yml` reports no findings (10 suppressed). - `prek run --files .github/workflows/soothfast.yml` passes. - `actionlint` did not run. It is not installed on the machine this was written on. The real verification is post-merge and cannot be performed here. The signal to watch: the first PR that changes a route or a tool without running `make sdk` should pass CI, and the regenerated `openapi.yaml`, `asyncapi.yaml`, `mcp-tools.json` and `sdks/**` should then show up in the bot's `bot/derived-artifacts` PR. ## Documentation - [ ] Code documentation updated (doc comments) - [ ] README updated (if needed) - [ ] CHANGELOG.md updated (if releasing) - [ ] Examples updated (if API changed) The documentation that needs this change is untracked. See the Description. ## Checklist - [ ] Code compiles without warnings (`cargo check`) - [ ] Tests pass (`cargo test`) - [ ] Code formatted (`cargo fmt`) - [ ] Clippy checks pass (`cargo clippy`) - [ ] Documentation builds (`cargo doc --no-deps`) - [x] Commit messages follow [Conventional Commits](https://www.conventionalcommits.org/) ## Related Issues Refs #482 Stacks on #486. Base is `ci/collapse-bot-regeneration` and this must merge after it. #486 already routes the generated specs and SDKs through the bot's single `land.sh` call, which is what makes removing these gates safe.
Verdenroz
added a commit
that referenced
this pull request
Sep 12, 2026
## Description `CHANGELOG.md`'s Unreleased section currently lists `Regenerate soothfast outputs (#474)` and `Regenerate derived artifacts (#473)`. Both are soothfast-bot commits that exist only to land generated files, so two of the changelog's entries describe the changelog regenerating itself. The cause was upstream and is fixed in v0.3.2, where the generator reads the author alongside the subject and drops the commits its own bot wrote. This repo's entire share of the fix is a version pin. ## Type of Change - [x] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that causes existing functionality to change) - [ ] Documentation update - [ ] Refactoring (no functional changes) - [ ] Performance improvement ## Changes - Bumped the pinned `Verdenroz/soothfast` action from `80b18d8831521646b65fec79c6df14d6f763c602` (v0.3.1) to `69e2e9250414bd1dcaa1f45529f1e3fe12c593dd` (v0.3.2) at all 13 pin sites: 8 in `soothfast.yml`, 2 in `deploy.yml`, 2 in `io-probe.yml`, 1 in `sdk-publish.yml`. - Covered both kinds of pin. Eleven are `uses: Verdenroz/soothfast@<sha>`; the other two are `ref:` on the `actions/checkout` steps in `deploy.yml` and `io-probe.yml` that sparse-check-out the action's `action/` directory for `land.sh`. The two kinds are kept in lockstep. A bump driven by a `uses:` grep alone misses the `ref:` pins and leaves those workflows running v0.3.1 scripts against a v0.3.2 CLI. - Left `soothfast.toml` alone. The generator's default bot author is `soothfast-bot[bot]`, which is what this repo's bot commits are already authored by, so a `[changelog] bot-author` key would only be one more value to drift. - Left `soothfast.lock`, `Cargo.toml` and `Cargo.lock` alone. 0.3.1 to 0.3.2 is caret-compatible; only the action SHAs are pinned by hand. ## Breaking Changes None. The composite action and its seven shell scripts are byte-identical between the two tags, so the bump changes the CLI and nothing else. No library, server, or MCP code is touched. ## Testing - [ ] Unit tests added/updated - [ ] Integration tests added/updated - [ ] Manual testing performed - [ ] All tests pass (`cargo test`) The change is YAML only, so no cargo gate applies and the boxes above stay unticked. What ran, on all four changed workflows: - `python3 -c "import yaml; yaml.safe_load(open(f))"` parses each of `soothfast.yml`, `deploy.yml`, `sdk-publish.yml`, `io-probe.yml`. - `zizmor --no-online-audits` over the four reports no findings (27 suppressed). - `prek run --files` over the four passes. - `grep -rn '80b18d8831521646b65fec79c6df14d6f763c602' .github/` returns nothing, and `grep -ro '69e2e9250414bd1dcaa1f45529f1e3fe12c593dd' .github/ | wc -l` returns 13. - `actionlint` did not run. It is not installed on the machine this was written on. The fix itself cannot be verified before merge, since it only shows up when the bot next regenerates the changelog on `master`. Two things to check then. The Unreleased section should no longer carry `Regenerate soothfast outputs` or `Regenerate derived artifacts` under `### 🔧 Internal`. The `### 📦 Dependencies` section must still list its dependabot entries, `Bump debian from ...` and `Bump rust from ...`. The filter compares the author string exactly, so `dependabot[bot]` should survive it; dependabot entries disappearing would mean the filter is over-matching, which is a worse bug than the one this fixes and is grounds to revert. ## Documentation - [ ] Code documentation updated (doc comments) - [ ] README updated (if needed) - [ ] CHANGELOG.md updated (if releasing) - [ ] Examples updated (if API changed) `CHANGELOG.md` is deliberately not touched here. The Unreleased section is generated, and the bot rewrites it after merge. ## Checklist - [ ] Code compiles without warnings (`cargo check`) - [ ] Tests pass (`cargo test`) - [ ] Code formatted (`cargo fmt`) - [ ] Clippy checks pass (`cargo clippy`) - [ ] Documentation builds (`cargo doc --no-deps`) - [x] Commit messages follow [Conventional Commits](https://www.conventionalcommits.org/) ## Related Issues Closes #480 Third in a stack. Base is `ci/bot-land-sdk-regeneration`, so this stacks on #487, which stacks on #486, and it merges last. #486 and #487 both rewrite `soothfast.yml` and `deploy.yml`, which this also touches.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Every human merge to
masterlands two soothfast-bot commits and runs three Docker build-and-deploy cycles. Two workflows each regenerate half the derived artifacts and each open their own bot PR, and nothing stops those bot commits from rebuilding all three images. Thedeploy-docsjob already runs last and already builds thesoothfast-routesbench target, so it can produce the changelog and the specs as well. Moving that work there and skipping the rebuild for the bot's own commit leaves one bot PR and one build cycle per merge.Type of Change
Changes
spec gen,sdk gen, and MCPspec genregeneration out of thegatejob'sregen-runinsoothfast.ymlinto a step indeploy.yml'sdeploy-docs, placed after the endpoint reference pages so it reuses the bench binary already built there.report changelogstep todeploy-docs, before the token mint so every step that compiles the tree still runs first. It resolves the latest tag withgit describeand passes it as--against-ref.fetch-tags: trueto thedeploy-docscheckout.actions/checkoutpasses--no-tagsby default even atfetch-depth: 0, and without a tag the changelog step would replace the real Unreleased section with an initial-surface dump.deploy-docs'sland.shPATHSto the union of both landings:CHANGELOG.md,.soothfast/trend.jsonl,llms.txt,docs/library,README.md,server/openapi.yaml,server/asyncapi.yaml,sdks,finance-query-mcp/mcp-tools.json.changelog: falseon theVerdenroz/soothfastaction in thegatejob and dropped itsregen-run,regen-paths, andchangelog-featuresinputs. With no regen inputs the action's regen step collects no pathspecs and reportschanged=false, so it mints no token and opens no pull request.save-if: falseon thegatejob'srust-cache. It now compiles nothing on a master push and would finish first, saving a near-empty target under thebench-gatekey it shares withbaseline.build-and-pushanddeploy-docswithif: github.actor != 'soothfast-bot[bot]'.deployhasneeds: build-and-push, so the VPS deploy skips along with it.gatejob comment insoothfast.yml, which described the regeneration that job no longer does.The guard matches the soothfast bot by name rather than testing for any
[bot]actor. Dependabot's base-image digest bumps fordebianandrustmust still rebuild the images.Breaking Changes
None. No library, server, or MCP code changed.
Testing
cargo test)Verified statically: both workflows parse under
yaml.safe_load,prek run --fileson both is clean, andzizmor --no-online-auditsover both reports no findings.actionlintis not installed on this machine, so it did not run. No Rust changed, so nocargogate applies.The
github.actorguard was checked against real run payloads before it was written. Runs34423002373and34042536402, the two soothfast-bot commits, reportactor.loginassoothfast-bot[bot]. Run33565318087, a dependabot base-image bump, reportsactor.loginasVerdenrozwithhead_commit.authorasdependabot[bot], which is why the guard cannot key off the commit author.Three behaviors cannot be verified before merge: that exactly one bot PR opens per human merge, that the rebuild is skipped for it, and that the changelog regenerates with its entries intact. The first merge to
masterafter this is the test. What to watch for:bot/derived-artifactsPR and nobot/soothfast-updatePR.Build and Deployskipped on the bot's own push.CHANGELOG.mdstill headed## Unreleased (draft vs v3.0.0)with its entry lists intact, not## Unreleased (initial public surface).That last one is the rollback trigger. If the heading changes, revert this rather than hand-editing the file.
Documentation
Checklist
cargo check)cargo test)cargo fmt)cargo clippy)cargo doc --no-deps)Related Issues
Closes #479