carlos / platform Public

changelog-v0.28.7

Squashed from changelog-v0.28.7 into main.
claude agent, operated by paul@keymail.dev c02978ad2a7c96454c73c01ecfd12d9671b5759d parent 4f55bfb
2 files changed, +661 −0
  • docs/site/changelog-links.json +60 −0
  • docs/site/changelog.json +601 −0

CI passed — run details

CI log
=== gate ===
.amadan/test-gate.sh
go: downloading github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.68.0
go: downloading github.com/aws/aws-sdk-go-v2 v1.44.0
go: downloading github.com/aws/aws-sdk-go-v2/service/costexplorer v1.67.5
go: downloading github.com/aws/aws-sdk-go-v2/service/s3 v1.105.0
go: downloading github.com/aws/smithy-go v1.28.1
go: downloading github.com/superfly/ltx v0.5.1
go: downloading golang.org/x/net v0.56.0
go: downloading modernc.org/sqlite v1.55.0
go: downloading github.com/aws/aws-sdk-go-v2/config v1.32.6
go: downloading github.com/aws/aws-sdk-go-v2/service/sns v1.43.0
go: downloading github.com/aws/aws-sdk-go-v2/service/acm v1.45.0
go: downloading github.com/aws/aws-sdk-go-v2/service/ec2 v1.324.0
go: downloading github.com/aws/aws-sdk-go-v2/service/iam v1.58.2
go: downloading github.com/aws/aws-sdk-go-v2/service/route53 v1.64.1
go: downloading github.com/aws/aws-sdk-go-v2/service/sts v1.45.6
go: downloading github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.37.0
go: downloading github.com/oschwald/maxminddb-golang v1.13.1
go: downloading github.com/aws/aws-sdk-go-v2/credentials v1.19.6
go: downloading golang.org/x/sys v0.46.0
go: downloading github.com/benbjohnson/litestream v0.5.14
go: downloading golang.org/x/crypto v0.53.0
go: downloading github.com/aws/aws-sdk-go-v2/service/autoscaling v1.74.0
go: downloading github.com/pion/logging v0.2.4
go: downloading github.com/pion/stun/v3 v3.0.1
go: downloading github.com/pion/turn/v4 v4.1.4
go: downloading golang.org/x/crypto v0.53.0
go: downloading github.com/aws/aws-sdk-go-v2/service/ec2 v1.324.0
go: downloading github.com/aws/aws-sdk-go-v2/service/autoscaling v1.74.0
go: downloading github.com/benbjohnson/litestream v0.5.14
go: downloading modernc.org/sqlite v1.55.0
go: downloading github.com/aws/aws-sdk-go-v2/service/s3 v1.105.0
go: downloading github.com/aws/aws-sdk-go-v2/service/ssm v1.74.0
go: downloading github.com/pion/stun/v3 v3.0.1
go: downloading github.com/klauspost/compress v1.18.0
go: downloading github.com/aws/aws-sdk-go-v2/service/sesv2 v1.66.6
go: downloading github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.40
go: downloading github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.40
go: downloading github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16
go: downloading github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4
go: downloading github.com/aws/aws-sdk-go-v2/service/signin v1.0.4
go: downloading github.com/aws/aws-sdk-go-v2/service/sso v1.30.8
go: downloading github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12
go: downloading github.com/aws/aws-sdk-go-v2/service/sesv2 v1.66.6
go: downloading github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.40
go: downloading github.com/pion/randutil v0.1.0
go: downloading github.com/pion/transport/v4 v4.0.1
go: downloading github.com/pion/randutil v0.1.0
go: downloading github.com/pion/transport/v4 v4.0.1
go: downloading github.com/pierrec/lz4/v4 v4.1.22
go: downloading github.com/pierrec/lz4/v4 v4.1.22
go: downloading github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23
go: downloading github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23
go: downloading github.com/wlynxg/anet v0.0.5
go: downloading github.com/wlynxg/anet v0.0.5
go: downloading github.com/pion/transport/v3 v3.0.8
go: downloading github.com/pion/dtls/v3 v3.0.7
go: downloading github.com/pion/transport/v3 v3.0.8
go: downloading github.com/pion/dtls/v3 v3.0.7
go: downloading github.com/prometheus/client_golang v1.17.0
go: downloading github.com/lmittmann/tint v1.1.3
go: downloading golang.org/x/sync v0.21.0
go: downloading github.com/mattn/go-isatty v0.0.20
go: downloading github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.20.18
go: downloading golang.org/x/sync v0.21.0
go: downloading github.com/prometheus/client_golang v1.17.0
go: downloading github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.20.18
go: downloading github.com/mattn/go-isatty v0.0.20
go: downloading github.com/lmittmann/tint v1.1.3
go: downloading github.com/prometheus/client_model v0.5.0
go: downloading github.com/beorn7/perks v1.0.1
go: downloading google.golang.org/protobuf v1.36.10
go: downloading github.com/prometheus/procfs v0.12.0
go: downloading github.com/cespare/xxhash/v2 v2.3.0
go: downloading github.com/prometheus/common v0.45.0
go: downloading github.com/prometheus/common v0.45.0
go: downloading github.com/beorn7/perks v1.0.1
go: downloading google.golang.org/protobuf v1.36.10
go: downloading github.com/cespare/xxhash/v2 v2.3.0
go: downloading github.com/prometheus/client_model v0.5.0
go: downloading github.com/prometheus/procfs v0.12.0
go: downloading github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0
go: downloading github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0
go: downloading golang.org/x/text v0.38.0
go: downloading golang.org/x/text v0.38.0
go: downloading modernc.org/libc v1.74.1
go: downloading modernc.org/libc v1.74.1
go: downloading modernc.org/memory v1.11.0
go: downloading github.com/dustin/go-humanize v1.0.1
go: downloading modernc.org/mathutil v1.7.1
go: downloading github.com/google/uuid v1.6.0
go: downloading modernc.org/memory v1.11.0
go: downloading github.com/google/uuid v1.6.0
go: downloading modernc.org/mathutil v1.7.1
go: downloading github.com/dustin/go-humanize v1.0.1
go: downloading github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec
go: downloading github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec
=== launchctx (3 s)
ok  	amadan.net/carlos/platform.git/launchctx	0.011s
?   	amadan.net/carlos/platform.git/launchctx/controlname	[no test files]
?   	amadan.net/carlos/platform.git/launchctx/wireid	[no test files]
=== vet (45 s)
go: downloading github.com/benbjohnson/litestream v0.5.14
go: downloading golang.org/x/crypto v0.53.0
go: downloading modernc.org/sqlite v1.55.0
go: downloading github.com/aws/aws-sdk-go-v2/service/ssm v1.74.0
go: downloading github.com/aws/aws-sdk-go-v2/service/autoscaling v1.74.0
go: downloading github.com/aws/aws-sdk-go-v2/service/ec2 v1.324.0
go: downloading github.com/aws/aws-sdk-go-v2/service/sesv2 v1.66.6
go: downloading github.com/pion/stun/v3 v3.0.1
go: downloading github.com/klauspost/compress v1.18.0
go: downloading golang.org/x/tools v0.47.0
go: downloading github.com/pierrec/lz4/v4 v4.1.22
go: downloading github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23
go: downloading github.com/wlynxg/anet v0.0.5
go: downloading github.com/pion/dtls/v3 v3.0.7
go: downloading github.com/pion/transport/v3 v3.0.8
go: downloading golang.org/x/sync v0.21.0
go: downloading github.com/prometheus/client_golang v1.17.0
go: downloading github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.20.18
go: downloading github.com/lmittmann/tint v1.1.3
go: downloading github.com/prometheus/common v0.45.0
go: downloading github.com/prometheus/client_model v0.5.0
go: downloading google.golang.org/protobuf v1.36.10
go: downloading github.com/cespare/xxhash/v2 v2.3.0
go: downloading github.com/beorn7/perks v1.0.1
go: downloading github.com/prometheus/procfs v0.12.0
go: downloading github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0
go: downloading golang.org/x/text v0.38.0
go: downloading golang.org/x/mod v0.37.0
go: downloading modernc.org/libc v1.74.1
go: downloading github.com/dustin/go-humanize v1.0.1
go: downloading github.com/google/uuid v1.6.0
go: downloading modernc.org/mathutil v1.7.1
go: downloading modernc.org/memory v1.11.0
=== gofmt (1 s)
gofmt -l .: clean
=== rest (182 s)
?   	github.com/carlosframework/platform/cmd/changelog	[no test files]
ok  	github.com/carlosframework/platform/cmd/console	3.419s
ok  	github.com/carlosframework/platform/cmd/moveprobe	11.708s
ok  	github.com/carlosframework/platform/cmd/zddprobe	0.767s
ok  	github.com/carlosframework/platform/internal/activator	65.079s
ok  	github.com/carlosframework/platform/internal/agentsock	0.036s
ok  	github.com/carlosframework/platform/internal/alerting	0.006s
ok  	github.com/carlosframework/platform/internal/analytics	0.037s
ok  	github.com/carlosframework/platform/internal/appconfig	2.710s
ok  	github.com/carlosframework/platform/internal/apperr	0.144s
ok  	github.com/carlosframework/platform/internal/applog	0.201s
ok  	github.com/carlosframework/platform/internal/awsinv	0.012s
ok  	github.com/carlosframework/platform/internal/boxchoice	0.005s
ok  	github.com/carlosframework/platform/internal/boxid	0.762s
?   	github.com/carlosframework/platform/internal/boxid/boxidtest	[no test files]
?   	github.com/carlosframework/platform/internal/boxid/internal/signtest	[no test files]
ok  	github.com/carlosframework/platform/internal/boxvolumes	0.019s
ok  	github.com/carlosframework/platform/internal/caps	0.023s
ok  	github.com/carlosframework/platform/internal/certwarm	0.012s
ok  	github.com/carlosframework/platform/internal/cgroup	0.799s
ok  	github.com/carlosframework/platform/internal/changelog	0.504s
ok  	github.com/carlosframework/platform/internal/claimactivation	1.039s
ok  	github.com/carlosframework/platform/internal/clamd	0.057s
?   	github.com/carlosframework/platform/internal/cliflag	[no test files]
?   	github.com/carlosframework/platform/internal/controlname	[no test files]
?   	github.com/carlosframework/platform/internal/controlsock	[no test files]
ok  	github.com/carlosframework/platform/internal/dbdoor	5.909s
ok  	github.com/carlosframework/platform/internal/dbdoor/dbdoortest	0.013s
ok  	github.com/carlosframework/platform/internal/dbverify	0.008s
ok  	github.com/carlosframework/platform/internal/dnsrec	0.009s
ok  	github.com/carlosframework/platform/internal/docsite	0.010s
ok  	github.com/carlosframework/platform/internal/domains	2.666s
ok  	github.com/carlosframework/platform/internal/doorkey	0.008s
ok  	github.com/carlosframework/platform/internal/economics	0.005s
ok  	github.com/carlosframework/platform/internal/edge	48.695s
?   	github.com/carlosframework/platform/internal/edgeproof	[no test files]
ok  	github.com/carlosframework/platform/internal/edgesfile	0.008s
ok  	github.com/carlosframework/platform/internal/fleetapi	0.180s
ok  	github.com/carlosframework/platform/internal/gate	1.670s
ok  	github.com/carlosframework/platform/internal/genselect	0.017s
ok  	github.com/carlosframework/platform/internal/geo	0.026s
ok  	github.com/carlosframework/platform/internal/geoip	0.032s
ok  	github.com/carlosframework/platform/internal/historyreadback	0.205s
ok  	github.com/carlosframework/platform/internal/host	133.201s
ok  	github.com/carlosframework/platform/internal/hostactors	6.095s
ok  	github.com/carlosframework/platform/internal/hostactors/awsmembership	0.015s
ok  	github.com/carlosframework/platform/internal/hostbox	3.228s
ok  	github.com/carlosframework/platform/internal/hostclaim	0.790s
ok  	github.com/carlosframework/platform/internal/hostenv	0.015s
ok  	github.com/carlosframework/platform/internal/hostevidence	0.015s
ok  	github.com/carlosframework/platform/internal/hostexec	5.743s
ok  	github.com/carlosframework/platform/internal/hostfence	0.041s
ok  	github.com/carlosframework/platform/internal/hostfiles	10.463s
ok  	github.com/carlosframework/platform/internal/hostfloor	0.018s
ok  	github.com/carlosframework/platform/internal/hostguard	1.021s
ok  	github.com/carlosframework/platform/internal/hostops	1.987s
?   	github.com/carlosframework/platform/internal/hostops/fencerelease	[no test files]
ok  	github.com/carlosframework/platform/internal/hostops/internal/fencerelease	0.015s
ok  	github.com/carlosframework/platform/internal/hostquarantine	0.015s
ok  	github.com/carlosframework/platform/internal/hostrelocate	0.610s
ok  	github.com/carlosframework/platform/internal/hostresolve	0.184s
ok  	github.com/carlosframework/platform/internal/hostwrite	0.015s
ok  	github.com/carlosframework/platform/internal/infraview	0.015s
ok  	github.com/carlosframework/platform/internal/instancectl	5.259s
ok  	github.com/carlosframework/platform/internal/instanceexec	2.794s
ok  	github.com/carlosframework/platform/internal/instancefs	0.008s
ok  	github.com/carlosframework/platform/internal/instancekey	0.016s
ok  	github.com/carlosframework/platform/internal/instanceupdates	0.023s
ok  	github.com/carlosframework/platform/internal/layout	1.814s
ok  	github.com/carlosframework/platform/internal/lbhealth	0.015s
ok  	github.com/carlosframework/platform/internal/lease	10.273s
ok  	github.com/carlosframework/platform/internal/lease/leasetest	0.518s
ok  	github.com/carlosframework/platform/internal/ledger	0.026s
ok  	github.com/carlosframework/platform/internal/mail	0.206s
ok  	github.com/carlosframework/platform/internal/maintenance	0.111s
ok  	github.com/carlosframework/platform/internal/maintenanceexec	5.596s
ok  	github.com/carlosframework/platform/internal/maintenanceguard	0.105s
ok  	github.com/carlosframework/platform/internal/metrics	0.006s
ok  	github.com/carlosframework/platform/internal/moves	30.317s
ok  	github.com/carlosframework/platform/internal/moves/archive	0.906s
ok  	github.com/carlosframework/platform/internal/objstore	0.296s
ok  	github.com/carlosframework/platform/internal/ops	0.226s
ok  	github.com/carlosframework/platform/internal/park	0.322s
ok  	github.com/carlosframework/platform/internal/plans	0.006s
ok  	github.com/carlosframework/platform/internal/privatefile	0.006s
ok  	github.com/carlosframework/platform/internal/provision	49.278s
ok  	github.com/carlosframework/platform/internal/publicrelease	0.009s
?   	github.com/carlosframework/platform/internal/regionname	[no test files]
ok  	github.com/carlosframework/platform/internal/registry	5.798s
ok  	github.com/carlosframework/platform/internal/relay	7.247s
ok  	github.com/carlosframework/platform/internal/release	31.386s
ok  	github.com/carlosframework/platform/internal/rollout	4.111s
ok  	github.com/carlosframework/platform/internal/rolloutwords	0.005s
ok  	github.com/carlosframework/platform/internal/rootaws	0.015s
ok  	github.com/carlosframework/platform/internal/rootparticipation	0.069s
ok  	github.com/carlosframework/platform/internal/rootstate	0.028s
ok  	github.com/carlosframework/platform/internal/runs	0.606s
ok  	github.com/carlosframework/platform/internal/s3compat	0.005s
ok  	github.com/carlosframework/platform/internal/safefile	0.004s
ok  	github.com/carlosframework/platform/internal/schedule	2.863s
ok  	github.com/carlosframework/platform/internal/seeds	0.012s
ok  	github.com/carlosframework/platform/internal/sim/hostlife	11.427s
ok  	github.com/carlosframework/platform/internal/sim/litestreamfacts	3.936s
ok  	github.com/carlosframework/platform/internal/status	0.087s
ok  	github.com/carlosframework/platform/internal/steering	0.009s
ok  	github.com/carlosframework/platform/internal/stopevidence	1.136s
ok  	github.com/carlosframework/platform/internal/svcrole	0.004s
ok  	github.com/carlosframework/platform/internal/telemetry	0.004s
ok  	github.com/carlosframework/platform/internal/termfence	0.004s
ok  	github.com/carlosframework/platform/internal/tunnelclient	0.009s
ok  	github.com/carlosframework/platform/internal/unixdial	0.003s
ok  	github.com/carlosframework/platform/internal/updatewords	0.008s
ok  	github.com/carlosframework/platform/internal/usage	0.005s
ok  	github.com/carlosframework/platform/internal/version	0.002s
ok  	github.com/carlosframework/platform/internal/vet	1.678s
=== internal_console@0 (212 s)
ok  	github.com/carlosframework/platform/internal/console	210.300s
=== internal_console@1 (39 s)
ok  	github.com/carlosframework/platform/internal/console	37.527s
=== internal_console@2 (40 s)
ok  	github.com/carlosframework/platform/internal/console	37.779s
=== internal_console@3 (44 s)
ok  	github.com/carlosframework/platform/internal/console	41.772s
=== internal_console@4 (45 s)
ok  	github.com/carlosframework/platform/internal/console	42.618s
=== internal_console@5 (45 s)
ok  	github.com/carlosframework/platform/internal/console	42.677s
=== internal_console@6 (47 s)
ok  	github.com/carlosframework/platform/internal/console	44.933s
=== internal_console@7 (44 s)
ok  	github.com/carlosframework/platform/internal/console	42.593s
=== root@0 (39 s)
ok  	github.com/carlosframework/platform	36.946s
=== root@1 (47 s)
ok  	github.com/carlosframework/platform	45.506s
=== root@2 (49 s)
ok  	github.com/carlosframework/platform	46.860s
=== cross ===
--- shard 0 of 5 ---
cross-compiling darwin/arm64
--- shard 1 of 5 ---
cross-compiling darwin/amd64
--- shard 2 of 5 ---
cross-compiling linux/arm64
linux/arm64 carlos binary: 49873058 bytes (ceiling 52000000)
--- shard 3 of 5 ---
cross-compiling windows/amd64
--- shard 4 of 5 ---
cross-compiling windows/arm64
=== minio-contract ===
minio contract: arm64, minio RELEASE.2025-09-07T16-13-09Z, mc RELEASE.2025-08-13T08-35-41Z
  minio: cached, digest verified
  mc: cached, digest verified
  minio healthy on 127.0.0.1:20999
Added `local` successfully.
Bucket created successfully `local/contract-bucket`.
Bucket created successfully `local/denied-bucket`.
Created policy `contract-only` successfully.
Added user `scopeduser` successfully.
Attached Policies: [contract-only]
To User: scopeduser
  buckets and scoped user ready
=== RUN   TestDeliveredContractMinio
=== RUN   TestDeliveredContractMinio/put
=== RUN   TestDeliveredContractMinio/get_round-trips_the_body
=== RUN   TestDeliveredContractMinio/list_shows_the_key
=== RUN   TestDeliveredContractMinio/head_and_list_agree_on_the_version
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/not_by_PutObjectTagging
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/and_not_by_x-amz-tagging_on_upload
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CreateMultipartUpload
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CopyObject_with_a_REPLACE_tagging_directive
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/but_multipart_itself_is_allowed
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_copy_itself_is_allowed
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/a_POST-policy_forged_tag_with_a_matching_version_is_still_not_a_verdict
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_an_ordinary_tagged-with-something-else_upload_is_allowed
=== RUN   TestDeliveredContractMinio/delete_removes_it
=== RUN   TestDeliveredContractMinio/cross-bucket_denial
--- PASS: TestDeliveredContractMinio (0.02s)
    --- PASS: TestDeliveredContractMinio/put (0.00s)
    --- PASS: TestDeliveredContractMinio/get_round-trips_the_body (0.00s)
    --- PASS: TestDeliveredContractMinio/list_shows_the_key (0.00s)
    --- PASS: TestDeliveredContractMinio/head_and_list_agree_on_the_version (0.00s)
    --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/not_by_PutObjectTagging (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/and_not_by_x-amz-tagging_on_upload (0.00s)
    --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route (0.01s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CreateMultipartUpload (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CopyObject_with_a_REPLACE_tagging_directive (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/but_multipart_itself_is_allowed (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_copy_itself_is_allowed (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/a_POST-policy_forged_tag_with_a_matching_version_is_still_not_a_verdict (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_an_ordinary_tagged-with-something-else_upload_is_allowed (0.00s)
    --- PASS: TestDeliveredContractMinio/delete_removes_it (0.00s)
    --- PASS: TestDeliveredContractMinio/cross-bucket_denial (0.00s)
PASS
ok  	github.com/carlosframework/platform/internal/objstore	0.023s
=== RUN   TestT4StorageProbeMinio
2026/10/21 17:00:40 moves: T4: STORE: list: operation error S3: ListObjectsV2, https response error StatusCode: 403, RequestID: 18E09A0EF2373793, HostID: 7c420053e0fbcd7f41653fdd92ffa2802c903d05303b1aa15adc2e8bb65d183f, api error SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
--- PASS: TestT4StorageProbeMinio (0.01s)
PASS
ok  	github.com/carlosframework/platform/internal/host	0.022s
minio contract: PASS
diff --git a/docs/site/changelog-links.json b/docs/site/changelog-links.json
index 3082e8c6a..80ec9b2e2 100644
--- a/docs/site/changelog-links.json
+++ b/docs/site/changelog-links.json
@@ -1,5 +1,65 @@
{
"//": "For the changelog: each release-note bullet's bold lead, mapped to the branches behind it. Kept by hand, one release at a time, as step 10 of the release recipe in the README. go run ./cmd/changelog fails on a lead no bullet has, or a branch that did not land in that release.",
+ "v0.28.7": {
+ "`carlos logs` now shows each run.": [
+ "run-lifecycle-logs-325"
+ ],
+ "An app can ask for one uploaded object to be scanned.": [
+ "scan-demand-revival"
+ ],
+ "The console's account switcher has a search box.": [
+ "console-switcher-filter"
+ ],
+ "An offline move can copy most of its data before the instance goes offline.": [
+ "moves-offline-precopy"
+ ],
+ "Every box in both regions must run this release before `stage` works.": [
+ "moves-offline-precopy"
+ ],
+ "Moves and replica copies now run eight object copies at once.": [
+ "moves-offline-precopy"
+ ],
+ "On-demand scanning needs `CARLOS_SCAN_WEBHOOK_KEY` only for callbacks.": [
+ "scan-demand-revival"
+ ]
+ },
+ "v0.28.6": {
+ "A guard-armed box's protected console can now be replaced.": [
+ "install-console-upgrade"
+ ],
+ "A nested instance's `config.env` is written as soon as its directory appears.": [
+ "moves-offline-fixes"
+ ],
+ "Each offline move step now sees a current box report.": [
+ "moves-offline-fixes"
+ ],
+ "A source box's scheduler leaves a moved instance alone.": [
+ "moves-offline-fixes"
+ ]
+ },
+ "v0.28.5": {
+ "`carlos move offline` moves one instance to another region, with planned downtime.": [
+ "moves-offline"
+ ],
+ "Roll every box in both regions before you start an offline move.": [
+ "moves-offline"
+ ],
+ "A box whose guard is armed on v0.28.4 needs one update by hand.": [
+ "armed-box-updates"
+ ],
+ "The guarded updater reads only what a candidate writes to standard output.": [
+ "armed-box-updates"
+ ],
+ "`carlos system guard-arm` makes its directories readable whatever your umask is.": [
+ "claim-guard-umask"
+ ],
+ "Routes with their own unit now restart on boxes whose agent doesn't run as root.": [
+ "adopt-unit-root-pass-315"
+ ],
+ "`carlos system status` warns when a new box would boot an older build.": [
+ "bootstrap-carlos-follows-316"
+ ]
+ },
"v0.28.4": {
"Console invites now arrive.": [
"design-console-invite-delivery"
diff --git a/docs/site/changelog.json b/docs/site/changelog.json
index a15fa98c9..8b790967a 100644
--- a/docs/site/changelog.json
+++ b/docs/site/changelog.json
@@ -2,6 +2,607 @@
"//": "Generated by go run ./cmd/changelog from git, the published release notes and Amadan. Do not edit; regenerate.",
"repo": "https://amadan.net/carlos/platform",
"releases": [
+ {
+ "tag": "v0.28.7",
+ "date": "2026-10-21",
+ "sha": "771ca01b6be00cec299a8e265c34136daa1fe0d1",
+ "published": true,
+ "notes_url": "https://github.com/carlosframework/releases/releases/tag/v0.28.7",
+ "notes": {
+ "form": "bullets",
+ "sections": [
+ {
+ "title": "",
+ "bullets": [
+ {
+ "md": "**`carlos logs` now shows each run.** It shows when each `carlos run` started, who asked for it and how it ended. The command's output is not kept there.",
+ "branches": [
+ "run-lifecycle-logs-325"
+ ],
+ "docs": [
+ "/docs/cli#carlos-logs",
+ "/docs/cli#carlos-run"
+ ]
+ },
+ {
+ "md": "**An app can ask for one uploaded object to be scanned.** Where scanning is enabled for the deployment and an operator has granted the store, the app requests a scan with an app-scoped `service` credential and polls for the result, or receives a signed callback. See [Receiving scan results](https://carlosframework.com/docs/scan-callbacks).",
+ "branches": [
+ "scan-demand-revival"
+ ]
+ },
+ {
+ "md": "**The console's account switcher has a search box.** It helps when you belong to many accounts.",
+ "branches": [
+ "console-switcher-filter"
+ ]
+ }
+ ]
+ },
+ {
+ "title": "For operators",
+ "bullets": [
+ {
+ "md": "**Roll the boxes first, then the console.** Coming from v0.28.4, read the [v0.28.5 operator notes](https://github.com/carlosframework/releases/releases/tag/v0.28.5) first. Coming from v0.28.5, upgrade the console with `carlos system claims install-console --upgrade` as the [v0.28.6 notes](https://github.com/carlosframework/releases/releases/tag/v0.28.6) describe.",
+ "docs": [
+ "/docs/cli#carlos-system-claims"
+ ]
+ },
+ {
+ "md": "**An offline move can copy most of its data before the instance goes offline.** Run `carlos move offline stage --host <host> --to <region>` while the instance keeps serving. It copies the instance's replica to the target region, and running it again copies only what is new. `start` then takes the instance offline as before, and the seal copies only what changed since the last stage. Until `start`, `abort` removes the staged copy and the instance is never offline. While a move is staged, the instance refuses `carlos run` and deletion, and no other instance can move offline.",
+ "branches": [
+ "moves-offline-precopy"
+ ],
+ "docs": [
+ "/docs/cli#carlos-move",
+ "/docs/cli#carlos-run"
+ ]
+ },
+ {
+ "md": "**Every box in both regions must run this release before `stage` works.** Each box now publishes `offline-stage-1`, and `stage` refuses while any box in either region lacks it.",
+ "branches": [
+ "moves-offline-precopy"
+ ]
+ },
+ {
+ "md": "**Moves and replica copies now run eight object copies at once.** Before, they copied one object at a time, so a large replica took minutes to copy while the instance was offline.",
+ "branches": [
+ "moves-offline-precopy"
+ ]
+ },
+ {
+ "md": "**On-demand scanning needs `CARLOS_SCAN_WEBHOOK_KEY` only for callbacks.** Polling works without it. To rotate it, keep the old key in `CARLOS_SCAN_WEBHOOK_KEY_PREVIOUS` and run `carlos system antivirus rotate-webhook-key`. Apps whose delivered secret changes restart.",
+ "branches": [
+ "scan-demand-revival"
+ ],
+ "docs": [
+ "/docs/cli#carlos-system"
+ ]
+ },
+ {
+ "md": "**Every dormant switch stays off.** Leave `CARLOS_MOVES_PHASE1`, `CARLOS_HOST_CLAIM`, `CARLOS_HOST_CLAIM_ORIGINS`, `CARLOS_HOST_CLAIM_RETIRED_LOCATIONS`, `CARLOS_CONSOLE_ID`, `CARLOS_REGION_HA`, `CONSOLE_APP_REGIONS`, `CARLOS_TEMPORARY_APPS`, `CARLOS_REQUIRE_POINTER_DIGEST` and `CARLOS_PLAN_CATALOG` unset, don't put `CARLOS_BOX_REFERENCE=group` in any host.env, and don't run `carlos channels digests on`. Keep `CARLOS_SWAP` as it is: a box armed for zero-downtime deploys stays armed.",
+ "docs": [
+ "/docs/cli#carlos-channels-digests"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "changes": [
+ {
+ "sha": "771ca01b6be00cec299a8e265c34136daa1fe0d1",
+ "date": "2026-10-21",
+ "subject": "moves-offline-precopy: carlos move offline stage (pre-copy while serving) and parallel mirror copies",
+ "branch": "moves-offline-precopy",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/moves-offline-precopy",
+ "commits": 10,
+ "docs": [
+ "/docs/cli#carlos-move"
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "f550afa21b8098460cbcf0bac2cac6748e52b802",
+ "date": "2026-10-21",
+ "subject": "spec: plans, caps and packs for the first paid launch (draft)",
+ "branch": "design-plans-and-caps",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/design-plans-and-caps",
+ "commits": 15,
+ "discussions": [
+ {
+ "id": 280,
+ "title": "Root trusts service-writable hostguard and health records under /data (claim root paths)",
+ "state": "open"
+ }
+ ],
+ "docs": [
+ "/docs/cli#carlos-accounts-plan",
+ "/docs/plans#turning-plans-on",
+ "/docs/plans#the-catalog",
+ "/docs/plans#assigning-a-plan",
+ "/docs/plans#sponsored-accounts"
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "aaa6a9498092d0e24910991127b45a9b21cdf7b4",
+ "date": "2026-10-21",
+ "subject": "root tests: the carlos binary is built once per test run, not once per test",
+ "branch": "test-suite-speed",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/test-suite-speed",
+ "commits": 3,
+ "discussions": [
+ {
+ "id": 291,
+ "title": "Test suite speed: where the CI gate's 375 seconds go, and a ranked plan",
+ "state": "open"
+ }
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "512baa591dc275b5b3a01a353d6993fb19509a0b",
+ "date": "2026-10-21",
+ "subject": "Prompts:",
+ "branch": "test-suite-debt",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/test-suite-debt",
+ "commits": 4,
+ "discussions": [
+ {
+ "id": 226,
+ "title": "Root package tests read the operator's real ~/.carlos/config (TestShipVerbAPIMode aborts the package)",
+ "state": "open"
+ },
+ {
+ "id": 258,
+ "title": "Root CLI tests read the operator's real ~/.carlos/config when TMPDIR is under HOME",
+ "state": "open"
+ },
+ {
+ "id": 263,
+ "title": "Hibernating instances: keep 7 days of snapshot history like awake ones",
+ "state": "closed"
+ },
+ {
+ "id": 266,
+ "title": "Flaky: sim/litestreamfacts TestGate_AnchoredLineageThroughStore under load",
+ "state": "open"
+ },
+ {
+ "id": 274,
+ "title": "Flaky CI test: stopevidence TestFDIdentityFindsAHardLinkHeldByAChild",
+ "state": "open"
+ }
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "f54aa2fc50b8481b9ba4b6bfe09a21bc7c7172e2",
+ "date": "2026-10-21",
+ "subject": "carlos run: a run's start and end reach carlos logs (#325)",
+ "branch": "run-lifecycle-logs-325",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/run-lifecycle-logs-325",
+ "commits": 5,
+ "discussions": [
+ {
+ "id": 325,
+ "title": "Run a one-off command with one instance's delivered config (carlos exec)",
+ "state": "closed"
+ }
+ ],
+ "docs": [
+ "/docs/cli#carlos-run"
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "3d444a1b63c6e853527292cd8845f1347fdbb544",
+ "date": "2026-10-21",
+ "subject": "Merge reviewed on-demand object scanning revival",
+ "branch": "scan-demand-revival",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/scan-demand-revival",
+ "commits": 1,
+ "docs": [
+ "/docs/cli#carlos-store-scan",
+ "/docs/cli#deployment-wide-object-scanning",
+ "/docs/scan-callbacks#asking-for-a-scan",
+ "/docs/scan-callbacks#the-states",
+ "/docs/scan-callbacks#callbacks-take-a-path"
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "ce8c425ae5930e1c2807018bde1880b93b0947cd",
+ "date": "2026-10-20",
+ "subject": "console: searchable, scrolling account switcher",
+ "branch": "console-switcher-filter",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/console-switcher-filter",
+ "commits": 2,
+ "discussions": [
+ {
+ "id": 280,
+ "title": "Root trusts service-writable hostguard and health records under /data (claim root paths)",
+ "state": "open"
+ }
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "tag": "v0.28.6",
+ "date": "2026-10-20",
+ "sha": "e0986eabc5bc2a7ae5e17e58b19c9a6b92beecfe",
+ "published": true,
+ "notes_url": "https://github.com/carlosframework/releases/releases/tag/v0.28.6",
+ "notes": {
+ "form": "bullets",
+ "sections": [
+ {
+ "title": "",
+ "bullets": [
+ {
+ "md": "**Nothing changes for people deploying apps with the CLI.**"
+ }
+ ]
+ },
+ {
+ "title": "For operators",
+ "bullets": [
+ {
+ "md": "**Roll the boxes first, then the console.**"
+ },
+ {
+ "md": "**Coming from v0.28.4, read the [v0.28.5 operator notes](https://github.com/carlosframework/releases/releases/tag/v0.28.5) first.** They all still apply, including the one update by hand for a box whose guard is armed on v0.28.4."
+ },
+ {
+ "md": "**A guard-armed box's protected console can now be replaced.** Once the box's router is on this release, run `carlos system claims install-console --upgrade --from <sha256>` as root, where the sha256 is the console that is running now. It refuses unless that build is what the box holds, then installs the new console and keeps the old one as `console.prev`. No hand recovery is needed. A box upgraded this way can't be armed again with `carlos system guard-arm` until `install-console` has been run without `--upgrade`, because `guard-arm` expects both copies to be the same build.",
+ "branches": [
+ "install-console-upgrade"
+ ],
+ "docs": [
+ "/docs/cli#carlos-system-claims",
+ "/docs/cli#carlos-system"
+ ]
+ },
+ {
+ "md": "**A nested instance's `config.env` is written as soon as its directory appears.** Before, a move could leave the instance without it for up to an hour.",
+ "branches": [
+ "moves-offline-fixes"
+ ]
+ },
+ {
+ "md": "**Each offline move step now sees a current box report.** While a move is running, the source boxes and the sealing box report again every 15 seconds. A move takes under a minute of downtime when its steps run back to back. A step that meets a stale report now says the report is not current and to try again. Before, `flip` could answer that a process was still running.",
+ "branches": [
+ "moves-offline-fixes"
+ ]
+ },
+ {
+ "md": "**A source box's scheduler leaves a moved instance alone.** After `open`, it no longer writes a stray token file into the instance it gave up.",
+ "branches": [
+ "moves-offline-fixes"
+ ]
+ },
+ {
+ "md": "**Every dormant switch stays off.** Leave `CARLOS_MOVES_PHASE1`, `CARLOS_HOST_CLAIM`, `CARLOS_HOST_CLAIM_ORIGINS`, `CARLOS_HOST_CLAIM_RETIRED_LOCATIONS`, `CARLOS_CONSOLE_ID`, `CARLOS_REGION_HA`, `CONSOLE_APP_REGIONS`, `CARLOS_TEMPORARY_APPS` and `CARLOS_REQUIRE_POINTER_DIGEST` unset, don't put `CARLOS_BOX_REFERENCE=group` in any host.env, and don't run `carlos channels digests on`. Keep `CARLOS_SWAP` as it is: a box armed for zero-downtime deploys stays armed.",
+ "docs": [
+ "/docs/cli#carlos-channels-digests"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "changes": [
+ {
+ "sha": "e0986eabc5bc2a7ae5e17e58b19c9a6b92beecfe",
+ "date": "2026-10-20",
+ "subject": "moves-offline-fixes: harness Run 9 defects. Config sync writes a nested row's config.env as soon as its instance directory appears, keeping it pending until delivered (6); each offline door step sees a current report: source boxes and the sealer refresh reports every 15 s while a move is active without renewing the tombstone, and a stale report answers MV-O178 (7); a source box's scheduler leaves a held or moved host alone, excluding it before the batch limit (8). Astra reviewed (two rounds); census-ruling-moves-offline-fixes (platform-1c); MV-O178 approved by Paul.",
+ "branch": "moves-offline-fixes",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/moves-offline-fixes",
+ "commits": 9,
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "2185035698a1111c487651bddb1bf2500cd92ccc",
+ "date": "2026-10-20",
+ "subject": "install-console --upgrade --from <sha256>: replace a guard-armed box's protected console",
+ "branch": "install-console-upgrade",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/install-console-upgrade",
+ "commits": 4,
+ "docs": [
+ "/docs/cli#carlos-system-claims"
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "tag": "v0.28.5",
+ "date": "2026-10-20",
+ "sha": "54ae7fb93820f37f123bbdcbcb57f4f2efb25dc9",
+ "published": true,
+ "notes_url": "https://github.com/carlosframework/releases/releases/tag/v0.28.5",
+ "notes": {
+ "form": "bullets",
+ "sections": [
+ {
+ "title": "",
+ "bullets": [
+ {
+ "md": "**Nothing changes for people deploying apps with the CLI.**"
+ }
+ ]
+ },
+ {
+ "title": "For operators",
+ "bullets": [
+ {
+ "md": "**Roll the boxes first, then the console.**"
+ },
+ {
+ "md": "**Coming from v0.28.3, read the [v0.28.4 operator notes](https://github.com/carlosframework/releases/releases/tag/v0.28.4) first.** They all still apply."
+ },
+ {
+ "md": "**`carlos move offline` moves one instance to another region, with planned downtime.** It is for operators, works only while host claims and Phase 1 moves are off, and takes one step per command: `start`, `seal`, `flip`, `open`, then `finish`. The instance is offline from `start` until `open`. Until `open`, `abort` puts it back where it was with nothing lost.",
+ "branches": [
+ "moves-offline"
+ ],
+ "docs": [
+ "/docs/cli#carlos-move"
+ ]
+ },
+ {
+ "md": "**Roll every box in both regions before you start an offline move.** `seal` waits until every box in the instance's current region has stopped it and said so, and a box on an earlier release never says so.",
+ "branches": [
+ "moves-offline"
+ ]
+ },
+ {
+ "md": "**A box whose guard is armed on v0.28.4 needs one update by hand.** Its updater reads a candidate's progress messages as part of the answer, so `carlos system update` refuses every candidate on that box. Stop `carlos-system-update.path`, put the v0.28.5 binary in a root-only file after checking it against `SHA256SUMS.txt`, run it as root as `system apply` with the box's `host.env`, check the box, then start `carlos-system-update.path` again. Do one box at a time. From then on the box updates as usual.",
+ "branches": [
+ "armed-box-updates"
+ ],
+ "docs": [
+ "/docs/cli#carlos-system"
+ ]
+ },
+ {
+ "md": "**The guarded updater reads only what a candidate writes to standard output.** Progress and warnings no longer break its checks, so this is the last update a guard-armed box needs by hand.",
+ "branches": [
+ "armed-box-updates"
+ ]
+ },
+ {
+ "md": "**`carlos system guard-arm` makes its directories readable whatever your umask is.** Before, a root shell with a strict umask left them unreadable to the box's updater.",
+ "branches": [
+ "claim-guard-umask"
+ ],
+ "docs": [
+ "/docs/cli#carlos-system"
+ ]
+ },
+ {
+ "md": "**Routes with their own unit now restart on boxes whose agent doesn't run as root.** The agent now hands those restarts to root. Before, the restart was refused, the agent read that as a broken build and rolled back.",
+ "branches": [
+ "adopt-unit-root-pass-315"
+ ]
+ },
+ {
+ "md": "**`carlos system status` warns when a new box would boot an older build.** It compares `bootstrap/carlos` with stable's build and says which file to copy over it.",
+ "branches": [
+ "bootstrap-carlos-follows-316"
+ ],
+ "docs": [
+ "/docs/cli#carlos-system"
+ ]
+ },
+ {
+ "md": "**Every dormant switch stays off.** Leave `CARLOS_MOVES_PHASE1`, `CARLOS_HOST_CLAIM`, `CARLOS_HOST_CLAIM_ORIGINS`, `CARLOS_HOST_CLAIM_RETIRED_LOCATIONS`, `CARLOS_CONSOLE_ID`, `CARLOS_REGION_HA`, `CONSOLE_APP_REGIONS`, `CARLOS_TEMPORARY_APPS` and `CARLOS_REQUIRE_POINTER_DIGEST` unset, don't put `CARLOS_BOX_REFERENCE=group` in any host.env, and don't run `carlos channels digests on`. Keep `CARLOS_SWAP` as it is: a box armed for zero-downtime deploys stays armed.",
+ "docs": [
+ "/docs/cli#carlos-channels-digests"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "changes": [
+ {
+ "sha": "54ae7fb93820f37f123bbdcbcb57f4f2efb25dc9",
+ "date": "2026-10-20",
+ "subject": "armed-box-updates: guard-armed boxes can take a release by the ruled re-arm. Cherry-picks 8376a468 (rootaws: an inherited disabled sentinel is not an override) and 8a313548 (hostfloor: a guarded run returns stdout only) from claim-empty-cohort-done, Astra-reviewed there; census-ruling-claim-rootaws-sentinel, confirmed for main by platform-1c. For v0.28.5.",
+ "branch": "armed-box-updates",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/armed-box-updates",
+ "commits": 3,
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "7af881553052fb0b1a26308f49e446df5bcf71be",
+ "date": "2026-10-20",
+ "subject": "moves-offline: operator-run offline region move (claims-off, planned downtime): holds and fences every source box, seals the source with a create-only tombstone after a final checkpoint, lands every dependency on the target proven against an immutable seal.json, opens, then retires the source by rename. Reviewed task by task and by Fable and Astra; census-ruling-moves-offline; copy approved by Paul 2026-10-20. Dormant until an operator runs carlos move offline.",
+ "branch": "moves-offline",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/moves-offline",
+ "commits": 40,
+ "docs": [
+ "/docs/cli#carlos-move"
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "57569bfffa089b9e0ac9c61b9d6f1a03ccf4fc97",
+ "date": "2026-10-20",
+ "subject": "changelog-v0.28.4: release step 10 for v0.28.1 to v0.28.4",
+ "branch": "changelog-v0.28.4",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/changelog-v0.28.4",
+ "commits": 1,
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "cd2dd6e1a3f208b31932d28721bfa0eedb7e7a76",
+ "date": "2026-10-20",
+ "subject": "system status: say when bootstrap/carlos is not stable's build (#316)",
+ "branch": "bootstrap-carlos-follows-316",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/bootstrap-carlos-follows-316",
+ "commits": 2,
+ "discussions": [
+ {
+ "id": 280,
+ "title": "Root trusts service-writable hostguard and health records under /data (claim root paths)",
+ "state": "open"
+ },
+ {
+ "id": 316,
+ "title": "Keep bootstrap/carlos in step with the fleet: system update mirrors releases but new boxes still boot a stale binary",
+ "state": "open"
+ }
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "d7a5b8eb640535f54dd7e0380eda59e9bcc6c2c6",
+ "date": "2026-10-20",
+ "subject": "adopt: an agent that is not root hands named-unit routes to root's pass (#315)",
+ "branch": "adopt-unit-root-pass-315",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/adopt-unit-root-pass-315",
+ "commits": 3,
+ "discussions": [
+ {
+ "id": 280,
+ "title": "Root trusts service-writable hostguard and health records under /data (claim root paths)",
+ "state": "open"
+ },
+ {
+ "id": 315,
+ "title": "Agent's in-process adopt rolls back a console update when it can't restart console.service itself (\"Interactive authentication required\")",
+ "state": "closed"
+ }
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ },
+ {
+ "sha": "96db0efe4a0dc94f26cc8e01d5ed8c5c07e3296a",
+ "date": "2026-10-19",
+ "subject": "claim-guard-umask: guard-arm makes its guard, system and lock directories 0755 whatever the caller's umask (#317)",
+ "branch": "claim-guard-umask",
+ "branch_url": "https://amadan.net/carlos/platform/-/branch/claim-guard-umask",
+ "commits": 2,
+ "discussions": [
+ {
+ "id": 317,
+ "title": "guard-arm's directories inherit the caller's umask: umask 077 broke the guarded console (exit 203)",
+ "state": "open"
+ }
+ ],
+ "credit": [
+ {
+ "person": "Paul Campbell",
+ "agents": [
+ "claude"
+ ]
+ }
+ ]
+ }
+ ]
+ },
{
"tag": "v0.28.4",
"date": "2026-10-18",