Skip to content

ci: collapse the two bot regeneration commits into one - #486

Merged
Verdenroz merged 4 commits into
masterfrom
ci/collapse-bot-regeneration
Sep 12, 2026
Merged

Verdenroz merged 4 commits into
masterfrom
ci/collapse-bot-regeneration

Conversation

@Verdenroz

@Verdenroz Verdenroz commented Sep 12, 2026

Copy link
Copy Markdown
Owner

Description

Every human merge to master lands 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. The deploy-docs job already runs last and already builds the soothfast-routes bench 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

  • 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

  • Moved the spec gen, sdk gen, and MCP spec gen regeneration out of the gate job's regen-run in soothfast.yml into a step in deploy.yml's deploy-docs, placed after the endpoint reference pages so it reuses the bench binary already built there.
  • Added a report changelog step to deploy-docs, before the token mint so every step that compiles the tree still runs first. It resolves the latest tag with git describe and passes it as --against-ref.
  • Added fetch-tags: true to the deploy-docs checkout. actions/checkout passes --no-tags by default even at fetch-depth: 0, and without a tag the changelog step would replace the real Unreleased section with an initial-surface dump.
  • Extended deploy-docs's land.sh PATHS to 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.
  • Set changelog: false on the Verdenroz/soothfast action in the gate job and dropped its regen-run, regen-paths, and changelog-features inputs. With no regen inputs the action's regen step collects no pathspecs and reports changed=false, so it mints no token and opens no pull request.
  • Set save-if: false on the gate job's rust-cache. It now compiles nothing on a master push and would finish first, saving a near-empty target under the bench-gate key it shares with baseline.
  • Guarded build-and-push and deploy-docs with if: github.actor != 'soothfast-bot[bot]'. deploy has needs: build-and-push, so the VPS deploy skips along with it.
  • Updated the header comment and the gate job comment in soothfast.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 for debian and rust must still rebuild the images.

Breaking Changes

None. No library, server, or MCP code changed.

Testing

  • Unit tests added/updated
  • Integration tests added/updated
  • Manual testing performed
  • All tests pass (cargo test)

Verified statically: both workflows parse under yaml.safe_load, prek run --files on both is clean, and zizmor --no-online-audits over both reports no findings. actionlint is not installed on this machine, so it did not run. No Rust changed, so no cargo gate applies.

The github.actor guard was checked against real run payloads before it was written. Runs 34423002373 and 34042536402, the two soothfast-bot commits, report actor.login as soothfast-bot[bot]. Run 33565318087, a dependabot base-image bump, reports actor.login as Verdenroz with head_commit.author as dependabot[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 master after this is the test. What to watch for:

  • One bot/derived-artifacts PR and no bot/soothfast-update PR.
  • Build and Deploy skipped on the bot's own push.
  • CHANGELOG.md still 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

  • Code documentation updated (doc comments)
  • README updated (if needed)
  • CHANGELOG.md updated (if releasing)
  • Examples updated (if API changed)

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)
  • Commit messages follow Conventional Commits

Related Issues

Closes #479

@github-actions github-actions Bot added the ci Pull requests that update CI configuration label Sep 12, 2026
@Verdenroz
Verdenroz deployed to soothfast-bot September 12, 2026 00:36 — with GitHub Actions Active
@github-actions github-actions Bot added the refactor Internal improvement, cleanup, or architectural change label Sep 12, 2026
@soothfast-bot

soothfast-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

soothfast gate

finance-query

