Skip to content

fix(s3frontend): require s3:DeleteObjectVersion for DeleteObjects entries naming a version - #287

Merged
alanshaw merged 5 commits into
ash/chore/bump-hilt-encryption-permsfrom
ash/fix/delete-objects-version-permission
Oct 20, 2026
Merged

alanshaw merged 5 commits into
ash/chore/bump-hilt-encryption-permsfrom
ash/fix/delete-objects-version-permission

Conversation

@alanshaw

@alanshaw alanshaw commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Stacked on #286, which maps hilt#101's ConflictingQuery refusal to S3's 400. Pins hilt to the merge of fil-forge/hilt#102 (cd26388, which includes hilt#101), replacing #286's pin, and libforge to its merge of fil-forge/libforge#86.

Hilt used to classify POST /b?delete (DeleteObjects) as CreateBucket. CreateBucket skips the bucket scope check, so a key holding s3:CreateBucket could batch-delete in any bucket of its tenant, permanently deleting named versions included. Ingot did no permission check per entry. hilt#101 authorizes DeleteObjects on s3:DeleteObject, as S3 does.

S3 also requires s3:DeleteObjectVersion for each entry that names a version. Those entries are in the body, where Hilt can't see them, so Ingot now checks them: the IAM service puts the key's action sets on the request (reqscope.ActionsKey, the same per-key cache the local fast path reads), and DeleteObjects fails each such entry with AccessDenied, leaving the version in place, unless the key holds the permission on the bucket. Entries without a version are unaffected. A request with no action set refuses version entries.

The pin bump also brings in hilt#101's and hilt#102's classification on the fast path (RequirementsFor), so bucket configuration, object tagging and attribute requests are checked against their own permissions.

Tests

  • TestVersioning_DeleteObjectsNeedsVersionPermission: refused without the permission and with no action set; a mixed batch refuses the version entry and deletes the rest.

  • TestForgeRoutePermissions (itest), through the real hilt:

    • a key holding only s3:CreateBucket is refused PutBucketVersioning and DeleteObjects on an existing bucket
    • a key without s3:DeleteObjectVersion gets AccessDenied for the version entry while the other entry is deleted, and a key with it deletes the version

    Each denial is asserted twice, so the fast path is covered.

  • The itest key (hiltAllPermissions) carries the encryption and route permissions; the published hilt image knows them, so the INGOT_ITEST_ENCRYPTION_PERMS and INGOT_ITEST_ROUTE_PERMS guards are gone and both permission scenarios run in CI.

make test passes. Against the published hilt :main (cd26388), with no override, as CI runs, these pass: TestForgeVersity (the S3 conformance suite), TestForgeScenarios, TestForgeRoutePermissions and TestForgeBucketEncryptionPermissions.

Merge #286 first; this PR's pin replaces its pin.

🤖 Generated with Claude Code

alanshaw and others added 3 commits October 20, 2026 11:46
…ries naming a version

Hilt now authorizes DeleteObjects on s3:DeleteObject, as S3 does, where it
used to classify the request as CreateBucket. S3 also requires
s3:DeleteObjectVersion for an entry that names a version, and those entries
are in the body, where Hilt cannot see them. The IAM service now carries
the key's action sets on the request (reqscope.ActionsKey, the same
per-key cache the fast path reads), and DeleteObjects fails such an entry
with AccessDenied unless the key holds the permission on the bucket.

Bumps hilt to the classification that mirrors the gateway's router
(fil-forge/hilt#102) and libforge to the matching policy actions
(fil-forge/libforge#86). The itest key carries the new permissions behind
INGOT_ITEST_ROUTE_PERMS until the published hilt image knows them, and
TestForgeRoutePermissions covers the refusals through the real hilt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hilt#102 now builds on hilt#101's subresource vocabulary and adds the
GetBucketPolicyStatus operation, so the itest key carries
s3:GetBucketPolicyStatus with the other route permissions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Hilt moves to the hilt#102 head that pins the same libforge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@alanshaw
alanshaw force-pushed the ash/fix/delete-objects-version-permission branch from 04fb884 to 62ce7ec Compare October 20, 2026 10:46
@alanshaw
alanshaw changed the base branch from main to ash/chore/bump-hilt-encryption-perms October 20, 2026 10:46
@alanshaw
alanshaw added this pull request to stack #288 October 20, 2026 10:47
alanshaw added a commit to fil-forge/hilt that referenced this pull request Oct 20, 2026
…102)

Stacked on #101. Pins libforge to its merge of fil-forge/libforge#86.

#101 refuses a query naming two subresources (`ConflictingQuery`) or an
unsupported one, and classifies DeleteObjects. It classifies the
remaining supported subresources as the plain bucket or object
operation. Those include writes: `PUT /b?versioning` and `?object-lock`
run on a **CreateBucket** authorization, which skips the bucket scope
check, so a key holding `s3:CreateBucket` can change any bucket's
versioning or object lock. This PR gives each of them its own operation
and permission.

### What changes

Each supported subresource now selects its operation per method, as the
gateway's router does (`bucketRoutes`, `objectRoutes`, alongside #101's
`subresources` vocabulary):

