Repository navigation
fix(config): require the upload service settings - #100
Conversation
upload.service_id, upload.service_url and upload.product_id defaulted to prod's Sprue and product DID. A stage that forgot to set them would provision its tenants and buckets on prod Sprue, the same failure that the revocation defaults caused for tenant deletes. Drop the three defaults and make NewUploadClient refuse empty values, so `hilt serve` exits at startup naming the missing env var and flag. The product DID was optional in the constructor, but tenant provisioning always passes it to /customer/add, so serve cannot work without it. The `hilt client` commands never build the upload client. Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Miroslav Bajtoš <oss@bajtos.net>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
🟢 Approval recommended
The change is a small, well-tested, consistently-applied config hardening with no leftover default references and no impact on the non-serve code paths.
0 open findings
What changed in this PR
This PR removes the production Sprue/product DID defaults for the upload service settings (upload.service_id, upload.service_url, upload.product_id) and makes all three required, so a misconfigured stage fails fast at hilt serve startup instead of silently registering tenants and provisioning buckets against prod's Sprue. It mirrors the pattern established for the revocation settings in #99, and additionally promotes upload.product_id from optional to required since tenant provisioning always passes it to Sprue's /customer/add.
Changes:
- Remove the three
upload.*SetDefaultcalls inpkg/configand the corresponding--upload-*flag defaults incmd/main.go. NewUploadClientnow rejects an emptyServiceID,ServiceURL, orProductIDwith an actionable startup error, andproduct_idis always parsed (no longer conditionally).- Add tests for missing/invalid fields, empty-config fx construction failure, and no-default loading; update README and AGENTS.md to mark the three settings required.
| File | Description |
|---|---|
pkg/fx/upload.go |
Adds required-field checks for ServiceID/ServiceURL/ProductID and makes product_id parsing unconditional. |
pkg/config/config.go |
Removes the three upload.* defaults and documents them as required. |
cmd/main.go |
Clears the --upload-* flag defaults and marks them required in help text. |
pkg/fx/upload_test.go |
Adds missing-field, invalid-product-DID, and empty-config fx-construction test cases. |
pkg/fx/rpc_test.go |
Supplies ProductID so the RPC app still constructs under the new requirement. |
pkg/config/config_test.go |
Verifies the upload config stays empty when nothing sets it. |
README.md |
Marks the three upload settings as required with a startup-failure note. |
AGENTS.md |
Updates the "Run locally" command to include the now-required upload flags. |
🧠 Review effort: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Miroslav Bajtoš <oss@bajtos.net>
The upload and revocation settings have no default, so the README tables show the production DIDs and URLs under an "Example" column. Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Miroslav Bajtoš <oss@bajtos.net>
Published from fil-forge/hilt#100 - Digest: `sha256:d693f583b28c9473ec34acac94b01daf65cfe6d77832c5aae5c4f060c598cd4a` - Commit: fil-forge/hilt@358562a - Publish run: https://github.com/fil-forge/hilt/actions/runs/39423586246 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>
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))
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))
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))
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))
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_urlandupload.product_idinstead 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.
SetDefaultcalls inpkg/configand the--upload-*flag defaults incmd/main.go.NewUploadClientrejects an empty service DID, URL or product DID, sohilt serveexits during fx construction with, for example,upload.product_id is required: set HILT_UPLOAD_PRODUCT_ID or --upload-product-id.upload.product_idwas optional in the constructor. Tenant provisioning always passes it to Sprue's/customer/add, so aservewithout it cannot create tenants, and it is now required too.upload.proofsstays optional.hilt clientcommands load config but never build the upload client, so they keep working without these settings.config.Loadleaves the upload config empty when nothing sets it;NewUploadClienterrors on each missing field and on an invalid product DID; an fx app with the upload client and empty config fails to construct.Safe to merge once reviewed. infra-central's shared
modules/apps, used by dev, staging and prod, has set all threeHILT_UPLOAD_*variables since 2026-08-19. Smelt'ssystems/hilt/compose.ymlsets them for the integration stack.This PR and #99 edit neighbouring lines in
pkg/config/config.goSetDefaultsand the same "Run locally" line in AGENTS.md. Whichever merges second needs a small conflict resolution.