ok    finance_query::ticker_quote_then_cached allocs 4 -> 4 (allowed <= 4)
ok    finance_query::ticker_quote_then_cached alloc_bytes 43864 -> 43864 (allowed <= 46057)
ok    finance_query::tickers_batch_quote_then_cached walltime_median_ns 10450.6 -> 10450.6 (+0.0%)
ok    finance_query::tickers_batch_quote_then_cached allocs 16 -> 16 (allowed <= 16)
ok    finance_query::tickers_batch_quote_then_cached alloc_bytes 134810 -> 134810 (allowed <= 141550)
ok    finance_query::translate_dictionary walltime_median_ns 1958.4 -> 1958.4 (+0.0%)
ok    finance_query::translate_dictionary allocs 49 -> 49 (allowed <= 51)
ok    finance_query::translate_dictionary alloc_bytes 2880 -> 2880 (allowed <= 3024)
ok    finance_query::translation_set_backend walltime_median_ns 17.8 -> 17.8 (+0.0%)
ok    finance_query::translation_set_backend allocs 1 -> 1 (allowed <= 1)
ok    finance_query::translation_set_backend alloc_bytes 16 -> 16 (allowed <= 16)
ok    finance_query::translation_translate walltime_median_ns 3674.2 -> 3674.2 (+0.0%)
ok    finance_query::translation_translate allocs 79 -> 79 (allowed <= 82)
ok    finance_query::translation_translate alloc_bytes 6298 -> 6298 (allowed <= 6612)
ok    finance_query::translation_translate_with walltime_median_ns 3541.7 -> 3541.7 (+0.0%)
ok    finance_query::translation_translate_with allocs 77 -> 77 (allowed <= 80)
ok    finance_query::translation_translate_with alloc_bytes 6294 -> 6294 (allowed <= 6608)
ok    finance_query::bt_base_to_htf_index assert complexity: claimed O(n); growth drift x1.28 over sizes [1024, 4096, 16384] (limit x2.5)
ok    finance_query::bt_resample assert complexity: claimed O(n); growth drift x0.96 over sizes [1024, 4096, 16384] (limit x2.5)
ok    finance_query::bt_sma_crossover assert complexity: claimed O(n); growth drift x1.03 over sizes [1024, 4096, 16384] (limit x2.5)
ok    finance_query::capability_name assert alloc: allocs 0 <= 0
ok    finance_query::de_quote assert p99: p99 1101740ns <= 3000000ns
ok    finance_query::dispatch_select assert alloc: allocs 0 <= 0
ok    finance_query::ind_patterns assert complexity: claimed O(n); growth drift x1.11 over sizes [1024, 4096, 16384] (limit x2.5)
ok    finance_query::ind_sma assert alloc: allocs 1 <= 1
ok    finance_query::ind_sma assert p99: p99 432832ns <= 1000000ns
ok    finance_query::ind_sma assert complexity: claimed O(n); growth drift x1.01 over sizes [1000, 10000, 100000] (limit x2.5)
ok    finance_query::risk_beta assert alloc: allocs 0 <= 0
ok    finance_query::risk_beta assert complexity: claimed O(n); growth drift x1.03 over sizes [1024, 4096, 16384] (limit x2.5)
ok    finance_query::risk_calmar assert alloc: allocs 0 <= 0
ok    finance_query::risk_historical_var assert alloc: allocs 2 <= 2
ok    finance_query::risk_historical_var assert complexity: claimed O(n log n); growth drift x1.05 over sizes [1000, 10000, 100000] (limit x2.5)
ok    finance_query::risk_max_drawdown assert alloc: allocs 1 <= 1
ok    finance_query::risk_parametric_var assert alloc: allocs 0 <= 0
ok    finance_query::risk_parametric_var assert complexity: claimed O(n); growth drift x1.01 over sizes [1024, 4096, 16384] (limit x2.5)
ok    finance_query::risk_sharpe assert alloc: allocs 0 <= 0
ok    finance_query::risk_sharpe assert complexity: claimed O(n); growth drift x1.01 over sizes [1024, 4096, 16384] (limit x2.5)
ok    finance_query::risk_sortino assert alloc: allocs 0 <= 0
ok    finance_query::risk_sortino assert complexity: claimed O(n); growth drift x1.02 over sizes [1024, 4096, 16384] (limit x2.5)
gate: passed (180 item(s))

@Verdenroz
Verdenroz deployed to soothfast-bot September 12, 2026 00:50 — with GitHub Actions Active
@Verdenroz
Verdenroz added this pull request to stack #490 September 12, 2026 01:05
@Verdenroz Verdenroz mentioned this pull request Sep 12, 2026
20 tasks
- 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
Verdenroz force-pushed the ci/collapse-bot-regeneration branch from 1408af8 to 4f545e7 Compare September 12, 2026 01:11
@Verdenroz
Verdenroz deployed to soothfast-bot September 12, 2026 01:11 — with GitHub Actions Active
@Verdenroz
Verdenroz merged commit 80b5bda into master Sep 12, 2026
30 checks passed
@Verdenroz
Verdenroz deleted the ci/collapse-bot-regeneration branch September 12, 2026 01:31
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci Pull requests that update CI configuration refactor Internal improvement, cleanup, or architectural change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[TECH DEBT] Collapse the two bot regeneration commits into one

1 participant