Skip to content

feat(settings,auth): expose the audience posture in the auth settings namespace (console switch surface for self-host) #11768

Closed

Description

@os-zhuang

The audience posture shipped by #11739 (PR #11767) is authorable on AuthConfig and live-patchable via AuthManager.applyConfigPatch, and cloud gets its own switch surface (objectstack-ai/cloud#1649) — but the OPEN-SOURCE operator surface has no channel: the auth settings namespace (packages/services/service-settings/src/manifests/auth.manifest.ts + the bindAuthSettings binding in packages/plugins/plugin-auth/src/auth-plugin.ts) exposes signup_enabled / require_email_verification / membership_policy, but not the audience posture. A self-host admin therefore cannot switch invite_only | email_domain | open (or declare the domain list / self-registration permission set) from the console Settings page — only from stack config at boot.

Suggested shape, following the membership_policy precedent exactly (#5152: explicit-only application, off-vocabulary values rejected loudly and never coerced):

  • manifest entries in an audience group: a select over the closed vocabulary, a domain-list field, a permission-set name field;
  • bindAuthSettings maps them to one applyConfigPatch({ audience: {...} }) — note the patch validates the MERGED result and throws on an invalid combination (empty domain list under email_domain, missing permission set, verification contradiction), so the binding should catch and report per the existing applySettings catch;
  • the settings write path already enforces the option table on setMany; an OS_AUTH_* env override channel, if added, must run isAudiencePosture at the boundary.

Out of scope for #11739 (its declared file surface excluded packages/services/service-settings/**); filed from that dispatch as an out-of-scope finding.

Blocked-by: #11739

Generated by Claude Code

Activity

  1. added
    domain:servicesRetired 2026-10-22, alias of domain:server (services surface); in-flight cards keep it until landed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Aug 24, 2026
  2. os-zhuang commented on Aug 24, 2026

    @os-zhuang
    ContributorAuthor

    Triage: domain:services, pm:blocked, type Feature.

    Blocked-by: #11739

    Rationale: this is the open-source operator leg of the ruled audience-posture epic (#11723, ruled A 2026-08-24; cloud leg objectstack-ai/cloud#1649 filed the same way as a blocked execution card). The settings-namespace exposure follows the membership_policy precedent (#5152) and stays inside the ruled closed vocabulary, so it routes as an execution leg rather than a new decision. Blocked until #11739 / PR #11767 lands — the applyConfigPatch audience surface this binds to does not exist on origin/main yet. At claim time: re-verify the merged shape on the post-#11767 ref before pricing, and assess Clause-② against the actual diff (a manifest/binding addition inside the ruled vocabulary is expected to be no, but the claim comment owns that call).

    Session: session_012od9QE3Wzmgb3aXQ7U156P (triage seat, hourly round)


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Aug 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:servicesRetired 2026-10-22, alias of domain:server (services surface); in-flight cards keep it until landed

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions