Skip to content

Commit 276d96d

Browse files
docs(qa): withdraw the retired sys_account.issuer from two checklist carriers (#19826)
Fixes #19217 Clause-②: no ## What changed Two QA-checklist carriers still required or cited `sys_account.issuer`, a column that retired with better-auth 1.7.3 (durable record: `packages/spec/src/migrations/entries/semantic/18.sys-account-issuer-retired.ts`). Docs/QA only; no code, no published package source. 1. `docs/qa/platform-checklist/areas/identity-auth.json`, item `identity-auth.linked-accounts-social`: the ORACLE. The step 「issuer stamped」 and the first acceptance clause's verify 「issuer is stamped」 are both withdrawn. The same shape PR #19213 used for `approvals.json`: the reason is kept (the step now says `(provider_id, account_id)` is the whole account identity and names the retirement's migration entry), and the verify says an issuer-less row is the healthy shape, never a FAIL. `revision` 1 -> 2 with an appended `history` entry; revision 1's history entry is untouched. 2. `docs/qa/platform-checklist/FOLLOW-UPS.md` section 6, the "second signed-up (non-admin) user in seeds" row: the closing-evidence clause "issuer derived from the dev admin's own row" is withdrawn. The file's own rule is append-never-rewrite, so the correction is made visibly in place (the pattern section 10's E2 row already uses): the row says what the seed does today (`ensureCredentialAccount` -> better-auth `internalAdapter.createAccount`, keyed on `(provider_id, account_id)`, read at `examples/app-showcase/src/security/seed-approval-demo.ts` `ensureCredentialAccount` and the comment above its call site), and records that it used to claim an issuer derivation, withdrawn with this card. ## Premise, re-measured on `c1185240` (branch base) - `identity-auth.json` step at `:1119` and verify at `:1128` carried the dead requirement (card said `:1118` / `:1127`). - `FOLLOW-UPS.md:151` carried the falsified clause. - The corroboration still holds: `packages/qa/dogfood/test/showcase-demo-personas-loginable.dogfood.test.ts:133-138` asserts the admin's account row has NO `issuer` own-property ("sys_account.issuer retired with better-auth 1.7.3 — nothing should still be writing it"); only its header comment changed. - Left untouched on purpose, each read: the other `issuer` hits in `identity-auth.json` are the OIDC discovery-document `issuer` (`:178`, `:233`, `:235`, `:250`, `:275`) and the TOTP otpauth label `issuer + account` (`:1287`, `:1302`) — different concepts, correct. `areas/approvals.json`'s hits are all in `history` entries or closed-by-fixture `knownGaps` text — the correct steady state, not in scope. `areas/ai.json:697/719` is the OAuth issuer URL in a boot-log warning — unrelated. ## Verification (at `f7fb5a98`) Gate list derived with `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` (13 commands), every one run, reconciled with `--ran` carrying exit codes: "13 derived famil(ies) accounted for — 13 run, 0 NOT-MEASURED (a DERIVED zero)". - `pnpm check:platform-checklist` exit 0: "OK — 15 areas, 265 items ... symbol anchors: 619/637 resolved ... 17 file floors held". - Anchor census unchanged by this diff: `areas/identity-auth.json` 83 against floor 82, `FOLLOW-UPS.md` 4 against floor 2. No floor or ledger moved. (`identity-auth.json` has one anchor of headroom — the new migration citations are bare paths, which add and remove no anchor.) - `pnpm check:doc-authoring`, `check:nul-bytes`, `check:cross-package-test-inputs`, `check:driver-memory-census`, `check:gitlink-declared`, `check:refd-timer-probe`, `check:watch-hint-literal`, `check-ci-filter-parity`, `check-closing-keyword-parity` (+ `--self-test`), `check-comment-mask-corpus`: all exit 0. - `@objectstack/lint check:doc-formula-expressions`: first run exit 3 (PREREQUISITE NOT MET — `@objectstack/formula` / `@objectstack/lint` unbuilt, nothing measured); after `turbo run build` of those two, exit 0. ## Changeset None. The diff is `docs/qa/**` only and publishes nothing from any released package, so this is `skip-changeset` territory; the label is left to the PM seat. ## Acceptance notes - No out-of-scope findings filed or proposed. --- _Generated by [Claude Code](https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent ad6e234 commit 276d96d

2 files changed

Lines changed: 6 additions & 5 deletions

File tree

‎docs/qa/platform-checklist/FOLLOW-UPS.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ appended — the #7670 pattern).
148148
| §3 line | landed as | items unblocked |
149149
|---|---|---|
150150
| "a `publicSharing.enabled` object" | `showcase_client_brief` — `redactFields`, `maxExpiryDays`, and an `eligibility` predicate, with a `published` AND a `draft` brief seeded so the predicate is falsifiable | `access-security.share-link-capability-tokens` (was `blocked(fixture)`, now runnable) |
151-
| "a second signed-up (non-admin) user in seeds" | both demo personas get a better-auth credential account at boot (`seed-approval-demo.ts` → `ensureCredentialAccount`), issuer derived from the dev admin's own row | `approvals.per-group-signoff`, `approvals.viewer-gating-submitter-side` (was `blocked(fixture)`), `approvals.ooo-delegation-reroute` |
151+
| "a second signed-up (non-admin) user in seeds" | both demo personas get a better-auth credential account at boot (`seed-approval-demo.ts` → `ensureCredentialAccount`, keyed on `(provider_id, account_id)` through better-auth's `internalAdapter.createAccount`). ⚠️ This row used to add that the personas' issuer was derived from the dev admin's own row; withdrawn 2026-09-23 with #19217 — better-auth 1.7.3 rolled the issuer-scoped account identity back and `sys_account.issuer` retired with it (`packages/spec/src/migrations/entries/semantic/18.sys-account-issuer-retired.ts`), so the seed derives and stamps no issuer. The three items this row unblocked withdrew the same clause with #17453 | `approvals.per-group-signoff`, `approvals.viewer-gating-submitter-side` (was `blocked(fixture)`), `approvals.ooo-delegation-reroute` |
152152
| — (not in §3; found by #9308) | `showcase_client_liaison` — the app's first `readable: false` FLS grant | `access-security.fls-mask-and-strip` clause 5, whose UI half had no reachable fixture |
153153

154154
**Still open from §3, unchanged and still correctly listed there:** the OIDC/social IdP,

‎docs/qa/platform-checklist/areas/identity-auth.json‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,7 +1101,7 @@
11011101
"title": "Linked accounts: link a social/OIDC identity through the redirect round-trip → a sys_account row appears in mine-view; unlink removes it; provider-less boot degrades honestly",
11021102
"since": "v16",
11031103
"status": "active",
1104-
"revision": 1,
1104+
"revision": 2,
11051105
"priority": "P2",
11061106
"surface": "mixed",
11071107
"personas": ["a signed-in user linking a second identity", "the same user after unlinking"],
@@ -1116,7 +1116,7 @@
11161116
"steps": [
11171117
"as a signed-in user, open Account → Identity Links (sys_account `mine` view, filter user_id={current_user_id}); screenshot the initial link set",
11181118
"invoke link_social for a configured provider: the action is type:'url' — GET /api/v1/auth/sign-in/social?provider=<p>&callbackURL=<origin>/_console/apps/account/sys_account (full-page navigation, NOT XHR, so the OAuth 302 dance and link cookie work); complete the provider round-trip and land back on the Identity Links view",
1119-
"confirm a sys_account row now exists for that provider in the caller's mine-view (provider_id = the provider, user_id = the caller, issuer stamped)",
1119+
"confirm a sys_account row now exists for that provider in the caller's mine-view (provider_id = the provider, user_id = the caller) — (provider_id, account_id) is the whole account identity; there is no issuer to check, sys_account.issuer retired with better-auth 1.7.3 (packages/spec/src/migrations/entries/semantic/18.sys-account-issuer-retired.ts)",
11201120
"unlink it: the unlink_account action → POST /api/v1/auth/unlink-account with accountId = the sys_account ROW id (better-auth 1.7 keys on the row id); confirm the row is gone from mine-view",
11211121
"both-sides / degradation: on a boot with NO provider configured, confirm link_social degrades honestly — the affordance is absent or names the missing provider, rather than offering a link that dead-ends (open-edition honest-degradation posture)",
11221122
"confirm sys_account is read-only over the data API — a forged direct insert/delete is refused (apiMethods ['get','list'], writes 405)"
@@ -1125,7 +1125,7 @@
11251125
{
11261126
"clause": "linking a social identity creates a sys_account row in the caller's mine-view after the redirect round-trip completes",
11271127
"oracle": "api",
1128-
"verify": "GET /api/v1/data/sys_account (mine view) after the link shows a new row with provider_id = the provider and user_id = the caller; issuer is stamped",
1128+
"verify": "GET /api/v1/data/sys_account (mine view) after the link shows a new row with provider_id = the provider and user_id = the caller; a row with no issuer is the healthy shape, never a FAIL — the column is retired",
11291129
"evidence": "the post-link mine-view read"
11301130
},
11311131
{
@@ -1166,7 +1166,8 @@
11661166
"packages/platform-objects/src/apps/setup-nav.contributions.ts#nav_accounts (nav_accounts → 'Identity Links', objectName sys_account)"
11671167
],
11681168
"history": [
1169-
{ "revision": 1, "date": "2026-08-08", "change": "new item: social/OIDC account linking round-trip → sys_account mine-view row, unlink removal, provider-less honest degradation; blocked(fixture) pending a configured IdP (PENDING-GAPS §C)", "ref": "claude/platform-test-checklist-ocwugl" }
1169+
{ "revision": 1, "date": "2026-08-08", "change": "new item: social/OIDC account linking round-trip → sys_account mine-view row, unlink removal, provider-less honest degradation; blocked(fixture) pending a configured IdP (PENDING-GAPS §C)", "ref": "claude/platform-test-checklist-ocwugl" },
1170+
{ "revision": 2, "date": "2026-09-23", "change": "the 'issuer stamped' requirement is withdrawn from both the step and the first acceptance clause's verify: better-auth 1.7.3 rolled the issuer-scoped account identity back and sys_account.issuer retired with it, so nothing stamps it and the old verify failed a healthy system. The reason is kept — the step now says (provider_id, account_id) is the whole identity and names the retirement's migration entry in packages/spec — and the verify states that an issuer-less row is the expected shape", "ref": "#19217" }
11701171
]
11711172
},
11721173
{

0 commit comments

Comments
 (0)