Skip to content

feat(iam): forward a DeleteObjects body to Hilt and decide the fast path on it - #299

Merged
alanshaw merged 18 commits into
mainfrom
ash/feat/delete-objects-body
Oct 22, 2026
Merged

alanshaw merged 18 commits into
mainfrom
ash/feat/delete-objects-body

Conversation

@alanshaw

@alanshaw alanshaw commented Oct 21, 2026 •

Copy link
Copy Markdown
Member

Companion to fil-forge/hilt#106 and fil-forge/libforge#87, both merged; pins Hilt and libforge main.

Hilt now decides a DeleteObjects on its body: an entry naming a version needs s3:DeleteObjectVersion beside s3:DeleteObject. Until now Ingot removed the named versions with no such check, so a key holding the delete permission alone could remove any version it could name.

What changes

The request forwarded to Hilt carries its body only for the operations Hilt's classifier names as deciding on one, which today is DeleteObjects. Every other request goes without, so PutObject and UploadPart never have their body read here. Hilt binds the body to the signature before reading it, and the fast path decides on the same classification: a version entry is refused locally when the key's cached set lacks the version permission, and a body the signature does not bind is left to Hilt, which refuses it as InvalidBody. That name joins UnsignedHeader in the error mapping as AccessDenied.

Behaviour changes to know about

  • A DeleteObjects naming a version by a key or principal without s3:DeleteObjectVersion is refused as a whole, where S3 would refuse only those entries. Plain batches are unaffected.
  • A DeleteObjects whose body is not covered by the signature, as the payload hash or a signed checksum header, is refused. The SDKs and CLI sign the payload for this operation.

The IAM itest scenario for this lives in Hilt and was not run.

🤖 Generated with Claude Code

alanshaw and others added 5 commits October 21, 2026 18:34
…ath on it

Hilt now reads a DeleteObjects body and needs s3:DeleteObjectVersion
when an entry names a version. The body travels only for the operations
Hilt's classifier names, so a streaming write's body is never read
here; the fast path checks the version permission from the same
classification and leaves a body the signature does not bind to Hilt,
which refuses it as UnboundBody. Pins libforge to fil-forge/libforge#87
and hilt to fil-forge/hilt#106.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…/hilt#106

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

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.

🟡 Changes recommended

Unbounded pre-authentication body buffering and forgeable checksum-based body binding leave unresolved security risks.

2 open issues
What changed in this PR

This PR adds body-aware DeleteObjects authorization to Ingot’s Hilt integration, so batches naming versions require version-delete permission.

Changes:

  • Forward bodies only for operations Hilt classifies as body-dependent, and map UnboundBody to AccessDenied.
  • Add tests for cached permissions and tampered bodies.
  • Update Hilt/libforge dependencies and authorization documentation.
File Description
iam/​service.go Forward authorization-relevant bodies and map unbound-body errors.
iam/​service_internal_test.go Test version-delete permissions, body binding, and error mapping.
go.sum Update dependency checksums.
go.mod Pin Hilt and libforge revisions supporting body-aware authorization.
docs/​diagrams.md Document body-dependent authorization and fallback behavior.

Review effort: Balanced

Comment thread go.mod Outdated
Comment thread iam/service.go Outdated
alanshaw and others added 8 commits October 22, 2026 10:50
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The body was drained from the stream and cloned before anything about
the request was verified, so an unauthenticated POST ?delete could cost
an unbounded allocation. It is now read only to one byte past Hilt's
limit, refused as EntityTooLarge beyond it, and set back on the request
within it so the handler reads the same bytes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…hilt#106

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

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.

🟡 Changes recommended

The mixed DeleteObjects integration expectations must be updated, and end-to-end body forwarding and restoration coverage should be added.

2 open issues
2 resolved since last review

Review effort: Lite

