Repository navigation
docs(qa): 18.0 sweep round 11 — the walled pass of QA round 3: RUNNER's walled boot under serve, and eight items' producers, recipes and refusals - #24801
Conversation
…full-copy scratch app, the admin persona door; the setsid stop recipe Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…F3–F8 on eight items, scope-depth's pin dropped 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 |
Conflict in access-security.no-active-org-session-semantics only, both sides kept: round 11 of the wave anchor (#24801) rewrote knownGaps[0]-[4] and took revision 6; this branch's acceptance[7] gap follows them as knownGaps[5], and its history row moves to revision 7. Claude-Session: https://claude.ai/code/session_01MRkuLGosywLTY6EMcP6fGK Co-authored-by: Claude <noreply@anthropic.com>
Refs #24579
Clause-②: no
Round 11 of the 18.0 release sweep's wave anchor (#24579), claim
6284734380. This is the walled pass of QA round 3: QA record #24783's checklist-accuracy findings F1 to F8, the round-3 summary's (6284472874) §1 re-point and §6 environment fact, andaccess-security.scope-depth-asymmetry's pin. Only checklist text changes:RUNNER.md(which carries no revision) and 8 items in 5 area files, each with onerevisionbump and onehistoryrow. No product code, test, pin or changeset text changed.Base
46bb5e3e54. The edits are commits79222a3b2e(RUNNER) and8a5a8b0660(area files).origin/mainthen moved toa43405d596(#24743, one.claudeskill reference, disjoint), merged at423d2726dc. Each history row'srefis written as this branch's name and is filled with this PR's number in one later commit that changes only those 8 strings.Each finding was re-read in the code at the base before it was written. Where the code disagreed with the finding, the finding was not applied as written, and the table says so.
RUNNER.md
46bb5e3e54os dev, each prerequisite below refuses …" (QA run #24783 measured all three). Round 10's first sentence, the 18.0.0 /next.5attribution, is unchanged.os devspawnsserve --dev;resolveAuthSecret()inpackages/core/src/stack-auth.tsfalls back toDEV_AUTH_SECRET_FALLBACKon a development bootos servein production mode judges none of the three untilOS_AUTH_SECRETresolves. Without it AuthPlugin is skipped and the boot comes upDEGRADED: missing core services: auth, not FATAL. It also needs a stable encryption key.resolvePlatformAuthComposition()(reasonno-secret); the⚠ AuthPlugin skippedbranch inserve.ts, with the multi-org runtime load inside that branch's composing arm; the owner-email throw inAuthPlugin.init();assertWalledMembershipPolicyDeclared()skips a kernel with noauthservice;printServerReady()prints the DEGRADED line;LocalCryptoProvider's "Refusing to start in production without a stable encryption key"examples/app-showcase(withsrc/), every dependency aslink:plus@objectstack/organizations,pnpm install --ignore-workspace. A config that only re-exports the showcase does not boot.spec: './src/system/connectors/status-openapi.json'(examples/app-showcase/src/system/connectors/index.ts) resolves against the package root at materializationPOST /api/v1/auth/admin/create-user: sign-up answers 403SELF_REGISTRATION_CLOSED, and underinvite-onlyeach created user lands withmembershipCreated: false.decideAudienceAdmission()(audience-posture.ts);runAdminCreateUser();reconcileMembership()answerspolicy-skipunderinvite-onlyssentry (round-3 §6)pnpmwrapper leaves theservegrandchild listening. Start withsetsid, read the group id from the listener, and stop the process group.os dev's SIGTERM handler forwards to its child only (beginShutdown()ofServeRestartCoordinator,packages/cli/src/utils/dev-restart.ts). Measured here with a stand-in tree underpnpm -C examples/app-showcase exec: two seconds after a SIGTERM to pnpm the child still answered 200, and a SIGTERM to the group stopped all four processes. It also measured that a backgroundedsetsidforks, so$!is not the group id.Not applied as written: the dispatch's "bare
os serve/os start".os starthands itsservechild an auth secret (its flag, the environment, or a persistedauth-secretfile) and setsOS_CRYPTO_AUTOKEY(packages/cli/src/commands/start.ts). So the secret skip isserve's alone. The entry says this was read from the code and not booted.Items
46bb5e3e54access-security.no-active-org-session-semantics5 → 6personas[0],personas[1],fixtures.requires[1],knownGaps[0],knownGaps[1]invite-only(membershipCreated: false, nosys_memberrow) and (2) a member that sendsset-active {"organizationId": null}. SSO-JIT stays blocked(fixture).reconcile-membership.ts#reconcileMembership(policy-skip) andadmin-user-endpoints.ts#bindUserToSoleOrganization. The signup race is closed by ADR-0123 D3's settle inauth-manager.ts#composeDatabaseHooks(defaultActiveOrg). Removal revokes the session or re-points it (membership-ended-session.ts#endSessionClaimsForEndedMembership), and QA measured 401.acceptance[0]clause + verifyisolated, an empty membership set undergroup. Agroupmember with no active organization reads its own memberships' rows.group, 'no organization scope' means an empty membership set") and ADR-0105 D2 (the active organization "no longer bounds read reach ingroupposture — membership does");tenant-layer.ts#computeTenantLayer0FilterknownGaps[3](new)acceptance[4]left as written: no ADR states the answer for a member-less user's NULL-tenanted login/logout audit rows. The new line names the question and how to score until it is ruled.knownGaps[4](new)groupmember write answers 500 whereisolatedanswers 403. The clauses stand as written.knownGaps[2]blockedmarker itself is unchanged.access-security.walled-environment-metadata-operator-only4 → 5fixtures.requires[2];knownGaps[0](F2 sentence)manage_metadatagrant, a system-context engine insert as the dogfood harness does it. The line also gives the two measured refusals.security-plugin.ts#denyTenantPlacement("outside the caller's organization scope"); ADR-0090 D12 (c) indelegated-admin-gate.ts#organizationBoundaryFailure(manage_metadataisscope: 'platform'incapabilities.ts);wall-environment-metadata-refusal.dogfood.test.ts#bootaccess-security.activation-write-operator-gate7 → 8fixtures.requires[3];knownGaps[0](F2 sentence)steps[8],acceptance[4])integration-system.webhook-lifecycle8 → 9fixtures.requires[0]sys_webhookneedsdefinition_json(required) and a lower-casemethod.auto-enqueuer.tsadmitsOrganization(deploymentWidefirst);wall-declared-webhook-deployment-wide.dogfood.test.ts(its "[ruling A] … a declared webhook is deployment-wide" describe, run under both postures);sys-webhook.object.ts(definition_jsonrequired: true,Field.selectlower-cases the options)api-backend.action-activation-door-contract3 → 4fixtures.knownGaps[2]actions.ts#handleActionActivationWrite(both authority tiers before shape, body and lookup)platform-core.settings-organization-isolation-and-platform-rung4 → 5fixtures.requires[2],steps[2],knownGaps[1](new);knownGaps[0](F2 sentence)sys-setting.object.tsapiMethods: ['get', 'list'](an update answers 405);settings-service.ts#setManytakes a key-to-value patch and never writeslockedidentity-auth.workspace-org-switch4 → 5fixtures.requires[0],fixtures.requires[1],personas[2]add-memberis not needed and the admin only mints the member.auth-manager.tscreator role on createaccess-security.scope-depth-asymmetry3 → 4automateddropped;fixtures.knownGaps[0]addedautomatedfield is dropped. The new line says what the three dogfood suites assert and whenautomatedmay return. The item is now Tier 2.showcase_inquiry(read at the base)F1: nothing recorded. No ledger field marks an item as walled. The 21 item keys used across the area files hold no tag and no
walledmarker.scripts/checklist-select.mjshas nowalledselector key, sowalled:isolated+groupresolves to 0 items. The three items matched on words in free text:lead_walledinknownGaps[1]andautomated.ref; "boot showcase isolated" insteps[0]; "isolated scratch file DB" inknownGaps[0]. The 14-item list was the runner's own selection.Governing-text decision (F3).
acceptance[0]is aligned, citing ADR-0123 D2 and ADR-0105 D2, which state thegroupanswer.acceptance[4]is left as written, because no ADR states it, andknownGaps[3]names the question. #24784 is named inknownGaps[4].Left alone, and why
platform-core.v18-boot-refusalsandareas/cli.json: PR feat(cli,runtime)!: the upgrade ceremony opens — v17 and 18.0 databases take it, and a server serves only a database it created or one the ceremony certified (18.x steps 5 and 6) #24681 (open) edits them, and the claim excludes them.access-security.grant-table-write-contractandaccess-security.parent-and-organization-write-guards: both carry round 10's walled line, with the same "each one absent refuses the boot naming itself" sentence. They are outside this claim's file surface, so they still read the old way, and the card report names them.access-security.platform-owner-email-anchorandattachments-storage.chunked-upload-integrity: both cite the RUNNER entry but carry no refusal sentence.no-active-org-session-semantics'sblockedmarker, and itsacceptance[1],[4]to[6]: the marker still holds (the stock showcase cannot run any clause). The clauses have no governing text to align them to.Gates
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackand no paths: 13 families, the same list at8a5a8b0660and423d2726dc. All 13 exited 0 at423d2726dc, each exit code captured before any pipe:check-ci-filter-parity,check-closing-keyword-parity(and its--self-test),check-comment-mask-corpus,check:doc-formula-expressions,check:cross-package-test-inputs,check:doc-authoring,check:driver-memory-census,check:gitlink-declared,check:nul-bytes,check:platform-checklist,check:refd-timer-probeandcheck:watch-hint-literal. The--ranreconciliation reads "13 run, 0 NOT-MEASURED (a DERIVED zero — all 13 recorded an exit code)". They are run again on the final head, after thereffill, and those readings go in the card's report.check:platform-checklistruns in no per-PR CI, so this local reading is its evidence:46bb5e3e54: "line citations: 0 survive across 21 swept documents", "symbol anchors: 943/953 resolved", 10 on the residual, 18 file floors held;423d2726dc: line citations 0, "symbol anchors: 955/965 resolved", 10 on the residual, 18 file floors held.access-security.json104 → 115,api-backend.json85 → 86,platform-core.json95 → 96,identity-auth.json118 → 117 (its floor is 82). The one anchor removed ismembership-policy-gate.ts#MEMBERSHIP_POLICY_ERROR_CODE, part of the F8 parenthetical that was replaced.git merge-tree --write-tree HEAD c6f775cbd7(PR feat(cli,runtime)!: the upgrade ceremony opens — v17 and 18.0 databases take it, and a server serves only a database it created or one the ceremony certified (18.x steps 5 and 6) #24681's head, fetched frompull/24681/head) exits 0 (tree7829f37ae3). PR feat(cli,runtime)!: the upgrade ceremony opens — v17 and 18.0 databases take it, and a server serves only a database it created or one the ceremony certified (18.x steps 5 and 6) #24681 touchesplatform-core.json(itemv18-boot-refusalsonly) andcli.json, so it shares no item with this PR, and no path here is routed to theos-regendriver.How the edits were made
The area files went through a span-recording editor. It applies each declared op twice, once to the parsed item and once to the item's own text span, and then asserts four things:
revisionplus one newhistoryrow;Its changed-path report matched the declarations for all 8 items.
Acceptance notes
no-target-org. At the base,invite-onlyanswerspolicy-skipbefore any organization is looked at (reconcileMembership()). This corrects the record's explanation and is noted here, not filed.docs/qa/**ships in no package. The root package is private, and none of the 73 published manifests namesdocs/qainfiles[](control: all 73 namedist). Henceskip-changeset.Generated by Claude Code