Skip to content

Team page: a hand-made team reads as managed by the identity provider, member rows are titled with raw ids, and the count is stale #30337

Closed

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

Filing gate: ③ the maintainer's direct order, verbatim: 「你发现的问题都立卡,安全问题总专用的安全密卡通道,需要进一步分析的进一步测试,还是没有把握的用决策卡。」 (2026-11-05). Found in a real-user browser walkthrough of Setup on main 04f36b63f8, with a test app and a local test deployment.

Business reason. Teams are how a company groups people for sharing. A label that reads as "not yours to change" and a list of id strings make a working feature look unusable.

Reader. The UI lane dev for the record page; the engine lane if the title comes from sys_team_member's definition in packages/platform-objects/src/identity/sys-team-member.object.ts.

Duplicates. Searched team managed by identity provider label (24 hits), team member title raw id (51 hits) and related list tab count stale (127 hits). They are QA run anchors; none has this subject.

Measured

Creating a team, adding members and removing them all work, and a team used as a sharing rule's recipient grants and withdraws access at once. The problems are in how the page reads:

  • A team I created by hand in Setup is labelled 「由身份提供方管理」 (ui/packages/i18n/src/locales/zh.ts:933), though it can be edited there.
  • The member list's 标题 column shows ZDGI1SW5JmHgaiu6reGuHodMbgPr4AiZ in gGjBm6s3gDy1TcjUpkAz0L4d4AkaMmjo.
  • The tab read 团队成员 0 while the list said 2 条. After a removal it read 1 with 1 row, so it catches up late.