Comment thread iam/service.go
Comment thread iam/service.go
alanshaw and others added 2 commits October 22, 2026 11:42
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A streamed DeleteObjects body reaches the authorizer exactly and is
left for the handler, another operation's body is neither forwarded nor
consumed, and an oversized body is refused before the authorizer is
asked. The route-permission scenario expects a mixed batch naming a
version to be refused as a whole, as Hilt now decides it, with nothing
deleted, and the plain batch to go through.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

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.

🟡 Changes recommended

The integration subtest should prime or assert the cached fast path so regressions in the local body and permission check cannot pass.

1 open issue
2 resolved since last review

Review effort: Lite

Comment thread itest/forge_route_perms_test.go
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

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

An unresolved documentation-contract inconsistency remains, and the review assessments are mixed.

No open issues 🎉

1 resolved since last review

Review effort: Lite

@alanshaw
alanshaw merged commit 9881bef into main Oct 22, 2026
22 checks passed
@alanshaw
alanshaw deleted the ash/feat/delete-objects-body branch October 22, 2026 11:26
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 22, 2026
Published from fil-forge/ingot#299

- Digest: `sha256:fce5261976ed9bddc9b9b3dbe26430da6178fc04e2f86c0b51af568549628ae0`
- Commit: fil-forge/ingot@9881bef
- Publish run: https://github.com/fil-forge/ingot/actions/runs/39770653477

Merging rewrites [`nodes/dev/apps/versions.env`](https://github.com/fil-forge/infra-nodes/blob/main/nodes/dev/apps/versions.env) and queues the image. The node picks
it up on its next reconcile pass, waits for a safe proving window and then
restarts the service, so the deploy happens well after this merges.

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-nodes that referenced this pull request Oct 22, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:00f0fb7`](https://github.com/orgs/fil-forge/packages/container/piri/1421174034)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..3cd4f27`](fil-forge/piri@c2dc6b0...3cd4f27):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:fce5261`](https://github.com/orgs/fil-forge/packages/container/ingot/1427940427)

What fil-forge/ingot brings over staging's pin, [`6331454..9881bef`](fil-forge/ingot@6331454...9881bef):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 22, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:00f0fb7`](https://github.com/orgs/fil-forge/packages/container/piri/1421174034)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..3cd4f27`](fil-forge/piri@c2dc6b0...3cd4f27):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:c4f38fd`](https://github.com/orgs/fil-forge/packages/container/ingot/1428268604)

What fil-forge/ingot brings over staging's pin, [`6331454..bb88ee0`](fil-forge/ingot@6331454...bb88ee0):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
- fil-forge/ingot#279 ([bb88ee0](fil-forge/ingot@bb88ee0))
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 22, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:00f0fb7`](https://github.com/orgs/fil-forge/packages/container/piri/1421174034)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..3cd4f27`](fil-forge/piri@c2dc6b0...3cd4f27):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:c4f38fd`](https://github.com/orgs/fil-forge/packages/container/ingot/1428268604)

What fil-forge/ingot brings over staging's pin, [`6331454..bb88ee0`](fil-forge/ingot@6331454...bb88ee0):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
- fil-forge/ingot#279 ([bb88ee0](fil-forge/ingot@bb88ee0))
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 22, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:00f0fb7`](https://github.com/orgs/fil-forge/packages/container/piri/1421174034)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..3cd4f27`](fil-forge/piri@c2dc6b0...3cd4f27):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:eea47a7`](https://github.com/orgs/fil-forge/packages/container/ingot/1428859054)

What fil-forge/ingot brings over staging's pin, [`6331454..5596df7`](fil-forge/ingot@6331454...5596df7):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
- fil-forge/ingot#279 ([bb88ee0](fil-forge/ingot@bb88ee0))
- fil-forge/ingot#278 ([0d16d90](fil-forge/ingot@0d16d90))
- fil-forge/ingot#280 ([5596df7](fil-forge/ingot@5596df7))
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 22, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:00f0fb7`](https://github.com/orgs/fil-forge/packages/container/piri/1421174034)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..3cd4f27`](fil-forge/piri@c2dc6b0...3cd4f27):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:7a6cd2d`](https://github.com/orgs/fil-forge/packages/container/ingot/1429078201)

What fil-forge/ingot brings over staging's pin, [`6331454..7be5b2f`](fil-forge/ingot@6331454...7be5b2f):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
- fil-forge/ingot#279 ([bb88ee0](fil-forge/ingot@bb88ee0))
- fil-forge/ingot#278 ([0d16d90](fil-forge/ingot@0d16d90))
- fil-forge/ingot#280 ([5596df7](fil-forge/ingot@5596df7))
- fil-forge/ingot#273 ([7be5b2f](fil-forge/ingot@7be5b2f))
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 22, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:00f0fb7`](https://github.com/orgs/fil-forge/packages/container/piri/1421174034)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..3cd4f27`](fil-forge/piri@c2dc6b0...3cd4f27):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:7a6cd2d`](https://github.com/orgs/fil-forge/packages/container/ingot/1429078201)

What fil-forge/ingot brings over staging's pin, [`6331454..7be5b2f`](fil-forge/ingot@6331454...7be5b2f):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
- fil-forge/ingot#279 ([bb88ee0](fil-forge/ingot@bb88ee0))
- fil-forge/ingot#278 ([0d16d90](fil-forge/ingot@0d16d90))
- fil-forge/ingot#280 ([5596df7](fil-forge/ingot@5596df7))
- fil-forge/ingot#273 ([7be5b2f](fil-forge/ingot@7be5b2f))
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 22, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:f493390`](https://github.com/orgs/fil-forge/packages/container/piri/1429852644)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..3ef715b`](fil-forge/piri@c2dc6b0...3ef715b):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))
- fil-forge/piri#192 ([9b3191c](fil-forge/piri@9b3191c))
- fil-forge/piri#121 ([0fbd8da](fil-forge/piri@0fbd8da))
- fil-forge/piri#194 ([3ef715b](fil-forge/piri@3ef715b))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:7a6cd2d`](https://github.com/orgs/fil-forge/packages/container/ingot/1429078201)

