Repository navigation
qa(checklist): identity-auth — 23 ledger edits from the 18.2.0 release sweep (#25807) #25843
Description
Filing gate: maintainer-directed task. Filed by the 18.2.0 release-assessment thread · session_01G3h9iZTpL8aCiXbfsp8H5u. ⛔ Not a claim, ⛔ not dispatched.
Maintainer's words (project thread, 2026-10-25, verbatim): 22:54Z 「约 300 条清单准确性问题:是不是应该开卡?」, then 22:55Z 「写issue,不派发」.
Parent: wave anchor #25807 (18.2.0 release test sweep). RUNNER's extraction obligation parks checklist-accuracy findings on the anchor; the maintainer asked for them as issues, so the wave's findings are split into one card per ledger file and the anchor links each card. This is not a release blocker, so it carries no target:v18.
Reader who acts: the lane owning docs/qa/platform-checklist/** (domain:devx). Dedupe (open and closed): no card holds these lines; the 18.0 precedent closed its accuracy rows on its anchor #24579.
Wanted
For each line below, edit docs/qa/platform-checklist/areas/identity-auth.json: revise the item's text, bump its revision, and append a history entry citing the run record the line comes from. Keep pnpm check:platform-checklist green. A line that turns out to describe a product defect rather than stale text gets its own card instead of a ledger edit.
Findings (23)
From #25812 — priority:P0, 23 items, at 6679644a, pin b41ed7f68956
identity-auth.default-organization-boot-invariant: step 3 filtersorganization = default, the column isorganization_idand takes the org id;fixtures.requiressays--freshbut c1 needs--log-level infoand a readable file DB; acc[0] prescribes--maxWorkers=2against RUNNER's memory fact.
From #25815 — release-18.2.0-tier1, 156 items, at 6679644a, pin b41ed7f68956 (clause labels: aK = acceptance[K], nK = negative[K])
identity-auth.admin-lifecycle-operationsa4: verify says the 'target's next PROTECTED request still 2xx' is pinned by admin-platform-admin-standing.dogfood.test.ts; that file asserts the 403 + code only, no protected request as the targetidentity-auth.admin-lifecycle-operationsa0/n1: C0 case asserts sys_user.banned/ban_reason and unban; no sign-in by the banned user is attempted, so the enforcement half is unpinnedidentity-auth.admin-lifecycle-operationsref-parse: packages/plugins/plugin-auth/src/remove-user-atomicity.test.ts is named in the ref only as a contrast ('deliberately does NOT copy'), not as a pin; the parent's pins list includes it — it scores no clauseidentity-auth.api-key-expiry-lifecyclea2: the dogfood case asserts 400 API_KEY_EXPIRY_TOO_LONG but not that the key count is unchanged; 'nothing is stored' is asserted only in packages/runtime/src/api-key-lifecycle.pin.test.ts over a fake objectqlidentity-auth.api-key-expiry-lifecyclea3: the three 403 codes are pinned only at unit layer (rest-api-key-lifecycle.pin.test.ts over HTTP_STUB + fake ql; runtime dispatcher over a fake kernel); the dogfood file drives no revoked or expired keyidentity-auth.auth-gate-held-session-raw-host-familiesa2: held-session-vendor-admin-doors arms PASSWORD_RESET_REQUIRED by a system write of must_change_password + auth.noteMustChangePasswordIssued() (simulating the forced-reset route), not by driving the admin's forced-reset dooridentity-auth.auth-gate-held-session-raw-host-familiesa3: rest-api-key-account-posture.pin drives RestServer.enforceAuth with a hand-built req/res and a fake auth; http-dispatcher.api-key-account-posture drives HttpDispatcher with fakes — neither answers an HTTP x-api-key callidentity-auth.auth-gate-held-session-raw-host-familiesa1: 'raw-host families' are proven at mixed layers: storage, settings, share-link and cloud-connection pins call registered handlers with fake IHttpRequest/IHttpResponseidentity-auth.auth-method-matrixa3: verify names packages/plugins/plugin-auth/src/phone-otp-no-sms-service-refusal.test.ts as the pin — it exists but is not in automated.ref, and it drives AuthManager (unit), not the NODE_ENV=production boot's send-otp door.identity-auth.auth-method-matrixa6: verify names packages/qa/dogfood/test/two-factor-lockout.dogfood.test.ts as the end-to-end pin for the 2FA gate — exists, not in automated.ref.identity-auth.auth-method-matrixa9: verify names packages/plugins/plugin-auth/src/change-email-delete-user-wiring.test.ts ('auth-method-matrix:change-emailanddelete-userare booked as mounted inauth-route-ledger.tsbut plugin-auth never configures better-auth'suser.changeEmail/user.deleteUser— no switch to enable them #7735 — POST /delete-user stays unwired') — exists, not in automated.ref; AuthManager unit layer.identity-auth.auth-method-matrixref: a single OIDC pin (a7) for a 10-clause, 5-negative mixed item; kind 'e2e' over-implies coverage.identity-auth.cookie-session-renewal-in-processa1: the runtime pin's DOORS are GET /data/:object, /auth/me/permissions and /i18n/locales — the clause's 'meta reads' leg has no door in itidentity-auth.implicit-account-linking-ownershipa0-a3: the ref's 'end to end' cases drive the real better-auth handler (AuthManager.handleRequest) but over a hand-rolled in-memory data engine and with sys_account read off that fake, not an admin read through a booted server — they assert each clause's facts at the unit layer onlyidentity-auth.import-invitation-and-sso-domain-answersa1: the ref's admin-import-users-invite-link.test.ts asserts the auth.account_invitation template id on the import but never the 'self-requested reset still uses password_reset' half; packages/plugins/plugin-auth/src/admin-import-users-account-invitation.test.ts (cases ① and ②) asserts both and is not in the refidentity-auth.import-invitation-and-sso-domain-answersa3: sso-domain-verification-unknown-provider.pin.test.ts mounts the real AuthPlugin on Hono but over createMemoryEngine (a hand-rolled engine fake), so it scores the doors at unit layer onlyidentity-auth.invitation-scope-gatesa0: ref states its pending half is scored live — consistentidentity-auth.invitation-scope-gatesn1: server-side denial of the forged request is pinned; the UI-hidden half is a5/a4 browser work
From #25817 — release-18.2.0-manual-set, 29 items, at 6679644a, pin b41ed7f68956
identity-auth.two-factor-backup-codes: A4's at-rest check needs an out-of-band DB read, because REST never returns the column. The item should say so.
From #25823 — addendum, identity-auth.admin-lifecycle-operations at 17f8217b, after #25626
- Coverage gap (new clauses): no item asserts feat(plugin-auth): multi-org Create User joins the administrator's current organization #25626's walled Create User join. Missing clauses: joins the caller's active organization as
member, and a bodyorganizationIdchooses nothing;400 NO_ACTIVE_ORGANIZATIONwith no row;invite-onlystill joins. Candidate pin:packages/qa/dogfood/test/create-user-organization-join.dogfood.test.ts. identity-auth.workspace-org-switchrev 5,personas[2]: stale after feat(plugin-auth): multi-org Create User joins the administrator's current organization #25626 — the recipe now needs the operator to create andset-activean organization before Create User.identity-auth.admin-lifecycle-operationsautomated.refoverclaims: the A0 sign-ins, the A4 live-session half, the A6 stop half and the A9 state read-back beyond two routes are unpinned.
Acceptance
- Every line above is either applied (item revised,
revisionbumped,historycites the record) or answered on this card with the reason it was not. pnpm check:platform-checklistis green.- The PR links this card and [sweep] v18.2.0 release test sweep #25807.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 1 · 2026-10-26T12:22Z
Session:
session_01Q4MDXRbEJCNdPAP4SiXwp9(devx seat 2) · card threadsession_016gb7qhsFoBRVmSNDpHG9NhAccount:
os-steveBranch:
claude/project-thread-pomla3(the harness-pinned branch of the card thread; it names no issue, so this claim is the identity record; amended on spawn)Worktree:
objectstack-issue-25843Domain:
domain:devxSeat:
domain:devx#2(seat post #20163)File surface:
docs/qa/platform-checklist/areas/identity-auth.jsononly (stop on breach; explain in the report)Container & model: M,
mode:thread,model: default tier (TIER_DEFAULT, from dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: none
Premise: holds (action surface
git log origin/mainon the file since filing: no commit; the dev re-reads each line against main first)Serial constraints cleared: own ledger file only; seat 1 holds #25835 / #25836 on other files; #26035 left the retired objectui pin wording in these files to these cards; no other
Claim:names this fileGenerated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{
"issue": 25843,
"status": "done",
"branch": "claude/project-thread-pomla3",
"pr": "#26117",
"session": "session_016gb7qhsFoBRVmSNDpHG9Nh",
"premise_still_valid": true,
"summary": "All 23 lines disposed in docs/qa/platform-checklist/areas/identity-auth.json: 22 applied, 1 answered with no edit (invitation-scope-gates a0, already consistent). 11 items revised, each with revision bumped and one history row citing its QA run (#25812, #25815, #25817 or addendum #25823; ref #25843). admin-lifecycle-operations gains acceptance[10]-[12] for the #25626 walled Create User join, appended after clause 9 so no index moved. Retired objectui pin wording: 0 live hits in this file; 6 mentions sit in history rows of self-signup-gate and email-verification-loop and are left as records.",
"tests": "docs-only ledger; no package touched, so no build closure (①) and no package tests (②) are owed.",
"gates": "head 95f651a (merged origin/main f6c6193, no docs/qa change in range). pnpm check:platform-checklist exit 0 (OK, 16 areas, 329 items). dispatch-gates --commands: 13 derived, all run, all exit 0; @objectstack/lint check:doc-formula-expressions exit 3 (prerequisite: formula/lint dist missing) then exit 0 after turbo run build --filter=@objectstack/formula --filter=@objectstack/lint (os-verify-lock VERDICT command-exit 0). --ran with exit codes: 13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN. CI families: PR #26117 check-runs in_progress at report time.",
"line_budget": "1 file, +130 / -47 (177 changed lines) vs merge base 9753d16; under the 3000 human-merge threshold.",
"files_changed": [
"docs/qa/platform-checklist/areas/identity-auth.json"
],
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"deviations": [
"--maxWorkers=2 corrected to 1 in 4 items beyond the one the card cites (api-key-expiry-lifecycle, auth-gate-held-session-raw-host-families, cookie-session-renewal-in-process, import-invitation-and-sso-domain-answers), each already revised for its own card line; implicit-account-linking-ownership steps[7] gains --maxWorkers=1. Named in each history row and the PR body.",
"two-factor-backup-codes: beside A4, the same three places quoted the column old JSON-serialized description; they now quote the current sys-two-factor.object.ts description. Same item, same line.",
"history rows carry ref #25843 (the parking card), following the #22017 precedent, not the PR number.",
"worktree objectstack-issue-25843 created on the harness-pinned branch by detaching the shared checkout first (the branch was checked out there).",
"branch merged origin/main once before pr_create because the gate derivation flagged a stale tree.",
"PR reviewer request not made: the only route is a GitHub MCP write, which the dispatch forbids. Assignee os-steve set through the relay pr_create.",
"PR body footer uses the AGENTS.md session-URL form, not the harness Generated-with block; commit trailers are the model-free pair."
],
"mcp_calls": "5 — mcp__github__issue_read x5 (get 25843, get_comments 25843 x2, get 26052, get 26035); no write tool",
"api_writes": "2 — fleet-write relay: pr_create (POST /repos/objectstack-ai/objectstack/pulls + assignees + labels, run 40325231677, read-back identical 9258 bytes, labels [skip-changeset], assignees [os-steve]); this os-dev-report comment (POST /repos//issues/25843/comments)",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none — no line turned out to be a product defect; noted, not filed"
]
}
objectstack-fleet commentedon Oct 26, 2026
devx seat 2 · review: ACCEPT → PR #26117 comment 6416479375. Landing: ready + merge queue once every check on the reviewed head is green or skipped.
Generated by Claude Code