Expected

  • The label says something true of a team made here, or does not appear.
  • Member rows read as names. If the title column adds nothing beside 用户, it goes.
  • The tab count matches the list as soon as members change.

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p3 · domain:ui · pm:queue · 2026-11-05T07:12Z

    ⛔ Not a claim.

    • Read fresh. The Team page reads a hand-made team as managed by the identity provider, titles member rows with raw ids, and shows a stale count. p3. The member title (sys-team-member.object.ts) is the domain:server half.

    Generated by Claude Code

  2. added
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2

    Claim: PM loop round 2 · 2026-11-05T09:18Z
    Session: session_01Utp6Cb5R6JDdfyvtj3dPR2 (seat); dev = card thread session_01Utp6CZGJdHbf9pjnedaUeD
    Account: os-bill
    Branch: claude/project-thread-x8wcyi (harness-pinned card thread branch; the claude/issue-N-slug convention does not apply to a project card thread)
    Worktree: objectstack-issue-30337
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: ui/packages/app-shell/src/** (Setup team page, record page tab count, provenance notice), ui/packages/plugin-detail/src/** only where the related tab count is drawn, ui/packages/i18n/src/locales/**, their tests, one root .changeset/; ⛔ packages/platform-objects/** (stop on breach; explain in the report)
    Container & model: M (three items), mode:thread, model: default tier (opus) — dispatch-gates --tier: no path-derived mandate, effort: high
    Clause-②: no (yes (widening) if a published @object-ui/i18n key is added)
    Metadata-protocol: none
    Responsibility: n/a — UI defect/enhancement in ui/** owned by this lane; no platform path covers it; reached by every console/Studio user
    Thread-read: 6652088012
    Premise: holds (zh.ts:933 betterAuth title 由身份提供方管理; items 2-3 card measurement 04f36b6, not re-measured by the seat)
    Serial constraints cleared: seat 2 #29944 (PR #30378) edits plugin-detail RelatedList.tsx header: merge main before the PR if the count fix lands there; seat 1 #30122 timeline files disjoint

    Dispatch order: /mnt/project-files/ui-seat2/dispatch-30337.md (project files).

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2
    os-dev-report

    {
      "issue": 30337,
      "status": "done",
      "branch": "claude/project-thread-x8wcyi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30417",
      "head": "53cf42ca",
      "session": "session_01Utp6CZGJdHbf9pjnedaUeD (card thread; seat session_01Utp6Cb5R6JDdfyvtj3dPR2)",
      "premise_still_valid": true,
      "summary": "Items 1 and 3 done in ui; item 2 is the server half, reported, PR says Part of #30337. Item 1: sys_team is managedBy better-auth and that bucket is right; the note's words were not. managedByBadge.betterAuth title/body changed in all 10 packs plus the ManagedByBadge English fallback (values only, no key added or removed): 'Written through the built-in identity service' / 经内置身份服务写入, body says create and change records with this page's actions or sign-in/invitation/security flows. Item 3: the team's header action add_team_member (type api, refreshAfter true) posted only sys_team + this record, while the tab badge's RelatedCountStore and the related list key on the CHILD (sys_team_member), so the count cached at 0 stayed 0; RecordDetailView now has notifyViewChanged (record + every child object the page lists), used at all five refreshAfter entries (api door, direct api fetch, declared-operation script path, flow, server action onRefresh). Parent still read once.",
      "tests": "Red on 4779e798 (tests only): Tests 3 failed | 7 passed (10) (badge en+zh got the old note; header-action test: 'Unable to find an element with the text: Support plan'). Green: 3 files, Tests 15 passed (15). Red-first leg on the parent commit is the ablation (fix is the only source change; app-shell tests import src). Importers: every ui test file naming RecordDetailView / ManagedByBadge / managedByBadge plus all of packages/i18n/: Test Files 382 passed (382), Tests 3754 passed | 13 skipped (3767), under the lock 17m12s. Final head 53cf42ca: 4 files (incl. updateActionRefresh-29935), Tests 18 passed (18). turbo type-check --filter=@object-ui/app-shell --filter=@object-ui/i18n: Tasks 69 successful, 69 total. eslint changed ui files: 0 errors; RecordDetailView.tsx 124 warnings vs 123 on main (+1 react-hooks/refs heuristic on the withNewTabUrlFastPath memo).",
      "gates": "dispatch-gates --commands on 53cf42ca (after merging origin/main): 35 families, all exit 0, incl. node scripts/check-sdui-manifest.mjs :: exit 0 and pnpm check:type-check-debt :: exit 0 (under the lock). --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. Record: /mnt/project-files/ui-seat2/30337-gates-ran.txt. CI check-runs on 53cf42ca: in_progress at report time (21 runs: 3 success, 3 skipped, 15 in_progress).",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "line_budget": "16 files vs origin/main; source RecordDetailView.tsx + ManagedByBadge.tsx, 10 locale value pairs, 3 test files, 1 changeset",
      "files_changed": [
        ".changeset/30337-team-page-identity-note-and-counts.md",
        "ui/packages/app-shell/src/components/ManagedByBadge.tsx",
        "ui/packages/app-shell/src/components/__tests__/ManagedByBadge.keyboard-27521.test.tsx",
        "ui/packages/app-shell/src/views/RecordDetailView.tsx",
        "ui/packages/app-shell/src/views/RecordDetailView.childWriteRefreshesParent-12244.test.tsx",
        "ui/packages/app-shell/src/views/RecordDetailView.setupManagedByChip-13385.test.tsx",
        "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts"
      ],
      "deviations": [
        "Closing line is 'Part of #30337', not Fixes: item 2 (member title column) is server-side and not in this PR; merging should not close the card.",
        "Item 3's fix widened from the api paths to every refreshAfter entry on the record page (script operation, flow, server action), for one rule matching the spec's 'Refresh view after execution'; importer suite (382 files) green.",
        "The 12244 harness's createAuthenticatedFetch mock is now a hoisted spy (bare vi.fn() behaviour by default) so its new describe can answer the action door.",
        "No assignee and no reviewer on the PR (dispatch Writes line); the harness post-PR assign/review step skipped.",
        "PR attribution link points at this card thread (session-context instruction)."
      ],
      "mcp_calls": "2 — mcp__github__issue_read x2 (get, get_comments); no write tools",
      "api_writes": "2 — relay pr_create (objectstack-ai/objectstack#30417, draft, read back identical 10942 bytes), post-stamped issue comment on #30337 (this report); plus git pushes (not REST)",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: Setup, a team record, its member list's Title column reads 'USER_ID in TEAM_ID' beside the User column (card's measurement on main 04f36b63f8) · evidence: packages/platform-objects/src/identity/sys-team-member.object.ts declares nameField display_title, a formula record.user_id + ' in ' + record.team_id evaluated before expand; a related list with no authored columns leads with the declared nameField (leadWithNameField, ADR-0079, declared names exempt) then highlightFields. Producer fix: relatedListColumns ['user_id','created_at'] on the team_id lookup (and ['team_id','created_at'] on user_id for the user page's teams list); authored relationship columns are drawn verbatim with no name lead. domain:server, outside this card's file surface · dedupe words: team member title raw id, sys_team_member display_title related list, relatedListColumns team_id · carrier: seat (file as the server half of #30337)"
      ]
    }

    Report taken 2026-11-05T10:33Z.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2

    Landed · 2026-11-05T11:52Z · PR #30417 merged as 2b353744f through the merge queue. It covers items 1 and 3; the seat ACCEPTed the merged head, and the maintainer authorized the landing in the seat thread at 11:29Z. pm:dispatched is removed.

    The card stays open. Item 2, the members list's Title column that shows raw ids, is the server half, filed as #30421 (domain:server). Close this card when #30421 merges.

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2

    Closed · 2026-11-05T13:37Z · both halves have landed. The ui half (items 1 and 3) landed as PR #30417 (2b353744f). The server half (item 2: the members list's Title column showing raw ids) landed as #30421 / PR #30452 (35cd64c57). Nothing on this card is left open.

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

    bugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions