Batch 3: terminal JWT revocation, release reconciliation, CLI fail-closed + routine dependency bumps (#1838 #1837 #1738 + 8 deps) - #1841
Merged
simple-agent-manager[bot] merged 41 commits intoAug 17, 2026
Conversation
Bumps [CodSpeedHQ/action](https://github.com/codspeedhq/action) from 5.0.2 to 5.0.3. - [Release notes](https://github.com/codspeedhq/action/releases) - [Changelog](https://github.com/CodSpeedHQ/action/blob/main/CHANGELOG.md) - [Commits](CodSpeedHQ/action@0ca9cbb...4296e51) --- updated-dependencies: - dependency-name: CodSpeedHQ/action dependency-version: 5.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [dorny/paths-filter](https://github.com/dorny/paths-filter) from 4.0.2 to 4.0.3. - [Release notes](https://github.com/dorny/paths-filter/releases) - [Changelog](https://github.com/dorny/paths-filter/blob/master/CHANGELOG.md) - [Commits](dorny/paths-filter@7b450ff...ceb8a2b) --- updated-dependencies: - dependency-name: dorny/paths-filter dependency-version: 4.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [github.com/pelletier/go-toml/v2](https://github.com/pelletier/go-toml) from 2.2.4 to 2.4.3. - [Release notes](https://github.com/pelletier/go-toml/releases) - [Commits](pelletier/go-toml@v2.2.4...v2.4.3) --- updated-dependencies: - dependency-name: github.com/pelletier/go-toml/v2 dependency-version: 2.4.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.11 to 3.4.13. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](cure53/DOMPurify@3.4.11...3.4.13) --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.4.13 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [anthropics/claude-code-action](https://github.com/anthropics/claude-code-action) from 1.0.183 to 1.0.189. - [Release notes](https://github.com/anthropics/claude-code-action/releases) - [Commits](anthropics/claude-code-action@be7b93b...6b082c4) --- updated-dependencies: - dependency-name: anthropics/claude-code-action dependency-version: 1.0.189 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 8.65.0 to 8.67.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-version: 8.66.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [recharts](https://github.com/recharts/recharts) from 3.10.0 to 3.10.1. - [Release notes](https://github.com/recharts/recharts/releases) - [Changelog](https://github.com/recharts/recharts/blob/main/CHANGELOG.md) - [Commits](recharts/recharts@v3.10.0...v3.10.1) --- updated-dependencies: - dependency-name: recharts dependency-version: 3.10.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
Auto-committed by SAM on agent completion.
Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 6.0.9 to 6.0.10. - [Release notes](https://github.com/pnpm/action-setup/releases) - [Commits](pnpm/action-setup@0ebf471...0977fd9) --- updated-dependencies: - dependency-name: pnpm/action-setup dependency-version: 6.0.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
…ocation on logout (head efee532)
…ease reconciliation (head 2300968)
…n 1.0.189 (head 678f0e0)
Integration-only fixes required to combine PRs #1838, #1837, #1738 and the routine dependency bumps onto current main: - Renumber PR #1837's D1 migration 0114 -> 0115. Main already claimed 0114 (0114_credential_setup_exchanging_status.sql) after #1837 branched, so the merged tree tripped quality:migration-ordering's duplicate-prefix guard. The migration was never applied to any environment, so renaming cannot replay it. - Align @typescript-eslint/eslint-plugin and typescript-eslint to 8.67.0. Dependabot (#1800) only proposes the parser; the three ship in lockstep and a parser/plugin skew is a known source of AST/rule disagreement. - Regenerate pnpm-lock.yaml for the merged dependency set. - Skip the agent preflight-evidence step for dependabot-authored PRs. Bots open PRs from a fixed template and cannot produce preflight research evidence, so the check was unsatisfiable and left every dependency PR permanently red. The stale-tracked-binary guard in the same job still runs for all authors.
Corrects two findings from local specialist review of the previous integration commit (6c3e03e). cloudflare-specialist (CRITICAL): renumbering PR #1837's migration was wrong. The file was already applied to staging as 0112_deployment_release_status_updated_at.sql (staging d1_migrations id 134, applied 2026-08-16 15:30:36) and #1837's own branch had already renamed it once (0112 -> 0114) afterwards. Wrangler matches migrations by exact filename, so any renumber makes staging treat it as new and replay 'ALTER TABLE deployment_releases ADD COLUMN status_updated_at' against a table that already has the column, aborting the migration step and failing the deploy. Restored the applied filename and grandfathered prefix 0112 in check-migration-ordering.ts, matching the existing 0105/0106 precedent for this exact situation. Verified against both live databases: staging - ledger has 0112_deployment_release_status_updated_at.sql, column exists -> wrangler skips it prod - filename absent from ledger, column absent -> wrangler applies it security-auditor (MEDIUM): the dependabot preflight skip keyed only on pull_request.user.login, which is frozen when the PR is opened. Dependabot branches live in this repo rather than a fork, so a collaborator can push a commit onto an open dependabot/** branch and keep the skip active for human-authored code. Now requires github.actor to agree, so a human push re-enables the check.
Contributor
|
Contributor
Author
Staging Verification EvidenceDeploy run: 32018978340 — ✅ success (branch Regression Sweep
Feature-Specific Checks
Production migration forecast
|
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.



Summary
Batch 3 integration: combines three reviewed, independently-green PRs plus eight routine dependency bumps into a single verifiable unit, on Raphaël's explicit instruction to "get them all green, merge them all into a single PR, test them in staging, then merge to prod."
Each constituent is merged at its exact head SHA, so merging this PR with a merge commit closes all eleven as merged.
efee5325f2300968c2b2ebcf00aanthropics/claude-code-action1.0.183 → 1.0.189678f0e0a4@typescript-eslint/parser8.65.0 → 8.67.05aa691bf9dompurify3.4.11 → 3.4.1362744a4d3recharts3.10.0 → 3.10.14de3bdd65github.com/pelletier/go-toml/v22.2.4 → 2.4.3 (vm-agent)3091c10f7dorny/paths-filter4.0.2 → 4.0.3ab940c1caCodSpeedHQ/action5.0.2 → 5.0.38d5959ea8pnpm/action-setup6.0.9 → 6.0.10ba1841c8cDeliberately excluded and left as drafts at Raphaël's direction: #1817 (architecture workspace), #1808 (VM agent release preservation), #1788 (OSV scan, blocked on repository secrets). The four non-trivial dependency PRs (#1801, #1790, #1792, #1796) are being handled separately in SAM task
01M079AYQTDVEP2WN7KJD0KABV.Integration-only changes (not present in any constituent PR)
scripts/quality/check-migration-ordering.ts— grandfather prefix0112. PR Reconcile stale compose deployment releases #1837's migration was applied to staging on 2026-08-16 as0112_deployment_release_status_updated_at.sql(stagingd1_migrationsid 134), and main subsequently landed0112_session_snapshot_direct_upload_authorization.sqlunder the same prefix. Wrangler matches migrations by exact filename, so the applied file must keep its name; the duplicate prefix is allowlisted exactly as the existing0105/0106entries do for the identical situation. See the post-mortem below — an earlier revision of this PR renumbered the file instead, which would have broken the staging deploy.pnpm-workspace.yaml— align@typescript-eslint/eslint-pluginandtypescript-eslintto 8.67.0. Dependabot (chore(deps): bump @typescript-eslint/parser from 8.65.0 to 8.67.0 #1800) proposes only the parser. All three ship in lockstep from one monorepo and a parser/plugin skew is a known source of AST/rule disagreement. Lint is clean after the bump, so it introduced no new findings..github/workflows/ci.yml— skip the preflight-evidence step for dependabot-authored PRs. The check parses the PR body for agent pre-implementation research evidence, which a bot structurally cannot produce, so every dependency PR was permanently red and real signal (a genuinely broken Starlight bump) was hiding in the noise. The skip is scoped to the single step, so the stale-tracked-binary guard in the same job still runs for every author, and it requires bothgithub.actorandpull_request.user.loginto be dependabot so a human push to an opendependabot/**branch re-enables the check.pnpm-lock.yamlregenerated for the merged dependency set.Candidate-selection load review
PR #1837 adds a bounded stale-release reconciliation pass ahead of deployment-release retention. Per its own analysis, carried forward unchanged: at most 50 candidates per retention run, D1-only work, one bounded parameterized
UPDATE ... WHERE id IN (SELECT ... LIMIT ?), no per-candidate network or R2 calls. Existing R2 cleanup remains separately bounded. No other constituent changes a sweep/cron/alarm candidate query.Validation
pnpm lint— 13/13 tasks, 0 errors (8 pre-existing warnings unchanged from main)pnpm typecheck— 19/19 taskspnpm test— 21/21 tasks, 12,782 tests passed, 0 failed, exit 0.claude/rules/47-control-loop-io-budget.md)Additional validation:
pnpm build— 9/9 taskspnpm check:fast— exit 0 (format ratchet, oxlint shadow, ESLint, type-boundary ratchet)pnpm quality:migration-safety— passed, 141 FK relationships scanned, 0 violationspnpm quality:migration-ordering— passed (verified failing before the allowlist entry, passing after)scripts/quality/check-migration-ordering.test.ts— 5/5Staging Verification (REQUIRED for all code changes — merge-blocking)
Deploy Stagingworkflow triggered manually and passed for this branchapp.sammy.party(staging) using test credentials and actively tested the applicationpackages/vm-agentdependencies, producing a new agent binary)Staging Verification Evidence
Pending — will be completed and this section filled in before merge.
Planned per
.claude/rules/33-staging-feature-validation.mdand.claude/rules/27-vm-agent-staging-refresh.md:deploy-staging.ymlrun is active or queued first.packages/vm-agent/go.mod, and an existing node would keep its old binary.config.tomlgeneration runs through the bumpedgo-toml.0112_deployment_release_status_updated_at.sqlis skipped (already applied), and the retention sweep runs without wrongly terminalizing any release.UI Compliance Checklist (Required for UI changes)
dompurify/rechartsare patch bumps to existing rendering dependencies with no component changes.End-to-End Verification (Required for multi-component changes)
Data Flow Trace
This PR is an integration; each constituent carries its own trace. The integration-only delta traces as:
.github/workflows/ci.yml:80preflight-evidencejob runs onpull_request..github/workflows/ci.yml:102-110evaluatesgithub.actorandgithub.event.pull_request.user.login; both dependabot → step skipped; either human →pnpm quality:preflightruns..github/workflows/ci.yml:112quality:no-tracked-stale-binariesruns unconditionally regardless of author.d1_migrationsalready contains0112_deployment_release_status_updated_at.sql→ skipped; production does not → applied.Untested Gaps
#1837's reconciler cannot be fully exercised on staging. It only acts on
created/applyingcompose-publish releases whosestatus_updated_atis old, and staging has no such releases. Staging verification will prove the migration applies correctly and that the retention sweep runs clean without wrongly terminalizing any release, but will not prove a genuinely stale release gets reconciled. That path is covered by the constituent PR's unit and integration tests only. Documented rather than checked off.Post-Mortem (Required for bug fix PRs)
This section covers a defect introduced and caught within this PR, before merge.
What broke
An earlier revision of this integration (commit
6c3e03ef8) renumbered PR #1837's D1 migration from0114_deployment_release_status_updated_at.sqlto0115_...to clear a duplicate-prefix violation. Had it merged, the next staging deploy would have treated0115_...as an unapplied migration and re-runALTER TABLE deployment_releases ADD COLUMN status_updated_at, failing with a duplicate-column error and aborting the deploy's migration step.Root cause
The renumber was justified on the premise that the migration had never been applied to any environment. That premise was false and was taken from PR #1837's summary section ("do not merge", "no staging deployment performed") without reading its Staging Verification Evidence section, which records a successful staging deploy. The file had in fact been applied to staging as
0112_deployment_release_status_updated_at.sqland already renamed once (0112→0114) on #1837's own branch afterwards.Class of bug
Local-state reasoning about a distributed ledger. The migration runner's source of truth is the
d1_migrationstable in each live database, not the repository's filenames. Every local check passed —check-migration-ordering.tsonly inspects the local directory listing and has no visibility into what a live D1 has applied — so the failure was invisible until deploy time, and only in the one environment that had the row. Production, which lacks the row, would have applied it cleanly, so an environment-by-environment divergence was baked in.Why it wasn't caught
The claim "never applied" was asserted from a PR body rather than verified against the live ledger, in violation of
.claude/rules/05-preflight.md(assumption verification) and.claude/rules/32-cf-api-debugging.md(query state before guessing). It was caught by thecloudflare-specialistlocal reviewer, which queried staging D1 directly, and then independently re-verified against both staging and production before the fix landed:0112_deployment_release_status_updated_at.sqlin ledgerstatus_updated_atcolumnProcess fix included in this PR
scripts/quality/check-migration-ordering.ts— extended the grandfathering comment and added the0112entry, documenting explicitly that the file was applied to staging and why renumbering would replay it. This puts the evidence in the path of the next agent that hits a duplicate-prefix violation, which is exactly where the previous revision went wrong.Post-mortem file
This PR description, plus SAM task
01M077X88EYNPCMW6RAB1HGX49.Specialist Review Evidence (Required for agent-authored PRs)
needs-human-reviewlabel added and merge deferred to human — N/A, both completedReviewers were scoped to the integration-only delta (commits
6c3e03ef8,8ea9638bc). Each constituent PR was independently reviewed in its own originating task and is merged here at its reviewed head SHA.8ea9638bcby restoring the applied filename and grandfathering prefix 0112. Independently re-verified against live staging and production D1.pull_request.user.login, which is frozen at PR-open; dependabot branches are in-repo rather than forks, so a collaborator push kept the skip active for human code. Fixed in8ea9638bcby also requiringgithub.actor. Confirmed the preflight check is documentation-only (no security scanning), the stale-binary guard still runs for bots, andci.ymlusespull_requestnotpull_request_targetso no secrets exposure.Exceptions (If any)
created/applyingcompose releases, which staging does not have and which cannot be manufactured without mutating staging state in a way that would itself need cleanup. Unit and integration coverage in the constituent PR covers the path.Agent Preflight (Required)
Classification
External References
d1_migrationstable, which is the basis for the migration-filename decision in this PR.github.actor(actor of the current triggering event) versusgithub.event.pull_request.user.login(PR author, fixed at creation), and to confirm that a false step-levelif:skips that step without failing subsequent steps..claude/rules/32-cf-api-debugging.md: staging D11cfaf5d4-8226-47d8-bf26-6ba727ce5718and production D1a8923a52-b1d4-4e0d-9bd9-aa5406face5e.Codebase Impact Analysis
apps/api/src/db/migrations/— filename of the deployment-release migration from PR Reconcile stale compose deployment releases #1837; determines whether staging replays it.apps/api/src/— fix(security): revoke terminal JWTs on logout #1838 terminal JWT revocation and Reconcile stale compose deployment releases #1837 release reconciliation land here (reviewed in their own PRs).apps/web/—dompurifyandrechartspatch bumps affect existing sanitization and chart rendering.packages/cli/— fix(cli): fail closed on forward token errors #1738 fail-closed local forwarding.packages/vm-agent/—go-toml/v2bump changes the agent binary, which triggers the fresh-node requirement in.claude/rules/27-vm-agent-staging-refresh.md.packages/acp-client/—dompurifybump only;@agentclientprotocol/sdkis deliberately unchanged here.scripts/quality/check-migration-ordering.ts— duplicate-prefix allowlist..github/workflows/ci.yml— preflight-evidence step condition.Documentation & Specs
N/A: no user-facing behavior or interface changed by the integration-only delta.Constituent PRs carried their own documentation updates.tasks/archive/2026-08-16-stale-compose-release-reconciliation.mdwas updated to cite the correct migration filename.Constitution & Risk Check
ALTER TABLE ADD COLUMN+CREATE INDEX IF NOT EXISTS), noDROP TABLE, no unguardedUPDATE/DELETE. Verified bypnpm quality:migration-safety.