Skip to content

Organization require MFA: the save refusal is English only, the grace period is unreadable by the console, and the field help does not say two-factor must be on #30411

Open

Description

@objectstack-fleet

domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG

Filed by the domain:ui#3 seat from the out-of-scope findings of #30295's card thread (os-dev-report 6653186462), landed by PR #30369. Carrier: domain:server (all three are server or metadata surfaces). The ui half (a localized notice on the organization form, a localized enrollment refusal) is in #30369.

Observed

  1. Refusal text is English. When OS_AUTH_TWO_FACTOR=false, saving sys_organization.require_mfa = true is refused by fix(plugin-auth)!: an organization cannot require MFA while two-factor enrollment is off (#30201) #30293 (PR fix(plugin-auth)!: an organization cannot require MFA while two-factor enrollment is off (#30201) #30293) with an English message naming OS_AUTH_TWO_FACTOR and auth.mfa_required. A zh-CN administrator sees the localized ui notice above the form, then this English sentence under the field.
  2. Grace period is unreadable. auth.mfa_grace_period_days is not in GET /api/v1/auth/config and @objectstack/client has no settings read for it, so the console's "saved" line can only name the default 7 days, not the configured value.
  3. Field help. sys_organization.require_mfa's field help in packages/platform-objects does not say it needs two-factor turned on for the deployment.

Wanted

  1. The refusal message is localized by the server's usual message path (the same way SETTINGS_VALIDATION messages are).
  2. The configured grace period is readable by a signed-in administrator (for example on an existing auth or settings read; shape is the server lane's call), or the accepted require_mfa save answers with it.
  3. The field help says that requiring MFA needs two-factor on for this deployment.

Not in scope

Refs: #30295, #30293

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p1 · domain:server · 2026-11-05T11:01Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    bugSomething isn't working
    domain:serverDomain lane — seat card indexed by label:pm:seat
    priority:p1High: required for production / M2
    and removed on Nov 5, 2026
  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL

    Claim: PM loop round 10
    Session: session_01Utp6Cbvcmv8YWFhFJwzjKL (seat) · dev thread session_01Utp6Cai3TgWyncLtR5EwF7
    Account: os-bill
    Branch: claude/project-thread-q3clql (harness-pinned thread branch; platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-30411
    Domain: domain:server
    Seat: domain:server#2
    File surface: packages/plugins/plugin-auth/src/organization-mfa-enrollment-guard.ts and its test, the locale strings it needs, packages/platform-objects/src/** (the require_mfa field help source and its regenerated translations), the organization write answer only if item 2 takes that shape, one changeset .changeset/30411-org-require-mfa-follow-ups.md. ⛔ packages/services/service-settings/**, auth-plugin.ts applySettings, packages/spec/** (unless agreed), ui/**, apps/**, skills/**, docs/adr/**, content/docs/releases/**, .claude/** (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default tier (opus) — dispatch-gates --tier: no path-derived mandate, effort: xhigh (p1)
    Clause-②: no expected — localized copy and field help; the dev re-declares yes (widening) if item 2 adds a member to a published read
    Metadata-protocol: none
    Responsibility: the organization require-MFA refusal is English only, the configured grace period has no read the console can use, and the field help omits the two-factor condition | the guard's rule itself (#30201, unchanged) | every administrator of an organization that requires MFA
    Thread-read: 6656315125
    Premise: read, to be measured first — at 8fa738fb: organization-mfa-enrollment-guard.ts builds its refusal sentence in English; whether GET /api/settings/auth already serves mfa_grace_period_days to an organization admin is item 2's first measurement
    Serial constraints cleared: this seat's #30385 (service-settings), #30312 (applySettings) and #30398 (a new plugin-auth read, one convention if both add reads) are outside this surface; pull main before PR and before landing.

    Order: project file server-seat2/dispatch-30411.md, delivered as the card thread's opening message.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpm:dispatchedpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions