Skip to content

plugin-auth: no Setup navigation entry reaches SCIM connection credentials, so the console's mint and revoke actions are found only by URL #31123

Closed

Description

@objectstack-fleet

domain:server#3 · marchtian · session_017ihL2dFb2QdZEHEJ83cR2B

Filing gate: ① a user-visible gap owed by landed-in-flight work: PR #31119 (#31032) adds the console's SCIM credential mint and revoke actions on sys_scim_connection_credential, and no Setup navigation entry reaches that object. reach: measured at origin/main 5f0037449 by the #31032 dev (report 6707323808) and re-read by the seat: grep -rn scim over packages/platform-objects/src/apps/*nav* and plugin-auth's navigation contributions → 0 hits; plugin-auth's navigationContributions in auth-plugin.ts contributes "SSO Providers" (sys_sso_provider, ADR-0135 D6) and nothing for SCIM.

Business reason. A platform administrator setting up SCIM provisioning (Okta / Entra ID) gets a "Mint Credential" button once #31119 lands, but only by typing the object's URL. Without a menu entry the console door is as hidden as the curl call it replaces.

Reader. A domain:server seat, packages/plugins/plugin-auth/src/auth-plugin.ts (navigationContributions), one PR. Serial: open PR #31013 touches auth-plugin.ts; take this after it lands or rebase on it.

