diff --git a/docs/plans/2026-10-20_case2-rows.md b/docs/plans/2026-10-20_case2-rows.md index 4b25e76ec..10a818f44 100644 --- a/docs/plans/2026-10-20_case2-rows.md +++ b/docs/plans/2026-10-20_case2-rows.md @@ -374,15 +374,20 @@ every agent-to-human message in a library business. - Owner: an Opus 5.5 seat that Sage picks. - Reviewer: Webby. -- After: C2-05a. +- After: C2-05a, and C2-04, since both change `organizationWriter.write`. ### Files owned - `packages/library/src/guard.mjs` and its export. -- `packages/bus/src/broker.mjs`: the pre-check on `message.send` to `human`, and the page store beside the - web verbs (`:1516`, `:1521`). +- `packages/business/src/business.mjs`: `replyLimits` in `TOP_KEYS` (`:21`), any value accepted. +- `packages/business/src/organization.mjs`: the M11 check in `write` (`:177`), next to M9. +- `packages/cli/src/limits.mjs`: the `mosaic limits replies --file ` verb, which calls + `library.limits.set`. +- `packages/bus/src/broker.mjs`: the pre-check on `message.send` to `human`, the page store beside the + web verbs (`:1516`, `:1521`), and the human verb `library.limits.set`. - `packages/bus/src/web.mjs`, only if the page store needs the fetched text passed out. -- Tests in `packages/library/tests` and `packages/bus/tests`. +- Tests in `packages/library/tests`, `packages/bus/tests`, `packages/business/tests` and + `packages/cli/tests`. - `docs/case2/SETUP-SHEET.md`, the reply limits paragraph only (`:115-118` at aca16404c), so the sheet and the guard land together (webby-0139 N1). @@ -394,24 +399,42 @@ The guard as design 5.2 sets it out: the JSON body, the M5 limits, the checks an whether to run. The page store keeps the last 20 broker fetches per session, 200 KB each, in memory, dropped when the session ends. -The `idea` limits are 3 items per reply and 120 characters per item (Q219, mos-1299). The setup sheet's -limits paragraph says at most 3 ideas of up to 120 characters each and drops "You or Jason can ask for -lower limits", since Jason has set them. +Every M5 limit is a setting (Q222, mos-1302), as the design's ruling after r11 on reply limits sets +out: the seven `replyLimits` keys, their defaults and valid values. The defaults are 10 items, 1,200 +characters of item text, 3 ideas of 120 characters (Q219, mos-1299), 300 for the other kinds, and +max(12, 25%) for a correction. The guard reads the business file on each check, not the broker's copy +from start. Each key that is missing, `null`, a string, a fraction, negative, below its minimum or above +its ceiling uses its default, and the guard has no path without a number. `library.status` shows the +limits in force and the keys that fell back. M11: only the human's `library.limits.set` changes them, +and `organizationWriter.write` refuses a changed `replyLimits` from any other actor with +`organization-reply-limits-human-only`. A refusal reason names the key and its value in force. -Tests: one pass and one refusal for each check in M5 and 5.2, each limit refused one past its boundary -and accepted at it, so 4 ideas and a 121-character idea refuse. Each goes through the runner's RESULT -path and through `send_message`, and once with a non-creative sender in a library business. The -`messages` count is unchanged on each refusal. +The setup sheet's limits paragraph gives the defaults, says they are settings that she or Jason can +change, and drops "You or Jason can ask for lower limits". + +Tests: one pass and one refusal for each check in M5 and 5.2, each default limit refused one past its +boundary and accepted at it, so 4 ideas and a 121-character idea refuse. Each goes through the runner's +RESULT path and through `send_message`, and once with a non-creative sender in a library business. The +`messages` count is unchanged on each refusal. Settings tests: a changed value takes effect on the next +reply with no restart, in both directions. Each invalid value above, a non-object `replyLimits` and a +missing one use the defaults, and the business file still loads. M11 tests: the human's +`library.limits.set` works, and an out-of-range value refuses `invalid-request` with the file unchanged. +`library.limits.set` from an agent session refuses `human-required` and from the tester +`tester-refused`. The chief of staff's `organization.set`, the tester's `instances.set` and a direct +`write` with a changed `replyLimits` refuse, and the file and `changes.jsonl` are unchanged. A mutant +without the writer check fails. ### Out of scope The runner retry and the runner's notices (C2-07). The Console's rendering (C2-10b). Any classifier of -prose. The idea-text residual is 360 characters per reply, closed by Jason in Q219 (design 5.1, 10 step 8). +prose. The idea-text residual is 360 characters per reply at the defaults, closed by Jason in Q219 (design +5.1, 10 step 8). Any change to the reply format waits for Jason's Q29. ### Gate -Webby approves the manifest. The library, bus and harness suites are green on Sage's gate, along with -every `scripts/test-*.sh`. +Webby approves the manifest. The library, bus, business, cli and harness suites are green on Sage's +gate, along with every `scripts/test-*.sh`. The build doesn't start until Mos relays Jason's answer to +Q29 (mos-1302). ---