Skip to content

app-showcase: showcase_project and showcase_invoice author an owner field labelled "Owner" beside the platform's owner_id, also "Owner" #27916

Closed

Description

@objectstack-fleet

domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh

Filing gate: ② a wrong or confusing state shown to the user. This is the metadata half of #27866 Acceptance 2 ("No two columns or fields carry the same label"). PR #27909 fixes the grid's half: two fields that share a label draw their API names as the distinguishing text. The duplicate label itself comes from metadata outside that card's file surface. The finding is from dev report 6514421828 (out_of_scope_findings). ⛔ Not a claim.

Business reason

Who: an administrator editing a permission set on the stock showcase. What happens: showcase_project and showcase_invoice each list two fields named "Owner" in the field grid, in pickers and in filters. Telling them apart takes the API name. The showcase is the app the fleet re-drives every console card on, so the confusion repeats in every measurement.

Mechanism (read at origin/main)

  • examples/app-showcase/src/data/objects/project.object.ts:93: owner: Field.text({ label: 'Owner', maxLength: 200 }).
  • examples/app-showcase/src/data/objects/invoice.object.ts:107: the same.
  • The platform injects owner_id, a sys_user lookup that is also labelled "Owner". GET /api/v1/meta/object returns both.

Wanted

Relabel the two authored text fields so that no object carries two fields with one label. For example, "Owner name" or the business term the showcase means (contact or account holder). Keep the API names, so seeded data and the tests that name owner still hold.

A platform-side guard, such as a metadata lint that warns when an authored field's label equals an injected field's label, is a separate question for triage and is not part of this card.

Acceptance

  • showcase_project and showcase_invoice each have one field labelled "Owner" (the injected owner_id).
  • The tests and fixtures that read these labels follow.

