Skip to content

fix(config): require the revocation service settings - #99

Merged
bajtos merged 2 commits into
mainfrom
claude/require-revocation-config
Oct 20, 2026
Merged

bajtos merged 2 commits into
mainfrom
claude/require-revocation-config

Conversation

@bajtos

@bajtos bajtos commented Oct 16, 2026 •

Copy link
Copy Markdown
Member

The first run of E2E tests (fil-forge/infra-nodes#154) discovered that Hilt in dev cannot delete tenants because it was configured to use the production revocation service. I decided to make the revocation service config required to avoid similar surprises in the future.


Written by Claude.

Do not merge until fil-forge/infra-central#264, which sets HILT_REVOCATION_SERVICE_ID and HILT_REVOCATION_SERVICE_URL per stage, is applied to dev, staging and prod. After this lands, a Hilt task without them exits at startup.

Require revocation.service_id and revocation.service_url instead of defaulting them to prod's Swarf (did:web:revoke.fil-forge.com / https://revoke.fil-forge.com).

Dev's ECS task sets neither variable, so dev Hilt published revocations to prod's Swarf. Prod Swarf does not know dev tenants' did:plc DIDs and answers 404, which turned every dev tenant delete into a 500. Staging has the same gap.

  • Remove both SetDefault calls in pkg/config and the --revocation-service-* flag defaults in cmd/main.go.
  • NewRevocationClient rejects an empty DID or URL, so hilt serve exits during fx construction with revocation.service_id is required: set HILT_REVOCATION_SERVICE_ID or --revocation-service-id (or the _url equivalent). The check is explicit because url.Parse("") succeeds and would otherwise build a client that fails only on its first publish.
  • The hilt client commands load config but never build the revocation client, so they keep working without these settings.
  • Tests: config.Load leaves both fields empty when nothing sets them; NewRevocationClient errors on each missing field; an fx app with RevocationModule and empty config fails to construct.
  • README and AGENTS.md mark both settings required.

The integration stack keeps booting: smelt's systems/hilt/compose.yml already sets HILT_REVOCATION_SERVICE_ID=did:web:swarf and HILT_REVOCATION_SERVICE_URL=http://swarf:80.

upload.service_id, upload.service_url and upload.product_id still default to prod values in the same way. They are left for a separate change.

revocation.service_id and revocation.service_url defaulted to prod's
Swarf. Dev and staging set neither, so their Hilt published revocations
to prod, which 404s on their tenants' did:plc DIDs and turned every
tenant delete into a 500.

Drop both defaults and make NewRevocationClient refuse empty values, so
`hilt serve` exits at startup naming the missing env var and flag. The
`hilt client` commands never build the revocation client and need
neither setting.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Miroslav Bajtoš <oss@bajtos.net>
Copilot AI balanced review requested due to automatic review settings October 16, 2026 15:51
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-16T15:53:43.676295Z 210243e PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The change makes Hilt crash at startup across all stages when the settings are unset and is explicitly gated on an external infra PR being applied first, which requires human deployment coordination.

0 open findings

What changed in this PR

This PR makes the Swarf revocation service settings (revocation.service_id and revocation.service_url) required rather than defaulting them to prod's Swarf. Previously, dev and staging Hilt deployments—which don't set these variables—silently published revocations to prod's Swarf, which doesn't know their tenants' DIDs, turning every tenant delete into a 500. Now hilt serve fails fast at startup when either setting is missing, with a clear actionable error, while hilt client commands (which never build the revocation client) keep working.

Changes:

  • Remove the SetDefault calls in pkg/config and the flag defaults in cmd/main.go, replacing them with explicit empty values and "required" documentation.
  • Add explicit empty-value checks in fx.NewRevocationClient (needed because url.Parse("") succeeds and would otherwise defer the failure to first publish), plus tests for missing fields, module construction failure, and no-default loading.
  • Update README.md and AGENTS.md to mark both settings as required.
File Description
pkg/​fx/​revocation.go Adds empty-string guards for ServiceID/ServiceURL with actionable error messages before parsing.
pkg/​config/​config.go Removes the two SetDefault calls and documents why revocation settings have no default.
cmd/​main.go Clears the --revocation-service-* flag defaults and marks them "(required)".
pkg/​fx/​revocation_test.go Adds table-driven tests for missing fields and an fx-construction failure test.
pkg/​config/​config_test.go Verifies the revocation config stays empty with no defaults.
README.md Documents both settings as required and the startup-exit behavior.
AGENTS.md Updates the local-run command to include the now-required flags.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@bajtos
bajtos enabled auto-merge (squash) October 20, 2026 09:56
@bajtos
bajtos merged commit ac4676e into main Oct 20, 2026
8 checks passed
@bajtos
bajtos deleted the claude/require-revocation-config branch October 20, 2026 10:03
fil-forge-bot Bot added a commit to fil-forge/infra-central that referenced this pull request Oct 20, 2026
Published from fil-forge/hilt#99

- Digest: `sha256:be8aa83dcfcb18f4c57a027bfac969ffec38c7d87586594c3d17a2e43e98321c`
- Commit: fil-forge/hilt@ac4676e
- Publish run: https://github.com/fil-forge/hilt/actions/runs/39405191257

Merging applies [`terraform/envs/dev/apps`](https://github.com/fil-forge/infra-central/tree/main/terraform/envs/dev/apps) with no further confirmation.
fil-forge-bot Bot added a commit to fil-forge/infra-central that referenced this pull request Oct 20, 2026
Published from fil-forge/hilt#99

- Digest: `sha256:be8aa83dcfcb18f4c57a027bfac969ffec38c7d87586594c3d17a2e43e98321c`
- Commit: fil-forge/hilt@ac4676e
- Publish run: https://github.com/fil-forge/hilt/actions/runs/39405191257

Merging applies [`terraform/envs/dev/apps`](https://github.com/fil-forge/infra-central/tree/main/terraform/envs/dev/apps) with no further confirmation.

Co-authored-by: fil-forge-bot[bot] <318653112+fil-forge-bot[bot]@users.noreply.github.com>
fil-forge-bot Bot added a commit to fil-forge/infra-central that referenced this pull request Oct 20, 2026
Sets every staging pin in `terraform/envs/staging/apps/terraform.tfvars`
to what `terraform/envs/dev/apps/terraform.tfvars` pins at df6947f.
Merging this is the promotion: Check and deploy applies `terraform/envs/staging/apps`
on the merge commit, with no further confirmation.

dev passed its smoke test on that commit in https://github.com/fil-forge/infra-central/actions/runs/39405801504.

This pull request is rebuilt each time dev passes its smoke test after a push
to `main`, and closed once staging matches dev. To hold a service back, push
to `bot/promote-staging` by hand: the bot leaves the branch alone while this pull
request is open.

## sprue

[`sha256:79eb33d`](https://github.com/orgs/fil-forge/packages/container/sprue/1339893466) → [`sha256:705cd28`](https://github.com/orgs/fil-forge/packages/container/sprue/1414568650)

What fil-forge/sprue brings over staging's pin, [`9b40689..bb3458c`](fil-forge/sprue@9b40689...bb3458c):

- `Upgrade ucantone and log recovered panics` ([85b7799](fil-forge/sprue@85b7799))
- `Fix shared logger mutation in /provider/add` ([dc00875](fil-forge/sprue@dc00875))
- `Tolerate duplicate blob/add and blob/remove` ([c4a810d](fil-forge/sprue@c4a810d))
- `Stop sharing shard slices in memory upload store` ([4c387b0](fil-forge/sprue@4c387b0))
- `Don't panic on failure receipts without a name` ([32423bf](fil-forge/sprue@32423bf))
- `Insert agent index rows in a stable order` ([d5bc0fb](fil-forge/sprue@d5bc0fb))
- `Raise default postgres pool size to 100` ([b2ad08f](fil-forge/sprue@b2ad08f))
- `Lower default postgres pool size to 20` ([2038899](fil-forge/sprue@2038899))
- `Fail a /blob/add that loses the registration race` ([452bc56](fil-forge/sprue@452bc56))
- `Correct the descendingCIDs test helper comment` ([ea8fd67](fil-forge/sprue@ea8fd67))
- `Use conditional writes for admin provider updates` ([77b1492](fil-forge/sprue@77b1492))
- `Revert "Use conditional writes for admin provider updates"` ([5d0de78](fil-forge/sprue@5d0de78))
- fil-forge/sprue#130 ([0b76576](fil-forge/sprue@0b76576))
- fil-forge/sprue#131 ([8c7925a](fil-forge/sprue@8c7925a))
- fil-forge/sprue#132 ([a7762f6](fil-forge/sprue@a7762f6))
- fil-forge/sprue#133 ([a5d84ee](fil-forge/sprue@a5d84ee))
- fil-forge/sprue#137 ([98d22cc](fil-forge/sprue@98d22cc))
- fil-forge/sprue#136 ([9fb2d96](fil-forge/sprue@9fb2d96))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([dbd600d](fil-forge/sprue@dbd600d))
- `Address round 1 review of the observability guidance` ([4188af6](fil-forge/sprue@4188af6))
- fil-forge/sprue#141 ([046155c](fil-forge/sprue@046155c))
- fil-forge/sprue#142 ([80c2ed6](fil-forge/sprue@80c2ed6))
- fil-forge/sprue#145 ([9e5422e](fil-forge/sprue@9e5422e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([a5ee6c7](fil-forge/sprue@a5ee6c7))
- fil-forge/sprue#143 ([3c62127](fil-forge/sprue@3c62127))
- `Rewrap docs/observability.md` ([5c8387a](fil-forge/sprue@5c8387a))
- fil-forge/sprue#140 ([88ec247](fil-forge/sprue@88ec247))
- `Merge branch 'main' into claude/ucantone-upgrade-concurrency-c1a7d5` ([048df30](fil-forge/sprue@048df30))
- fil-forge/sprue#109 ([bb3458c](fil-forge/sprue@bb3458c))

## hilt

[`sha256:5b6d022`](https://github.com/orgs/fil-forge/packages/container/hilt/1384674731) → [`sha256:be8aa83`](https://github.com/orgs/fil-forge/packages/container/hilt/1414577134)

What fil-forge/hilt brings over staging's pin, [`42dd070..ac4676e`](fil-forge/hilt@42dd070...ac4676e):

- fil-forge/hilt#97 ([b5d3b3e](fil-forge/hilt@b5d3b3e))
- fil-forge/hilt#98 ([1f0b2c1](fil-forge/hilt@1f0b2c1))
- fil-forge/hilt#99 ([ac4676e](fil-forge/hilt@ac4676e))

## swarf

[`sha256:c364312`](https://github.com/orgs/fil-forge/packages/container/swarf/1361661163) → [`sha256:4807de8`](https://github.com/orgs/fil-forge/packages/container/swarf/1399568771)

What fil-forge/swarf brings over staging's pin, [`4b2e2ae..974851a`](fil-forge/swarf@4b2e2ae...974851a):

- `Add AGENTS.md with observability guidance` ([88dbb4c](fil-forge/swarf@88dbb4c))
- `Address round 1 review of the observability guidance` ([305021e](fil-forge/swarf@305021e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([7ff3da0](fil-forge/swarf@7ff3da0))
- `Rewrap docs/observability.md` ([72018b4](fil-forge/swarf@72018b4))
- fil-forge/swarf#24 ([974851a](fil-forge/swarf@974851a))

## delegator

[`sha256:30b1757`](https://github.com/orgs/fil-forge/packages/container/delegator/1178963957) → [`sha256:7fb4eb5`](https://github.com/orgs/fil-forge/packages/container/delegator/1399567101)

What fil-forge/delegator brings over staging's pin, [`b5552f1..3ae7270`](fil-forge/delegator@b5552f1...3ae7270):

- fil-forge/delegator#35 ([8bf4153](fil-forge/delegator@8bf4153))
- fil-forge/delegator#36 ([3dfe8c4](fil-forge/delegator@3dfe8c4))
- fil-forge/delegator#37 ([eb81da2](fil-forge/delegator@eb81da2))
- fil-forge/delegator#38 ([314b6d6](fil-forge/delegator@314b6d6))
- fil-forge/delegator#40 ([e588b27](fil-forge/delegator@e588b27))
- fil-forge/delegator#42 ([9cfc334](fil-forge/delegator@9cfc334))
- fil-forge/delegator#43 ([3d3525c](fil-forge/delegator@3d3525c))
- fil-forge/delegator#45 ([5e4090c](fil-forge/delegator@5e4090c))
- fil-forge/delegator#47 ([22d663d](fil-forge/delegator@22d663d))
- fil-forge/delegator#44 ([984ea6e](fil-forge/delegator@984ea6e))
- fil-forge/delegator#46 ([861f107](fil-forge/delegator@861f107))
- fil-forge/delegator#48 ([5a14d35](fil-forge/delegator@5a14d35))
- fil-forge/delegator#49 ([3fe2769](fil-forge/delegator@3fe2769))
- fil-forge/delegator#52 ([1ee1e5b](fil-forge/delegator@1ee1e5b))
- fil-forge/delegator#51 ([d12f29a](fil-forge/delegator@d12f29a))
- fil-forge/delegator#53 ([8d3b969](fil-forge/delegator@8d3b969))
- fil-forge/delegator#55 ([4d6e592](fil-forge/delegator@4d6e592))
- fil-forge/delegator#56 ([4d37521](fil-forge/delegator@4d37521))
- fil-forge/delegator#59 ([26d9d4e](fil-forge/delegator@26d9d4e))
- fil-forge/delegator#60 ([7eeff65](fil-forge/delegator@7eeff65))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([fe04a4c](fil-forge/delegator@fe04a4c))
- `Address round 1 review of the observability guidance` ([b29fad9](fil-forge/delegator@b29fad9))
- fil-forge/delegator#62 ([aaba55d](fil-forge/delegator@aaba55d))
- fil-forge/delegator#63 ([b3bc907](fil-forge/delegator@b3bc907))
- fil-forge/delegator#64 ([716049e](fil-forge/delegator@716049e))
- fil-forge/delegator#66 ([2c2784d](fil-forge/delegator@2c2784d))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([409ff15](fil-forge/delegator@409ff15))
- `Rewrap docs/observability.md` ([77e9d0a](fil-forge/delegator@77e9d0a))
- fil-forge/delegator#61 ([3ae7270](fil-forge/delegator@3ae7270))

## signing_service

[`sha256:b7ef5f0`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1157634158) → [`sha256:4493534`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1399574922)

What fil-forge/piri-signing-service brings over staging's pin, [`c2ac7db..678c9c1`](fil-forge/piri-signing-service@c2ac7db...678c9c1):

- fil-forge/piri-signing-service#19 ([8472ad9](fil-forge/piri-signing-service@8472ad9))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([53d3758](fil-forge/piri-signing-service@53d3758))
- `Address round 1 review of the observability guidance` ([950ef02](fil-forge/piri-signing-service@950ef02))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([e07d0ee](fil-forge/piri-signing-service@e07d0ee))
- `Rewrap docs/observability.md` ([af8b5c1](fil-forge/piri-signing-service@af8b5c1))
- fil-forge/piri-signing-service#22 ([678c9c1](fil-forge/piri-signing-service@678c9c1))
fil-forge-bot Bot added a commit to fil-forge/infra-central that referenced this pull request Oct 20, 2026
Sets every staging pin in `terraform/envs/staging/apps/terraform.tfvars`
to what `terraform/envs/dev/apps/terraform.tfvars` pins at d6562e5.
Merging this is the promotion: Check and deploy applies `terraform/envs/staging/apps`
on the merge commit, with no further confirmation.

dev passed its smoke test on that commit in https://github.com/fil-forge/infra-central/actions/runs/39406592373.

This pull request is rebuilt each time dev passes its smoke test after a push
to `main`, and closed once staging matches dev. To hold a service back, push
to `bot/promote-staging` by hand: the bot leaves the branch alone while this pull
request is open.

## sprue

[`sha256:79eb33d`](https://github.com/orgs/fil-forge/packages/container/sprue/1339893466) → [`sha256:705cd28`](https://github.com/orgs/fil-forge/packages/container/sprue/1414568650)

What fil-forge/sprue brings over staging's pin, [`9b40689..bb3458c`](fil-forge/sprue@9b40689...bb3458c):

- `Upgrade ucantone and log recovered panics` ([85b7799](fil-forge/sprue@85b7799))
- `Fix shared logger mutation in /provider/add` ([dc00875](fil-forge/sprue@dc00875))
- `Tolerate duplicate blob/add and blob/remove` ([c4a810d](fil-forge/sprue@c4a810d))
- `Stop sharing shard slices in memory upload store` ([4c387b0](fil-forge/sprue@4c387b0))
- `Don't panic on failure receipts without a name` ([32423bf](fil-forge/sprue@32423bf))
- `Insert agent index rows in a stable order` ([d5bc0fb](fil-forge/sprue@d5bc0fb))
- `Raise default postgres pool size to 100` ([b2ad08f](fil-forge/sprue@b2ad08f))
- `Lower default postgres pool size to 20` ([2038899](fil-forge/sprue@2038899))
- `Fail a /blob/add that loses the registration race` ([452bc56](fil-forge/sprue@452bc56))
- `Correct the descendingCIDs test helper comment` ([ea8fd67](fil-forge/sprue@ea8fd67))
- `Use conditional writes for admin provider updates` ([77b1492](fil-forge/sprue@77b1492))
- `Revert "Use conditional writes for admin provider updates"` ([5d0de78](fil-forge/sprue@5d0de78))
- fil-forge/sprue#130 ([0b76576](fil-forge/sprue@0b76576))
- fil-forge/sprue#131 ([8c7925a](fil-forge/sprue@8c7925a))
- fil-forge/sprue#132 ([a7762f6](fil-forge/sprue@a7762f6))
- fil-forge/sprue#133 ([a5d84ee](fil-forge/sprue@a5d84ee))
- fil-forge/sprue#137 ([98d22cc](fil-forge/sprue@98d22cc))
- fil-forge/sprue#136 ([9fb2d96](fil-forge/sprue@9fb2d96))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([dbd600d](fil-forge/sprue@dbd600d))
- `Address round 1 review of the observability guidance` ([4188af6](fil-forge/sprue@4188af6))
- fil-forge/sprue#141 ([046155c](fil-forge/sprue@046155c))
- fil-forge/sprue#142 ([80c2ed6](fil-forge/sprue@80c2ed6))
- fil-forge/sprue#145 ([9e5422e](fil-forge/sprue@9e5422e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([a5ee6c7](fil-forge/sprue@a5ee6c7))
- fil-forge/sprue#143 ([3c62127](fil-forge/sprue@3c62127))
- `Rewrap docs/observability.md` ([5c8387a](fil-forge/sprue@5c8387a))
- fil-forge/sprue#140 ([88ec247](fil-forge/sprue@88ec247))
- `Merge branch 'main' into claude/ucantone-upgrade-concurrency-c1a7d5` ([048df30](fil-forge/sprue@048df30))
- fil-forge/sprue#109 ([bb3458c](fil-forge/sprue@bb3458c))

## hilt

[`sha256:5b6d022`](https://github.com/orgs/fil-forge/packages/container/hilt/1384674731) → [`sha256:be8aa83`](https://github.com/orgs/fil-forge/packages/container/hilt/1414577134)

What fil-forge/hilt brings over staging's pin, [`42dd070..ac4676e`](fil-forge/hilt@42dd070...ac4676e):

- fil-forge/hilt#97 ([b5d3b3e](fil-forge/hilt@b5d3b3e))
- fil-forge/hilt#98 ([1f0b2c1](fil-forge/hilt@1f0b2c1))
- fil-forge/hilt#99 ([ac4676e](fil-forge/hilt@ac4676e))

## swarf

[`sha256:c364312`](https://github.com/orgs/fil-forge/packages/container/swarf/1361661163) → [`sha256:4807de8`](https://github.com/orgs/fil-forge/packages/container/swarf/1399568771)

What fil-forge/swarf brings over staging's pin, [`4b2e2ae..974851a`](fil-forge/swarf@4b2e2ae...974851a):

- `Add AGENTS.md with observability guidance` ([88dbb4c](fil-forge/swarf@88dbb4c))
- `Address round 1 review of the observability guidance` ([305021e](fil-forge/swarf@305021e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([7ff3da0](fil-forge/swarf@7ff3da0))
- `Rewrap docs/observability.md` ([72018b4](fil-forge/swarf@72018b4))
- fil-forge/swarf#24 ([974851a](fil-forge/swarf@974851a))

## delegator

[`sha256:30b1757`](https://github.com/orgs/fil-forge/packages/container/delegator/1178963957) → [`sha256:7fb4eb5`](https://github.com/orgs/fil-forge/packages/container/delegator/1399567101)

What fil-forge/delegator brings over staging's pin, [`b5552f1..3ae7270`](fil-forge/delegator@b5552f1...3ae7270):

- fil-forge/delegator#35 ([8bf4153](fil-forge/delegator@8bf4153))
- fil-forge/delegator#36 ([3dfe8c4](fil-forge/delegator@3dfe8c4))
- fil-forge/delegator#37 ([eb81da2](fil-forge/delegator@eb81da2))
- fil-forge/delegator#38 ([314b6d6](fil-forge/delegator@314b6d6))
- fil-forge/delegator#40 ([e588b27](fil-forge/delegator@e588b27))
- fil-forge/delegator#42 ([9cfc334](fil-forge/delegator@9cfc334))
- fil-forge/delegator#43 ([3d3525c](fil-forge/delegator@3d3525c))
- fil-forge/delegator#45 ([5e4090c](fil-forge/delegator@5e4090c))
- fil-forge/delegator#47 ([22d663d](fil-forge/delegator@22d663d))
- fil-forge/delegator#44 ([984ea6e](fil-forge/delegator@984ea6e))
- fil-forge/delegator#46 ([861f107](fil-forge/delegator@861f107))
- fil-forge/delegator#48 ([5a14d35](fil-forge/delegator@5a14d35))
- fil-forge/delegator#49 ([3fe2769](fil-forge/delegator@3fe2769))
- fil-forge/delegator#52 ([1ee1e5b](fil-forge/delegator@1ee1e5b))
- fil-forge/delegator#51 ([d12f29a](fil-forge/delegator@d12f29a))
- fil-forge/delegator#53 ([8d3b969](fil-forge/delegator@8d3b969))
- fil-forge/delegator#55 ([4d6e592](fil-forge/delegator@4d6e592))
- fil-forge/delegator#56 ([4d37521](fil-forge/delegator@4d37521))
- fil-forge/delegator#59 ([26d9d4e](fil-forge/delegator@26d9d4e))
- fil-forge/delegator#60 ([7eeff65](fil-forge/delegator@7eeff65))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([fe04a4c](fil-forge/delegator@fe04a4c))
- `Address round 1 review of the observability guidance` ([b29fad9](fil-forge/delegator@b29fad9))
- fil-forge/delegator#62 ([aaba55d](fil-forge/delegator@aaba55d))
- fil-forge/delegator#63 ([b3bc907](fil-forge/delegator@b3bc907))
- fil-forge/delegator#64 ([716049e](fil-forge/delegator@716049e))
- fil-forge/delegator#66 ([2c2784d](fil-forge/delegator@2c2784d))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([409ff15](fil-forge/delegator@409ff15))
- `Rewrap docs/observability.md` ([77e9d0a](fil-forge/delegator@77e9d0a))
- fil-forge/delegator#61 ([3ae7270](fil-forge/delegator@3ae7270))

## signing_service

[`sha256:b7ef5f0`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1157634158) → [`sha256:4493534`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1399574922)

What fil-forge/piri-signing-service brings over staging's pin, [`c2ac7db..678c9c1`](fil-forge/piri-signing-service@c2ac7db...678c9c1):

- fil-forge/piri-signing-service#19 ([8472ad9](fil-forge/piri-signing-service@8472ad9))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([53d3758](fil-forge/piri-signing-service@53d3758))
- `Address round 1 review of the observability guidance` ([950ef02](fil-forge/piri-signing-service@950ef02))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([e07d0ee](fil-forge/piri-signing-service@e07d0ee))
- `Rewrap docs/observability.md` ([af8b5c1](fil-forge/piri-signing-service@af8b5c1))
- fil-forge/piri-signing-service#22 ([678c9c1](fil-forge/piri-signing-service@678c9c1))
fil-forge-bot Bot added a commit to fil-forge/infra-central that referenced this pull request Oct 20, 2026
Sets every staging pin in `terraform/envs/staging/apps/terraform.tfvars`
to what `terraform/envs/dev/apps/terraform.tfvars` pins at da64faf.
Merging this is the promotion: Check and deploy applies `terraform/envs/staging/apps`
on the merge commit, with no further confirmation.

dev passed its smoke test on that commit in https://github.com/fil-forge/infra-central/actions/runs/39412790499.

This pull request is rebuilt each time dev passes its smoke test after a push
to `main`, and closed once staging matches dev. To hold a service back, push
to `bot/promote-staging` by hand: the bot leaves the branch alone while this pull
request is open.

## sprue

[`sha256:79eb33d`](https://github.com/orgs/fil-forge/packages/container/sprue/1339893466) → [`sha256:705cd28`](https://github.com/orgs/fil-forge/packages/container/sprue/1414568650)

What fil-forge/sprue brings over staging's pin, [`9b40689..bb3458c`](fil-forge/sprue@9b40689...bb3458c):

- `Upgrade ucantone and log recovered panics` ([85b7799](fil-forge/sprue@85b7799))
- `Fix shared logger mutation in /provider/add` ([dc00875](fil-forge/sprue@dc00875))
- `Tolerate duplicate blob/add and blob/remove` ([c4a810d](fil-forge/sprue@c4a810d))
- `Stop sharing shard slices in memory upload store` ([4c387b0](fil-forge/sprue@4c387b0))
- `Don't panic on failure receipts without a name` ([32423bf](fil-forge/sprue@32423bf))
- `Insert agent index rows in a stable order` ([d5bc0fb](fil-forge/sprue@d5bc0fb))
- `Raise default postgres pool size to 100` ([b2ad08f](fil-forge/sprue@b2ad08f))
- `Lower default postgres pool size to 20` ([2038899](fil-forge/sprue@2038899))
- `Fail a /blob/add that loses the registration race` ([452bc56](fil-forge/sprue@452bc56))
- `Correct the descendingCIDs test helper comment` ([ea8fd67](fil-forge/sprue@ea8fd67))
- `Use conditional writes for admin provider updates` ([77b1492](fil-forge/sprue@77b1492))
- `Revert "Use conditional writes for admin provider updates"` ([5d0de78](fil-forge/sprue@5d0de78))
- fil-forge/sprue#130 ([0b76576](fil-forge/sprue@0b76576))
- fil-forge/sprue#131 ([8c7925a](fil-forge/sprue@8c7925a))
- fil-forge/sprue#132 ([a7762f6](fil-forge/sprue@a7762f6))
- fil-forge/sprue#133 ([a5d84ee](fil-forge/sprue@a5d84ee))
- fil-forge/sprue#137 ([98d22cc](fil-forge/sprue@98d22cc))
- fil-forge/sprue#136 ([9fb2d96](fil-forge/sprue@9fb2d96))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([dbd600d](fil-forge/sprue@dbd600d))
- `Address round 1 review of the observability guidance` ([4188af6](fil-forge/sprue@4188af6))
- fil-forge/sprue#141 ([046155c](fil-forge/sprue@046155c))
- fil-forge/sprue#142 ([80c2ed6](fil-forge/sprue@80c2ed6))
- fil-forge/sprue#145 ([9e5422e](fil-forge/sprue@9e5422e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([a5ee6c7](fil-forge/sprue@a5ee6c7))
- fil-forge/sprue#143 ([3c62127](fil-forge/sprue@3c62127))
- `Rewrap docs/observability.md` ([5c8387a](fil-forge/sprue@5c8387a))
- fil-forge/sprue#140 ([88ec247](fil-forge/sprue@88ec247))
- `Merge branch 'main' into claude/ucantone-upgrade-concurrency-c1a7d5` ([048df30](fil-forge/sprue@048df30))
- fil-forge/sprue#109 ([bb3458c](fil-forge/sprue@bb3458c))

## hilt

[`sha256:5b6d022`](https://github.com/orgs/fil-forge/packages/container/hilt/1384674731) → [`sha256:3dbe302`](https://github.com/orgs/fil-forge/packages/container/hilt/1414890670)

What fil-forge/hilt brings over staging's pin, [`42dd070..cd26388`](fil-forge/hilt@42dd070...cd26388):

- fil-forge/hilt#97 ([b5d3b3e](fil-forge/hilt@b5d3b3e))
- fil-forge/hilt#98 ([1f0b2c1](fil-forge/hilt@1f0b2c1))
- fil-forge/hilt#99 ([ac4676e](fil-forge/hilt@ac4676e))
- fil-forge/hilt#101 ([9328a49](fil-forge/hilt@9328a49))
- fil-forge/hilt#102 ([cd26388](fil-forge/hilt@cd26388))

## swarf

[`sha256:c364312`](https://github.com/orgs/fil-forge/packages/container/swarf/1361661163) → [`sha256:4807de8`](https://github.com/orgs/fil-forge/packages/container/swarf/1399568771)

What fil-forge/swarf brings over staging's pin, [`4b2e2ae..974851a`](fil-forge/swarf@4b2e2ae...974851a):

- `Add AGENTS.md with observability guidance` ([88dbb4c](fil-forge/swarf@88dbb4c))
- `Address round 1 review of the observability guidance` ([305021e](fil-forge/swarf@305021e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([7ff3da0](fil-forge/swarf@7ff3da0))
- `Rewrap docs/observability.md` ([72018b4](fil-forge/swarf@72018b4))
- fil-forge/swarf#24 ([974851a](fil-forge/swarf@974851a))

## delegator

[`sha256:30b1757`](https://github.com/orgs/fil-forge/packages/container/delegator/1178963957) → [`sha256:7fb4eb5`](https://github.com/orgs/fil-forge/packages/container/delegator/1399567101)

What fil-forge/delegator brings over staging's pin, [`b5552f1..3ae7270`](fil-forge/delegator@b5552f1...3ae7270):

- fil-forge/delegator#35 ([8bf4153](fil-forge/delegator@8bf4153))
- fil-forge/delegator#36 ([3dfe8c4](fil-forge/delegator@3dfe8c4))
- fil-forge/delegator#37 ([eb81da2](fil-forge/delegator@eb81da2))
- fil-forge/delegator#38 ([314b6d6](fil-forge/delegator@314b6d6))
- fil-forge/delegator#40 ([e588b27](fil-forge/delegator@e588b27))
- fil-forge/delegator#42 ([9cfc334](fil-forge/delegator@9cfc334))
- fil-forge/delegator#43 ([3d3525c](fil-forge/delegator@3d3525c))
- fil-forge/delegator#45 ([5e4090c](fil-forge/delegator@5e4090c))
- fil-forge/delegator#47 ([22d663d](fil-forge/delegator@22d663d))
- fil-forge/delegator#44 ([984ea6e](fil-forge/delegator@984ea6e))
- fil-forge/delegator#46 ([861f107](fil-forge/delegator@861f107))
- fil-forge/delegator#48 ([5a14d35](fil-forge/delegator@5a14d35))
- fil-forge/delegator#49 ([3fe2769](fil-forge/delegator@3fe2769))
- fil-forge/delegator#52 ([1ee1e5b](fil-forge/delegator@1ee1e5b))
- fil-forge/delegator#51 ([d12f29a](fil-forge/delegator@d12f29a))
- fil-forge/delegator#53 ([8d3b969](fil-forge/delegator@8d3b969))
- fil-forge/delegator#55 ([4d6e592](fil-forge/delegator@4d6e592))
- fil-forge/delegator#56 ([4d37521](fil-forge/delegator@4d37521))
- fil-forge/delegator#59 ([26d9d4e](fil-forge/delegator@26d9d4e))
- fil-forge/delegator#60 ([7eeff65](fil-forge/delegator@7eeff65))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([fe04a4c](fil-forge/delegator@fe04a4c))
- `Address round 1 review of the observability guidance` ([b29fad9](fil-forge/delegator@b29fad9))
- fil-forge/delegator#62 ([aaba55d](fil-forge/delegator@aaba55d))
- fil-forge/delegator#63 ([b3bc907](fil-forge/delegator@b3bc907))
- fil-forge/delegator#64 ([716049e](fil-forge/delegator@716049e))
- fil-forge/delegator#66 ([2c2784d](fil-forge/delegator@2c2784d))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([409ff15](fil-forge/delegator@409ff15))
- `Rewrap docs/observability.md` ([77e9d0a](fil-forge/delegator@77e9d0a))
- fil-forge/delegator#61 ([3ae7270](fil-forge/delegator@3ae7270))

## signing_service

[`sha256:b7ef5f0`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1157634158) → [`sha256:4493534`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1399574922)

What fil-forge/piri-signing-service brings over staging's pin, [`c2ac7db..678c9c1`](fil-forge/piri-signing-service@c2ac7db...678c9c1):

- fil-forge/piri-signing-service#19 ([8472ad9](fil-forge/piri-signing-service@8472ad9))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([53d3758](fil-forge/piri-signing-service@53d3758))
- `Address round 1 review of the observability guidance` ([950ef02](fil-forge/piri-signing-service@950ef02))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([e07d0ee](fil-forge/piri-signing-service@e07d0ee))
- `Rewrap docs/observability.md` ([af8b5c1](fil-forge/piri-signing-service@af8b5c1))
- fil-forge/piri-signing-service#22 ([678c9c1](fil-forge/piri-signing-service@678c9c1))
bajtos added a commit that referenced this pull request Oct 20, 2026
The first run of E2E tests
(fil-forge/infra-nodes#154) discovered that Hilt
in dev cannot delete tenants because it was configured to use the
production revocation service. I decided to make the revocation service
config required in #99. Claude
flagged that there is a similar footgun related to the configuration of
the upload service, so in this PR I am making it required too.

---

_Written by Claude._

Require `upload.service_id`, `upload.service_url` and
`upload.product_id` instead of defaulting them to prod's Sprue
(`did:web:upload.fil-forge.com`, `https://upload.fil-forge.com`) and
prod's product DID (`did:web:hilt.fil-forge.com`).

A stage that forgot these settings would register its tenants and
provision its buckets on prod Sprue. #99 fixes the same
pattern for the revocation settings, which turned every dev tenant
delete into a 500.

- Remove the three `SetDefault` calls in `pkg/config` and the
`--upload-*` flag defaults in `cmd/main.go`.
- `NewUploadClient` rejects an empty service DID, URL or product DID, so
`hilt serve` exits during fx construction with, for example,
`upload.product_id is required: set HILT_UPLOAD_PRODUCT_ID or
--upload-product-id`.
- `upload.product_id` was optional in the constructor. Tenant
provisioning always passes it to Sprue's `/customer/add`, so a `serve`
without it cannot create tenants, and it is now required too.
`upload.proofs` stays optional.
- The `hilt client` commands load config but never build the upload
client, so they keep working without these settings.
- Tests: `config.Load` leaves the upload config empty when nothing sets
it; `NewUploadClient` errors on each missing field and on an invalid
product DID; an fx app with the upload client and empty config fails to
construct.
- README and AGENTS.md mark the three settings required.

Safe to merge once reviewed. infra-central's shared `modules/apps`, used
by dev, staging and prod, has set all three `HILT_UPLOAD_*` variables
since 2026-08-19. Smelt's `systems/hilt/compose.yml` sets them for the
integration stack.

This PR and #99 edit neighbouring lines in `pkg/config/config.go`
`SetDefaults` and the same "Run locally" line in AGENTS.md. Whichever
merges second needs a small conflict resolution.

Signed-off-by: Miroslav Bajtoš <oss@bajtos.net>
fil-forge-bot Bot added a commit to fil-forge/infra-central that referenced this pull request Oct 20, 2026
Sets every staging pin in `terraform/envs/staging/apps/terraform.tfvars`
to what `terraform/envs/dev/apps/terraform.tfvars` pins at cb2213d.
Merging this is the promotion: Check and deploy applies `terraform/envs/staging/apps`
on the merge commit, with no further confirmation.

dev passed its smoke test on that commit in https://github.com/fil-forge/infra-central/actions/runs/39423531338.

This pull request is rebuilt each time dev passes its smoke test after a push
to `main`, and closed once staging matches dev. To hold a service back, push
to `bot/promote-staging` by hand: the bot leaves the branch alone while this pull
request is open.

## sprue

[`sha256:79eb33d`](https://github.com/orgs/fil-forge/packages/container/sprue/1339893466) → [`sha256:0e6f85e`](https://github.com/orgs/fil-forge/packages/container/sprue/1415261149)

What fil-forge/sprue brings over staging's pin, [`9b40689..ad4c80f`](fil-forge/sprue@9b40689...ad4c80f):

- `Upgrade ucantone and log recovered panics` ([85b7799](fil-forge/sprue@85b7799))
- `Fix shared logger mutation in /provider/add` ([dc00875](fil-forge/sprue@dc00875))
- `Tolerate duplicate blob/add and blob/remove` ([c4a810d](fil-forge/sprue@c4a810d))
- `Stop sharing shard slices in memory upload store` ([4c387b0](fil-forge/sprue@4c387b0))
- `Don't panic on failure receipts without a name` ([32423bf](fil-forge/sprue@32423bf))
- `Insert agent index rows in a stable order` ([d5bc0fb](fil-forge/sprue@d5bc0fb))
- `Raise default postgres pool size to 100` ([b2ad08f](fil-forge/sprue@b2ad08f))
- `Lower default postgres pool size to 20` ([2038899](fil-forge/sprue@2038899))
- `Fail a /blob/add that loses the registration race` ([452bc56](fil-forge/sprue@452bc56))
- `Correct the descendingCIDs test helper comment` ([ea8fd67](fil-forge/sprue@ea8fd67))
- `Use conditional writes for admin provider updates` ([77b1492](fil-forge/sprue@77b1492))
- `Revert "Use conditional writes for admin provider updates"` ([5d0de78](fil-forge/sprue@5d0de78))
- fil-forge/sprue#130 ([0b76576](fil-forge/sprue@0b76576))
- fil-forge/sprue#131 ([8c7925a](fil-forge/sprue@8c7925a))
- fil-forge/sprue#132 ([a7762f6](fil-forge/sprue@a7762f6))
- fil-forge/sprue#133 ([a5d84ee](fil-forge/sprue@a5d84ee))
- fil-forge/sprue#137 ([98d22cc](fil-forge/sprue@98d22cc))
- fil-forge/sprue#136 ([9fb2d96](fil-forge/sprue@9fb2d96))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([dbd600d](fil-forge/sprue@dbd600d))
- `Address round 1 review of the observability guidance` ([4188af6](fil-forge/sprue@4188af6))
- fil-forge/sprue#141 ([046155c](fil-forge/sprue@046155c))
- fil-forge/sprue#142 ([80c2ed6](fil-forge/sprue@80c2ed6))
- fil-forge/sprue#145 ([9e5422e](fil-forge/sprue@9e5422e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([a5ee6c7](fil-forge/sprue@a5ee6c7))
- fil-forge/sprue#143 ([3c62127](fil-forge/sprue@3c62127))
- `Rewrap docs/observability.md` ([5c8387a](fil-forge/sprue@5c8387a))
- fil-forge/sprue#140 ([88ec247](fil-forge/sprue@88ec247))
- `Merge branch 'main' into claude/ucantone-upgrade-concurrency-c1a7d5` ([048df30](fil-forge/sprue@048df30))
- fil-forge/sprue#109 ([bb3458c](fil-forge/sprue@bb3458c))
- `Use conditional writes for admin provider updates` ([34ff3f9](fil-forge/sprue@34ff3f9))
- `Copy replication weights in memory provider store` ([0ca9a6e](fil-forge/sprue@0ca9a6e))
- fil-forge/sprue#110 ([ad4c80f](fil-forge/sprue@ad4c80f))

## hilt

[`sha256:5b6d022`](https://github.com/orgs/fil-forge/packages/container/hilt/1384674731) → [`sha256:3dbe302`](https://github.com/orgs/fil-forge/packages/container/hilt/1414890670)

What fil-forge/hilt brings over staging's pin, [`42dd070..cd26388`](fil-forge/hilt@42dd070...cd26388):

- fil-forge/hilt#97 ([b5d3b3e](fil-forge/hilt@b5d3b3e))
- fil-forge/hilt#98 ([1f0b2c1](fil-forge/hilt@1f0b2c1))
- fil-forge/hilt#99 ([ac4676e](fil-forge/hilt@ac4676e))
- fil-forge/hilt#101 ([9328a49](fil-forge/hilt@9328a49))
- fil-forge/hilt#102 ([cd26388](fil-forge/hilt@cd26388))

## swarf

[`sha256:c364312`](https://github.com/orgs/fil-forge/packages/container/swarf/1361661163) → [`sha256:4807de8`](https://github.com/orgs/fil-forge/packages/container/swarf/1399568771)

What fil-forge/swarf brings over staging's pin, [`4b2e2ae..974851a`](fil-forge/swarf@4b2e2ae...974851a):

- `Add AGENTS.md with observability guidance` ([88dbb4c](fil-forge/swarf@88dbb4c))
- `Address round 1 review of the observability guidance` ([305021e](fil-forge/swarf@305021e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([7ff3da0](fil-forge/swarf@7ff3da0))
- `Rewrap docs/observability.md` ([72018b4](fil-forge/swarf@72018b4))
- fil-forge/swarf#24 ([974851a](fil-forge/swarf@974851a))

## delegator

[`sha256:30b1757`](https://github.com/orgs/fil-forge/packages/container/delegator/1178963957) → [`sha256:7fb4eb5`](https://github.com/orgs/fil-forge/packages/container/delegator/1399567101)

What fil-forge/delegator brings over staging's pin, [`b5552f1..3ae7270`](fil-forge/delegator@b5552f1...3ae7270):

- fil-forge/delegator#35 ([8bf4153](fil-forge/delegator@8bf4153))
- fil-forge/delegator#36 ([3dfe8c4](fil-forge/delegator@3dfe8c4))
- fil-forge/delegator#37 ([eb81da2](fil-forge/delegator@eb81da2))
- fil-forge/delegator#38 ([314b6d6](fil-forge/delegator@314b6d6))
- fil-forge/delegator#40 ([e588b27](fil-forge/delegator@e588b27))
- fil-forge/delegator#42 ([9cfc334](fil-forge/delegator@9cfc334))
- fil-forge/delegator#43 ([3d3525c](fil-forge/delegator@3d3525c))
- fil-forge/delegator#45 ([5e4090c](fil-forge/delegator@5e4090c))
- fil-forge/delegator#47 ([22d663d](fil-forge/delegator@22d663d))
- fil-forge/delegator#44 ([984ea6e](fil-forge/delegator@984ea6e))
- fil-forge/delegator#46 ([861f107](fil-forge/delegator@861f107))
- fil-forge/delegator#48 ([5a14d35](fil-forge/delegator@5a14d35))
- fil-forge/delegator#49 ([3fe2769](fil-forge/delegator@3fe2769))
- fil-forge/delegator#52 ([1ee1e5b](fil-forge/delegator@1ee1e5b))
- fil-forge/delegator#51 ([d12f29a](fil-forge/delegator@d12f29a))
- fil-forge/delegator#53 ([8d3b969](fil-forge/delegator@8d3b969))
- fil-forge/delegator#55 ([4d6e592](fil-forge/delegator@4d6e592))
- fil-forge/delegator#56 ([4d37521](fil-forge/delegator@4d37521))
- fil-forge/delegator#59 ([26d9d4e](fil-forge/delegator@26d9d4e))
- fil-forge/delegator#60 ([7eeff65](fil-forge/delegator@7eeff65))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([fe04a4c](fil-forge/delegator@fe04a4c))
- `Address round 1 review of the observability guidance` ([b29fad9](fil-forge/delegator@b29fad9))
- fil-forge/delegator#62 ([aaba55d](fil-forge/delegator@aaba55d))
- fil-forge/delegator#63 ([b3bc907](fil-forge/delegator@b3bc907))
- fil-forge/delegator#64 ([716049e](fil-forge/delegator@716049e))
- fil-forge/delegator#66 ([2c2784d](fil-forge/delegator@2c2784d))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([409ff15](fil-forge/delegator@409ff15))
- `Rewrap docs/observability.md` ([77e9d0a](fil-forge/delegator@77e9d0a))
- fil-forge/delegator#61 ([3ae7270](fil-forge/delegator@3ae7270))

## signing_service

[`sha256:b7ef5f0`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1157634158) → [`sha256:4493534`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1399574922)

What fil-forge/piri-signing-service brings over staging's pin, [`c2ac7db..678c9c1`](fil-forge/piri-signing-service@c2ac7db...678c9c1):

- fil-forge/piri-signing-service#19 ([8472ad9](fil-forge/piri-signing-service@8472ad9))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([53d3758](fil-forge/piri-signing-service@53d3758))
- `Address round 1 review of the observability guidance` ([950ef02](fil-forge/piri-signing-service@950ef02))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([e07d0ee](fil-forge/piri-signing-service@e07d0ee))
- `Rewrap docs/observability.md` ([af8b5c1](fil-forge/piri-signing-service@af8b5c1))
- fil-forge/piri-signing-service#22 ([678c9c1](fil-forge/piri-signing-service@678c9c1))
fil-forge-bot Bot added a commit to fil-forge/infra-central that referenced this pull request Oct 20, 2026
Sets every staging pin in `terraform/envs/staging/apps/terraform.tfvars`
to what `terraform/envs/dev/apps/terraform.tfvars` pins at a4b4089.
Merging this is the promotion: Check and deploy applies `terraform/envs/staging/apps`
on the merge commit, with no further confirmation.

dev passed its smoke test on that commit in https://github.com/fil-forge/infra-central/actions/runs/39424031564.

This pull request is rebuilt each time dev passes its smoke test after a push
to `main`, and closed once staging matches dev. To hold a service back, push
to `bot/promote-staging` by hand: the bot leaves the branch alone while this pull
request is open.

## sprue

[`sha256:79eb33d`](https://github.com/orgs/fil-forge/packages/container/sprue/1339893466) → [`sha256:0e6f85e`](https://github.com/orgs/fil-forge/packages/container/sprue/1415261149)

What fil-forge/sprue brings over staging's pin, [`9b40689..ad4c80f`](fil-forge/sprue@9b40689...ad4c80f):

- `Upgrade ucantone and log recovered panics` ([85b7799](fil-forge/sprue@85b7799))
- `Fix shared logger mutation in /provider/add` ([dc00875](fil-forge/sprue@dc00875))
- `Tolerate duplicate blob/add and blob/remove` ([c4a810d](fil-forge/sprue@c4a810d))
- `Stop sharing shard slices in memory upload store` ([4c387b0](fil-forge/sprue@4c387b0))
- `Don't panic on failure receipts without a name` ([32423bf](fil-forge/sprue@32423bf))
- `Insert agent index rows in a stable order` ([d5bc0fb](fil-forge/sprue@d5bc0fb))
- `Raise default postgres pool size to 100` ([b2ad08f](fil-forge/sprue@b2ad08f))
- `Lower default postgres pool size to 20` ([2038899](fil-forge/sprue@2038899))
- `Fail a /blob/add that loses the registration race` ([452bc56](fil-forge/sprue@452bc56))
- `Correct the descendingCIDs test helper comment` ([ea8fd67](fil-forge/sprue@ea8fd67))
- `Use conditional writes for admin provider updates` ([77b1492](fil-forge/sprue@77b1492))
- `Revert "Use conditional writes for admin provider updates"` ([5d0de78](fil-forge/sprue@5d0de78))
- fil-forge/sprue#130 ([0b76576](fil-forge/sprue@0b76576))
- fil-forge/sprue#131 ([8c7925a](fil-forge/sprue@8c7925a))
- fil-forge/sprue#132 ([a7762f6](fil-forge/sprue@a7762f6))
- fil-forge/sprue#133 ([a5d84ee](fil-forge/sprue@a5d84ee))
- fil-forge/sprue#137 ([98d22cc](fil-forge/sprue@98d22cc))
- fil-forge/sprue#136 ([9fb2d96](fil-forge/sprue@9fb2d96))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([dbd600d](fil-forge/sprue@dbd600d))
- `Address round 1 review of the observability guidance` ([4188af6](fil-forge/sprue@4188af6))
- fil-forge/sprue#141 ([046155c](fil-forge/sprue@046155c))
- fil-forge/sprue#142 ([80c2ed6](fil-forge/sprue@80c2ed6))
- fil-forge/sprue#145 ([9e5422e](fil-forge/sprue@9e5422e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([a5ee6c7](fil-forge/sprue@a5ee6c7))
- fil-forge/sprue#143 ([3c62127](fil-forge/sprue@3c62127))
- `Rewrap docs/observability.md` ([5c8387a](fil-forge/sprue@5c8387a))
- fil-forge/sprue#140 ([88ec247](fil-forge/sprue@88ec247))
- `Merge branch 'main' into claude/ucantone-upgrade-concurrency-c1a7d5` ([048df30](fil-forge/sprue@048df30))
- fil-forge/sprue#109 ([bb3458c](fil-forge/sprue@bb3458c))
- `Use conditional writes for admin provider updates` ([34ff3f9](fil-forge/sprue@34ff3f9))
- `Copy replication weights in memory provider store` ([0ca9a6e](fil-forge/sprue@0ca9a6e))
- fil-forge/sprue#110 ([ad4c80f](fil-forge/sprue@ad4c80f))

## hilt

[`sha256:5b6d022`](https://github.com/orgs/fil-forge/packages/container/hilt/1384674731) → [`sha256:d693f58`](https://github.com/orgs/fil-forge/packages/container/hilt/1415385710)

What fil-forge/hilt brings over staging's pin, [`42dd070..358562a`](fil-forge/hilt@42dd070...358562a):

- fil-forge/hilt#97 ([b5d3b3e](fil-forge/hilt@b5d3b3e))
- fil-forge/hilt#98 ([1f0b2c1](fil-forge/hilt@1f0b2c1))
- fil-forge/hilt#99 ([ac4676e](fil-forge/hilt@ac4676e))
- fil-forge/hilt#101 ([9328a49](fil-forge/hilt@9328a49))
- fil-forge/hilt#102 ([cd26388](fil-forge/hilt@cd26388))
- fil-forge/hilt#100 ([358562a](fil-forge/hilt@358562a))

## swarf

[`sha256:c364312`](https://github.com/orgs/fil-forge/packages/container/swarf/1361661163) → [`sha256:4807de8`](https://github.com/orgs/fil-forge/packages/container/swarf/1399568771)

What fil-forge/swarf brings over staging's pin, [`4b2e2ae..974851a`](fil-forge/swarf@4b2e2ae...974851a):

- `Add AGENTS.md with observability guidance` ([88dbb4c](fil-forge/swarf@88dbb4c))
- `Address round 1 review of the observability guidance` ([305021e](fil-forge/swarf@305021e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([7ff3da0](fil-forge/swarf@7ff3da0))
- `Rewrap docs/observability.md` ([72018b4](fil-forge/swarf@72018b4))
- fil-forge/swarf#24 ([974851a](fil-forge/swarf@974851a))

## delegator

[`sha256:30b1757`](https://github.com/orgs/fil-forge/packages/container/delegator/1178963957) → [`sha256:7fb4eb5`](https://github.com/orgs/fil-forge/packages/container/delegator/1399567101)

What fil-forge/delegator brings over staging's pin, [`b5552f1..3ae7270`](fil-forge/delegator@b5552f1...3ae7270):

- fil-forge/delegator#35 ([8bf4153](fil-forge/delegator@8bf4153))
- fil-forge/delegator#36 ([3dfe8c4](fil-forge/delegator@3dfe8c4))
- fil-forge/delegator#37 ([eb81da2](fil-forge/delegator@eb81da2))
- fil-forge/delegator#38 ([314b6d6](fil-forge/delegator@314b6d6))
- fil-forge/delegator#40 ([e588b27](fil-forge/delegator@e588b27))
- fil-forge/delegator#42 ([9cfc334](fil-forge/delegator@9cfc334))
- fil-forge/delegator#43 ([3d3525c](fil-forge/delegator@3d3525c))
- fil-forge/delegator#45 ([5e4090c](fil-forge/delegator@5e4090c))
- fil-forge/delegator#47 ([22d663d](fil-forge/delegator@22d663d))
- fil-forge/delegator#44 ([984ea6e](fil-forge/delegator@984ea6e))
- fil-forge/delegator#46 ([861f107](fil-forge/delegator@861f107))
- fil-forge/delegator#48 ([5a14d35](fil-forge/delegator@5a14d35))
- fil-forge/delegator#49 ([3fe2769](fil-forge/delegator@3fe2769))
- fil-forge/delegator#52 ([1ee1e5b](fil-forge/delegator@1ee1e5b))
- fil-forge/delegator#51 ([d12f29a](fil-forge/delegator@d12f29a))
- fil-forge/delegator#53 ([8d3b969](fil-forge/delegator@8d3b969))
- fil-forge/delegator#55 ([4d6e592](fil-forge/delegator@4d6e592))
- fil-forge/delegator#56 ([4d37521](fil-forge/delegator@4d37521))
- fil-forge/delegator#59 ([26d9d4e](fil-forge/delegator@26d9d4e))
- fil-forge/delegator#60 ([7eeff65](fil-forge/delegator@7eeff65))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([fe04a4c](fil-forge/delegator@fe04a4c))
- `Address round 1 review of the observability guidance` ([b29fad9](fil-forge/delegator@b29fad9))
- fil-forge/delegator#62 ([aaba55d](fil-forge/delegator@aaba55d))
- fil-forge/delegator#63 ([b3bc907](fil-forge/delegator@b3bc907))
- fil-forge/delegator#64 ([716049e](fil-forge/delegator@716049e))
- fil-forge/delegator#66 ([2c2784d](fil-forge/delegator@2c2784d))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([409ff15](fil-forge/delegator@409ff15))
- `Rewrap docs/observability.md` ([77e9d0a](fil-forge/delegator@77e9d0a))
- fil-forge/delegator#61 ([3ae7270](fil-forge/delegator@3ae7270))

## signing_service

[`sha256:b7ef5f0`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1157634158) → [`sha256:4493534`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1399574922)

What fil-forge/piri-signing-service brings over staging's pin, [`c2ac7db..678c9c1`](fil-forge/piri-signing-service@c2ac7db...678c9c1):

- fil-forge/piri-signing-service#19 ([8472ad9](fil-forge/piri-signing-service@8472ad9))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([53d3758](fil-forge/piri-signing-service@53d3758))
- `Address round 1 review of the observability guidance` ([950ef02](fil-forge/piri-signing-service@950ef02))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([e07d0ee](fil-forge/piri-signing-service@e07d0ee))
- `Rewrap docs/observability.md` ([af8b5c1](fil-forge/piri-signing-service@af8b5c1))
- fil-forge/piri-signing-service#22 ([678c9c1](fil-forge/piri-signing-service@678c9c1))
fil-forge-bot Bot added a commit to fil-forge/infra-central that referenced this pull request Oct 20, 2026
Sets every staging pin in `terraform/envs/staging/apps/terraform.tfvars`
to what `terraform/envs/dev/apps/terraform.tfvars` pins at 4c6e6e1.
Merging this is the promotion: Check and deploy applies `terraform/envs/staging/apps`
on the merge commit, with no further confirmation.

dev passed its smoke test on that commit in https://github.com/fil-forge/infra-central/actions/runs/39444651185.

This pull request is rebuilt each time dev passes its smoke test after a push
to `main`, and closed once staging matches dev. To hold a service back, push
to `bot/promote-staging` by hand: the bot leaves the branch alone while this pull
request is open.

## sprue

[`sha256:79eb33d`](https://github.com/orgs/fil-forge/packages/container/sprue/1339893466) → [`sha256:1c37f2f`](https://github.com/orgs/fil-forge/packages/container/sprue/1416201344)

What fil-forge/sprue brings over staging's pin, [`9b40689..2ee5d6c`](fil-forge/sprue@9b40689...2ee5d6c):

- `Upgrade ucantone and log recovered panics` ([85b7799](fil-forge/sprue@85b7799))
- `Fix shared logger mutation in /provider/add` ([dc00875](fil-forge/sprue@dc00875))
- `Tolerate duplicate blob/add and blob/remove` ([c4a810d](fil-forge/sprue@c4a810d))
- `Stop sharing shard slices in memory upload store` ([4c387b0](fil-forge/sprue@4c387b0))
- `Don't panic on failure receipts without a name` ([32423bf](fil-forge/sprue@32423bf))
- `Insert agent index rows in a stable order` ([d5bc0fb](fil-forge/sprue@d5bc0fb))
- `Raise default postgres pool size to 100` ([b2ad08f](fil-forge/sprue@b2ad08f))
- `Lower default postgres pool size to 20` ([2038899](fil-forge/sprue@2038899))
- `Fail a /blob/add that loses the registration race` ([452bc56](fil-forge/sprue@452bc56))
- `Correct the descendingCIDs test helper comment` ([ea8fd67](fil-forge/sprue@ea8fd67))
- `Use conditional writes for admin provider updates` ([77b1492](fil-forge/sprue@77b1492))
- `Revert "Use conditional writes for admin provider updates"` ([5d0de78](fil-forge/sprue@5d0de78))
- fil-forge/sprue#130 ([0b76576](fil-forge/sprue@0b76576))
- fil-forge/sprue#131 ([8c7925a](fil-forge/sprue@8c7925a))
- fil-forge/sprue#132 ([a7762f6](fil-forge/sprue@a7762f6))
- fil-forge/sprue#133 ([a5d84ee](fil-forge/sprue@a5d84ee))
- fil-forge/sprue#137 ([98d22cc](fil-forge/sprue@98d22cc))
- fil-forge/sprue#136 ([9fb2d96](fil-forge/sprue@9fb2d96))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([dbd600d](fil-forge/sprue@dbd600d))
- `Address round 1 review of the observability guidance` ([4188af6](fil-forge/sprue@4188af6))
- fil-forge/sprue#141 ([046155c](fil-forge/sprue@046155c))
- fil-forge/sprue#142 ([80c2ed6](fil-forge/sprue@80c2ed6))
- fil-forge/sprue#145 ([9e5422e](fil-forge/sprue@9e5422e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([a5ee6c7](fil-forge/sprue@a5ee6c7))
- fil-forge/sprue#143 ([3c62127](fil-forge/sprue@3c62127))
- `Rewrap docs/observability.md` ([5c8387a](fil-forge/sprue@5c8387a))
- fil-forge/sprue#140 ([88ec247](fil-forge/sprue@88ec247))
- `Merge branch 'main' into claude/ucantone-upgrade-concurrency-c1a7d5` ([048df30](fil-forge/sprue@048df30))
- fil-forge/sprue#109 ([bb3458c](fil-forge/sprue@bb3458c))
- `Use conditional writes for admin provider updates` ([34ff3f9](fil-forge/sprue@34ff3f9))
- `Copy replication weights in memory provider store` ([0ca9a6e](fil-forge/sprue@0ca9a6e))
- fil-forge/sprue#110 ([ad4c80f](fil-forge/sprue@ad4c80f))
- fil-forge/sprue#148 ([2ee5d6c](fil-forge/sprue@2ee5d6c))

## hilt

[`sha256:5b6d022`](https://github.com/orgs/fil-forge/packages/container/hilt/1384674731) → [`sha256:d693f58`](https://github.com/orgs/fil-forge/packages/container/hilt/1415385710)

What fil-forge/hilt brings over staging's pin, [`42dd070..358562a`](fil-forge/hilt@42dd070...358562a):

- fil-forge/hilt#97 ([b5d3b3e](fil-forge/hilt@b5d3b3e))
- fil-forge/hilt#98 ([1f0b2c1](fil-forge/hilt@1f0b2c1))
- fil-forge/hilt#99 ([ac4676e](fil-forge/hilt@ac4676e))
- fil-forge/hilt#101 ([9328a49](fil-forge/hilt@9328a49))
- fil-forge/hilt#102 ([cd26388](fil-forge/hilt@cd26388))
- fil-forge/hilt#100 ([358562a](fil-forge/hilt@358562a))

## swarf

[`sha256:c364312`](https://github.com/orgs/fil-forge/packages/container/swarf/1361661163) → [`sha256:4807de8`](https://github.com/orgs/fil-forge/packages/container/swarf/1399568771)

What fil-forge/swarf brings over staging's pin, [`4b2e2ae..974851a`](fil-forge/swarf@4b2e2ae...974851a):

- `Add AGENTS.md with observability guidance` ([88dbb4c](fil-forge/swarf@88dbb4c))
- `Address round 1 review of the observability guidance` ([305021e](fil-forge/swarf@305021e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([7ff3da0](fil-forge/swarf@7ff3da0))
- `Rewrap docs/observability.md` ([72018b4](fil-forge/swarf@72018b4))
- fil-forge/swarf#24 ([974851a](fil-forge/swarf@974851a))

## delegator

[`sha256:30b1757`](https://github.com/orgs/fil-forge/packages/container/delegator/1178963957) → [`sha256:7fb4eb5`](https://github.com/orgs/fil-forge/packages/container/delegator/1399567101)

What fil-forge/delegator brings over staging's pin, [`b5552f1..3ae7270`](fil-forge/delegator@b5552f1...3ae7270):

- fil-forge/delegator#35 ([8bf4153](fil-forge/delegator@8bf4153))
- fil-forge/delegator#36 ([3dfe8c4](fil-forge/delegator@3dfe8c4))
- fil-forge/delegator#37 ([eb81da2](fil-forge/delegator@eb81da2))
- fil-forge/delegator#38 ([314b6d6](fil-forge/delegator@314b6d6))
- fil-forge/delegator#40 ([e588b27](fil-forge/delegator@e588b27))
- fil-forge/delegator#42 ([9cfc334](fil-forge/delegator@9cfc334))
- fil-forge/delegator#43 ([3d3525c](fil-forge/delegator@3d3525c))
- fil-forge/delegator#45 ([5e4090c](fil-forge/delegator@5e4090c))
- fil-forge/delegator#47 ([22d663d](fil-forge/delegator@22d663d))
- fil-forge/delegator#44 ([984ea6e](fil-forge/delegator@984ea6e))
- fil-forge/delegator#46 ([861f107](fil-forge/delegator@861f107))
- fil-forge/delegator#48 ([5a14d35](fil-forge/delegator@5a14d35))
- fil-forge/delegator#49 ([3fe2769](fil-forge/delegator@3fe2769))
- fil-forge/delegator#52 ([1ee1e5b](fil-forge/delegator@1ee1e5b))
- fil-forge/delegator#51 ([d12f29a](fil-forge/delegator@d12f29a))
- fil-forge/delegator#53 ([8d3b969](fil-forge/delegator@8d3b969))
- fil-forge/delegator#55 ([4d6e592](fil-forge/delegator@4d6e592))
- fil-forge/delegator#56 ([4d37521](fil-forge/delegator@4d37521))
- fil-forge/delegator#59 ([26d9d4e](fil-forge/delegator@26d9d4e))
- fil-forge/delegator#60 ([7eeff65](fil-forge/delegator@7eeff65))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([fe04a4c](fil-forge/delegator@fe04a4c))
- `Address round 1 review of the observability guidance` ([b29fad9](fil-forge/delegator@b29fad9))
- fil-forge/delegator#62 ([aaba55d](fil-forge/delegator@aaba55d))
- fil-forge/delegator#63 ([b3bc907](fil-forge/delegator@b3bc907))
- fil-forge/delegator#64 ([716049e](fil-forge/delegator@716049e))
- fil-forge/delegator#66 ([2c2784d](fil-forge/delegator@2c2784d))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([409ff15](fil-forge/delegator@409ff15))
- `Rewrap docs/observability.md` ([77e9d0a](fil-forge/delegator@77e9d0a))
- fil-forge/delegator#61 ([3ae7270](fil-forge/delegator@3ae7270))

## signing_service

[`sha256:b7ef5f0`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1157634158) → [`sha256:4493534`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1399574922)

What fil-forge/piri-signing-service brings over staging's pin, [`c2ac7db..678c9c1`](fil-forge/piri-signing-service@c2ac7db...678c9c1):

- fil-forge/piri-signing-service#19 ([8472ad9](fil-forge/piri-signing-service@8472ad9))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([53d3758](fil-forge/piri-signing-service@53d3758))
- `Address round 1 review of the observability guidance` ([950ef02](fil-forge/piri-signing-service@950ef02))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([e07d0ee](fil-forge/piri-signing-service@e07d0ee))
- `Rewrap docs/observability.md` ([af8b5c1](fil-forge/piri-signing-service@af8b5c1))
- fil-forge/piri-signing-service#22 ([678c9c1](fil-forge/piri-signing-service@678c9c1))
fil-forge-bot Bot added a commit to fil-forge/infra-central that referenced this pull request Oct 20, 2026
Sets every staging pin in `terraform/envs/staging/apps/terraform.tfvars`
to what `terraform/envs/dev/apps/terraform.tfvars` pins at fe0e133.
Merging this is the promotion: Check and deploy applies `terraform/envs/staging/apps`
on the merge commit, with no further confirmation.

dev passed its smoke test on that commit in https://github.com/fil-forge/infra-central/actions/runs/39450487506.

This pull request is rebuilt each time dev passes its smoke test after a push
to `main`, and closed once staging matches dev. To hold a service back, push
to `bot/promote-staging` by hand: the bot leaves the branch alone while this pull
request is open.

## sprue

[`sha256:79eb33d`](https://github.com/orgs/fil-forge/packages/container/sprue/1339893466) → [`sha256:1828e90`](https://github.com/orgs/fil-forge/packages/container/sprue/1416415898)

What fil-forge/sprue brings over staging's pin, [`9b40689..7b94804`](fil-forge/sprue@9b40689...7b94804):

- `Upgrade ucantone and log recovered panics` ([85b7799](fil-forge/sprue@85b7799))
- `Fix shared logger mutation in /provider/add` ([dc00875](fil-forge/sprue@dc00875))
- `Tolerate duplicate blob/add and blob/remove` ([c4a810d](fil-forge/sprue@c4a810d))
- `Stop sharing shard slices in memory upload store` ([4c387b0](fil-forge/sprue@4c387b0))
- `Don't panic on failure receipts without a name` ([32423bf](fil-forge/sprue@32423bf))
- `Insert agent index rows in a stable order` ([d5bc0fb](fil-forge/sprue@d5bc0fb))
- `Raise default postgres pool size to 100` ([b2ad08f](fil-forge/sprue@b2ad08f))
- `Lower default postgres pool size to 20` ([2038899](fil-forge/sprue@2038899))
- `Fail a /blob/add that loses the registration race` ([452bc56](fil-forge/sprue@452bc56))
- `Correct the descendingCIDs test helper comment` ([ea8fd67](fil-forge/sprue@ea8fd67))
- `Use conditional writes for admin provider updates` ([77b1492](fil-forge/sprue@77b1492))
- `Revert "Use conditional writes for admin provider updates"` ([5d0de78](fil-forge/sprue@5d0de78))
- fil-forge/sprue#130 ([0b76576](fil-forge/sprue@0b76576))
- fil-forge/sprue#131 ([8c7925a](fil-forge/sprue@8c7925a))
- fil-forge/sprue#132 ([a7762f6](fil-forge/sprue@a7762f6))
- fil-forge/sprue#133 ([a5d84ee](fil-forge/sprue@a5d84ee))
- fil-forge/sprue#137 ([98d22cc](fil-forge/sprue@98d22cc))
- fil-forge/sprue#136 ([9fb2d96](fil-forge/sprue@9fb2d96))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([dbd600d](fil-forge/sprue@dbd600d))
- `Address round 1 review of the observability guidance` ([4188af6](fil-forge/sprue@4188af6))
- fil-forge/sprue#141 ([046155c](fil-forge/sprue@046155c))
- fil-forge/sprue#142 ([80c2ed6](fil-forge/sprue@80c2ed6))
- fil-forge/sprue#145 ([9e5422e](fil-forge/sprue@9e5422e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([a5ee6c7](fil-forge/sprue@a5ee6c7))
- fil-forge/sprue#143 ([3c62127](fil-forge/sprue@3c62127))
- `Rewrap docs/observability.md` ([5c8387a](fil-forge/sprue@5c8387a))
- fil-forge/sprue#140 ([88ec247](fil-forge/sprue@88ec247))
- `Merge branch 'main' into claude/ucantone-upgrade-concurrency-c1a7d5` ([048df30](fil-forge/sprue@048df30))
- fil-forge/sprue#109 ([bb3458c](fil-forge/sprue@bb3458c))
- `Use conditional writes for admin provider updates` ([34ff3f9](fil-forge/sprue@34ff3f9))
- `Copy replication weights in memory provider store` ([0ca9a6e](fil-forge/sprue@0ca9a6e))
- fil-forge/sprue#110 ([ad4c80f](fil-forge/sprue@ad4c80f))
- fil-forge/sprue#148 ([2ee5d6c](fil-forge/sprue@2ee5d6c))
- fil-forge/sprue#149 ([7b94804](fil-forge/sprue@7b94804))

## hilt

[`sha256:5b6d022`](https://github.com/orgs/fil-forge/packages/container/hilt/1384674731) → [`sha256:d693f58`](https://github.com/orgs/fil-forge/packages/container/hilt/1415385710)

What fil-forge/hilt brings over staging's pin, [`42dd070..358562a`](fil-forge/hilt@42dd070...358562a):

- fil-forge/hilt#97 ([b5d3b3e](fil-forge/hilt@b5d3b3e))
- fil-forge/hilt#98 ([1f0b2c1](fil-forge/hilt@1f0b2c1))
- fil-forge/hilt#99 ([ac4676e](fil-forge/hilt@ac4676e))
- fil-forge/hilt#101 ([9328a49](fil-forge/hilt@9328a49))
- fil-forge/hilt#102 ([cd26388](fil-forge/hilt@cd26388))
- fil-forge/hilt#100 ([358562a](fil-forge/hilt@358562a))

## swarf

[`sha256:c364312`](https://github.com/orgs/fil-forge/packages/container/swarf/1361661163) → [`sha256:4807de8`](https://github.com/orgs/fil-forge/packages/container/swarf/1399568771)

What fil-forge/swarf brings over staging's pin, [`4b2e2ae..974851a`](fil-forge/swarf@4b2e2ae...974851a):

- `Add AGENTS.md with observability guidance` ([88dbb4c](fil-forge/swarf@88dbb4c))
- `Address round 1 review of the observability guidance` ([305021e](fil-forge/swarf@305021e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([7ff3da0](fil-forge/swarf@7ff3da0))
- `Rewrap docs/observability.md` ([72018b4](fil-forge/swarf@72018b4))
- fil-forge/swarf#24 ([974851a](fil-forge/swarf@974851a))

## delegator

[`sha256:30b1757`](https://github.com/orgs/fil-forge/packages/container/delegator/1178963957) → [`sha256:7fb4eb5`](https://github.com/orgs/fil-forge/packages/container/delegator/1399567101)

What fil-forge/delegator brings over staging's pin, [`b5552f1..3ae7270`](fil-forge/delegator@b5552f1...3ae7270):

- fil-forge/delegator#35 ([8bf4153](fil-forge/delegator@8bf4153))
- fil-forge/delegator#36 ([3dfe8c4](fil-forge/delegator@3dfe8c4))
- fil-forge/delegator#37 ([eb81da2](fil-forge/delegator@eb81da2))
- fil-forge/delegator#38 ([314b6d6](fil-forge/delegator@314b6d6))
- fil-forge/delegator#40 ([e588b27](fil-forge/delegator@e588b27))
- fil-forge/delegator#42 ([9cfc334](fil-forge/delegator@9cfc334))
- fil-forge/delegator#43 ([3d3525c](fil-forge/delegator@3d3525c))
- fil-forge/delegator#45 ([5e4090c](fil-forge/delegator@5e4090c))
- fil-forge/delegator#47 ([22d663d](fil-forge/delegator@22d663d))
- fil-forge/delegator#44 ([984ea6e](fil-forge/delegator@984ea6e))
- fil-forge/delegator#46 ([861f107](fil-forge/delegator@861f107))
- fil-forge/delegator#48 ([5a14d35](fil-forge/delegator@5a14d35))
- fil-forge/delegator#49 ([3fe2769](fil-forge/delegator@3fe2769))
- fil-forge/delegator#52 ([1ee1e5b](fil-forge/delegator@1ee1e5b))
- fil-forge/delegator#51 ([d12f29a](fil-forge/delegator@d12f29a))
- fil-forge/delegator#53 ([8d3b969](fil-forge/delegator@8d3b969))
- fil-forge/delegator#55 ([4d6e592](fil-forge/delegator@4d6e592))
- fil-forge/delegator#56 ([4d37521](fil-forge/delegator@4d37521))
- fil-forge/delegator#59 ([26d9d4e](fil-forge/delegator@26d9d4e))
- fil-forge/delegator#60 ([7eeff65](fil-forge/delegator@7eeff65))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([fe04a4c](fil-forge/delegator@fe04a4c))
- `Address round 1 review of the observability guidance` ([b29fad9](fil-forge/delegator@b29fad9))
- fil-forge/delegator#62 ([aaba55d](fil-forge/delegator@aaba55d))
- fil-forge/delegator#63 ([b3bc907](fil-forge/delegator@b3bc907))
- fil-forge/delegator#64 ([716049e](fil-forge/delegator@716049e))
- fil-forge/delegator#66 ([2c2784d](fil-forge/delegator@2c2784d))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([409ff15](fil-forge/delegator@409ff15))
- `Rewrap docs/observability.md` ([77e9d0a](fil-forge/delegator@77e9d0a))
- fil-forge/delegator#61 ([3ae7270](fil-forge/delegator@3ae7270))

## signing_service

[`sha256:b7ef5f0`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1157634158) → [`sha256:4493534`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1399574922)

What fil-forge/piri-signing-service brings over staging's pin, [`c2ac7db..678c9c1`](fil-forge/piri-signing-service@c2ac7db...678c9c1):

- fil-forge/piri-signing-service#19 ([8472ad9](fil-forge/piri-signing-service@8472ad9))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([53d3758](fil-forge/piri-signing-service@53d3758))
- `Address round 1 review of the observability guidance` ([950ef02](fil-forge/piri-signing-service@950ef02))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([e07d0ee](fil-forge/piri-signing-service@e07d0ee))
- `Rewrap docs/observability.md` ([af8b5c1](fil-forge/piri-signing-service@af8b5c1))
- fil-forge/piri-signing-service#22 ([678c9c1](fil-forge/piri-signing-service@678c9c1))
fil-forge-bot Bot added a commit to fil-forge/infra-central that referenced this pull request Oct 20, 2026
Sets every staging pin in `terraform/envs/staging/apps/terraform.tfvars`
to what `terraform/envs/dev/apps/terraform.tfvars` pins at c96a817.
Merging this is the promotion: Check and deploy applies `terraform/envs/staging/apps`
on the merge commit, with no further confirmation.

dev passed its smoke test on that commit in https://github.com/fil-forge/infra-central/actions/runs/39491247723.

This pull request is rebuilt each time dev passes its smoke test after a push
to `main`, and closed once staging matches dev. To hold a service back, push
to `bot/promote-staging` by hand: the bot leaves the branch alone while this pull
request is open.

## sprue

[`sha256:79eb33d`](https://github.com/orgs/fil-forge/packages/container/sprue/1339893466) → [`sha256:1828e90`](https://github.com/orgs/fil-forge/packages/container/sprue/1416415898)

What fil-forge/sprue brings over staging's pin, [`9b40689..7b94804`](fil-forge/sprue@9b40689...7b94804):

- `Upgrade ucantone and log recovered panics` ([85b7799](fil-forge/sprue@85b7799))
- `Fix shared logger mutation in /provider/add` ([dc00875](fil-forge/sprue@dc00875))
- `Tolerate duplicate blob/add and blob/remove` ([c4a810d](fil-forge/sprue@c4a810d))
- `Stop sharing shard slices in memory upload store` ([4c387b0](fil-forge/sprue@4c387b0))
- `Don't panic on failure receipts without a name` ([32423bf](fil-forge/sprue@32423bf))
- `Insert agent index rows in a stable order` ([d5bc0fb](fil-forge/sprue@d5bc0fb))
- `Raise default postgres pool size to 100` ([b2ad08f](fil-forge/sprue@b2ad08f))
- `Lower default postgres pool size to 20` ([2038899](fil-forge/sprue@2038899))
- `Fail a /blob/add that loses the registration race` ([452bc56](fil-forge/sprue@452bc56))
- `Correct the descendingCIDs test helper comment` ([ea8fd67](fil-forge/sprue@ea8fd67))
- `Use conditional writes for admin provider updates` ([77b1492](fil-forge/sprue@77b1492))
- `Revert "Use conditional writes for admin provider updates"` ([5d0de78](fil-forge/sprue@5d0de78))
- fil-forge/sprue#130 ([0b76576](fil-forge/sprue@0b76576))
- fil-forge/sprue#131 ([8c7925a](fil-forge/sprue@8c7925a))
- fil-forge/sprue#132 ([a7762f6](fil-forge/sprue@a7762f6))
- fil-forge/sprue#133 ([a5d84ee](fil-forge/sprue@a5d84ee))
- fil-forge/sprue#137 ([98d22cc](fil-forge/sprue@98d22cc))
- fil-forge/sprue#136 ([9fb2d96](fil-forge/sprue@9fb2d96))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([dbd600d](fil-forge/sprue@dbd600d))
- `Address round 1 review of the observability guidance` ([4188af6](fil-forge/sprue@4188af6))
- fil-forge/sprue#141 ([046155c](fil-forge/sprue@046155c))
- fil-forge/sprue#142 ([80c2ed6](fil-forge/sprue@80c2ed6))
- fil-forge/sprue#145 ([9e5422e](fil-forge/sprue@9e5422e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([a5ee6c7](fil-forge/sprue@a5ee6c7))
- fil-forge/sprue#143 ([3c62127](fil-forge/sprue@3c62127))
- `Rewrap docs/observability.md` ([5c8387a](fil-forge/sprue@5c8387a))
- fil-forge/sprue#140 ([88ec247](fil-forge/sprue@88ec247))
- `Merge branch 'main' into claude/ucantone-upgrade-concurrency-c1a7d5` ([048df30](fil-forge/sprue@048df30))
- fil-forge/sprue#109 ([bb3458c](fil-forge/sprue@bb3458c))
- `Use conditional writes for admin provider updates` ([34ff3f9](fil-forge/sprue@34ff3f9))
- `Copy replication weights in memory provider store` ([0ca9a6e](fil-forge/sprue@0ca9a6e))
- fil-forge/sprue#110 ([ad4c80f](fil-forge/sprue@ad4c80f))
- fil-forge/sprue#148 ([2ee5d6c](fil-forge/sprue@2ee5d6c))
- fil-forge/sprue#149 ([7b94804](fil-forge/sprue@7b94804))

## hilt

[`sha256:5b6d022`](https://github.com/orgs/fil-forge/packages/container/hilt/1384674731) → [`sha256:d693f58`](https://github.com/orgs/fil-forge/packages/container/hilt/1415385710)

What fil-forge/hilt brings over staging's pin, [`42dd070..358562a`](fil-forge/hilt@42dd070...358562a):

- fil-forge/hilt#97 ([b5d3b3e](fil-forge/hilt@b5d3b3e))
- fil-forge/hilt#98 ([1f0b2c1](fil-forge/hilt@1f0b2c1))
- fil-forge/hilt#99 ([ac4676e](fil-forge/hilt@ac4676e))
- fil-forge/hilt#101 ([9328a49](fil-forge/hilt@9328a49))
- fil-forge/hilt#102 ([cd26388](fil-forge/hilt@cd26388))
- fil-forge/hilt#100 ([358562a](fil-forge/hilt@358562a))

## swarf

[`sha256:c364312`](https://github.com/orgs/fil-forge/packages/container/swarf/1361661163) → [`sha256:4807de8`](https://github.com/orgs/fil-forge/packages/container/swarf/1399568771)

What fil-forge/swarf brings over staging's pin, [`4b2e2ae..974851a`](fil-forge/swarf@4b2e2ae...974851a):

- `Add AGENTS.md with observability guidance` ([88dbb4c](fil-forge/swarf@88dbb4c))
- `Address round 1 review of the observability guidance` ([305021e](fil-forge/swarf@305021e))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([7ff3da0](fil-forge/swarf@7ff3da0))
- `Rewrap docs/observability.md` ([72018b4](fil-forge/swarf@72018b4))
- fil-forge/swarf#24 ([974851a](fil-forge/swarf@974851a))

## delegator

[`sha256:30b1757`](https://github.com/orgs/fil-forge/packages/container/delegator/1178963957) → [`sha256:7fb4eb5`](https://github.com/orgs/fil-forge/packages/container/delegator/1399567101)

What fil-forge/delegator brings over staging's pin, [`b5552f1..3ae7270`](fil-forge/delegator@b5552f1...3ae7270):

- fil-forge/delegator#35 ([8bf4153](fil-forge/delegator@8bf4153))
- fil-forge/delegator#36 ([3dfe8c4](fil-forge/delegator@3dfe8c4))
- fil-forge/delegator#37 ([eb81da2](fil-forge/delegator@eb81da2))
- fil-forge/delegator#38 ([314b6d6](fil-forge/delegator@314b6d6))
- fil-forge/delegator#40 ([e588b27](fil-forge/delegator@e588b27))
- fil-forge/delegator#42 ([9cfc334](fil-forge/delegator@9cfc334))
- fil-forge/delegator#43 ([3d3525c](fil-forge/delegator@3d3525c))
- fil-forge/delegator#45 ([5e4090c](fil-forge/delegator@5e4090c))
- fil-forge/delegator#47 ([22d663d](fil-forge/delegator@22d663d))
- fil-forge/delegator#44 ([984ea6e](fil-forge/delegator@984ea6e))
- fil-forge/delegator#46 ([861f107](fil-forge/delegator@861f107))
- fil-forge/delegator#48 ([5a14d35](fil-forge/delegator@5a14d35))
- fil-forge/delegator#49 ([3fe2769](fil-forge/delegator@3fe2769))
- fil-forge/delegator#52 ([1ee1e5b](fil-forge/delegator@1ee1e5b))
- fil-forge/delegator#51 ([d12f29a](fil-forge/delegator@d12f29a))
- fil-forge/delegator#53 ([8d3b969](fil-forge/delegator@8d3b969))
- fil-forge/delegator#55 ([4d6e592](fil-forge/delegator@4d6e592))
- fil-forge/delegator#56 ([4d37521](fil-forge/delegator@4d37521))
- fil-forge/delegator#59 ([26d9d4e](fil-forge/delegator@26d9d4e))
- fil-forge/delegator#60 ([7eeff65](fil-forge/delegator@7eeff65))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([fe04a4c](fil-forge/delegator@fe04a4c))
- `Address round 1 review of the observability guidance` ([b29fad9](fil-forge/delegator@b29fad9))
- fil-forge/delegator#62 ([aaba55d](fil-forge/delegator@aaba55d))
- fil-forge/delegator#63 ([b3bc907](fil-forge/delegator@b3bc907))
- fil-forge/delegator#64 ([716049e](fil-forge/delegator@716049e))
- fil-forge/delegator#66 ([2c2784d](fil-forge/delegator@2c2784d))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([409ff15](fil-forge/delegator@409ff15))
- `Rewrap docs/observability.md` ([77e9d0a](fil-forge/delegator@77e9d0a))
- fil-forge/delegator#61 ([3ae7270](fil-forge/delegator@3ae7270))

## signing_service

[`sha256:b7ef5f0`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1157634158) → [`sha256:4493534`](https://github.com/orgs/fil-forge/packages/container/piri-signing-service/1399574922)

What fil-forge/piri-signing-service brings over staging's pin, [`c2ac7db..678c9c1`](fil-forge/piri-signing-service@c2ac7db...678c9c1):

- fil-forge/piri-signing-service#19 ([8472ad9](fil-forge/piri-signing-service@8472ad9))
- `AGENTS.md: add telemetry, alerts and dashboards to the definition of done` ([53d3758](fil-forge/piri-signing-service@53d3758))
- `Address round 1 review of the observability guidance` ([950ef02](fil-forge/piri-signing-service@950ef02))
- `Keep the always-loaded guidance short, and move the how-to to docs` ([e07d0ee](fil-forge/piri-signing-service@e07d0ee))
- `Rewrap docs/observability.md` ([af8b5c1](fil-forge/piri-signing-service@af8b5c1))
- fil-forge/piri-signing-service#22 ([678c9c1](fil-forge/piri-signing-service@678c9c1))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants