Repository navigation
docs(qa): 18.0 sweep anchor round 5 — the walled-posture and second-organization themes, runner environment facts, and two carried notes - #24687
Conversation
…rganization themes, runner environment facts, and two carried notes Part (a): seven items record that a stock 18.0 boot cannot run their walled or second-organization legs (knownGaps, one revision and one history row each): settings-organization-isolation-and-platform-rung, walled-environment-metadata- operator-only, activation-write-operator-gate, grant-table-write-contract, parent-and-organization-write-guards, no-active-org-session-semantics and chunked-upload-integrity. Part (b): RUNNER.md's environment facts gain the two theme entries and four section-6 facts, the Playwright entry is re-measured, and the invite recipe gains the accept-invitation step. Part (c): FOLLOW-UPS.md row E3 records its payment. Part (d): paused-run-trigger-record-masked's knownGap names the flow's real status. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
… the Playwright check reads the store path Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…8-sweep-round5-themes-runner
Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
Seat reviewACCEPT ·
This seat readies the PR and queues it with auto-merge. Generated by Claude Code |
Refs #24579
Clause-②: no
Round 5 of the 18.0 release sweep's wave anchor (#24579), one PR in four parts. Rounds 1–4 landed as #24622, #24632, #24649 and #24671. This is a partial landing: the card keeps §2's other two themes and §4 for later rounds.
The diff is the checklist ledger and its runner docs only: four area files,
RUNNER.mdandFOLLOW-UPS.md. No product code, test or pin changes. Every edited area item takes onerevisionbump and onehistoryrow (ref: this PR). Every finding was re-derived from source before it was edited. The base isbfc1539fe0, merged withorigin/main92ce3af404before this PR opened. Main's 8 new commits touched none of the cited sources except.objectui-sha(#24660 moved the pin4016370a→12dc7b47c340), and the one fact that reads it, the map-tile entry, was re-checked at the new pin. Findings that did not hold are left alone and listed at the end, each with the reading that refutes it.Part (a) — §2's two wave themes
What the ledger allows.
plannedis an item-level status only.statusFieldProblemsinscripts/check-platform-checklist.mjsjudgesstatusper item; a planned item must carry nosteps; no clause carries a status of its own; andchecklist-select.mjsdrops a planned item from every runnable set. So a walled leg on an otherwise runnable item can only be recorded inknownGaps. The gate validates theplannedshape and does not readknownGapsat all (PM H3).Where 18.0 refuses (PM H1 holds). The walled refusal lives in one place:
walledPostureRefusal()inpackages/cli/src/commands/serve.ts.Serve.runasks it right after the posture gate, before a config is read, a plugin is mounted or the HTTP server starts.os devandos startboot throughserve. The organizations-runtime load andOS_ALLOW_DEGRADED_TENANCYcome later in the same method, so nothing skips the refusal. Kernel-level boots (bootStack, the dogfood wall suites) never pass throughserve, which is why the pins still prove walled behaviour.Measured live at
bfc1539fe0with the built CLI:os serve,OS_TENANCY_POSTURE=isolated: exit 1,✖ FATAL: tenancy posture 'isolated' is not supported in 18.0 (NOT_IMPLEMENTED).group: the same, naminggroup.OS_MULTI_ORG_ENABLED=true: the same, namingisolated.single(the control): passes the gate and stops later, on "Nothing to serve".os startunderisolated: the same FATAL.The refusal names no release ("an 18.x release"), so the knownGaps say "a later 18.x release".
Where the second organization is refused (PM H2). The door is
beforeCreateOrganizationinpackages/plugins/plugin-auth/src/auth-manager.ts. It answers 403ORGANIZATION_CREATION_DISABLEDwherever the effective posture enforces no wall, and on 18.0 that is every boot. Two more facts close the other routes:sys_organizationdeclaresapiMethods: ['get', 'list', 'update'], so the data API has no create, and 18.0 serves fresh installs only. Per-item decision: an org-switch clause is the §2 theme ("not scored on a stock 18.0 boot"). A planted second organization is a fixture route. QA run #24560 used one, a system write, and the knownGap says such a run must declare it. That route itself stays with §4.Shape. The ledger has no area-level or README-level slot for a wave theme. An area file carries
$commentand provisioning recipes, and a recipe must have aprovisioning.useconsumer. The README has no such section.RUNNER.md's "Environment facts the runner should not re-derive" is the standing-facts slot runners read first. So each theme is stated once there, as the entries "18.0 boots the single tenancy posture only" and "A stock 18.0 boot holds exactly one organization". Each item's knownGap points at the entry and restates the refusal in one sentence with its anchor. That keeps the item readable on its own throughchecklist-select.mjs, and lets the anchor gate resolve each citation (aRUNNER.mdanchor would red: the anchor floor file declares no floor forRUNNER.md). The entry also settles the verdict word. The live leg is recordedskippedwith the entry cited, as the withdrawn ownership command's clauses are, and neverblocked(fixture). The sweep's records had scored it bothblocked(environment)(QA runs #24557, #24559) andblocked(fixture)(QA run #24558).knownGaps vs planned, per item, on the four axes. Every item below takes
knownGaps. The common reason on each axis:plannedwould tell the next sweep the capability is unbuilt, which is the wrong debt (README: "Scoring one as the other sends the next sweep to fix the wrong thing"). The knownGap names the exact clauses and the verdict word.platform-core.settings-organization-isolation-and-platform-rungfixtures.knownGaps(new, [0]);acceptance[3].clausesettings-service.ts#organizationlessTenantKeyErrorrefuses only under a walled posture, and the pin asserts single does not refuse. So the clause is now markedwalled:access-security.walled-environment-metadata-operator-onlyfixtures.knownGaps(new, [0]);steps[0]sharingModel(round 2's note): the admitted repeats in steps[2]/[3] reach the save door's authoring rules, which refuse an object with none 422security-owd-unset(validate-security-posture.ts#SECURITY_OWD_UNSET, error tier). The walled refusal answers ahead of them (meta-item-write-routes.ts)access-security.activation-write-operator-gatefixtures.knownGaps[0];steps[8];acceptance[4].clause;acceptance[4].verify;variants[1];variants[2]blocked(fixture)on an "enterprise runtime" gap. On 18.0 the refusal runs ahead of the runtime load, and the runtime is open code since ADR-0132. Clause 5 keeps its unit pins as its oracleaccess-security.grant-table-write-contractfixtures.knownGaps(new, [0])access-security.parent-and-organization-write-guardsfixtures.knownGaps(new, [0])access-security.no-active-org-session-semanticsfixtures.knownGaps[2](appended)blocked {fixture, #9334}with a pin.plannedwould also be wrong here: the capability is built and pinned. The marker is unchangedattachments-storage.chunked-upload-integrityfixtures.knownGaps[0](round 2's pointer sentence replaced by the theme's statement, not duplicated)Taken, but not in the card's five:
no-active-org-session-semantics(its clauses need a walled boot) andchunked-upload-integrity(the second-organization theme). Read and left alone:platform-owner-email-anchor,suggested-binding-loop,public-form-withdrawal-layersand the three attachments items carrying the CROSS-TENANT marker (see the end). No item inautomation.jsoncarries a walled or org-switch clause.Part (b) —
RUNNER.mdRUNNER.mdrecords its own provenance inline: the measured-at sha, the QA run and the card section, inside each entry. The rows below follow that convention.@playwright/test1.62.1 → 1.63.0, chromium build 1234 → 1243 (three places). The Check readsbrowsers.jsonfrom the pnpm store, because the rootnode_modules/playwright-corethe old line named does not existbfc1539fe0; #24579 §6memberand leaves the invitationpending(reconcileMembership). Any other role takes effect only after the persona's ownPOST /api/v1/auth/organization/accept-invitationwith{"invitationId": "ID"}(adoptExistingMembership, never lowers a grade). Email verification is not required (requireEmailVerificationOnInvitation: false)bfc1539fe0; pinaccept-invitation-adopt-membership.test.ts6 passed; QA run #24616bfc1539fe0live + pin 5 passed; QA runs #24557, #24558, #24559org-create-posture-gate.test.ts25 passed; QA runs #24560, #24558build-console.shruns turbo builds in this checkout), the cgroup limit,--concurrency=2/--maxWorkers=1, theOBJECTUI_DEPS_BUILD_CMDoverride, exit 13714343688192atbfc1539fe0; QA run #24598's fingerprint. The OOM is not re-runOS_TEST_TIERSnarrowspackages/cli's vitest population"packages/cliowns tier files (1 package, 83 files)nightly-tiers.mjs --packagesatbfc1539fe0; #24579 round 2 (6272032736); QA runs #24556, #24558, #24598scripts/qa/qa-rollup.mjshas two blind spots"classifySelector('area:X')→other(16 records of 2026-10-16); page 2 via therepositories/IDpath → proxy 403, andfetchRunRecordsthrowsclassifySelectorrun on 5 selectors; page-1 Link header → 403,repos/OWNER/REPOpage 2 → 200 (130 records), atbfc1539fe0; #24579 §6DEFAULT_MAP_STYLEis unreachable behind the proxy, and the amber banner keeps the markersObjectMap.tsxat4016370aand12dc7b47c340;curl→CONNECT tunnel failed, response 403; QA run #24616 (round 4's note)scripts/qa/is not edited (ruling).Part (c) —
FOLLOW-UPS.mdThe file's own convention: append, never rewrite; a corrected row keeps its old content as "⚠️ This row used to …; DATE with #PR" (rows E2 and §6's second row), and a closed row carries its marker in bold (FIXED in #N, closed by …).
cc95f5e63e)".rest-crud-config-contractandrest-batch-config-contract(revision 3 each) name the mount pin inautomated.refand say inknownGaps[1]that the mount half is pinned. Measured inapi-backend.jsonatbfc1539fe0Part (d) —
automation.jsonautomation.paused-run-trigger-record-maskedfixtures.knownGaps[0]"
showcase_approver_bindingsis draft on purpose" becomesstatus: 'obsolete'on purpose (approver-bindings.flow.ts#ApproverBindingsFlow). Its docblock says why not draft: a draft flow binds and fires like an active one. It is still the only flow onshowcase_field_zoo, so the gap's conclusion holds.Findings left alone, each with its refuting reading
scaffold-e2e.ymlhas not run on the candidate sha; its latest scheduled run failed on9112bcd8" (round 2). Re-read: still true. The newestschedulerun is9112bcd887, failure, 2026-10-19T03:39Z, and onlypull_requestruns follow it. Not taken: it is a dated CI state that the next scheduled run changes, not a standing environment fact.4016370a" (round 2). Not taken. It is §2's objectui-live-e2e theme, which the dispatch gives to the next round, and the pin it names has since moved (chore(console): move the objectui pin 4016370af3c9 → 12dc7b47c340, regime C for sharing rules (objectui#13050) #24660 →12dc7b47c340). Not re-measured: that needs the objectui live suite.grant-table-write-contractacceptance[4] "needs a walled boot" (card §2, rounds 2–3). Half refuted:grant-holder-membership-refusal.ts's predicate does not read the posture. The knownGap records this and keeps the clause as written. A single-posture rig, a grantee with no membership in the writer's organization, is a fixture route and is not measured here.no-active-org-session-semantics(every clause walled) andchunked-upload-integrity(org switch) also carry the themes and were taken.platform-owner-email-anchor. No clause needs a walled boot: acceptance[5], the walled half, is test-only already. steps[0]'s parenthetical still reads "a walled posture … refuses to boot with it unset (plugin-auth init …)". On 18.0 the boot is refused earlier, set or unset. Noted, not edited: the item boots single and scores nothing on it.suggested-binding-loopnegative[1] ("under a walled posture only the platform operator may accept"). A negative note, not a clause. Left alone.public-form-withdrawal-layers. Itsset-activeswitches between the Default Organization and null, which a stock 18.0 boot can do, and it already puts the walled half out of scope.download-authz-both-sides,read-inherits-parent-rls,attach-requires-parent-edit(the CROSS-TENANT marker). That marker is about the dogfood matrix'sskipIfblock, alreadyblocked(dependency). None of their acceptance clauses needs a walled boot.Measurements (at
bfc1539fe0)os-verify-lock:turbo run build --concurrency=2 --filter='@objectstack/plugin-auth^...'(27/27, cache), then--filter='@objectstack/cli^...'(60/60, 37 cached, held 101 s), then--filter=@objectstack/cli. VERDICT command-exit 0 each time.vitest run --maxWorkers=2, VERDICT command-exit 0:org-create-posture-gate.test.ts: 25 passed.accept-invitation-adopt-membership.test.ts: 6 passed.serve-walled-posture-refusal.test.ts: 5 passed.classifySelectoron 5 selectors, the qa-run page-2 403 and 200, and the demotilesCONNECT403.Gates
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 13 families for the 6 paths, against merge base92ce3af40, treecfb070a467. All 13 ran atcfb070a467, each exit captured before any pipe, all exit 0:node scripts/check-ci-filter-parity.mjsnode scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjspnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:cross-package-test-inputspnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:gitlink-declaredpnpm check:nul-bytespnpm check:platform-checklistpnpm check:refd-timer-probepnpm check:watch-hint-literal--ranreports: "13 derived famil(ies) accounted for — 13 run, 0 NOT-MEASURED (a DERIVED zero …)".check:platform-checklistruns in no per-PR CI, so this local reading is its evidence: "check-platform-checklist: OK — 16 areas, 327 items (322 active, 1 planned)". Symbol anchors are 875/885 atbfc1539fe0and at mergedorigin/main92ce3af404, and 886/896 at head: 11 added (access-security +7, platform-core +2, attachments-storage +1, automation +1), 0 lost, 10 on the #16898 residual, 18 file floors held.RUNNER.mdcarries no anchor, by design (it has no floor entry).check:platform-checklist --changed-fromwas not run: no symbol was renamed or removed. A control-character scan of the six files is empty.Changeset
skip-changeset.docs/qa/**sits in no package, so this diff publishes nothing.Not in this PR
integration-system.json.Generated by Claude Code