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
client SDK oauth.* family: bind the 5 return res.json() methods to their better-auth wire shapes (ISO string timestamps) — #12104 family card 1 of 3 #14312
Filed by the domain:cli execution PM seat (#6024), session session_016yfqQh2dBgPAymYd7xipza, R65 — one of the three family cards the maintainer's ruling on #12104 ordered this lane to file. Part of #12104 (the family head). ⛔ domain:* / type left to triage; the lane is fixed by the parent. Family order: this card FIRST (shortest job on the hot file), then the auth.* card, then the organizations.* card.
Each is an exported callable of @objectstack/client with no return annotation that ends return res.json(), so its published type is Promise< any > from lib.dom. ⛔ Grep cannot count this class — use pnpm --filter @objectstack/client check:exported-any-returns (asks the type checker on the built dist).
Constraints that bind
Clause-② yes (narrows a published return type). Hang needs:contract-review on the PR at creation (double carrier: card + PR); the dispatching seat runs the in-seat at-tier review before any landing.
Source of truth for each shape is the wire body. Drive at least one route of this family end to end against a real server and read the body; better-auth's own exported return types are the starting point (the A sixth client-SDK erasure spelling, larger than the other five combined: 43 exported methods return res.json() directly, whose lib.dom type is Promise< any > #12104 dev measured that every one of the 38 endpoints has a concrete better-auth return type — the card's "contracts must be authored" hypothesis is refuted). Every Date-typed field is declared as ISO string with a JSDoc ISO-8601 note, per the ruling. ⛔ No Date, ⛔ no runtime revival layer, ⛔ no any.
check:exported-any-returns is shrink-only: delete exactly this family's ledger entries in the same PR — no others, no count-driven cleanup (read the reasons, never the count).
Positive control: automation.trigger was bound by PR #13082 and must NOT appear in the ledger; the grep above must hit packages/client/src/index.ts before any zero is read as "already bound".
Refs: #12104 (family head, ruling) · PR #13082 (the in-repo 5 — precedent for the binding shape and the same-PR ledger deletion) · #13080 (BREAKING-token category) · #13079 (envelope convention, ⛔ not this family's question).
Filed by the
domain:cliexecution PM seat (#6024), sessionsession_016yfqQh2dBgPAymYd7xipza, R65 — one of the three family cards the maintainer's ruling on #12104 ordered this lane to file. Part of #12104 (the family head). ⛔domain:*/ type left to triage; the lane is fixed by the parent. Family order: this card FIRST (shortest job on the hot file), then theauth.*card, then theorganizations.*card.Ruling (verbatim, 2026-08-31, maintainer, comment
5472614711on #12104 — ⛔ 不译)Scope — the 5 methods (from #12104's census; re-locate on current
main, the file has moved under several landings since)oauth.applications.register·oauth.applications.get·oauth.applications.getPublic·oauth.applications.delete·oauth.consentEach is an exported callable of
@objectstack/clientwith no return annotation that endsreturn res.json(), so its published type isPromise< any >fromlib.dom. ⛔ Grep cannot count this class — usepnpm --filter @objectstack/client check:exported-any-returns(asks the type checker on the builtdist).Constraints that bind
needs:contract-reviewon the PR at creation (double carrier: card + PR); the dispatching seat runs the in-seat at-tier review before any landing.return res.json()directly, whose lib.dom type isPromise< any >#12104 dev measured that every one of the 38 endpoints has a concrete better-auth return type — the card's "contracts must be authored" hypothesis is refuted). EveryDate-typed field is declared as ISOstringwith a JSDocISO-8601note, per the ruling. ⛔ NoDate, ⛔ no runtime revival layer, ⛔ noany.check:exported-any-returnsis shrink-only: delete exactly this family's ledger entries in the same PR — no others, no count-driven cleanup (read the reasons, never the count).**BREAKING**token follows the disposition client SDK drops the precise spec types at its boundary: 32 methods returnPromise< any >on a package that already depends on@objectstack/spec#8140 / A fifth client-SDK erasure spelling no grep in #8140's census counted: 38 methods with NO return annotation, typed fromunwrapResponse< …any… >#11925 /client.packagesdeclares envelopes two mounted surfaces do not emit:getdiverges between them, andinstall/enable/disabledeclare{ package }where the only serving surface sends the bare row #12034 used until [finding] check-adr-0087-registration has no honest disposition for a published TYPE-surface narrowing — every category is refused, so the class is pushed to drop the**BREAKING**token instead #13080 lands (⛔ not solved here).packages/client/src/index.ts— HARD SERIAL across the three family cards, released on MERGE, ⛔ never two in flight.Promise< any >) — the body sanitizer eats tag-shaped spans, backticks included.Re-check
Positive control:
automation.triggerwas bound by PR #13082 and must NOT appear in the ledger; the grep above must hitpackages/client/src/index.tsbefore any zero is read as "already bound".Refs: #12104 (family head, ruling) · PR #13082 (the in-repo 5 — precedent for the binding shape and the same-PR ledger deletion) · #13080 (BREAKING-token category) · #13079 (envelope convention, ⛔ not this family's question).