| D-M4-27-0 |
2026-10-18 |
Base int/m1-wave42 at c5a86a6, branch feat/M4-27-admin-grants in its own worktree; the branch is not merged locally and not pushed, the PR lane lands it. The rows stand in a section of the ticket because the base has no section 10 in this file. The base names chapter 07 07-rechte.md and has no language-check markers around the example of 9.3; the markers of main come in as the first commit, because the fake server and the tests read the example between them. Readers look for 07-permissions.md first, then 07-rechte.md. The operations the brief names (listGrants, createGrant, previewGrant, getGrant, revokeGrant, explainSpaceAccess, explainChannelAccess, viewAsUser) and their actions equal those of origin/main. |
Instructions of the launcher, which override the brief's landing step; merged layout wins over the brief (D-W-100, D-W-114). |
| D-M4-27-1 |
2026-10-18 |
Preview on every step change: the wizard calls previewGrant with the full request (subject, target, level, capabilities, expiry, reason) after every change once the request is complete, 300 ms debounced; an answer for an older request is dropped. "Confirm" is enabled only while the shown preview belongs to the current request, allowed is true and the reason is set, so the step-up always follows a preview of exactly what is created. |
Brief Design note 1; 07 9.3: the console shows the preview before every confirmation. |
| D-M4-27-2 |
2026-10-18 |
Server text only: the panel shows text unchanged with text_locale as the Text locale; around it the client shows labels only (effects as "Gets", "Loses", "becomes" of the server's levels, the invariant code through problemText with agent and affected names, the hints as fixed labels with names, the denial reason through problemText(forbidden, reason) with three new reason texts of 07 4.1). I1 shows "Switch the agent to organization first."; the guided switch stays M4-28. |
Brief fixed requirements 9, 12, 13; 07 9.3. |
| D-M4-27-3 |
2026-10-18 |
The run-time example: the fake server (grantPreviewExample of sync_engine/testing) and the admin_ui fake read the first fenced block between the language-check markers after the heading of 07 9.3 and answer it with text_locale = de for Sam, trigger, channel Marketing/Kampagnen with an expiry; the tests compare against the same read. No German sentence is in a tracked test file. |
Brief Design note 3; D-W-94. |
| D-M4-27-4 |
2026-10-18 |
AccessRepository (ApiAccessRepository) holds the grant calls; AdminRepository implements it and ApiAdminRepository forwards to an ApiAccessRepository, so the shell and the app keep one repository (D-M4-26-1). Its types are prefixed Admin or Access (AdminTarget, AdminSubjectKind, GrantHint) because api_client already exports AccessTarget, GrantSubjectKind and PreviewHint. The test "no source of admin_ui reads grants" now exempts lib/src/grants/, lib/src/access/ and the access repository: they show grants and explanations and derive no control from them. |
Strictly modular screens without a second data source in the shell; 15 1 principle 1. |
| D-M4-27-5 |
2026-10-18 |
Grants live at /admin/grants/<target key> (instance, space.<id>, channel.<id>): a target picker over listSpaces and listSpaceChannels, the grants of the target with "Revoke", "Create access grant" (the wizard in a dialog, target preselected) and "Who has access?" for a space or channel, shown below the list. "View as person" is the picker of A3 inside "Who has access?" and opens the snapshot in a dialog; the step-up of viewAsUser comes from the interceptor. Names of IDs in answers come from the directory lists the caller may read; a refused list leaves the IDs as they are. |
01 5.2 A1 to A4; brief Scope. |
| D-M4-27-6 |
2026-10-20 |
Port onto main from the integration squash of int/m1-wave44: the six own commits of the ticket on top of the M4-26 port; the commit with the language-check markers in 07-rechte.md is left out, because main carries these markers in 07-permissions.md; INT-W44/0 is a union with M4-20 and is not needed; the CHANGELOG and the ruling log take only this ticket's entries; grant_preview_test.dart gets its macOS and Windows lines in apps/client/platform-tests.json (D-M4-18-19); the goldens grants_view_as and grants_wizard_preview are recorded again after D-M4-25-10. |
The PR lane ports only the ticket and the integration fixes it needs; all goldens of admin_ui and apps/client pass in a Linux amd64 container with Flutter 3.47.7. |
| D-M4-27-7 |
2026-10-20 |
contract_documents.g.dart also carries docs/spec/07-permissions.md; grantPreviewExample reads the example of 9.3 from that copy when no repository is above the working directory, like the action catalogue of D-M4-26-9; the older file name 07-rechte.md is no longer read by the fake server. |
The macOS app sandbox cannot read the repository, so grant_preview_test.dart would fail in the macOS platform job as admin_step_up_test.dart did. Test: test/fake_server/embedded_spec_test.dart. |