| Operation | Permission |
|---|---|
| GetBucketLocation / Acl / Cors | `s3:GetBucketLocation` /
`s3:GetBucketAcl` / `s3:GetBucketCORS` |
| GetBucketPolicyStatus | `s3:GetBucketPolicyStatus` |
| Get / Put / DeleteBucketTagging | `s3:GetBucketTagging` /
`s3:PutBucketTagging` (both writes) |
| Get / PutBucketVersioning | `s3:GetBucketVersioning` /
`s3:PutBucketVersioning` |
| Get / PutObjectLockConfiguration |
`s3:GetBucketObjectLockConfiguration` /
`s3:PutBucketObjectLockConfiguration` |
| Get / Put / DeleteObjectTagging | `s3:GetObjectTagging` /
`s3:PutObjectTagging` / `s3:DeleteObjectTagging` |
| GetObjectAttributes | `s3:GetObjectAttributes` |

The bucket configuration writes and the policy status are service-key
only, like the policy and encryption. The other new permissions are
policy actions (fil-forge/libforge#86, merged). Object tagging writes
are catalog writes; the bucket configuration lives in Ingot's registry
and needs no Forge commands.

Routing follows the router per method:

- A route the gateway has that Hilt does not authorize is refused with
`UnsupportedOperation`: `PUT`/`DELETE ?cors`, `PUT ?acl`, object ACLs,
`?uploads`/`?versions` on an object, and `uploadId` on a PUT without a
`partNumber`.
- A POST naming no route is refused. On a bucket it is a browser form
upload, authenticated by a signed policy in the body that Hilt doesn't
verify; #101 classifies it as CreateBucket.
- A supported subresource the router doesn't route on for the method is
the plain operation there, as in the router (`PUT /b?uploads` creates
the bucket). A HEAD is HeadBucket or HeadObject whatever its
subresource.
- Other query parameters are ignored, as #101 has it.

### Behaviour changes to know about

- Existing service keys don't hold the new permissions, so they lose
these operations until they're re-issued with them. FilOne's console
sets explicit permission lists on the keys it issues and will need the
new names.
- Principal policies that list actions (instead of `s3:*`) need the new
reads added for principals to keep reading bucket configuration, tags
and attributes.
- `POST /b/k?partNumber&uploadId` is now CompleteMultipartUpload, as the
router routes it (same permission as the PutObject it was before).

### Tests

`go test ./...` and `go vet -tags itest ./itest` pass.
`TestClassifyRequest` covers each new operation, the router's
fall-through cases, and the refused routes.
`TestRoutesAddressExistingBuckets` checks that every routed operation is
scope-checked against its bucket and routes only on a supported
subresource. I haven't run the IAM itest scenarios against the change.
fil-forge/ingot#287 pins this branch and runs its route-permission
scenario against it.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
alanshaw and others added 2 commits October 20, 2026 12:06
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The published hilt image carries fil-forge/hilt#101 and #102, so it knows
the bucket encryption permissions and the permissions of the operations it
now classifies by route. Ingot's fast path already enforces the route
permissions through its hilt pin, so CI's key, which carried neither set,
was refused object tagging and GetObjectAttributes.

Both sets join hiltAllPermissions, and the INGOT_ITEST_ENCRYPTION_PERMS and
INGOT_ITEST_ROUTE_PERMS guards go. The encryption scenario's bucket-admin
key leaves out the two encryption permissions explicitly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@alanshaw
alanshaw merged commit fff9351 into main Oct 20, 2026
20 checks passed
@alanshaw
alanshaw deleted the ash/fix/delete-objects-version-permission branch October 20, 2026 11:36
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 20, 2026
Published from fil-forge/ingot#287

- Digest: `sha256:03f172b62dabfbabb2eaeb549abc7b0bc0779a18d87b36cf07a2009c53d38d82`
- Commit: fil-forge/ingot@fff9351
- Publish run: https://github.com/fil-forge/ingot/actions/runs/39416156102

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 20, 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:d12d984`](https://github.com/orgs/fil-forge/packages/container/piri/1399563716)

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

- 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))

## ingot

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

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 20, 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:d12d984`](https://github.com/orgs/fil-forge/packages/container/piri/1399563716)

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

- 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))

## ingot

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

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 20, 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:d12d984`](https://github.com/orgs/fil-forge/packages/container/piri/1399563716)

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

- 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))

## ingot

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

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 20, 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:d12d984`](https://github.com/orgs/fil-forge/packages/container/piri/1399563716)

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

- 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))

## ingot

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

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 21, 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:d12d984`](https://github.com/orgs/fil-forge/packages/container/piri/1399563716)

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

- 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))

## ingot

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

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 21, 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:d12d984`](https://github.com/orgs/fil-forge/packages/container/piri/1399563716)

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

- 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))

## ingot

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

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 21, 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:f87a697`](https://github.com/orgs/fil-forge/packages/container/ingot/1418019409)

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 21, 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:f87a697`](https://github.com/orgs/fil-forge/packages/container/ingot/1418019409)

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 21, 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:f87a697`](https://github.com/orgs/fil-forge/packages/container/ingot/1418019409)

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 21, 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:f87a697`](https://github.com/orgs/fil-forge/packages/container/ingot/1418019409)

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

- 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))
alanshaw added a commit to fil-forge/ucan-protocol-specs that referenced this pull request Oct 21, 2026
…ion (#8)

Brings `s3.md` in line with Hilt's request classification and permission
mapping, as implemented in fil-forge/hilt#101 and fil-forge/hilt#102,
and with Ingot's checks in fil-forge/ingot#286 and fil-forge/ingot#287.

- **S3 Operations** lists all 45 operations Hilt classifies, up from 15,
each with its required permission: DeleteObjects, the version, lock,
tagging and attribute operations, and the bucket policy, encryption,
location, ACL, CORS, tagging, versioning and object-lock configuration
operations. `PutObject` and `CreateBucket` are PUT only.
- **Classification rules:**
- Two subresources are refused as `ConflictingQuery`, an unsupported
subresource as `UnsupportedOperation`.
- A route the gateway has but the tenant service doesn't authorize is
refused.
- A subresource the router doesn't route for the method is the plain
operation there.
  - A HEAD ignores subresources, and a POST naming no route is refused.
  - Other query parameters are ignored.
- **DeleteObjects:** the gateway MUST check `s3:DeleteObjectVersion` for
each entry that names a version and fail the entry with `AccessDenied`
without it.
- **Authorize Request** gains the `ConflictingQuery` failure. A gateway
MAY refuse a two-subresource query without consulting the tenant
service.
- **S3 Permission Mapping** now matches the commands `pkg/s3perm`
delegates. The table had fallen behind before this work: it lacked the
catalog-write commands (`/blob/add`, `/index/add`) on every
catalog-changing permission, `/upload/remove` and `/blob/remove` on
`s3:PutObject`, and `s3:DeleteBucket`'s commands.

Checked against Hilt `main` (`cd26388`,
`pkg/rpc/service/auth/operation.go`, `pkg/s3perm/s3perm.go`) and Ingot
`main` (`s3frontend/object.go`, `iam/service.go`).

Still out of date: the spec doesn't describe principal-bound access
keys, bucket policies, or the `/s3/bucket/policy` capability. Those
predate this work and need a section of their own.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
alanshaw added a commit that referenced this pull request Oct 21, 2026
Comment-only change. Three itest comments added in #287 described
history rather than the code:

- `TestForgeRoutePermissions` said Hilt *used to* classify
PutBucketVersioning and DeleteObjects as CreateBucket. It now says why
the create-only key is refused: each operation is authorized on its own
permission and against the bucket's scope.
- The `hiltAllPermissions` group comments cited `fil-forge/hilt#101` and
`#102`. They now say what the permissions guard.

No behaviour changes; `go vet -tags itest ./itest` passes.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
fil-forge-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 21, 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:b5e200f`](https://github.com/orgs/fil-forge/packages/container/ingot/1421752609)

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 21, 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:b5e200f`](https://github.com/orgs/fil-forge/packages/container/ingot/1421752609)

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 21, 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:d38d6e1`](https://github.com/orgs/fil-forge/packages/container/ingot/1423201096)

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

- 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-bot Bot added a commit to fil-forge/infra-nodes that referenced this pull request Oct 21, 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:ae40c5e`](https://github.com/orgs/fil-forge/packages/container/ingot/1423645646)

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

- 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-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:a178eb2`](https://github.com/orgs/fil-forge/packages/container/ingot/1427079306)

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

- 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-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:b470bfc`](https://github.com/orgs/fil-forge/packages/container/ingot/1427178093)

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

- 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-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:ea89ede`](https://github.com/orgs/fil-forge/packages/container/ingot/1427350334)

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

- 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-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:2f1175e`](https://github.com/orgs/fil-forge/packages/container/ingot/1427537898)

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

- 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-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))
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.

1 participant