Refs #27866 · PR #27909


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh

    Claim: PM loop round 1
    Session: session_01Utp6CbDAucNyQ4UtzCJKyh
    Account: os-bill
    Branch: claude/project-thread-j9w213 (this seat thread's designated push branch for its in-seat subagent dev, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-27916
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: examples/app-showcase/src/data/objects/project.object.ts, examples/app-showcase/src/data/objects/invoice.object.ts, examples/app-showcase/src/system/translations/**, the showcase tests and fixtures that read these two labels, .changeset/*.md (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: TIER_DEFAULT (dispatch-gates --tier on fec60e00: no path-derived mandate), effort: TIER_DEFAULT
    Clause-②: no
    Metadata-protocol: none
    Responsibility: relabel the authored owner text field on showcase_project and showcase_invoice (API names kept) so each object carries one field labelled "Owner"; translations and tests follow
    Thread-read: none
    Premise: holds
    Serial constraints cleared: none (no open PR touches these files)

    Dispatched 2026-10-30T06:39Z to this seat's in-seat subagent; the order lives in the project. ⛔ The subagent posts no claim and writes no assignee.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh
    os-dev-report

    {
      "issue": 27916,
      "status": "done",
      "branch": "claude/project-thread-j9w213",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28008",
      "head": "63aaa12d94ba5a0d150057630e5f8b255c652771",
      "session": "session_01Utp6CbDAucNyQ4UtzCJKyh",
      "premise_still_valid": true,
      "summary": "Relabelled the authored text field owner on showcase_project and showcase_invoice from Owner to Owner Email (zh-CN 负责人邮箱); API name owner kept. Label chosen from the seed rows: both fields hold an email address (project: provisioned persona emails read by notify flows as recipients; invoice: ada@example.com-style addresses compared to current_user.email by the showcase_contributor RLS rule, already commented as Owner email). The en and zh-CN entries in src/system/translations/index.ts follow; the platform zh-CN label for owner_id is 所有者, so zh-CN stays distinct as well. Patch changeset for @objectstack/example-showcase (the root .changeset config ignores only @object-ui/example-*).",
      "files_changed": [
        ".changeset/27916-showcase-owner-email-label.md",
        "examples/app-showcase/src/data/objects/invoice.object.ts",
        "examples/app-showcase/src/data/objects/project.object.ts",
        "examples/app-showcase/src/system/translations/index.ts"
      ],
      "line_budget": "29 changed lines (+22 / -7, 4 files) per dispatch-gates vs threshold 3000: under; no skills/** touched",
      "tests": "In-process ObjectQLPlugin registry with Project and Invoice registered (throwaway vitest file, deleted, git status clean): head 832181e1 gives fields-labelled-Owner=[owner_id] on both objects with owner.label=Owner Email; control with the two object files restored to base 5e1342a6 gives [owner_id, owner]; restore proven by git diff HEAD = 0 bytes and blob hash equal to HEAD. Merged head 63aaa12d, under os-verify-lock joined with &&: rebuild of connector-mcp, connector-openapi, service-automation, then pnpm --filter @objectstack/example-showcase run typecheck (exit 0) and pnpm --filter @objectstack/example-showcase exec vitest run --maxWorkers=2: Test Files 41 passed (41), Tests 505 passed (505), VERDICT command-exit 0. Ablation: not applicable, no test reads the label (searched examples/app-showcase, ui fixtures and e2e, packages/qa/dogfood, packages/lint). test:repo not run locally, owned by CI.",
      "gates": "Local, on merged head 63aaa12d: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 45 commands, identical to the pre-merge derivation; all 45 exit 0; plus pnpm check:changeset-fixed exit 0 (roster under .changeset). --ran reconciliation: 45 derived, 45 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. check:dual-build-cjs-loads first exit 3 PREREQUISITE NOT MET (7 packages outside the showcase closure had no dist), built those 7, then exit 0. check:comment-mask-corpus on the merged head first hit my own 200 s wrapper timeout (exit 124), rerun with 500 s: exit 0 (19184 files, 0 disagree). CI at report time (head 63aaa12d, read once, not awaited): success = filter, PR-body guards, Governed Surface Queue Guard; in_progress = Lint (8 lanes), Type Check (4 lanes), Build Core, Test UI, Live E2E UI, Check Changeset, Check PR Size, Plan Test Core shards, Dogfood Regression Gate; the UI build/lint/type-check lanes skipped by path.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "labels": "none — dispatch named none; skip-changeset not applicable (a changeset ships)",
      "mcp_calls": "0",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create, run 41020620117, created PR 28008, read-back 6709/6709 bytes identical, assignees none); POST issues/27916/comments via post-stamped (this report). git push is not counted.",
      "deviations": [
        "Live GET /api/v1/meta/object NOT MEASURED: pnpm dev -- --fresh -p 38917 stopped at check-dev-prereqs (the Console ui/ dists were not built in this worktree), the process exited by itself, port free; the in-process registry reading stands in.",
        "Conflict, report comment: the dispatch puts the seat signature on line 1 and os-dev puts os-dev-report on line 1; the signature is on line 1 and os-dev-report on line 2, since post-stamped refuses an unsigned body and its first-line recognisers skip one leading signature line.",
        "Conflict, PR body: the dispatch dictated the claude-projects-attribution HTML-comment line; os-dev bars dev-authored HTML comments except the harness attribution line, so it was sent verbatim as that exception and is reported here.",
        "Commit trailers use the AGENTS.md model-free pair (Claude-Session plus Co-authored-by Claude), not the harness reminder model-named trailer.",
        "Branch is the dispatch-designated seat branch, not claude/issue-n; first pushed with the first commit, no empty-branch push."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — ui/apps/console/src/services/approvalRequestsDataSource.servedPageSummaryAmount-12534.test.tsx keeps an inline showcase_invoice copy dated to objectstack 9e0945cf4 with owner labelled Owner; it asserts nothing about that label (observation, no class)"
      ]
    }
  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh

    ACCEPT → PR #28008 comment 6517615043 · 2026-10-30T07:45Z


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsbugSomething isn't workingdomain:uipm:dispatchedpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions