carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1# Region HA plan 2a: copy record (pending Paul's review)
2
3**Approved by Paul, 2026-10-16**, through the copy review: all 25 rows (RHA-C1 to RHA-C25) unedited.
4
5Every user-facing string plan 2a (`2026-10-16-region-ha-2a-core.md`)
6writes: console refusals, CLI output and usage lines, the operator alert,
7and the docs prose. The gate is `approved_region_ha_copy_test.go` at the
8repo root, which reuses the moves gate's parser, so the format is the
9moves record's: one table per heading, columns id, file, text, status.
10
11The rules:
12
13- A row is `pending` until Paul approves it in the copy review (the
14 `copy-review` skill). His edits are applied to the text here verbatim
15 and the row becomes `approved`.
16- No pending string reaches code, CLI help or docs. The task that writes
17 a row's text adds its id to `regionHACopyBuilt` in the gate in the same
18 commit, and from then on the gate fails unless the row is `approved`
19 and its text is in the file it names. Tasks 10 and 11 therefore wait
20 for their rows' approval.
21- In a Go file the text is one string literal, or one `fmt.Sprintf`
22 format, equal to the row with `%s` where the row has a `<placeholder>`.
23 A row whose file cell says "a fragment" is a piece of a larger literal
24 (the `carlos system` usage text).
25- No em dashes. A full stop and a new sentence instead. The role doors'
26 refusals start lower case, as the console's other CLI refusals do; the
27 no-capacity refusal is shared with the browser's domain door, so it is
28 a capitalised sentence, as `claimResponseUnavailable` is.
29
30Placeholders: `<box>` a box's roster reference or label; `<role>` a role
31name (default, legacy or platform); `<region>` a placement code or the
32home region's name.
33
34## Box and group roles (Task 10)
35
36| id | file | text | status |
37|---|---|---|---|
38| RHA-C1 | internal/console/apiboxroles.go | role must be default, legacy or platform | approved |
39| RHA-C2 | internal/console/apiboxroles.go | a group's role must be default or legacy | approved |
40| RHA-C3 | internal/console/apiboxroles.go | could not read the box roster. Try again. | approved |
41| RHA-C4 | internal/console/apiboxroles.go | the box roster changed while the role was being saved, and nothing was changed. Try again. | approved |
42| RHA-C5 | internal/console/apiboxroles.go | could not save the role. Try again. | approved |
43| RHA-C6 | internal/console/apiboxroles.go | no enrolled box is named <box> | approved |
44| RHA-C7 | internal/console/apiboxroles.go | <region> has no group | approved |
45| RHA-C8 | internal/console/apiboxroles.go | <box> is retired, so it takes no role | approved |
46| RHA-C9 | system_roles.go | <box> now has the <role> role | approved |
47| RHA-C10 | system_roles.go | the group in <region> now has the <role> role | approved |
48| RHA-C11 | system.go (a fragment of the usage) | whether new instances may be placed on a box. A legacy or | approved |
49| RHA-C12 | system.go (a fragment of the usage) | platform box keeps the instances it has and takes no new ones | approved |
50| RHA-C13 | system.go (a fragment of the usage) | the same for every box a region's group has enrolled, and for | approved |
51| RHA-C14 | system.go (a fragment of the usage) | every box it enrolls later | approved |
52| RHA-C15 | docs/site/cli.md | Box and group roles | approved |
53| RHA-C16 | docs/site/cli.md | carlos system box role says whether new instances may be placed on a box. A box with the default role can take them. A legacy or platform box keeps the instances it has and takes no new ones: no new instance, relocation or move lands on it. carlos system group role sets the role of every box a region's group has enrolled, and of every box it enrolls later. Both work only on a console with region HA on. | approved |
54## No box has room (Task 11)
55
56One refusal for every door that chooses a box (H27): instance create,
57domain attach, standalone sidecar create and the move door's destination.
58
59| id | file | text | status |
60|---|---|---|---|
61| RHA-C17 | internal/console/nocapacity.go | No box in <region> has room right now. Try again in a few minutes. | approved |
62| RHA-C18 | internal/console/nocapacity.go (the operator alert's subject) | No box in <region> has room | approved |
63| RHA-C19 | internal/console/nocapacity.go (the operator alert's body) | A request in <region> was refused because no box there can take it. Every box is full, stale or excluded by its role. Add a box, or free memory or disk on one, and check the eligible-capacity alarm for <region>. | approved |
64## More Task 10 rows
65
66Added at Task 10's build (controller ruling): every sentence a person reads
67that the role doors, the CLI and the docs section carry and the rows above
68do not. Command syntax (the usage synopses and the docs example's commands)
69is not copy. The numbering follows Task 11's, which is why these start at
70RHA-C20.
71
72| id | file | text | status |
73|---|---|---|---|
74| RHA-C20 | system_roles.go | unreadable response: <error> | approved |
75| RHA-C21 | docs/site/cli.md | Ops account owners and `CARLOS_SYSTEM_OPERATORS`. | approved |
76| RHA-C22 | docs/site/cli.md | Do not set a role until every box and console in the deployment runs a release that knows about roles. A box on an older release cannot read a roster that carries one. | approved |
77| RHA-C23 | internal/console/apiboxroles.go (the ops audit row's detail) | gave <box> the <role> role | approved |
78| RHA-C24 | internal/console/apiboxroles.go (the ops audit row's detail) | gave the group in <region> and its boxes the <role> role | approved |
79| RHA-C25 | internal/console/apiboxroles.go | the box roster can't be changed right now. Try again later. | approved |