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
{{ message }}
Repository navigation
auth follow-ups of #30922: an org admin cannot read the judged client address before saving an IP list, and the console MFA notices over sys_organization.require_mfa are inert #31030
S7:GET /admin/client-address, or a sibling read, gated by setup.write in the organization, so an org admin sees the judged address before saving access_policy IP ranges.
S6:ui/packages/app-shell/src/console/organizationMfaNotices.ts (with AppContent.tsx:969 and its i18n strings) is removed, or re-pointed at access_policy.mfa_required.
Acceptance
An org admin reads their judged address; a plain member is refused.
Raised to p1: S7 is a new served read (「协议新增定 p1」), on the Enterprise access-policy work the maintainer prioritized. Lane domain:server (S6 touches ui/packages/app-shell; the seat posts a cross-seat note for it).
Carried from objectstack#31013's delta contract review 6695328434 (should-fix) · 2026-11-07T00:49Z
D1:ip_not_allowed is a new sys_session.revoke_reason value. Add it to the field description's published vocabulary in sys-session.object.ts, which calls itself the only contract a consumer can read.
D2: "no heartbeat before the switch judgement" is pinned only by calling hooks.session.update.before. Pin it through the real /organization/set-active route as well; if better-auth's session middleware ever ran customSession first, the switch idle rule would be silently defeated.
Carried from objectstack#31013's delta review 6702665651 (D3, should-fix) · 2026-11-07T05:14Z · The organization IP list is re-judged on a session read only when ctx.request is present: the better-auth-served door (auth-manager-plugin-list.ts, whose door comes from readRequestClientAddress()). An objectstack-mount route that reads the session in-process (gateAdmin at auth-plugin.ts:3731, plus main's six new routes) judges the organization's limits but not its list. The deployment list still gates them. Either pass the mount's established address as door, or narrow the sentence in the PR body, the manifest and the changeset.
Claim: PM loop round 1 · 2026-11-07T17:19Z · seat 6's pick in the A/B server split (B = the plugin-auth cluster)
Session: session_01FEkQ5p3T5YWhLjurajudnQ
Account: os-project-manager (the seat's linked user; the card's assignee)
Branch: claude/project-thread-em08na
Worktree: the card thread's own checkout of claude/project-thread-em08na
Domain: domain:server
Seat: domain:server#6
File surface: packages/plugins/plugin-auth/src/ (a new org-admin client-address read + route ledger/mount, auth-plugin.tsgateAdmin / in-process session door region, the /organization/set-active pin, + tests); packages/platform-objects/src/identity/sys-session.object.ts (description vocabulary only); ui/packages/app-shell/src/console/organizationMfaNotices.ts, AppContent.tsx notice call and its i18n strings; docs sentences on the read; root .changeset/. ⛔ packages/spec/**, skills/** (stop on breach; explain in the report)
Container & model: M, mode:thread, model: default, effort: xhigh (p1)
Clause-②: yes (widening) (a new served read; the console string removal measured and declared by the dev)
Metadata-protocol: none
Responsibility: n/a — not a defect card (should-fixes carried from PR #31013 contract reviews 6692495550 / 6695328434 / 6702665651)
Thread-read: 6709681591
Premise: holds per triage unblock 6709681591 (#30922 closed); D1–D3 are re-checked against b5696b49 by the dev (work-item face) and reported done-or-not
Serial constraints cleared: same-seat parallel #30924 (auth-plugin.ts sign-in IP gate region, disjoint function); ui/**: ui seat 1 #30974 in flight, the dev reads its claim surface before touching AppContent.tsx; second to land merges origin/main once
Claim amendment · 2026-11-07T17:32Z · claim 6710570984 · the declaration, measured by the dev
Clause-②: yes (narrowing)
Metadata-protocol: none
The claim said Clause-②: yes (widening). The diff widens (a new served read, GET /api/v1/auth/client-address) and narrows: S6 is removed under the seat's ruling (no reader that a notice would serve), which deletes console.organizationMfa.needsTwoFactor and console.organizationMfa.nowRequired from all 11 locale bundles of the published @object-ui/i18n. Precedent: .changeset/30206-first-run-checklist.md declared the same kind of key removal yes (narrowing). Consequences: the PR title carries !, the full dogfood battery runs on the final head, and a CONTRACT_REVIEW_TIER review on that head is owed before landing; the seat runs it. Everything else in the claim stands.
Activity
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 → p1 ·
domain:server·pm:blocked· 2026-11-06T18:58Z⛔ Not a claim.
setup.write; S6 removes or re-points the inertrequire_mfaconsole notices.domain:server(S6 touchesui/packages/app-shell; the seat posts a cross-seat note for it).Blocked-by:line; PR feat(plugin-auth, service-settings)!: the access policy is set per organization, with three MFA levels #31013 fixes Access policy per organization: allowed IP ranges, session idle/absolute/concurrent limits and an MFA requirement of off / administrators / everyone, with the deployment value as default and floor #30922.Generated by Claude Code
objectstack-fleet commentedon Nov 7, 2026
repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2
Carried from objectstack#31013's delta contract review 6695328434 (should-fix) · 2026-11-07T00:49Z
ip_not_allowedis a newsys_session.revoke_reasonvalue. Add it to the field description's published vocabulary insys-session.object.ts, which calls itself the only contract a consumer can read.hooks.session.update.before. Pin it through the real/organization/set-activeroute as well; if better-auth's session middleware ever rancustomSessionfirst, the switch idle rule would be silently defeated.objectstack-fleet commentedon Nov 7, 2026
repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2
Carried from objectstack#31013's delta review 6702665651 (D3, should-fix) · 2026-11-07T05:14Z · The organization IP list is re-judged on a session read only when
ctx.requestis present: the better-auth-served door (auth-manager-plugin-list.ts, whosedoorcomes fromreadRequestClientAddress()). An objectstack-mount route that reads the session in-process (gateAdminatauth-plugin.ts:3731, plus main's six new routes) judges the organization's limits but not its list. The deployment list still gates them. Either pass the mount's established address asdoor, or narrow the sentence in the PR body, the manifest and the changeset.objectstack-fleet commentedon Nov 7, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: unblock ·
pm:blocked→pm:queue· 2026-11-07T16:16Z⛔ Not a claim.
Blocked-by:target is closed, re-read now: Access policy per organization: allowed IP ranges, session idle/absolute/concurrent limits and an MFA requirement of off / administrators / everyone, with the deployment value as default and floor #30922 (closed completed 2026-11-07T13:45Z).Generated by Claude Code
objectstack-fleet commentedon Nov 7, 2026
domain:server#6 · os-project-manager · session_01FEkQ5p3T5YWhLjurajudnQ
Claim: PM loop round 1 · 2026-11-07T17:19Z · seat 6's pick in the A/B server split (B = the plugin-auth cluster)
Session:
session_01FEkQ5p3T5YWhLjurajudnQAccount:
os-project-manager(the seat's linked user; the card's assignee)Branch:
claude/project-thread-em08naWorktree: the card thread's own checkout of
claude/project-thread-em08naDomain:
domain:serverSeat:
domain:server#6File surface:
packages/plugins/plugin-auth/src/(a new org-admin client-address read + route ledger/mount,auth-plugin.tsgateAdmin/ in-process sessiondoorregion, the/organization/set-activepin, + tests);packages/platform-objects/src/identity/sys-session.object.ts(description vocabulary only);ui/packages/app-shell/src/console/organizationMfaNotices.ts,AppContent.tsxnotice call and its i18n strings; docs sentences on the read; root.changeset/. ⛔packages/spec/**,skills/**(stop on breach; explain in the report)Container & model:
M,mode:thread,model: default,effort: xhigh(p1)Clause-②: yes (widening) (a new served read; the console string removal measured and declared by the dev)
Metadata-protocol: none
Responsibility: n/a — not a defect card (should-fixes carried from PR #31013 contract reviews 6692495550 / 6695328434 / 6702665651)
Thread-read: 6709681591
Premise: holds per triage unblock 6709681591 (#30922 closed); D1–D3 are re-checked against
b5696b49by the dev (work-item face) and reported done-or-notSerial constraints cleared: same-seat parallel #30924 (
auth-plugin.tssign-in IP gate region, disjoint function);ui/**: ui seat 1 #30974 in flight, the dev reads its claim surface before touchingAppContent.tsx; second to land mergesorigin/mainonceobjectstack-fleet commentedon Nov 7, 2026
domain:server#6 · os-project-manager · session_01FEkQ5p3T5YWhLjurajudnQ
Claim amendment · 2026-11-07T17:32Z · claim 6710570984 · the declaration, measured by the dev
Clause-②: yes (narrowing)
Metadata-protocol: none
The claim said
Clause-②: yes (widening). The diff widens (a new served read,GET /api/v1/auth/client-address) and narrows: S6 is removed under the seat's ruling (no reader that a notice would serve), which deletesconsole.organizationMfa.needsTwoFactorandconsole.organizationMfa.nowRequiredfrom all 11 locale bundles of the published@object-ui/i18n. Precedent:.changeset/30206-first-run-checklist.mddeclared the same kind of key removalyes (narrowing). Consequences: the PR title carries!, the full dogfood battery runs on the final head, and aCONTRACT_REVIEW_TIERreview on that head is owed before landing; the seat runs it. Everything else in the claim stands.