What fil-forge/ingot brings over staging's pin, [`6331454..7be5b2f`](fil-forge/ingot@6331454...7be5b2f):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
- fil-forge/ingot#279 ([bb88ee0](fil-forge/ingot@bb88ee0))
- fil-forge/ingot#278 ([0d16d90](fil-forge/ingot@0d16d90))
- fil-forge/ingot#280 ([5596df7](fil-forge/ingot@5596df7))
- fil-forge/ingot#273 ([7be5b2f](fil-forge/ingot@7be5b2f))
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 22, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:f493390`](https://github.com/orgs/fil-forge/packages/container/piri/1429852644)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..3ef715b`](fil-forge/piri@c2dc6b0...3ef715b):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))
- fil-forge/piri#192 ([9b3191c](fil-forge/piri@9b3191c))
- fil-forge/piri#121 ([0fbd8da](fil-forge/piri@0fbd8da))
- fil-forge/piri#194 ([3ef715b](fil-forge/piri@3ef715b))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:5ca3bc4`](https://github.com/orgs/fil-forge/packages/container/ingot/1430706317)

What fil-forge/ingot brings over staging's pin, [`6331454..c1f3eaa`](fil-forge/ingot@6331454...c1f3eaa):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
- fil-forge/ingot#279 ([bb88ee0](fil-forge/ingot@bb88ee0))
- fil-forge/ingot#278 ([0d16d90](fil-forge/ingot@0d16d90))
- fil-forge/ingot#280 ([5596df7](fil-forge/ingot@5596df7))
- fil-forge/ingot#273 ([7be5b2f](fil-forge/ingot@7be5b2f))
- fil-forge/ingot#276 ([957e190](fil-forge/ingot@957e190))
- fil-forge/ingot#282 ([ebbc066](fil-forge/ingot@ebbc066))
- fil-forge/ingot#275 ([425d2cb](fil-forge/ingot@425d2cb))
- fil-forge/ingot#281 ([b36651a](fil-forge/ingot@b36651a))
- fil-forge/ingot#301 ([c1f3eaa](fil-forge/ingot@c1f3eaa))
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 22, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:f493390`](https://github.com/orgs/fil-forge/packages/container/piri/1429852644)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..3ef715b`](fil-forge/piri@c2dc6b0...3ef715b):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))
- fil-forge/piri#192 ([9b3191c](fil-forge/piri@9b3191c))
- fil-forge/piri#121 ([0fbd8da](fil-forge/piri@0fbd8da))
- fil-forge/piri#194 ([3ef715b](fil-forge/piri@3ef715b))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:8a16655`](https://github.com/orgs/fil-forge/packages/container/ingot/1431251960)

