From 5d291ab3b226d89dc356c19a79c2674600785731 Mon Sep 17 00:00:00 2001 From: Harvey Tseng Date: Fri, 11 Sep 2026 20:29:46 -0400 Subject: [PATCH 1/4] ci: land the changelog and specs from deploy-docs - deploy-docs runs last and already builds the soothfast-routes target, so one landing can carry every regenerated artifact --- .github/workflows/deploy.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 68ae7dd2..12eebcc6 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -97,6 +97,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 + fetch-tags: true persist-credentials: false - name: Checkout soothfast-bot scripts uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -194,6 +195,12 @@ jobs: cargo soothfast spec html -p finance-query-server --target soothfast-routes --out docs/server/api cargo soothfast spec html -p finance-query-mcp --target soothfast-routes --out docs/server/api + - name: Regenerate specs, MCP tool manifest, and SDKs + run: | + cargo soothfast spec gen -p finance-query-server --target soothfast-routes + cargo soothfast sdk gen -p finance-query-server --target soothfast-routes + cargo soothfast spec gen -p finance-query-mcp --target soothfast-routes --features backtesting + - name: Regenerate API reference, perf report, coverage page, and llms.txt run: | cargo soothfast docs reference -p finance-query --baseline base --features full --out docs/reference @@ -232,6 +239,13 @@ jobs: git show HEAD:llms.txt | sed '/^\*\*Measured:\*\*/d' > target/llms-churn/old.txt cmp -s target/llms-churn/old.txt target/llms-churn/new.txt && git checkout -- llms.txt || true + - name: Regenerate CHANGELOG.md + # Without --against-ref the draft carries no commit entries and + # replaces the real Unreleased section, so a missing tag must fail. + run: | + prev=$(git describe --tags --abbrev=0) + cargo soothfast report changelog -p finance-query --baseline base --features full --against-ref "$prev" + # Minted after every step that compiles the tree has run. - name: Mint a soothfast-bot token id: bot @@ -254,8 +268,8 @@ jobs: APP_SLUG: ${{ steps.bot.outputs.app_slug }} BRANCH: bot/derived-artifacts TITLE: "chore: regenerate derived artifacts" - BODY: Automated trend, captured-output, and llms.txt regeneration. - PATHS: .soothfast/trend.jsonl llms.txt docs/library README.md + BODY: Automated regeneration of the changelog, trend, captured output, llms.txt, specs, and SDKs. + PATHS: CHANGELOG.md .soothfast/trend.jsonl llms.txt docs/library README.md server/openapi.yaml server/asyncapi.yaml sdks finance-query-mcp/mcp-tools.json run: soothfast-action/action/land.sh - name: Revoke the soothfast-bot token if: always() && steps.bot.outputs.token != '' From b3e80aa51b078775b4ea8a1acfb1cf258f51f2fa Mon Sep 17 00:00:00 2001 From: Harvey Tseng Date: Fri, 11 Sep 2026 20:32:13 -0400 Subject: [PATCH 2/4] ci: stop the gate job landing its own bot commit - with no changelog or regen inputs the action's regen step finds nothing changed, so it mints no token and opens no pull request --- .github/workflows/soothfast.yml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/soothfast.yml b/.github/workflows/soothfast.yml index e1f8c0db..ad8747c5 100644 --- a/.github/workflows/soothfast.yml +++ b/.github/workflows/soothfast.yml @@ -1,6 +1,6 @@ name: Soothfast -# Perf gate, bot-landed regeneration, living docs, spec reconciliation, and site build. +# Perf gate, living docs, spec reconciliation, and site build. # No paths filter: a skipped job satisfies required checks, but a workflow # that never triggers blocks the merge. @@ -61,8 +61,8 @@ jobs: - 'finance-query-mcp/mcp-tools.json' # Pull requests: gate against the base branch, commented by soothfast-bot. - # Master pushes: regenerate CHANGELOG.md, specs, and SDKs, landed as a - # soothfast-bot PR. "Gate" is a required check on master. + # "Gate" is a required check on master, but deploy.yml owns the + # regeneration and its bot PR, so master pushes here do nothing else. gate: name: Gate needs: changes @@ -107,12 +107,7 @@ jobs: with: packages: finance-query features: bench-gate - changelog-features: full - regen-run: | - "$SOOTHFAST" spec gen -p finance-query-server --target soothfast-routes - "$SOOTHFAST" sdk gen -p finance-query-server --target soothfast-routes - "$SOOTHFAST" spec gen -p finance-query-mcp --target soothfast-routes --features backtesting - regen-paths: server/openapi.yaml server/asyncapi.yaml sdks finance-query-mcp/mcp-tools.json + changelog: false baseline: name: Baseline From 8f385d71831ec39dccce65d973b487fd0431741c Mon Sep 17 00:00:00 2001 From: Harvey Tseng Date: Fri, 11 Sep 2026 20:32:45 -0400 Subject: [PATCH 3/4] ci: skip the rebuild for soothfast-bot commits - the bot's landing changes no image input, and deploy needs build-and-push so skipping one skips the VPS deploy too --- .github/workflows/deploy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 12eebcc6..d69ce30e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -14,6 +14,8 @@ permissions: jobs: build-and-push: name: Build ${{ matrix.image.name }} + # Not a blanket [bot] test: dependabot's base-image bumps must still rebuild. + if: github.actor != 'soothfast-bot[bot]' runs-on: ubuntu-latest permissions: contents: read @@ -78,6 +80,7 @@ jobs: deploy-docs: name: Deploy docs site to GitHub Pages + if: github.actor != 'soothfast-bot[bot]' runs-on: ubuntu-latest # Rapid merges would each branch trend.jsonl off their own checkout, # and the second trend PR would conflict on master and hang. From 4f545e7f808649ff0f8acbd90c9c920c0c850550 Mon Sep 17 00:00:00 2001 From: Harvey Tseng Date: Fri, 11 Sep 2026 20:38:23 -0400 Subject: [PATCH 4/4] ci: stop the gate job saving an empty shared cache - rust-cache saves only on a key miss, and the job now finishes before baseline can populate the key they share --- .github/workflows/soothfast.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/soothfast.yml b/.github/workflows/soothfast.yml index ad8747c5..1cc67d2c 100644 --- a/.github/workflows/soothfast.yml +++ b/.github/workflows/soothfast.yml @@ -93,6 +93,9 @@ jobs: with: shared-key: bench-gate cache-on-failure: true + # Compiles nothing on a master push; saving would overwrite the + # baseline job's warm target under the shared key. + save-if: false # Unique per commit with the prefix in restore-keys: an exact key is # never rewritten once saved, so later commits would all miss. - name: Restore measured reference runs