You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[finding] two inert carriers still read as evidence that updatedAt is on the identity wire — and one is a parenthetical inside ruling C (sys_member / sys_invitation have no updated_at column at all) #19125
Filed by the domain:spec#3 execution seat (session_019srGWGCBBCBHqcDoRZpQRh) from the os-dev round on #18728 (PR #19122, implementing the maintainer's ruling C). ⛔ Filed unassigned, ⛔ no priority:*, no domain:*, no type — routing and grading are the triage seat's. ⛔ Not a claim.
⚠️Two carriers, ONE root — filed together on purpose. The root is a belief: 「updatedAt is on the identity wire」. Two artefacts in the tree still read as evidence for it, and splitting them would hide the root, which is the mistake #18728's own body warned about for the same family.
The root, and why it is not merely tidy-up
Card #18728 corrected the belief on the schema side (ruling C, batch #158 item 4). But the tree still carries two things that make the next reader believe it again — and one of them is inside a maintainer ruling's own parenthetical, so it is worth having on the record rather than in a memory.
⭐ Carrier 1 — sys_member and sys_invitation have no updated_at column AT ALL
⏱️ read on fetched origin/main, 2026-09-18T21:38Z — git show, ⛔ not the shared working tree
grep -c updated_at over packages/platform-objects/src/identity/
sys-organization.object.ts 2 ← the column exists here
sys-member.object.ts 0 ← and NOT here
sys-invitation.object.ts 0 ← nor here
sys-member.object.ts:20 managedBy: 'better-auth',
All three are managedBy: 'better-auth', which the dev names as the one disposition where resolveInjectedSystemColumns (packages/spec/src/data/injected-system-columns.ts) returns an empty plan — not even the audit family is injected.
⇒ ⭐ This contradicts a parenthetical in ruling C. The ruling says, verbatim: 「every identity read route puts updated_at on the wire as updatedAt (the column exists)」. Measured: it exists on one of the three. ⇒ on Member and Invitation the ruling's main arm is not merely unchosen — it is impossible, and the ruling's own fallback A is double-forced there.
⚠️ ⛔ This is not a request to re-adjudicate, and PR #19122 implemented the ruling as written: fallback A is the ruling's own branch and it fired on measurement, exactly as the ruling prescribes. What is filed here is the fact, because 「照字面执行」 and 「⛔ 永不静默重裁」 are both satisfied only if the contrary reading is visible on the board rather than absorbed.
Carrier 2 — a mapping for a vendor field the vendor does not declare
packages/plugins/plugin-auth/src/auth-schema-config.ts maps updatedAt: 'updated_at' in several model blocks, including the SystemObjectName.ORGANIZATION block (the mapping at ~:188, its docblock table row at :97). Mechanically inert — better-auth's own organization model declares no updatedAt, so nothing ever reads that entry — but it reads like evidence that updatedAt travels on that wire, which is the belief #18728 exists to correct.
⚠️Evidence limit, declared rather than glossed: the vendor half is the dev's reading, relayed with attribution — updatedAt appears exactly twice in better-auth's organization plugin (for team and organizationRole, ⛔ not for organization / member / invitation), while core's user / account do declare it. ⛔ This seat could not re-measure it: the shared checkout has no node_modules at all, so the vendor file is unreadable from here. What this seat did verify first-hand is the in-repo half above and the mapping's existence.
⛔ What this card does NOT claim
⛔ Not that the mapping causes a live defect today — it is inert, and 「inert」 is the whole point: the cost is on the next reader.
⛔ Not measured: whether any other of the mapped models has the same inert row (only the organization block was read here), and whether any consumer reads the mapping table as documentation.
Dedupe words
updatedAt not on identity wire · sys_member no updated_at column · auth-schema-config dead updatedAt mapping · managedBy better-auth empty injection plan · ruling C column exists parenthetical
⛔ The filer does not dedupe (only these words); triage searches its own list, and a zero there needs a control that hits.
Related: #18728 (the card this came out of; ruling C at comment 5729189649) · PR #19122 (implements ruling C; its at-tier contract review is in flight) · #18509 / PR #18718 (the image/logo.nullish() arm on the same files, merged).
Path: none | inert carriers (identity wire belief) | 北极星「优先级」4
Filed by the
domain:spec#3execution seat (session_019srGWGCBBCBHqcDoRZpQRh) from theos-devround on #18728 (PR #19122, implementing the maintainer's ruling C). ⛔ Filed unassigned, ⛔ nopriority:*, nodomain:*, notype— routing and grading are the triage seat's. ⛔ Not a claim.updatedAtis on the identity wire」. Two artefacts in the tree still read as evidence for it, and splitting them would hide the root, which is the mistake #18728's own body warned about for the same family.The root, and why it is not merely tidy-up
Card #18728 corrected the belief on the schema side (ruling C, batch #158 item 4). But the tree still carries two things that make the next reader believe it again — and one of them is inside a maintainer ruling's own parenthetical, so it is worth having on the record rather than in a memory.
⭐ Carrier 1 —
sys_memberandsys_invitationhave noupdated_atcolumn AT ALLAll three are
managedBy: 'better-auth', which the dev names as the one disposition whereresolveInjectedSystemColumns(packages/spec/src/data/injected-system-columns.ts) returns an empty plan — not even the audit family is injected.⇒ ⭐ This contradicts a parenthetical in ruling C. The ruling says, verbatim: 「every identity read route puts
updated_aton the wire asupdatedAt(the column exists)」. Measured: it exists on one of the three. ⇒ onMemberandInvitationthe ruling's main arm is not merely unchosen — it is impossible, and the ruling's own fallback A is double-forced there.Carrier 2 — a mapping for a vendor field the vendor does not declare
packages/plugins/plugin-auth/src/auth-schema-config.tsmapsupdatedAt: 'updated_at'in several model blocks, including theSystemObjectName.ORGANIZATIONblock (the mapping at ~:188, its docblock table row at:97). Mechanically inert — better-auth's ownorganizationmodel declares noupdatedAt, so nothing ever reads that entry — but it reads like evidence thatupdatedAttravels on that wire, which is the belief #18728 exists to correct.updatedAtappears exactly twice in better-auth's organization plugin (forteamandorganizationRole, ⛔ not fororganization/member/invitation), while core'suser/accountdo declare it. ⛔ This seat could not re-measure it: the shared checkout has nonode_modulesat all, so the vendor file is unreadable from here. What this seat did verify first-hand is the in-repo half above and the mapping's existence.⛔ What this card does NOT claim
sys_member/sys_invitation: those aremanagedBy: 'better-auth', and fix(plugin-auth,spec,client): the identity read routes serve what the spec declares #19122's dispatch putplatform-objectsout of surface for exactly this reason. Whether the column should exist is a question for whoever owns that boundary.Dedupe words
updatedAt not on identity wire·sys_member no updated_at column·auth-schema-config dead updatedAt mapping·managedBy better-auth empty injection plan·ruling C column exists parenthetical⛔ The filer does not dedupe (only these words); triage searches its own list, and a zero there needs a control that hits.
Related: #18728 (the card this came out of; ruling C at comment
5729189649) · PR #19122 (implements ruling C; its at-tier contract review is in flight) · #18509 / PR #18718 (theimage/logo.nullish()arm on the same files, merged).Generated by Claude Code