What fil-forge/ingot brings over staging's pin, [`6331454..4585b83`](fil-forge/ingot@6331454...4585b83):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
- fil-forge/ingot#279 ([bb88ee0](fil-forge/ingot@bb88ee0))
- fil-forge/ingot#278 ([0d16d90](fil-forge/ingot@0d16d90))
- fil-forge/ingot#280 ([5596df7](fil-forge/ingot@5596df7))
- fil-forge/ingot#273 ([7be5b2f](fil-forge/ingot@7be5b2f))
- fil-forge/ingot#276 ([957e190](fil-forge/ingot@957e190))
- fil-forge/ingot#282 ([ebbc066](fil-forge/ingot@ebbc066))
- fil-forge/ingot#275 ([425d2cb](fil-forge/ingot@425d2cb))
- fil-forge/ingot#281 ([b36651a](fil-forge/ingot@b36651a))
- fil-forge/ingot#301 ([c1f3eaa](fil-forge/ingot@c1f3eaa))
- fil-forge/ingot#302 ([4585b83](fil-forge/ingot@4585b83))
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 22, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:07f74c5`](https://github.com/orgs/fil-forge/packages/container/piri/1431242148)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..e8d7fd9`](fil-forge/piri@c2dc6b0...e8d7fd9):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))
- fil-forge/piri#192 ([9b3191c](fil-forge/piri@9b3191c))
- fil-forge/piri#121 ([0fbd8da](fil-forge/piri@0fbd8da))
- fil-forge/piri#194 ([3ef715b](fil-forge/piri@3ef715b))
- fil-forge/piri#196 ([1f79668](fil-forge/piri@1f79668))
- fil-forge/piri#197 ([476f1a2](fil-forge/piri@476f1a2))
- fil-forge/piri#198 ([1df9059](fil-forge/piri@1df9059))
- fil-forge/piri#193 ([e8d7fd9](fil-forge/piri@e8d7fd9))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:8a16655`](https://github.com/orgs/fil-forge/packages/container/ingot/1431251960)

What fil-forge/ingot brings over staging's pin, [`6331454..4585b83`](fil-forge/ingot@6331454...4585b83):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
- fil-forge/ingot#279 ([bb88ee0](fil-forge/ingot@bb88ee0))
- fil-forge/ingot#278 ([0d16d90](fil-forge/ingot@0d16d90))
- fil-forge/ingot#280 ([5596df7](fil-forge/ingot@5596df7))
- fil-forge/ingot#273 ([7be5b2f](fil-forge/ingot@7be5b2f))
- fil-forge/ingot#276 ([957e190](fil-forge/ingot@957e190))
- fil-forge/ingot#282 ([ebbc066](fil-forge/ingot@ebbc066))
- fil-forge/ingot#275 ([425d2cb](fil-forge/ingot@425d2cb))
- fil-forge/ingot#281 ([b36651a](fil-forge/ingot@b36651a))
- fil-forge/ingot#301 ([c1f3eaa](fil-forge/ingot@c1f3eaa))
- fil-forge/ingot#302 ([4585b83](fil-forge/ingot@4585b83))
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 23, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:07f74c5`](https://github.com/orgs/fil-forge/packages/container/piri/1431242148)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..e8d7fd9`](fil-forge/piri@c2dc6b0...e8d7fd9):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))
- fil-forge/piri#192 ([9b3191c](fil-forge/piri@9b3191c))
- fil-forge/piri#121 ([0fbd8da](fil-forge/piri@0fbd8da))
- fil-forge/piri#194 ([3ef715b](fil-forge/piri@3ef715b))
- fil-forge/piri#196 ([1f79668](fil-forge/piri@1f79668))
- fil-forge/piri#197 ([476f1a2](fil-forge/piri@476f1a2))
- fil-forge/piri#198 ([1df9059](fil-forge/piri@1df9059))
- fil-forge/piri#193 ([e8d7fd9](fil-forge/piri@e8d7fd9))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:8a16655`](https://github.com/orgs/fil-forge/packages/container/ingot/1431251960)