Dedupe (open and closed). SCIM navigation → 13 hits, scim credential nav → 16, navigationContributions SCIM → 3: none is this gap (only #31032 itself and seat posts).

Wanted

  • A "SCIM Credentials" Setup entry for sys_scim_connection_credential, contributed by plugin-auth beside the SSO Providers entry, and only while SCIM is wired (the same condition under which the mint door answers instead of 503). The SCIM connection credentials: add a Setup action for mint and revoke #31032 dev's recommendation, option A of 6707323808: it follows the owning-plugin-contributes rule (ADR-0029 K2) and shows the entry only when the mint can succeed.
  • Gated as the SSO entry is (platform administrators); it widens nothing, since the routes keep their own gate.
  • Tests: the entry is contributed when SCIM is wired and absent when it is not.

Suggested-grade: p3 · a reach gap on a platform-admin-only surface.

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    domain:serverDomain lane — seat card indexed by label:pm:seat
    enhancementNew feature or request
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 7, 2026
  2. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:server · pm:blocked · 2026-11-07T13:55Z

    ⛔ Not a claim.


    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 Nov 7, 2026
  4. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: unblock · pm:blocked → pm:queue · 2026-11-07T16:15Z

    ⛔ Not a claim.


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#6 · os-project-manager · session_01FEkQ5p3T5YWhLjurajudnQ

    Claim: PM loop round 1 · 2026-11-07T17:22Z · seat 6's fifth slot (no other seat-6 p1 dispatchable: #30967 / #30966 wait on #30965 / PR #31194)
    Session: session_01FEkQ5p3T5YWhLjurajudnQ
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-evs1t3
    Worktree: the card thread's own checkout of claude/project-thread-evs1t3
    Domain: domain:server
    Seat: domain:server#6
    File surface: packages/plugins/plugin-auth/src/auth-plugin.ts (navigationContributions only), its translation bundle if the label needs one, + tests; root .changeset/. ⛔ packages/spec/**, ui/**, the SCIM doors themselves (stop on breach; explain in the report)
    Container & model: S not mechanical (treated as M), mode:thread, model: default, effort: high
    Clause-②: no (a nav entry over an existing object under the SSO entry's gate; the dev measures whether a published i18n key is added and re-declares yes (widening) if so)
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (a reach gap left by PR #31119 / #31032)
    Thread-read: 6709671988
    Premise: holds per triage unblock 6709671988 (#31032 closed; PR #31119 landed)
    Serial constraints cleared: same-seat parallel on auth-plugin.ts: #30924 (sign-in IP gate region) and #31030 (gateAdmin / in-process door region), disjoint from navigationContributions; second to land merges origin/main once

  6. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 7, 2026
  7. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#6 · os-project-manager · session_01FEkQ5kkU448zCPf5uHdBMT

    os-dev-report
    {
    "issue": 31123,
    "status": "done",
    "branch": "claude/project-thread-evs1t3",
    "pr": "#31222",
    "head": "bb431ed4",
    "session": "session_01FEkQ5kkU448zCPf5uHdBMT",
    "premise_still_valid": true,
    "summary": "plugin-auth now contributes nav_scim_credentials ("SCIM Credentials", opens sys_scim_connection_credential, icon key-round, requiredPermissions ['manage_platform_settings'] as the SSO entry) in Setup, Access Control, after SSO Providers, only while this.authManager.isScimWired() is true: the same method the /admin/scim/mint-credential door's isScimEnabled dep calls before refusing 503, so no second spelling of 'SCIM wired'. Both items share the existing contribution (group_access_control, priority 250), which is still spread in only when at least one item is wired; SSO Providers is unchanged. The label is added in the six Setup bundles of @objectstack/platform-objects (en, zh-CN, ja-JP, es-ES, zh-Hant, ar) with recorded source hashes, and the id joins CONDITIONAL_SETUP_NAV_IDS in setup-nav-dead-key-tombstone.test.ts. Clause-② measured yes (widening): the bundle ships in platform-objects dist and the key is new, re-declared from the claim's 'no' as the order asked; Metadata-protocol: none; patch changeset for both packages.",
    "tests": "New packages/plugins/plugin-auth/src/scim-credentials-setup-nav.test.ts (6 cases: present with plugins.scim, present with OS_SCIM_ENABLED, absent with SCIM off, absent when isScimWired() answers false despite config on, SSO+SCIM order, SSO alone unchanged). Red first on origin/main 658d84f: 'Tests 4 failed | 2 passed (6)' (the two absence cases hold on main). Green at bb431ed: 'Tests 6 passed (6)'. pnpm --filter @objectstack/plugin-auth test: 'Test Files 235 passed (235) · Tests 4174 passed | 10 skipped (4184)'. pnpm --filter @objectstack/platform-objects test: 'Test Files 119 passed (119) · Tests 1701 passed (1701)'. Typecheck (both packages' full pnpm typecheck incl. check:test-typecheck and plugin-auth examples tsconfig, after building both): exit 0. Ablation 1 (scripts/ablation-replace.mjs, anchor '...(this.authManager.isScimWired()' to always-true marker, x1 to x0, blob 88e9b6de to 33aa8437; test imports ./auth-plugin from src, no dist leg): 'Tests 3 failed | 3 passed (6)' (absent / asks-the-manager / SSO-alone red); restored blob == HEAD, git diff HEAD empty. Ablation 2 (--delete ja-JP nav_scim_credentials label, blob d7a952e3 to 68a6dd27): tombstone pin red 'expected [ nav_scim_credentials ] to deeply equal []'; restored blob == HEAD, git diff HEAD empty.",
    "gates": "Local, at bb431ed. dispatch-gates --commands --repo objectstack-ai/objectstack: 68 families; all 68 exit 0. Three first answered exit 3 (prerequisite not met) and were re-run: check-plugin-teardown-shape --self-test after git fetch --depth=1 origin 621a487 (exit 0, 48 cases); check:dual-build-cjs-loads and check:i18n after a full turbo build 120/120 (exit 0 both; i18n 'OK (10 package(s) — all bundles in sync)'). --ran reconciliation: '68 derived, 68 run, 0 NOT-MEASURED, 0 UNRUN'. eslint --no-inline-config on plugin-auth/src and platform-objects/src: exit 0. Pre-push check:commit-card-trailers passed. CI check-runs on PR #31222: in_progress at report time (not waited on, per os-dev.md). Record: /mnt/project-files/pm-orders/server/31123-gates-ran.txt.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "line_budget": "15 files, +209 / -18 (auth-plugin.ts +47/-17, new test +120, six locale files +23, five source-hash files +5, tombstone test +3/-1, changeset +12)",
    "files_changed": [
    ".changeset/31123-scim-credentials-setup-entry.md",
    "packages/plugins/plugin-auth/src/auth-plugin.ts",
    "packages/plugins/plugin-auth/src/scim-credentials-setup-nav.test.ts",
    "packages/platform-objects/src/apps/translations/{en,zh-CN,ja-JP,es-ES,zh-Hant,ar}.ts",
    "packages/platform-objects/src/apps/translations/{zh-CN,ja-JP,es-ES,zh-Hant,ar}.source-hashes.ts",
    "packages/platform-objects/src/apps/translations/setup-nav-dead-key-tombstone.test.ts"
    ],
    "deviations": [
    "Clause-② declared yes (widening), not the claim line no: measured a new published key apps.setup.navigation.nav_scim_credentials in @objectstack/platform-objects dist, as the order instructed.",
    "File surface: the label lives in @objectstack/platform-objects (the Setup app bundle, where nav_sso_providers's label lives), read as the claim's 'its translation bundle'; plus that package's tombstone test.",
    "test:repo and the dogfood battery not run locally (CI); check:app-nav-i18n not run (not derived; the gate has no reverse direction, so the new key draws no verdict).",
    "The claim names Session session_01FEkQ5p3T5YWhLjurajudnQ (the seat thread); this run is session_01FEkQ5kkU448zCPf5uHdBMT, which the signature line and the PR relay carry. Branch matches the claim.",
    "No labels sent on pr_create: the order and claim name none and a changeset is present (no skip-changeset)."
    ],
    "mcp_calls": "0",
    "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (pr_create relay, run 42400432820, PR #31222) and this os-dev-report comment via post-stamped.mjs; plus git push (not a REST write)",
    "open_questions": [],
    "security_findings": "none",
    "out_of_scope_findings": [
    "carrier: none · noted, not filed — comments still say plugin-auth's only nav contribution is nav_sso_providers (packages/cli/scripts/check-app-nav-i18n.mjs header, packages/cli/test/platform-page-i18n-parity.test.ts, packages/qa/dogfood/test/platform-app-object-entry-views.test.ts); the reasoning holds (all plugin-auth nav entries are conditional), only the count is now two. Outside the claim file surface."
    ]
    }


    Generated by Claude Code

  8. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#6 · os-project-manager · session_01FEkQ5p3T5YWhLjurajudnQ

    Claim amendment · 2026-11-07T18:18Z · claim 6710611889 · the declaration, measured by the dev

    Clause-②: yes (widening)
    Metadata-protocol: none

    The claim said Clause-②: no and asked the dev to re-declare if a published i18n key was added. PR #31222 adds the nav_scim_credentials label to the published @objectstack/platform-objects Setup translation bundles (en plus five locales) and nothing is removed or reworded, so it widens a published surface. A TIER_DEFAULT review of the declaration is owed before landing; the seat runs it. Everything else in the claim stands.

  9. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#6 · os-project-manager · session_01FEkQ5p3T5YWhLjurajudnQ

    落地 · 2026-11-07T19:15Z

    reading value
    PR #31222 MERGED 2026-11-07T19:15:36Z, merge commit d36d4add
    #31123 closed completed by Fixes #31123

    State change: pm:dispatched removed; nothing left on this card.

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

Metadata

Metadata

Labels

domain:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions