| 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 | |
| 5 | Every user-facing string plan 2a (`2026-10-16-region-ha-2a-core.md`) |
| 6 | writes: console refusals, CLI output and usage lines, the operator alert, |
| 7 | and the docs prose. The gate is `approved_region_ha_copy_test.go` at the |
| 8 | repo root, which reuses the moves gate's parser, so the format is the |
| 9 | moves record's: one table per heading, columns id, file, text, status. |
| 10 | |
| 11 | The 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 | |
| 30 | Placeholders: `<box>` a box's roster reference or label; `<role>` a role |
| 31 | name (default, legacy or platform); `<region>` a placement code or the |
| 32 | home 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 | |
| 56 | One refusal for every door that chooses a box (H27): instance create, |
| 57 | domain 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 | |
| 66 | Added at Task 10's build (controller ruling): every sentence a person reads |
| 67 | that the role doors, the CLI and the docs section carry and the rows above |
| 68 | do not. Command syntax (the usage synopses and the docs example's commands) |
| 69 | is not copy. The numbering follows Task 11's, which is why these start at |
| 70 | RHA-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 | |