What fil-forge/ingot brings over staging's pin, [`6331454..4585b83`](fil-forge/ingot@6331454...4585b83):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
- fil-forge/ingot#279 ([bb88ee0](fil-forge/ingot@bb88ee0))
- fil-forge/ingot#278 ([0d16d90](fil-forge/ingot@0d16d90))
- fil-forge/ingot#280 ([5596df7](fil-forge/ingot@5596df7))
- fil-forge/ingot#273 ([7be5b2f](fil-forge/ingot@7be5b2f))
- fil-forge/ingot#276 ([957e190](fil-forge/ingot@957e190))
- fil-forge/ingot#282 ([ebbc066](fil-forge/ingot@ebbc066))
- fil-forge/ingot#275 ([425d2cb](fil-forge/ingot@425d2cb))
- fil-forge/ingot#281 ([b36651a](fil-forge/ingot@b36651a))
- fil-forge/ingot#301 ([c1f3eaa](fil-forge/ingot@c1f3eaa))
- fil-forge/ingot#302 ([4585b83](fil-forge/ingot@4585b83))
bajtos pushed a commit to fil-forge/infra-nodes that referenced this pull request Oct 23, 2026
Sets every staging pin in `nodes/staging/eu-central-3/apps/versions.env` to what
`nodes/dev/apps/versions.env` pins on `main`. Merging this is the promotion: the node picks
it up on its next reconcile pass, waits for a safe proving window and restarts each
service that changed.

This pull request is rebuilt on every push to `main` and closed once staging matches
dev, so edits to it are overwritten unless they are pushed to `bot/promote-staging` by hand.

## piri

[`sha256:1e91500`](https://github.com/orgs/fil-forge/packages/container/piri/1392106094) → [`sha256:07f74c5`](https://github.com/orgs/fil-forge/packages/container/piri/1431242148)

What fil-forge/piri brings over staging's pin, [`c2dc6b0..e8d7fd9`](fil-forge/piri@c2dc6b0...e8d7fd9):

- fil-forge/piri#108 ([7912ce0](fil-forge/piri@7912ce0))
- fil-forge/piri#177 ([37cb316](fil-forge/piri@37cb316))
- fil-forge/piri#175 ([0a2dc09](fil-forge/piri@0a2dc09))
- fil-forge/piri#180 ([2703e3e](fil-forge/piri@2703e3e))
- fil-forge/piri#182 ([8e3ce5d](fil-forge/piri@8e3ce5d))
- fil-forge/piri#178 ([fa5bc09](fil-forge/piri@fa5bc09))
- fil-forge/piri#179 ([c9565b3](fil-forge/piri@c9565b3))
- fil-forge/piri#183 ([1fef19d](fil-forge/piri@1fef19d))
- fil-forge/piri#184 ([dcf3f70](fil-forge/piri@dcf3f70))
- fil-forge/piri#174 ([3a9a3fd](fil-forge/piri@3a9a3fd))
- fil-forge/piri#187 ([3cd4f27](fil-forge/piri@3cd4f27))
- fil-forge/piri#192 ([9b3191c](fil-forge/piri@9b3191c))
- fil-forge/piri#121 ([0fbd8da](fil-forge/piri@0fbd8da))
- fil-forge/piri#194 ([3ef715b](fil-forge/piri@3ef715b))
- fil-forge/piri#196 ([1f79668](fil-forge/piri@1f79668))
- fil-forge/piri#197 ([476f1a2](fil-forge/piri@476f1a2))
- fil-forge/piri#198 ([1df9059](fil-forge/piri@1df9059))
- fil-forge/piri#193 ([e8d7fd9](fil-forge/piri@e8d7fd9))

## ingot

[`sha256:f629535`](https://github.com/orgs/fil-forge/packages/container/ingot/1386342616) → [`sha256:8a16655`](https://github.com/orgs/fil-forge/packages/container/ingot/1431251960)

What fil-forge/ingot brings over staging's pin, [`6331454..4585b83`](fil-forge/ingot@6331454...4585b83):

- fil-forge/ingot#265 ([83dc31d](fil-forge/ingot@83dc31d))
- fil-forge/ingot#267 ([9b7051f](fil-forge/ingot@9b7051f))
- fil-forge/ingot#266 ([6aa7eee](fil-forge/ingot@6aa7eee))
- fil-forge/ingot#283 ([d69bbf3](fil-forge/ingot@d69bbf3))
- fil-forge/ingot#284 ([324e294](fil-forge/ingot@324e294))
- fil-forge/ingot#285 ([4fddf05](fil-forge/ingot@4fddf05))
- fil-forge/ingot#286 ([f879a36](fil-forge/ingot@f879a36))
- fil-forge/ingot#287 ([fff9351](fil-forge/ingot@fff9351))
- fil-forge/ingot#289 ([03d12c3](fil-forge/ingot@03d12c3))
- fil-forge/ingot#269 ([319edf8](fil-forge/ingot@319edf8))
- fil-forge/ingot#295 ([31f159a](fil-forge/ingot@31f159a))
- fil-forge/ingot#296 ([30c90f3](fil-forge/ingot@30c90f3))
- fil-forge/ingot#298 ([b6d6b2e](fil-forge/ingot@b6d6b2e))
- fil-forge/ingot#292 ([7c9440d](fil-forge/ingot@7c9440d))
- fil-forge/ingot#293 ([f2b2628](fil-forge/ingot@f2b2628))
- fil-forge/ingot#297 ([31e01b0](fil-forge/ingot@31e01b0))
- fil-forge/ingot#291 ([a75c81a](fil-forge/ingot@a75c81a))
- fil-forge/ingot#300 ([49fec43](fil-forge/ingot@49fec43))
- fil-forge/ingot#299 ([9881bef](fil-forge/ingot@9881bef))
- fil-forge/ingot#279 ([bb88ee0](fil-forge/ingot@bb88ee0))
- fil-forge/ingot#278 ([0d16d90](fil-forge/ingot@0d16d90))
- fil-forge/ingot#280 ([5596df7](fil-forge/ingot@5596df7))
- fil-forge/ingot#273 ([7be5b2f](fil-forge/ingot@7be5b2f))
- fil-forge/ingot#276 ([957e190](fil-forge/ingot@957e190))
- fil-forge/ingot#282 ([ebbc066](fil-forge/ingot@ebbc066))
- fil-forge/ingot#275 ([425d2cb](fil-forge/ingot@425d2cb))
- fil-forge/ingot#281 ([b36651a](fil-forge/ingot@b36651a))
- fil-forge/ingot#301 ([c1f3eaa](fil-forge/ingot@c1f3eaa))
- fil-forge/ingot#302 ([4585b83](fil-forge/ingot@4585b83))

Co-authored-by: fil-forge-bot[bot] <318653112+fil-forge-bot[bot]@users.noreply.github.com>
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.

2 participants