chore(deps)!: upgrade acton-service 0.34.1 -> 0.35.0 - #126
Merged
Conversation
0.35.0 bumps acton-reactive 8.1.1 -> 9.0.0. Two things reach this workspace. `AppState::actor` now returns an owned `Option<ActorHandle>` rather than a borrow, because a restart replaces the actor and a stored handle would silently go stale. Every route handler already resolved the handle per request, which is the pattern that change is designed for, so the migration is mechanical: 18 call sites in `routes/entities.rs` and `routes/schemas.rs` now pass `&forge` to the helpers that borrow it. `ActorExtension::restart_policy` is now actually read. Before 0.35.0 the spawner used the legacy `supervise()`, which never consulted the policy and registered children with no blueprint, so no extension could be restarted at all. The declared policy was inert. That makes the default `Permanent` live for the first time, and the two extensions here want opposite answers: `HookDispatchActor` stays `Permanent`. It is `struct HookDispatchActor;` — every input travels with the `DispatchHook` message, so a replacement rebuilt from `Default` is indistinguishable from the original. This is a real gain: post-commit hook dispatch now survives a handler panic. `ForgeActor` opts out with `Temporary`. Its `configure` registers handlers but sets no state — registry, backend, tenant config, policy store, storage registry and hook dispatcher all arrive in the single `InitForge` that `serve` sends at boot, and nothing would ever send a second one. A restarted `ForgeActor` would come back with an empty registry and no backend, leaving a process that stays up and answers 404 on every entity route. That is fail-closed, but it points an operator at a data problem when the fault is a dead actor. Declining the restart keeps the failure legible and preserves 0.34.1 behaviour, where no restart was possible. Making `ForgeActor` restartable means giving it a way to re-initialise from the backend; that is its own change, not a side effect of a version bump. `a_restarted_forge_actor_would_be_unusable` pins the condition rather than the policy value, so teaching the actor to self-initialise fails the test and prompts revisiting the policy instead of quietly diverging from its rationale. 2166 tests pass, clippy clean with --features surrealdb.
…35.0 # Conflicts: # crates/schema-forge-acton/Cargo.toml
rrrodzilla
added a commit
that referenced
this pull request
Aug 4, 2026
Release v0.36.0 — authenticated hook transport (PR #125) and the acton-service 0.34.1 -> 0.35.0 upgrade (PR #126). Minor bumps, both crates. `schema-forge-acton` gains public surface (`hooks::credential`, `HooksConfig::{allow_plaintext, client_identity}`, `HookError::InsecureEndpoint`) and changes hook dispatch behaviour: plaintext endpoints are now refused at startup and every hook RPC carries a per-call PASETO bearer. `schema-forge-cli` changes what `hooks generate` emits: the scaffold boots through `ServiceBuilder` with a live `[token]` section instead of a bare tonic server, so a generated hook service authenticates its callers out of the box.
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.
Branched from
dev, so this is independent of #125 (hook transport security). Whichever lands second will need a trivial rebase — they touch different files apart fromCargo.lock.What reaches us
0.35.0 bumps acton-reactive 8.1.1 → 9.0.0. Two things affect this workspace.
AppState::actorreturns an ownedOption<ActorHandle>, not a borrow — because a restart replaces the actor and a stored handle would silently go stale. Every route handler already resolved the handle per request, which is exactly the pattern that change is designed for, so this is mechanical: 18 call sites inroutes/entities.rsandroutes/schemas.rsnow pass&forgeto the helpers that borrow it.ActorExtension::restart_policyis now actually read. This is the part worth reviewing. Before 0.35.0 the spawner used the legacysupervise(), which never consulted the policy and registered children with no blueprint, so no extension could be restarted at all — the declared policy was inert. The defaultPermanentis now live for the first time, and the two extensions here want opposite answers.HookDispatchActor→ staysPermanentstruct HookDispatchActor;carries no state; every input travels with theDispatchHookmessage. A replacement rebuilt fromDefaultis indistinguishable from the original. This is a genuine gain — post-commit hook dispatch now survives a handler panic.ForgeActor→ opts out withTemporaryconfigureregisters handlers but sets no state. The registry, backend, tenant config, policy store, storage registry and hook dispatcher all arrive in the singleInitForgethatservesends at boot, and nothing would ever send a second one.So a restarted
ForgeActorwould come back with an empty registry and no backend: a process that stays up and answers404 schema not foundon every entity route. That is fail-closed — the emptypolicy_storedenies everything — but it points an operator at a data problem when the actual fault is a dead actor. Declining the restart keeps the failure legible (the handle resolves toNone, routes answer500naming the missing actor) and preserves 0.34.1 behaviour, where no restart was possible.Making
ForgeActorgenuinely restartable means giving it a way to re-initialise from the backend. That is its own change, not a side effect of a version bump — happy to file it if you want it.Test choice
a_restarted_forge_actor_would_be_unusableasserts the condition behind the policy (no backend, empty registry, no policy store afterDefault), not just the policy value. The acton-service commit itself notes the old policy was "declared, documented, unit-tested for its return value, and consumed by nothing" — a return-value test is the weak version. This one fails if someone later teaches the actor to self-initialise, which is the moment the policy should be revisited.Verification
2166 tests pass (+2), clippy clean workspace-wide with
--features surrealdb.