31 KiB
Row 287 design notes: C2-21, the grant executor for a library project (#1792)
Builder Megavolt, reviewer Dewey, gate owner Sage (sage-2910, Q226, mos-1310). Branch megavolt/row287, a
doc-only draft off 94c33a43c, written during Gizmoduck's slot with local git only. The build starts on the
candidates of row 285 (C2-08b, Scrooge) and row 226 (C2-13b, Gosalyn) and rebases onto their landings
(Q177). Nothing here has been run.
The brief is "C2-21 the grant executor for a library project" in docs/plans/2026-10-20_case2-rows.md at
94c33a43c. Its gate: Dewey approves the manifest; the bus suite, the Gitea Docker test and the install test
are green on Sage's gate, along with every scripts/test-*.sh; a search of the test run's output for the
fixture admin and seat tokens finds nothing.
Sources (line cites at 94c33a43c)
packages/bus/src/gitea-grant.mjs: the admin api (adminApi, no collaborator call yet), the seat api (forkGet,fork,repos),identitySha256,REPO_PAGE/REPO_PAGES.packages/bus/src/broker.mjs:#giteaRole:2132,#giteaTargets:2149,#giteaGrantBindingand its block :2167-2196,#giteaRecheck:2200,#giteaStepsstep 4 :2425-2441 and step 5 :2442-2473, thegrant.appliedbody and notice :2480-2488, the host refusalshost-creative-role:1106 and :1254.packages/business/src/business.mjs:266-288: akind: "library"project goes throughcheckMapping, and :286 refuses any role whosepublishnames a library project.packages/library/src/mapping.mjs: a library entry carriesremote,branchand an optionaluser.packages/bus/tests/gitea-grant.test.mjs:297-334 pins thegrant.appliedbody (forks: [...]) and the block;fake-gitea-api.mjskeeps collaborators as a list of logins with no permission.packages/bus/tests/gitea-grant-docker.test.mjs: the scratch gitea/gitea:1.27.1 container; it usesos.tmpdir().
1. Rulings, blockers and questions
- B1, the publish rule.
business.mjs:286refuses anypublishentry that names a library project ("library repositories cannot be published by agents"). The brief's chief needspublish: ["books"], and a creative seat needs the library project inpublishfor#giteaRoleand#giteaTargetsto pass. No test under packages/*/tests or scripts pins the :286 message (positive control: "publish names" hits agent-identity.test.mjs). - Ruling sage-2916 (18:42Z 10-22), files-owned extension: row 287 owns
packages/business/src/business.mjs:283-291 and thepackages/business/tests/business.test.mjscases for it. Row 285 leaves business.mjs alone. Conditions:- The refusal is rewritten, not deleted. A library project in
publishloads only for a creative instance (CREATIVE_DEFINITIONS) or the chief of staff, each with a gitea credential. Any other instance still refuses, with a new message that names the rule. Tests cover both sides. The grant path serves an allowed one with collaborator reach, never a fork. (To confirm on the base: how business.mjs names the chief, by definitionchief-of-staffor bylaunch.by.) - Before in-review, grep 'packages//tests/' and
scripts/test-*.shagain for the old message text, with a positive control. - PRD 1.15 REQ-LIB-6 is the authority for this. If Mos changes 1.15 (sage-2914,
library.writerouting), check this text against what lands.
- The refusal is rewritten, not deleted. A library project in
- Q1 to Q4 below: Sage accepted them as stated assumptions (sage-2916). Dewey checks them in the round.
- Q1, the hash.
identitySha256covers identity, publish and remotes, not a project's kind or the role's definition name, and the level comes from the definition name. Proposal: add alibrarykey ({project: level}) to the hash input only when a publish project is a library, so every non-library grant's hash stays byte-identical and no open grant turnsdecision-mismatchon upgrade. - Q2, the event.
grant.appliedand its notice carryforks, and the test at :322 pins that body. Proposal:forksstays (empty when every target is a library), and arepositories: [{project, repository, level}]key appears only when a library target exists. The notice names them the same way. - Q3, mixed raises. A creative raise must name only library projects (mos-1320 item 2). The chief may
name a library project next to forked ones in one raise; step 4 forks the others and adds the collaborator
on the library one. Proposal: allow that, and test it. Under sage-2916, any other non-creative instance
can't hold a library project in
publishat all, so the business file refuses it before any raise. - Q4, the token search for the Docker test. The fake API's tokens are fixtures and can be grepped. The Docker test's tokens are minted by the container at run time, so the gate grep can't know them in advance. Proposal: the Docker test captures its own diagnostics and asserts that no token it minted appears in them, and the gate greps the run's output for every fake-API fixture token.
Early look, Dewey (dewey-0862, 18:53Z 10-22, on 5bcfef0ad, read only), folded
These replace the matching proposals in sections 2 and 3 where they differ.
- Q2 accepted.
forksstays and is[]when every target is a library.repositories: [{project, repository, level}]appears only when a library target exists.repositoryis the remote URL, the same form asforks; thefull_namethat step 5 matched is asserted in a test and doesn't go in the body. The only src reader offorksis the notice (:2483). The notice drops its forks clause when the list is empty and adds "repositories: ()". A non-library notice keeps today's text. - The read line: "The token can read every path of this repository. It can't push to it, because the user
is a read collaborator." The seat scope is still
write:repository(:2189). - B-a:
\nForks:(:2187) prints only when a fork target exists. - B-b: "Step 5 checks that this is only its forks." (:2193) is unchanged with no library target. With one, it reads "Step 5 checks that this is only its forks and the repositories above at their level."
- B-c:
others(:2181, :2194) splits. An untargeted library project in publish gets its own line, "It may also reach these repositories as a collaborator: ()", because a revoke leaves the collaborator entry and step 5 accepts it publish-wide. Forked others keep today's line. L8 covers B-a to B-c. - Q1 holds. Test: a project flipped to
kind: "library"between the raise and the recheck givesdecision-mismatch(L10). - Q3 holds. Library projects stay out of step 5's fork upstream set (:2446), so a fork of her repository
refuses
gitea-reach-wider; L4 covers it. - Q4 holds if the assertion covers what the test prints, TAP stdout and stderr, not only an in-test buffer. The Docker test prints one line, "minted N, hits 0", for the gate to grep.
- Step 5 compares exactly the keys
admin,pushandpull. BUILD.md records F-B's actualpermissionsobject, so an extra Gitea key can't pass or fail by accident. - The chief is named by definition
chief-of-staff, notlaunch.by, matching brokerSTAFF_TO(:240) and row 286 (dewey-0860). A fired chief keeps its roles entry (instance-settings.mjs:355), so B-2 also loads a fired chief's entry.
The definitions' gitea credential (dewey-0865)
At 94c33a43c, chief-of-staff.json and all six creative definitions have credentials: [], so #giteaRole
(:2137-2143) would refuse them all gitea-not-declared. Row 287 doesn't add the credential. Row 285 (C2-08b)
owns those role files, and its brief (case2-rows.md :1823-1824) gives each creative role and the chief
[{"service": "gitea"}], which Mos authorized in mos-1309 item 5. That is why 287 builds after 285 lands. Two
notes for 285, not for this row:
- The grant path reads only
service === 'gitea'. The seat token's scopes come fromSEAT_SCOPESin code, not from the definition. coder.json addsscopes, and 285's validator decides whether the bare form passes. - Five bus tests read roles/chief-of-staff.json directly (chief-of-staff, fire-revokes-grants, instances-verb, names, routes-verb), and 285's gate names the business suite, not the bus suite.
- Settled (sage-2950, 19:06Z 10-22): 285's gate runs the bus suite whole (sage-2946), and Scrooge has the role.mjs no-scopes check. Dewey withdrew dewey-0865 (dewey-0867). Mos withdrew the mos-1332 item 3 publish fence (mos-1333), so business.mjs stays out of 285's files and sage-2916 stands as written.
- Correction (sage-2958, Scrooge): role.mjs refuses
{"service": "gitea"}with no scopes (checkGiteaScopes :100-111, util.mjs:42); only a host entry may omit them (:134). So 285's entries name their scopes, equal to SEAT_SCOPES (sage-2915). The chief-of-staff.json readers are seven, not five: add host-run and reload. 287's tests that build definitions give gitea entriesscopes: ["read:user", "write:repository"].
2. The change (proposed)
- Order in the executor: step 2 (user) and step 3 (mint) as today. Step 4, for each target: a library
project gets
PUT /api/v1/repos/{owner}/{repo}/collaborators/{user}with{permission}through the admin api, opcollaborator-add, thetokenheader, logged like every call. Expect 204, or anything else fails withgitea-failed. A non-library project forks as today. - The level:
writewhenCREATIVE_DEFINITIONS.includes(role.definition),readotherwise. The raise has no field for it;giteaGrantCheckstill refuses any key other than method, agent, rotateBy and target. - Step 5: the upstream set stays for forks. A repository is accepted when it is the user's fork of a
non-library publish upstream (today's rule), or when its
full_nameis a library publish project'sowner/repoand itspermissionsare exactly{admin: false, push: level === 'write', pull: true}. Any other repository, a wider permission oradmin: truerefusesgitea-reach-widerwith the repository named. #giteaRole: theCREATIVE_DEFINITIONSrefusal becomes "unless every project the raise names is a library project".#giteaRolegets the raise's project list from its two callers (the binding at :2168 and the recheck at :2201), so it can decide. The comment cites mos-1320 item 2 and keeps mos-1163 for every other project and every host grant. The host refusals at :1106 and :1254 and their tests stay as they are.#giteaTargetsreturns{project, upstream, library: true, repository, level}for a library project and today's{project, upstream, fork}otherwise.forkProblemstill runs for both: a library remote on another host refusesremote-host-mismatch, and one the seat user owns refusesremote-not-fork.- The block: a library target prints
Repository: <remote>, level <write|read>.in place of its fork line, plus the brief's line "The token can write every path of this repository. Only the bus's path check limits it to supporting folders." for awritelevel. For areadlevel the line says the token can read every path. (The brief gives only the write line; Dewey can rule the read wording.) - Revoke deletes the token as today; the collaborator entry stays, as forks do. A fire sets
prohibit_loginas today. Neither path changes. scripts/case2-install.sh(row 226's file): the chief of staff's instance getsidentityandpublish: ["books"]. If#grantableAgentrefuses the chief as its own target, the row stops and goes to Sage. Read of :2037-2042 says it passes when the chief islaunch.by; a test proves it.
3. Tests (proposed)
Docker (gitea-grant-docker.test.mjs), each fact first, before any code is trusted:
- F-A: the admin token with
ADMIN_SCOPESadds a collaborator to a repository the admin account doesn't own. F-B:/user/reposwith the seat token lists that repository with the grantedpermissions. Either failing stops the row; the output goes to Mos. - F-C (recorded, not gating): a protected file pattern on her branch refuses a seat user's push to a story path while her own push passes. F-D (recorded): branch protection refuses a seat user's force-push while a normal push passes. Each logs its result as a diagnostic and doesn't fail the file; BUILD.md and a message to Mos carry them.
Fake API (gitea-grant.test.mjs, fake-gitea-api.mjs): collaborators carry a permission, repoJson
returns permissions, and the PUT route requires a site admin token with write:repository.
- L1 a creative definition gets
write; L2 the chief getsread, including a mixed raise of the library project and a forked one (Q3). - L4 a repository with
push: truefor a read grant, oradmin: true, or a fork of her library repository, refusesgitea-reach-widernaming it. - L5 revoke deletes the token and leaves the collaborator.
- L6 a non-library project still forks, and its
grant.appliedbody is byte-identical to today's. - L7 a creative raise naming a non-library project, or a library and a non-library one, refuses
gitea-not-declared. - L8 the block holds the repository, the level and the brief's line, plus B-a to B-c (dewey-0862); the notice has no "forks: ." on a library-only grant.
- L10 a project flipped to
kind: "library"between the raise and the recheck givesdecision-mismatch. - L9 the chief raises its own grant through
credential.mint. - Install test: the business file gives the chief
identityandpublish.
Business (business.test.mjs, sage-2916): B-1 a creative instance with identity, a gitea credential and a
library project in publish loads; B-2 so does the chief; B-3 any other instance with a library project in
publish refuses with the new message; B-4 a creative instance or the chief without a gitea credential
still refuses under the existing publish needs identity and a gitea definition rule. Mutant: M5 drop the
creative-or-chief condition (any instance loads), killed by B-3.
Mutants: M1 drop the library-only condition from #giteaRole (the brief's), killed by L7. Others to list
once the code exists: the level forced to write (L2), step 5's exact-permission check loosened to
push || pull (L4), the fork path taken for a library project (L1, a fork call counted).
4. Gate plan (draft)
On Sage's CLEAR, with TMPDIR from mktemp -d /mnt/storage/scratch/tmp/gXXXXXX, stopping at the first red:
the touched bus test files whole, then the mutants, the bus suite, the Docker test (checking for ^skip
first, since a missing image skips it), the install test, every scripts/test-*.sh under row 281's limits,
then the token grep over the saved output. Timeouts and limits go in this file before the run.
Runs
Filled in after the runs.
Steelbeak takeover (2026-10-24, base 18334d713)
Sage-4124 dispatches Steelbeak as builder, Boyd first reviewer and Dewey landing reviewer. The
inherited text above is retained as design history; this section records current execution.
No test has run. Root npm ci uses this worktree only. Short TMPDIR is
/mnt/storage/scratch/tmp/1ysAmV; every scripts/test-*.sh invocation will use timeout -k 10.
Canonical queue next returned nothing while assignment was pending. Start op steelbeak-287-start
refused the sage-4122 assign lock; retry no sooner than two minutes after that refusal.
Delta at 18334d713: broker grantableAgent 2667-2672 (launch.by self eligible), giteaRole 2760-2777
(new chief refusal), targets 2781-2789, binding/block 2799-2830, recheck 2832-2842, step4
3070-3085, step5 3087-3120, applied/notice 3124-3132. gitea-grant hash 75-80 and API 250-264
unchanged. Business publish fence is 291-299. Install library helper is 109-127. Row286
library-credential.test.mjs seeds 153-179, consumed at 219, 225 and 286, must become real minting.
Chief scope delta raised in steelbeak-0001: row285 declares read scopes and sage-2921 fences the existing write-scoped executor; inherited dewey-0862 retained SEAT_SCOPES and Q3 allowed mixed chief grants. Await explicit resolution of that boundary before implementing it. Other accepted rulings (conditional library hash, optional repositories event key, exact permission keys, business publish fence, preserved host creative refusals) remain applicable.
Tests planned: Docker F-A/F-B gating first; F-C/F-D recorded. Fake L1/L2/L4-L10 and business B1-B4 from inherited plan; install chief identity/publish and row286 real-mint replacement. Mutants M1 library-only guard, M2 forced write, M3 loose permissions, M4 library fork, M5 missing creative-or-chief publish fence. No suite runs before Sage CLEAR.
Rulings
Sage-4125 (2026-10-24 14:49:27Z), replacing Q3 and dewey-0862's chief SEAT_SCOPES line:
- Chief grants name only library projects; mixed and fork-only chief raises refuse gitea-not-declared.
- Library mint scopes come from the definition's gitea credential: chief read:repository/read:user, creative its declared scopes. Fork grants retain SEAT_SCOPES.
- Role comment retains sage-2921's reason and cites mos-1320 item 2 and sage-4125.
- L2 pins chief read collaborator and read token scopes; L7b pins chief nonlibrary/mixed refusal; M6 substitutes SEAT_SCOPES for library minting, M7 drops chief library-only condition.
- Stop/report if grantableAgent or business validator still refuses chief after that condition.
Root npm ci passed (128 packages), webui npm ci passed (2), both worktree-local with ignore-scripts, no-audit and no-fund. Start retry met a different queue lock (louie-290-in-review); no bypass.
Prepared tests only (not executed): Docker F-A/F-B against both creative write and chief read users; F-B prints the actual permissions object. F-C/F-D use a private scratch repo and HTTP Git, logging only exit codes. A parent captures the fact child's entire TAP stdout/stderr and checks actual minted tokens before emitting diagnostics. New executor/business/install cases are drafted, including same-definition-hash level drift. Production files and fake API remain unchanged until Docker facts and expected RED evidence are recorded under CLEAR.
Row286 T7/T9 fixture draft now raises chief/books, resolves the human yes and awaits the executor; asserts repositories read level and actual token read scopes. The mapping remote is the fake's acme/books; revoke/fire assertions are unchanged. This intentional replacement is expected RED on the pre-C2-21 executor, separately from regressions in unchanged tests. No execution yet.
Implementation sequence and acceptance
After CLEAR: run only the C2-21 Docker facts first, under a 360-second outer timeout, and stop/report if F-A or F-B fails or skips. Then run new C2-21 tests and the intentionally replaced T7/T9 cases against unchanged production to establish expected RED. Save the evidence and report the first RED. No production fix until that evidence exists. Old tests retain assertions; the old chief refusal case still targets a non-library project and should remain green.
Implementation boundaries: definition-based scopes only for library minting, collaborator PUT through admin token, exact admin/push/pull check publish-wide with library projects excluded from fork parents, conditional library hash input preserving legacy hashes, optional repositories event field preserving legacy event shape, scope-accurate block/notice. Business library publish remains fenced to creative or chief and existing identity/credential validation. Install adds only chief identity/publish for the library profile. Host creative refusals remain untouched.
Builder verification after expected RED and fix: touched test files whole (600 seconds each), bus, business and cli whole (1800 seconds each); mutants M1-M7 with targeted test filters (180 seconds each), restoring source after each; Docker whole (600 seconds); all scripts/test-*.sh (1200 seconds each, timeout -k 10); token search across saved output. Tests do not run concurrently. Stop on an unexpected old-test RED or second RED and report to Sage before any remediation. The gate's cli skip-list rules and Sage's slot ownership remain authoritative. No live host change, push to refactor, merge or deployment is authorized. Own-branch push is authorized after applicable suites are green.
Canonical start succeeded at 14:56Z: ok steelbeak-287-start rev 3955 row 287 briefed→in-progress.
Prepared all independent pre-CLEAR work; no tests, production edits, commits or pushes. Reported
ready in steelbeak-0004. The first execution is the Docker facts, never a fake or package suite.
CLEAR run (sage-4130, 2026-10-24 15:04Z)
Worktree-local root npm ci passed (128 packages) and webui npm ci passed (2), ignore-scripts,
no-audit, no-fund. New short TMPDIR /mnt/storage/scratch/tmp/HvDvQ8.
First Docker facts invocation returned a vacuous green: inherited NODE_TEST_CONTEXT made Node skip
the nested runner, minted 0. INVALID evidence, no fact pass claimed; reported steelbeak-0006.
Corrected only the new harness child environment (delete NODE_TEST_CONTEXT) and added a requirement
that four actual tokens were minted. Second facts invocation is running. Production unchanged.
Docker facts (gitea/gitea:1.27.1, corrected harness, rc 0)
Evidence: evidence/docker-facts-r2.log, 1 pass, 0 fail, 0 skip; all four tokens minted and no minted value in complete captured TAP stdout/stderr. Container g287-* removed by t.after cleanup.
- F-A PASS: exact admin scopes write:admin/write:repository/write:user; collaborator PUT on writer/books (admin does not own it) returned 204 for creative write and chief read.
- F-B PASS: seat /user/repos lists writer/books. Actual creative permissions
{"admin":false,"push":true,"pull":true}; chief permissions{"admin":false,"push":false,"pull":true}. Chief token has read:repository/read:user scopes. - F-C NOT ESTABLISHED: Story/** protection rejected both seat push (rc 1) and owner push (rc 1). The required owner control did not pass; do not claim a useful seat-only protected-file fence.
- F-D ESTABLISHED: on protected branch normal seat supporting-file push rc 0, force-push rc 1.
Proceeding to expected RED against untouched production, then sage-4125 implementation.
RED and correction record
New-test first RED: evidence/red-new.log, 17 tests, 4 pass (refusal controls), 13 fail at missing behavior. T7/T9 replacement expected RED: evidence/red-replacement.log, 2 fail gitea-not-declared. After implementation, touched-r1.log: 122 tests, 115 pass, 7 fail, 0 skip, all failures new cases. Stopped/reported steelbeak-0008 before changes. Mos-1590 via sage-4138 approved two fixture fixes: seat-only /user/repos overrides (not admin prechecks) and real declared coder scopes for kind drift. Dedicated-admin refusal already covered by X-G2 "admin set refuses each failed check and writes nothing, then writes the slot once" at gitea-grant.test.mjs:276 (:293 asserts grant-admin-not-dedicated).
Touched-r2.log: 123 tests, 122 pass, 1 fail, 0 skip. New L10's extra zero-network assertion was false: executor correctly performs four read-only admin checks before binding recheck. Stopped/reported steelbeak-0009. Sage-4139 approves exact GET admin checks, no /admin/users, /tokens or /collaborators, unchanged decision-mismatch, and absent grant file/record. Add M10, an early write ahead of recheck. The added no-declared-scopes case ran green before its mutant, an ordering error recorded honestly; its proof will be M8 removing the scopes check, followed by restored green. No prior RED-first proof is claimed for that added case. Add M9 dedication-check removal against existing X-G2.
F-C follow-up (sage-4134): a protected Story/** rule refused owner and seat; the first row depending on owner pushes to a protected branch must resolve this. Record only; no 287 behavior changes. Install choice: books is the chief's read project when present; another library project's existing install support is retained by using the first library project. Default identity is business-id-chief on that project's origin, with a mosaic.invalid email; an explicit input identity is preserved.
Touched-r3.log: 123 tests, 123 pass, 0 fail/skip after sage-4139. No unchanged assertion removed. Mutants M1-M11: all KILLED by assertion failures (rc 1, positive fail count, zero skips), no timeout, syntax or module-load kill. Every edited file restored byte-for-byte after each mutant; runner is mutants.py, evidence/mutants-run.log and evidence/M*.log hold the outcomes. M8's restored proof is the forthcoming full bus run; the added case's initial green remains recorded above.
| Mutant | Change | Catch |
|---|---|---|
| M1 | drop creative library-only guard | L7 creative nonlibrary/mixed |
| M2 | force library level write | L2 chief read |
| M3 | accept pull regardless of admin/push | L4 widened read |
| M4 | fork instead of collaborator | L1 creative write |
| M5 | remove library publish fence | business only creative/chief |
| M6 | library mint SEAT_SCOPES | L2 chief declared read scopes |
| M7 | drop chief library-only guard | L7b chief nonlibrary/mixed |
| M8 | remove declared-scopes check | no-declared-scopes refusal |
| M9 | remove admin dedication check | existing X-G2 |
| M10 | move step2 user-create write before binding recheck | L10 exact GETs, no writes/file/record |
| M11 | omit library kind/level from identity hash | L10 drift |
Full suites in progress
Restored full bus: evidence/bus-suite.log, rc 0, 998/998 pass, 0 fail/skip. This includes restored M8 proof and both Docker tests (fact child diagnostics also carry their own nested summary). Full business: evidence/business-suite.log, rc 0, 283/283 pass, 0 fail/skip. CLI is running sequentially after business at --test-concurrency=2. Every package invocation uses short TMPDIR and an outer timeout -k 10; no live provider opt-in is passed. Docker executor container prefix is now g287-executor-* (only the test's scratch name changed), so the separately required full Docker rerun and final sweep can target only this row's g287-*.
Full CLI: evidence/cli-suite.log, rc 0, 990 tests, 989 pass, 0 fail, 1 skip, duration 851 seconds. The existing skip is packages/cli/tests/federation-acceptance.test.mjs, "FED R7 scratch two-instance acceptance", runner scripts/test-federation-acceptance.sh. That runner must pass in this same gate before the CLI skip is accepted (BRIEF-TEMPLATE mos-1583); no new skipped test was introduced. Dedicated full Docker and install-file reruns are now running; shell gates follow sequentially.
Dedicated Docker whole: evidence/docker-whole.log, rc 0, 2/2 pass, 0 fail/skip; actual F-A/F-B permissions and F-C negative/F-D positive reproduced. Complete captured fact TAP: minted 4, hits 0. Dedicated install whole: evidence/install-whole.log, rc 0, 27/27 pass, 0 fail/skip. Docker shell wrapper adds an EXIT/INT/TERM cleanup for g287-* only, alongside each test's t.after. Every scripts/test-*.sh is now running sequentially at timeout -k 10 1200, NO_COLOR=1 and MOSAIC_TEST_CONCURRENCY=2, with MOSAIC_LIVE_PROVIDER and NODE_TEST_CONTEXT unset. Each script's own scratch-project cleanup remains active. Stop at the first nonzero result; shell-summary.txt records rc.
Shell launcher error: direct timeout invocation of scripts/test-land-work.sh returned rc 126, Permission denied. File is tracked 100644; no assertion ran. Not a test RED. Reported steelbeak-0013; sage-4141 approved bash invocation for this and remaining scripts, matching the landing gate. No chmod or source change. Preserve initial shell-summary.txt and add shell-resume-summary.txt.
Builder verification complete (sage-4130)
All twelve shell scripts passed (shell-summary.txt plus shell-resume-summary.txt), with the recorded rc126 launcher error followed by the approved bash run. Counts: auth 15, conductor 17, config 55, discord 82, extension-package 18, FED 1, foundation 44, land-work 86, push-check 38 checks plus its six killed internal mutants, queue 28 shell checks and 156 node passes, release 15, task 92; zero failed checks. Queue's canonical-only verify/render checks are intentionally skipped by its linked worktree runner. Task's live-provider cases remain off as required by row244 and this assignment.
Summary: bus 998/998; business 283/283; CLI 989 passed, zero failed and the one existing FED skip covered by dedicated runner 1/1 with zero skips and cleanup receipt; Docker whole 2/2; install 27/27; all 12 shell scripts rc0; M1-M11 killed without timeout/syntax kills and byte-restored. Known fixture search: 3 values across 37 logs, hits0. Fact runner checked four actual minted values against complete TAP stdout/stderr, hits0. Fake cases check every issued value against stored data. Final cleanup: no owned test node/chromium processes and no g287 Docker containers; test-task and release network removal checks passed; FED reports no groups/ports/sockets. Other containers and preexisting harness/MCP services were untouched. git diff --check passes.
Scope result: a creative library seat gets collaborator write; chief library read uses its declared read token scopes; creative/chief non-library or mixed raises refuse. Business publish remains fenced to creative/chief; legacy forks/event fields and host creative refusals retain coverage. T7/T9 now mint real chief grants before their unchanged revoke/fire assertions. F-C owner-protection follow-up is recorded above; F-D force-push observation is positive. No live Gitea or host change.
Review handoff: Boyd first, Dewey landing review, Sage gate. Base 18334d713; branch steelbeak/row287. The review manifest freezes all changed code, tests, logs and these notes (excluding only the manifest itself). Commit/push are authorized by sage-4130; review/landing remain separate stages.
First-review doc-only follow-up (Boyd boyd-0034)
Boyd approved the frozen product candidate c2338ed588 and manifest
3683b40a32b68163c3ab0430ee0d6a4603c97882bf62e982d33a40058507c2b6 (56 entries), static review,
no tests or slot use. Dewey received the Q210 landing-review handoff.
Correction to the earlier diff-check claims: plain git diff --check checked the then-current
unstaged changes only. The complete base 18334d713 → frozen candidate diff-check returns rc2 because
raw RED/mutant evidence logs retain Node assertion formatting with trailing whitespace. The complete
product/test diff-check returns rc0. Raw evidence is preserved; do not claim the entire committed diff
is whitespace-clean. This correction changes documentation only and does not rerun or weaken a test.
Old-test numstats, verified with git diff --numstat 18334d713 c2338ed58 (added/deleted lines):
| Existing test file | Added | Deleted |
|---|---|---|
| packages/bus/tests/fake-gitea-api.mjs | 13 | 3 |
| packages/bus/tests/gitea-grant-docker.test.mjs | 127 | 2 |
| packages/bus/tests/gitea-grant.test.mjs | 155 | 0 |
| packages/bus/tests/library-credential.test.mjs | 24 | 35 |
| packages/business/tests/business.test.mjs | 25 | 0 |
| packages/cli/tests/case2-install.test.mjs | 13 | 0 |
Canonical queue move steelbeak-287-r1-review succeeded at rev3963, round1 on #1792. Its automatic review request failed at rev3964 because MOSAIC_GITEA_CREDENTIAL_FILE is unset; this seat has no Gitea credential. No substitution or secret access attempted. Sage received the precise boundary in steelbeak-0016 and handles the normal lead request/comment route. The test slot was returned.
Per lead decision137, this is a separate doc-only follow-up to the approved candidate. The frozen manifest and product/test bytes remain unchanged; the follow-up is not a new product review round.