Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

Marketplace cards truncate the app name and id at 1024 px #12616

Closed

Description

@objectstack-fleet

Source

Walked on objectui main 8415d9f11, /apps/setup/system/marketplace at 1024 × 768 (packages/app-shell/src/console/marketplace/MarketplacePage.tsx): the one card (HotCRM) renders its title as "H…" and its id as "ap…" although the card is 110 px wide and the title row has 60 px free beside the "objectstack" badge; the description below is whole. The header row's badge is given the width first and the text gets the remainder with an ellipsis on a one-character width.

Target

  1. Card header: the title takes the row's width first (13 px / 600, two lines maximum with an ellipsis), the publisher badge sits under it on its own line; the id is 11 px mono, one line, truncating from the middle so the package suffix stays readable.
  2. Cards are at least 240 px wide; the grid is repeat(auto-fill, minmax(240px, 1fr)).

File surface

packages/app-shell/src/console/marketplace/MarketplacePage.tsx, its card component, tests beside.

Acceptance

  1. A test renders a card at 240 px and asserts the title text is complete; screenshots at 1024 and 1280 px.
  2. pnpm --filter @object-ui/app-shell test green.

Constraints

  • No change to the marketplace data or install flow.

Evidence

No screenshot; the measurements above and the page URLs are the evidence.

Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-16 second review pass: objectui main 8415d9f11, HotCRM 63db83e2, the vite console on :5180 against objectstack serve --dev on :4001, the Studio pillars and all 43 Setup pages walked in the maintainer's browser pane at 1024 × 768 (en) with a 1280 × 900 re-check (zh). The maintainer asked for every finding to be filed, verbatim: 「全部立卡」.

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    and removed on Oct 16, 2026
  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (priority:p2; from the epic PM session's second review pass, the maintainer's 「全部立卡」)
    Session: session_01JZnppgHRp4sREcouhkQYDB
    Account: sunhaolin
    Branch: claude/issue-12616-marketplace-card-title
    Worktree: objectui-issue-12616
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: packages/app-shell/src/console/marketplace/MarketplacePage.tsx and its card component in the same directory (the card header and the grid track only), tests beside, and one @object-ui/app-shell patch changeset (stop on breach; explain in the report).
    Container & model: S, mode:subagent, model: opus (default tier)
    Clause-②: no
    Responsibility: the risk is produced by objectui's own code, the marketplace card's header row, which gives the publisher badge its width first and leaves the title one character; no platform path covers it; every admin opening the marketplace at 1024 px reaches it (HotCRM's card measured as "H…" / "ap…")
    Thread-read: none
    Serial constraints cleared: no open PR touches packages/app-shell/src/console/marketplace/ (scanned every open objectui PR's file list), and no in-flight claim names it. Queued sibling objectui#12606 (one Setup page header) names the App Marketplace page's header, not its cards. It is not in flight, and it rebases on this.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · takeover of claim 6207618158 (the claimant's session ran out of tokens mid-build)
    Release: claim 6207618158 · session session_01JZnppgHRp4sREcouhkQYDB · account sunhaolin · reason: the claimant is unreachable (token exhaustion; no PR, no os-dev-report) · destination: this claim, same branch, same declarations
    Provenance: the maintainer · in session session_011K9g23W67dy2zwnyzaoB6o, the /pm-dispatch UI seat 1 summons, read 2026-10-16T06:38Z · verbatim: 「前任没有token了,他的任务开发了一半你要接着处理。」
    Session: session_011K9g23W67dy2zwnyzaoB6o
    Account: os-tesla
    Branch: claude/issue-12616-marketplace-card-title
    Worktree: objectui-issue-12616
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: packages/app-shell/src/console/marketplace/MarketplacePage.tsx and its card (the card header and the grid track only), the new helper middleTruncate.ts in the same directory that the pushed tip adds, tests beside, and one @object-ui/app-shell patch changeset (stop on breach; explain in the report).
    Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui over the tip's 5 paths: no path-derived mandate)
    Clause-②: no
    Responsibility: carried from 6207618158: the risk is produced by objectui's own code, the marketplace card's header row, which gives the publisher badge its width first and leaves the title one character; no platform path covers it; every admin opening the marketplace at 1024 px reaches it
    Thread-read: 6207618158
    Serial constraints cleared: the only open objectui PR besides dependabot and the release PR is #12630 (Studio automations rail), whose files are disjoint; no in-flight branch touches packages/app-shell/src/console/marketplace/. Queued sibling objectui#12606 (one Setup page header) rebases on this.
    Resume-from: claude/issue-12616-marketplace-card-title@e9372154fa4c861472d777ddcad43b3121889173

    Handover record. Last pushed sha e9372154fa (2026-10-16T05:23:10Z), three commits on base 33fbc861d2: the fix (535696a), the tests (934020b) and the changeset (e937215). No PR and no report exist. Everything on the branch is UNVERIFIED: the resuming dev reads every commit, merges origin/main, re-runs every gate and the screenshots the acceptance names, and opens the draft PR.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 12616,
      "status": "done",
      "branch": "claude/issue-12616-marketplace-card-title",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12637",
      "session": "session_011K9g23W67dy2zwnyzaoB6o (seat domain:ui#1; this os-dev subagent resumed the dead claim 6207618158 under takeover claim 6209672630)",
      "premise_still_valid": true,
      "summary": "Resumed from e9372154fa, merged origin/main 63d00da (f4bb4b8, no conflicts), read every inherited hunk. Kept: the shared PackageCardHeader (title 13px semibold line-clamp-2 break-words owning the text column; badge self-start on its own line under it; header row = icon + text column only) and the 240px auto-fill grid on all three grids. Replaced in 72d6611: the inherited id cut was a fixed 20-character JS budget, so every id over 20 chars was cut at EVERY card width (HotCRM's real id app.objectstack.hotcrm, 22 chars, always read app.objectsta…hotcrm); the id is now two CSS runs in one flex line (head min-w-0 truncate, package suffix shrink-0 truncate capped at the column less 4ch), split by splitPackageSuffix in middleTruncate.ts, so it is cut in the middle only when it does not fit and the DOM text and title stay whole. Test header claims nobody re-reads (229px tracks, readings 'quoted in the pull request') removed; changeset reworded. Coordinator's question: the inherited MarketplacePage.cardHeader-12616.test.tsx IS the page-level pin (mounts MarketplacePage against a stubbed runtime, asserts header structure and grid track for the catalog and org cards, 8/8 red on ablation to main); no further pin added.",
      "tests": "At 72d6611, through os-verify-lock: `pnpm exec vitest run packages/app-shell/ --maxWorkers=2` (root form of the package test) → 'Test Files 1434 passed | 1 skipped (1435)', 'Tests 13581 passed | 9 skipped (13590)', VERDICT command-exit 0 (held 54m03s, shared box). New files alone: 'Test Files 2 passed (2)', 'Tests 11 passed (11)'. `pnpm --filter @object-ui/app-shell type-check` (script echoed: tsc --noEmit && tsc -p tsconfig.test.json) VERDICT command-exit 0; `tsc -p tsconfig.test.json --listFiles` lists both new test files (1435 test files in program). Ablation (fix committed first; trap restore `git checkout HEAD --` proven by HEAD-blob hash equality + empty `git diff HEAD`; source aliased to src, no dist in the path): MarketplacePage.tsx at origin/main 63d00da → 'Tests 8 failed (8)' (all four cases, both cards); MarketplacePage.tsx + middleTruncate.ts at inherited e9372154fa → 'Tests 2 failed | 6 passed (8)', only the id case: \"expected 'app.objectsta…hotcrm' to be 'app.objectstack.hotcrm'\". Static Chromium harness (one-shot, not committed): happy-dom-rendered DOM, compiled with tailwindcss 4.3.3 + app-shell styles.css, /opt/pw-browsers/chromium: main markup at 1024 viewport / 362px grid = 110px cards, title column 0px, title and id '…'; this PR at one 240px card = HotCRM title whole on 1 line (138px column), id 'app.objectsta…hotcrm'; 309-362px cards = HotCRM id whole; org 27-char suffix edge at 240px = 'com…customer-relati…'. NOT MEASURED: screenshots, reason: the seat takes one shared browser reading for the resumed cards at review, before ACCEPT.",
      "gates": "Local (exit captured before any pipe): pnpm check:changeset-claims 0; pnpm changeset:check 0; pnpm check:test-path-roots 0; pnpm check:new-line-citations 0 ('0 new citation(s)'); node scripts/check-changeset-presence.mjs 0; pnpm exec eslint --no-inline-config over the 4 changed source files 0 (0 errors, 2 pre-existing warnings on untouched lines); control-byte grep over the 5 changed files: no hits. Closure build `pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build` VERDICT command-exit 0. i18n gates not owed (no locale file changed). objectui has no dispatch-gates.mjs; list hand-derived per the brief, so no --ran reconciliation. CI at 72d6611, read once at PR open: completed success = Changeset Fixed Group Check, Changeset Bump Policy, label; skipped = Test (coverage), dependabot; in_progress = Test shards 1-16/16, Test (dist pins), Type Check, Lint, Repo Gates, Build & E2E, Build Docs, Bundle Analysis, Changeset Claim Re-read, Changeset Declaration, Changeset Overwrite Report, Governed Surface Queue Guard, Line Citation Gate, Live E2E (informational). CI convergence is the seat's.",
      "mcp_calls": "0",
      "api_writes": "2 relay strokes — (1) pr_create via fleet-write/dispatch.mjs: POST /repos/objectstack-ai/objectstack/dispatches → relay POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos/objectstack-ai/objectui/issues/12637/assignees (os-tesla), read-back 7527/7527 bytes identical; (2) this os-dev-report via post-stamped.mjs: POST /repos/objectstack-ai/objectui/issues/12616/comments. Plus 2 git pushes (f4bb4b8, 72d6611). Zero label writes, zero MCP writes.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed: InstalledListWidget.tsx draws its row title with `truncate` beside other row content; read only, not measured (in the PR's Acceptance notes)"
      ],
      "hypotheses": "H1 holds: @object-ui/app-shell's entry re-exports only MarketplacePage (no props); PackageCardHeader and splitPackageSuffix are module-local, so Clause-②: no stands. H2 holds after the fix, except the id is cut by CSS only when it does not fit rather than by a character budget. H3: the inherited id case asserted the fixed-budget string; it now pins the two runs and their classes, and both ablations prove every case fails when its defect returns. H4 holds: no change to marketplace data, install flow, click target or test ids.",
      "deviations": "The merge commit f4bb4b8 carries git's default message without the session trailer pair (not amended; history not rewritten). The full app-shell suite held the shared lock 54m03s. Worktree and its node_modules removed after the PR opened.",
      "files_changed": [
        ".changeset/12616-marketplace-card-title.md",
        "packages/app-shell/src/console/marketplace/MarketplacePage.tsx",
        "packages/app-shell/src/console/marketplace/middleTruncate.ts",
        "packages/app-shell/src/console/marketplace/__tests__/MarketplacePage.cardHeader-12616.test.tsx",
        "packages/app-shell/src/console/marketplace/__tests__/middleTruncate-12616.test.ts"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #12637 comment 6211320216 · domain:ui seat 1 · session_011K9g23W67dy2zwnyzaoB6o · 2026-10-16T08:24Z


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 1 · session_011K9g23W67dy2zwnyzaoB6o · 2026-10-16T08:38Z

    • Merged: PR fix(app-shell): marketplace cards give the title the header row and cut the id in the middle (objectui#12616) #12637 landed through the merge queue as main 07b0632496 at 2026-10-16T08:37:24Z. It has one parent, 726d8c9fcf, and is an ancestor of origin/main.
    • Verified by content: all 5 files of the PR are blob-identical on origin/main to the reviewed head 72d66112ca. Positive control: repeat(auto-fill,minmax(240px,1fr)) is present in MarketplacePage.tsx on origin/main (1 hit).
    • Card: closed completed by Fixes #12616. This note precedes the strip of pm:dispatched.
    • Carry-over: none. The live marketplace reading needs a runtime with a reachable catalog (OS_CLOUD_URL set to a control plane), which the CI recipe turns off. The layout reading of record is the dev's static harness, as recorded in the ACCEPT (6211320216).

    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:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions