settings-5 task 1: Paul's approved copy for plan 5 (unchanged from the drafts)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
3 files changed,
+240
−6
docs/superpowers/plans/2026-10-07-instance-settings-5-copy.json+236 −0internal/updatewords/words_approved_test.go+2 −3internal/updatewords/words_surfaces.go+2 −3
CI passed — run details
CI log
=== gate ===
go: downloading github.com/aws/aws-sdk-go-v2 v1.44.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/superfly/ltx v0.5.1
go: downloading github.com/benbjohnson/litestream v0.5.14
go: downloading modernc.org/sqlite v1.55.0
go: downloading github.com/oschwald/maxminddb-golang v1.13.1
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/cloudwatch v1.68.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/resourcegroupstaggingapi v1.37.0
go: downloading github.com/aws/aws-sdk-go-v2/service/route53 v1.64.1
go: downloading github.com/aws/aws-sdk-go-v2/service/s3 v1.105.0
go: downloading github.com/aws/aws-sdk-go-v2/service/sts v1.45.6
go: downloading github.com/aws/smithy-go v1.28.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 golang.org/x/crypto v0.52.0
go: downloading golang.org/x/net v0.55.0
go: downloading github.com/klauspost/compress v1.18.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 github.com/aws/aws-sdk-go-v2/service/sesv2 v1.66.6
go: downloading github.com/aws/aws-sdk-go-v2/service/costexplorer v1.67.5
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/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/pion/randutil v0.1.0
go: downloading github.com/pion/transport/v4 v4.0.1
go: downloading github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.40
go: downloading github.com/pion/dtls/v3 v3.0.7
go: downloading github.com/pion/transport/v3 v3.0.8
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/pierrec/lz4/v4 v4.1.22
go: downloading github.com/wlynxg/anet v0.0.5
go: downloading github.com/prometheus/client_golang v1.17.0
go: downloading golang.org/x/sync v0.21.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/mattn/go-isatty v0.0.20
go: downloading golang.org/x/text v0.37.0
go: downloading github.com/beorn7/perks v1.0.1
go: downloading github.com/prometheus/client_model v0.5.0
go: downloading github.com/prometheus/common v0.45.0
go: downloading github.com/prometheus/procfs v0.12.0
go: downloading github.com/cespare/xxhash/v2 v2.3.0
go: downloading google.golang.org/protobuf v1.36.10
go: downloading github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0
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 github.com/google/uuid v1.6.0
go: downloading modernc.org/mathutil v1.7.1
go: downloading github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec
cd launchctx && go vet ./... && go test ./... -count=1
ok amadan.net/carlos/platform.git/launchctx 0.012s
? amadan.net/carlos/platform.git/launchctx/controlname [no test files]
? amadan.net/carlos/platform.git/launchctx/wireid [no test files]
go vet ./...
gofmt -l .: clean
go test ./... -count=1 -timeout 30m
ok github.com/carlosframework/platform 340.285s
? github.com/carlosframework/platform/cmd/changelog [no test files]
ok github.com/carlosframework/platform/cmd/console 3.279s
ok github.com/carlosframework/platform/cmd/moveprobe 92.221s
ok github.com/carlosframework/platform/internal/activator 233.829s
ok github.com/carlosframework/platform/internal/agentsock 0.015s
ok github.com/carlosframework/platform/internal/alerting 0.004s
ok github.com/carlosframework/platform/internal/analytics 0.020s
ok github.com/carlosframework/platform/internal/appconfig 2.389s
ok github.com/carlosframework/platform/internal/apperr 0.071s
ok github.com/carlosframework/platform/internal/applog 0.134s
ok github.com/carlosframework/platform/internal/awsinv 0.004s
ok github.com/carlosframework/platform/internal/boxchoice 0.005s
ok github.com/carlosframework/platform/internal/boxid 0.932s
? 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.008s
ok github.com/carlosframework/platform/internal/caps 0.012s
ok github.com/carlosframework/platform/internal/certwarm 0.002s
ok github.com/carlosframework/platform/internal/cgroup 0.193s
ok github.com/carlosframework/platform/internal/changelog 0.250s
ok github.com/carlosframework/platform/internal/clamd 0.054s
? github.com/carlosframework/platform/internal/cliflag [no test files]
ok github.com/carlosframework/platform/internal/console 366.508s
? 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 6.284s
ok github.com/carlosframework/platform/internal/dbdoor/dbdoortest 0.009s
ok github.com/carlosframework/platform/internal/dbverify 0.004s
ok github.com/carlosframework/platform/internal/dnsrec 0.003s
ok github.com/carlosframework/platform/internal/docsite 0.004s
ok github.com/carlosframework/platform/internal/domains 2.159s
ok github.com/carlosframework/platform/internal/doorkey 0.006s
ok github.com/carlosframework/platform/internal/economics 0.004s
ok github.com/carlosframework/platform/internal/edge 25.971s
? github.com/carlosframework/platform/internal/edgeproof [no test files]
ok github.com/carlosframework/platform/internal/edgesfile 0.010s
ok github.com/carlosframework/platform/internal/fleetapi 0.126s
ok github.com/carlosframework/platform/internal/gate 1.655s
ok github.com/carlosframework/platform/internal/genselect 0.015s
ok github.com/carlosframework/platform/internal/geo 0.016s
ok github.com/carlosframework/platform/internal/geoip 0.030s
ok github.com/carlosframework/platform/internal/host 62.064s
ok github.com/carlosframework/platform/internal/hostactors 0.298s
ok github.com/carlosframework/platform/internal/hostbox 1.334s
ok github.com/carlosframework/platform/internal/hostclaim 0.243s
ok github.com/carlosframework/platform/internal/hostevidence 0.005s
ok github.com/carlosframework/platform/internal/hostexec 0.312s
ok github.com/carlosframework/platform/internal/hostfence 0.028s
ok github.com/carlosframework/platform/internal/hostfiles 4.144s
ok github.com/carlosframework/platform/internal/hostfloor 0.009s
ok github.com/carlosframework/platform/internal/hostguard 0.139s
ok github.com/carlosframework/platform/internal/hostops 1.377s
? github.com/carlosframework/platform/internal/hostops/fencerelease [no test files]
ok github.com/carlosframework/platform/internal/hostops/internal/fencerelease 0.002s
ok github.com/carlosframework/platform/internal/hostquarantine 0.003s
ok github.com/carlosframework/platform/internal/hostresolve 0.129s
ok github.com/carlosframework/platform/internal/hostwrite 0.002s
ok github.com/carlosframework/platform/internal/infraview 0.002s
ok github.com/carlosframework/platform/internal/instancectl 1.706s
ok github.com/carlosframework/platform/internal/instanceexec 2.683s
ok github.com/carlosframework/platform/internal/instancefs 0.005s
ok github.com/carlosframework/platform/internal/instancekey 0.005s
ok github.com/carlosframework/platform/internal/instanceupdates 0.006s
ok github.com/carlosframework/platform/internal/layout 1.390s
ok github.com/carlosframework/platform/internal/lease 9.435s
ok github.com/carlosframework/platform/internal/lease/leasetest 0.008s
ok github.com/carlosframework/platform/internal/ledger 0.013s
ok github.com/carlosframework/platform/internal/mail 0.153s
ok github.com/carlosframework/platform/internal/maintenance 0.082s
ok github.com/carlosframework/platform/internal/maintenanceexec 5.502s
ok github.com/carlosframework/platform/internal/maintenanceguard 0.062s
ok github.com/carlosframework/platform/internal/metrics 0.010s
ok github.com/carlosframework/platform/internal/moves 21.004s
ok github.com/carlosframework/platform/internal/moves/archive 0.744s
ok github.com/carlosframework/platform/internal/objstore 0.168s
ok github.com/carlosframework/platform/internal/ops 0.174s
ok github.com/carlosframework/platform/internal/park 0.188s
ok github.com/carlosframework/platform/internal/privatefile 0.003s
ok github.com/carlosframework/platform/internal/provision 3.267s
ok github.com/carlosframework/platform/internal/publicrelease 0.007s
? github.com/carlosframework/platform/internal/regionname [no test files]
ok github.com/carlosframework/platform/internal/registry 3.912s
ok github.com/carlosframework/platform/internal/relay 7.217s
ok github.com/carlosframework/platform/internal/release 20.199s
ok github.com/carlosframework/platform/internal/rollout 3.249s
ok github.com/carlosframework/platform/internal/rolloutwords 0.003s
ok github.com/carlosframework/platform/internal/rootaws 0.007s
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.281s
ok github.com/carlosframework/platform/internal/sim/hostlife 2.413s
ok github.com/carlosframework/platform/internal/sim/litestreamfacts 4.089s
ok github.com/carlosframework/platform/internal/status 0.037s
ok github.com/carlosframework/platform/internal/steering 0.005s
ok github.com/carlosframework/platform/internal/stopevidence 0.139s
ok github.com/carlosframework/platform/internal/svcrole 0.002s
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.004s
ok github.com/carlosframework/platform/internal/unixdial 0.002s
ok github.com/carlosframework/platform/internal/updatewords 0.004s
ok github.com/carlosframework/platform/internal/usage 0.004s
ok github.com/carlosframework/platform/internal/version 0.002s
ok github.com/carlosframework/platform/internal/vet 1.567s
=== cross ===
--- shard 0 of 5 ---
cross-compiling darwin/arm64
go: downloading github.com/ncruces/go-strftime v1.0.0
--- shard 1 of 5 ---
cross-compiling darwin/amd64
go: downloading github.com/ncruces/go-strftime v1.0.0
--- shard 2 of 5 ---
cross-compiling linux/arm64
--- shard 3 of 5 ---
cross-compiling windows/amd64
go: downloading github.com/ncruces/go-strftime v1.0.0
--- shard 4 of 5 ---
cross-compiling windows/arm64
go: downloading github.com/ncruces/go-strftime v1.0.0
=== minio-contract ===
minio contract: arm64, minio RELEASE.2025-09-07T16-13-09Z, mc RELEASE.2025-08-13T08-35-41Z
minio: downloading https://github.com/minio/minio/releases/download/RELEASE.2025-09-07T16-13-09Z/minio.linux-arm64.RELEASE.2025-09-07T16-13-09Z
minio: downloaded, digest verified
mc: downloading https://github.com/minio/mc/releases/download/RELEASE.2025-08-13T08-35-41Z/mc.linux-arm64.RELEASE.2025-08-13T08-35-41Z
mc: downloaded, 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.024s
=== RUN TestT4StorageProbeMinio
2026/10/12 23:23:39 moves: T4: STORE: list: operation error S3: ListObjectsV2, https response error StatusCode: 403, RequestID: 18DDEBBBF3806892, 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/superpowers/plans/2026-10-07-instance-settings-5-copy.json b/docs/superpowers/plans/2026-10-07-instance-settings-5-copy.json| new file mode 100644 |
| index 000000000..a330cc8ca |
| --- /dev/null |
| +++ b/docs/superpowers/plans/2026-10-07-instance-settings-5-copy.json |
| @@ -0,0 +1,236 @@ |
| +{ |
| + "approved_by": "Paul", |
| + "approved_on": "2026-10-13", |
| + "entries": [ |
| + { |
| + "id": "settings.cli.apps-set-flag-channel", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "the channel new instances follow" |
| + }, |
| + { |
| + "id": "settings.cli.apps-set-flag-control", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "settings an instance may change itself: any of updates, channel, major, pin, comma-separated; empty keeps them all for the app" |
| + }, |
| + { |
| + "id": "settings.cli.apps-set-flag-major", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "hold instances on stable at this major version; empty clears" |
| + }, |
| + { |
| + "id": "settings.cli.apps-set-flag-updates", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "auto or manual: what instances do when they have not chosen; empty restores auto" |
| + }, |
| + { |
| + "id": "settings.cli.apps-set-policy-done", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "%s: instances may change %s; default updates %s, default channel %s, default major %s" |
| + }, |
| + { |
| + "id": "settings.cli.apps-set-usage", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": " carlos apps set <app> [--instance-control <settings>] [--default-updates auto|manual] [--default-channel <channel>] [--default-major <n>]\n\n --instance-control <settings> the settings an instance may change itself:\n any of updates, channel, major and pin,\n comma-separated. Empty keeps them all for\n the app.\n --default-updates auto|manual what instances do when they have not\n chosen. Empty restores auto.\n --default-channel <channel> the channel new instances follow.\n --default-major <n> hold instances on stable at this major\n version. Empty clears it." |
| + }, |
| + { |
| + "id": "settings.cli.bad-major-flag", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "--major and --default-major take a whole number, 0 or more, or empty to clear" |
| + }, |
| + { |
| + "id": "settings.cli.direct-mode", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "carlos instances %s works through a console, and this shell is in direct bucket mode (CARLOS_DEPLOYMENT_BUCKET or CARLOS_DEPLOYMENT_DIR is set). Log in instead: carlos auth login --console <url>" |
| + }, |
| + { |
| + "id": "settings.cli.docs-apps-set", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "--instance-control names the settings an instance may change itself once instances can act for themselves. --default-updates and --default-major apply wherever an instance has not chosen; --default-channel is the channel new instances are created on." |
| + }, |
| + { |
| + "id": "settings.cli.docs-apps-set-lead", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "`carlos apps set` also controls the update settings an instance may change:" |
| + }, |
| + { |
| + "id": "settings.cli.docs-instances-set", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Sets how one instance takes new builds: auto or manual updates, the channel, a major version to stay on (stable only), or an exact build to pin. An empty value clears a setting, so the app's default applies again." |
| + }, |
| + { |
| + "id": "settings.cli.docs-instances-update", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Asks the instance's box to install the newest build it considers ready, even with manual updates. The box chooses the build, and it runs on the next start. --fast-track skips the safety delay; only account owners can use it." |
| + }, |
| + { |
| + "id": "settings.cli.flag-account-id", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "account sqid, matched as a sqid ONLY; supersedes --account" |
| + }, |
| + { |
| + "id": "settings.cli.instances-usage-lines", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": " carlos instances set --app <a> <host> [--updates auto|manual]\n [--channel <c>] [--major <n>] [--pin <build>]\n carlos instances update --app <a> <host> [--fast-track]" |
| + }, |
| + { |
| + "id": "settings.cli.instances-usage-para", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "set changes how one instance takes new builds: --updates auto or manual,\n--channel (the app's pipeline rules apply), --major to stay on one major\nversion of stable, and --pin to run exactly one build. An empty value clears\na setting, so the app's default applies again. update asks the instance's\nbox to install the newest build it considers ready, even with manual\nupdates; --fast-track skips the safety delay and needs an account owner." |
| + }, |
| + { |
| + "id": "settings.cli.none", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "none" |
| + }, |
| + { |
| + "id": "settings.cli.not-enforced-reason", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "settings not enforced (box runs an older release)" |
| + }, |
| + { |
| + "id": "settings.cli.roll-note", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "**Instance update settings: the roll order.** Roll every box to the release that applies update settings before anyone turns on manual updates, a major hold or a pin: the console refuses those until every box reports it can protect the builds they name from pruning, and says how many boxes it is waiting on. Before rolling any box back below that release, turn retention off for the deployment (`carlos releases retention --off` for each app that has one), because an older housekeeper prunes builds a pin or a held instance still needs. After such a rollback the console shows *settings not enforced* for instances on the older boxes: they follow their channel until the box is rolled forward again." |
| + }, |
| + { |
| + "id": "settings.cli.set-done", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "%s: updates %s, channel %s, major %s, pin %s" |
| + }, |
| + { |
| + "id": "settings.cli.set-flag-channel", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "the channel to follow (the app's pipeline rules apply)" |
| + }, |
| + { |
| + "id": "settings.cli.set-flag-major", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "stay on this major version of stable; empty clears" |
| + }, |
| + { |
| + "id": "settings.cli.set-flag-pin", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "run exactly this build; empty clears" |
| + }, |
| + { |
| + "id": "settings.cli.set-flag-updates", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "auto or manual; empty restores the app's default" |
| + }, |
| + { |
| + "id": "settings.cli.set-not-enforced", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "not every box applies update settings yet, so %s may still follow its channel" |
| + }, |
| + { |
| + "id": "settings.cli.set-unchanged", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "%s: nothing changed" |
| + }, |
| + { |
| + "id": "settings.cli.set-usage", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "usage: carlos instances set <host> [--app <a>] [--updates auto|manual] [--channel <c>] [--major <n>] [--pin <build>] (an empty value clears)" |
| + }, |
| + { |
| + "id": "settings.cli.update-done", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "%s: update requested (request %d). Its box picks the build and installs it; it runs on the next start" |
| + }, |
| + { |
| + "id": "settings.cli.update-flag-fast-track", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "skip the safety delay (account owners only)" |
| + }, |
| + { |
| + "id": "settings.cli.update-usage", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "usage: carlos instances update <host> [--app <a>] [--fast-track]" |
| + }, |
| + { |
| + "id": "settings.page.auto-label", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Install new builds automatically" |
| + }, |
| + { |
| + "id": "settings.page.channel-hint", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Change it with carlos instances set --channel. The app's pipeline rules apply." |
| + }, |
| + { |
| + "id": "settings.page.channel-label", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Channel" |
| + }, |
| + { |
| + "id": "settings.page.fast-track", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Skip the safety delay" |
| + }, |
| + { |
| + "id": "settings.page.heading", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Updates" |
| + }, |
| + { |
| + "id": "settings.page.kept", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "kept by the app" |
| + }, |
| + { |
| + "id": "settings.page.major-inherited", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "The app holds it at major %d. Leave this empty to keep the app's hold." |
| + }, |
| + { |
| + "id": "settings.page.major-label", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Stay on major version" |
| + }, |
| + { |
| + "id": "settings.page.not-enforced", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Settings not enforced: this instance's box runs a release that ignores them, so it follows its channel" |
| + }, |
| + { |
| + "id": "settings.page.pin-label", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Pin to build" |
| + }, |
| + { |
| + "id": "settings.page.rate-limited", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Too many update requests. Try again in a minute." |
| + }, |
| + { |
| + "id": "settings.page.refused-until-boxes", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Manual updates, major holds and pins can be turned on once every box runs a release that applies them" |
| + }, |
| + { |
| + "id": "settings.page.requested", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Update requested. The box installs the build and it runs on the next start." |
| + }, |
| + { |
| + "id": "settings.page.save", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Save" |
| + }, |
| + { |
| + "id": "settings.page.saved", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Update settings saved." |
| + }, |
| + { |
| + "id": "settings.page.status", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Installed %s. Serving %s. Wants %s: %s" |
| + }, |
| + { |
| + "id": "settings.page.update-now", |
| + "file": "internal/updatewords/words_surfaces.go", |
| + "text": "Update now" |
| + } |
| + ] |
| +} |
| \ No newline at end of file |
diff --git a/internal/updatewords/words_approved_test.go b/internal/updatewords/words_approved_test.go| index 3721227d4..d44466b3e 100644 |
| --- a/internal/updatewords/words_approved_test.go |
| +++ b/internal/updatewords/words_approved_test.go |
| @@ -31,9 +31,8 @@ func loadApproved(t *testing.T, path string) approvedRecord { |
| // The copy Paul approved lives in four records: plan 2's (2026-10-09, the |
| // authorize strings), plan 3's (2026-10-11, the settings.console.* strings), |
| -// plan 4's (the settings.box.* strings), and plan 5's (the settings.cli.* |
| -// and settings.page.* strings; the record is written only after Paul approves |
| -// them, so this test fails with the file missing until then). |
| +// plan 4's (2026-10-12, the settings.box.* strings), and plan 5's (2026-10-13, |
| +// the settings.cli.* and settings.page.* strings). |
| // Each record must name exactly its own IDs, each text must be what Text |
| // returns byte for byte, each entry must name the file that holds it, and |
| // together the four records must name exactly the IDs of All(), so a new |
diff --git a/internal/updatewords/words_surfaces.go b/internal/updatewords/words_surfaces.go| index f134b52af..31784e311 100644 |
| --- a/internal/updatewords/words_surfaces.go |
| +++ b/internal/updatewords/words_surfaces.go |
| @@ -4,9 +4,8 @@ package updatewords |
| // instances set and update, the list's REASON cell, the console instance |
| // page's Updates section, and the docs and roll notes. |
| // |
| -// TODO-COPY: these are drafts awaiting Paul's copy review (plan 5 Task 1). |
| -// None ships until docs/superpowers/plans/2026-10-07-instance-settings-5-copy.json |
| -// records his approved text and each Text below is replaced with it. |
| +// Approved by Paul on 2026-10-13, unchanged from the drafts |
| +// (docs/superpowers/plans/2026-10-07-instance-settings-5-copy.json). |
| func init() { |
| add( |
| // carlos apps set |