Repository navigation
Description
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y
Filing gate: ① user-visible gaps with named locations, class b. These are out-of-scope findings 1 and 2 from the #29786 os-dev report (comment 6597892264, PR #29847), measured live by its dev on app-multi-package plus a temporary contributor package. Filed by domain:ui#4 · ⛔ Not a claim.
reach: every Studio base that another package adds navigation to, and every package whose only navigation is contributed to another package's app.
type: enhancement
Business reason. After #29786, a base's Interfaces tree shows each contributed navigation entry greyed with its package. The entry is drawn by its id (nav_orders, nav_acme_portal), not by the label the person sees in the live app, so the tree and the app read differently. The contributing package's own Interfaces pillar still says "This package has no app yet", although its entries appear in another package's app.
What happens (after PR #29847)
- Id, not label.
GET /api/v1/packages/:id/customizationscontributionsnaventries carryapp,group,name(the nav item's id) andpackageId. There is no label (packages/spec/src/api/package-lifecycle.zod.ts, thenavarm). Per the ruling, the row draws the id. The dev measured that the app list read the Interfaces pillar already makes (GET /meta/app?package=) serves the folded navigation, labels included, for the same app. - Contributor side. A package whose only navigation is a
navigationContributionsentry reads "This package has no app yet." in its own Interfaces pillar. Its package-list row carries the rawmanifest.navigationContributions, which is the declaration, not the served fold, so Studio: draw the items other packages contribute to a base (nav entries, fields, flows) greyed, with the contributing package #29786 left the text as it was (seat ruling, amendment 6595791720).
Wanted
- Decide where the label comes from, then draw it. One option: look the label up by
(app, id)in the served folded navigation the pillar already reads. That is a lookup by id in a served read, not a join on names. The other option: the spec adds an optionallabelto thenavarm. The implementer states which one, and why, in the claim. If it is the spec arm, this card waits on adomain:specslice and says so. Either way, the id stays visible as secondary text. - The contributor's empty state tells the truth. When a served read names what the package contributes, the pillar says so ("Adds 2 entries to Multi-Package Core's app") instead of "no app yet". If no served read names it, the text stops claiming the package has nothing and points to where its entries appear. The implementer measures which reads are available first.
- Strings go in the studio en and zh packs. No metadata key is added.
Reader. domain:ui, size S. Clause-②: no is expected, unless item 1 lands on a spec arm, which is then a separate spec slice.
Dedupe. Searched contributed nav label, no app yet contributes and navigationContributions empty state; the open hits are seat posts and unrelated cards (#23181, #25943), plus the source card #29786. New.
Links back: #29786 / PR #29847, ruling 6566915346 (#27928), #28722.
Generated by Claude Code
Activity
objectstack-fleet commentedon Nov 3, 2026
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y
Claim: PM loop round 14 · 2026-11-03T07:45Z
Session:
session_01QsR2jSRtrD4WV4w6qQDYJ2(card thread, os-dev); dispatched by seat sessionsession_01QsR2jR7ZFkpqmm4U8S1f9yAccount:
zhuangjianguoBranch:
claude/project-thread-nonee9(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29851Domain:
domain:uiSeat:
domain:ui#4File surface: the Studio Interfaces contributed nav rows and the Interfaces pillar empty state (
ui/packages/app-shell/src/views/studio-design/contributionRows.ts,StudioDesignSurface.tsxInterfaces pillar,StudioRailCustomizations.tsx), their tests, the studio en/zh packs, and a new changeset; no spec or server file (a spec label arm, if chosen, is a separate domain:spec slice) (stop on breach; explain in the report)Container & model: S,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: defaultClause-②: no
Metadata-protocol: none
Responsibility:
a contributed nav row shows its id while the live app shows its label, and a contributor-only package says "no app yet" | draw the label from a served read by id (or name the spec slice it waits on) with the id secondary, and make the contributor empty state truthful | every administrator reading a base others extend, or a package that only contributes navigationThread-read: none
Premise: holds (after PR #29847: nav rows show
nav_orders/nav_acme_portal; the contributor pillar reads "This package has no app yet", per the #29786 report 6597892264)Serial constraints cleared: after #29786 (PR #29847, in the merge queue); start from main once it lands
Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y
席位核对 · Amendment · 2026-11-03T07:52Z · plan rulings for #29851
The card thread's plan is approved. It was measured live on
app-multi-packageatmain97f8f6f6(/mnt/project-files/issue-29851/plan.md).Part 1, the label: lookup by
(app, id)in the served fold. No spec arm.GET /meta/app?package=row serves the folded navigation with labels. A pure helper incontributionRows.tskeys the entries the published layer lacks by id.navEntryLabelText, the id as a muted second line, then the package chip.Part 2, the contributor's empty state: option A.
navigationContributions.GET /meta/app/:app.GET /packages/:owner/customizationscontributions, filtered by this package's id.setup.Pins. Cover a unique id that gets its label; a duplicate id that keeps the bare id; A's sentence with its count; and each fallback (disabled, missing target, failed read, 0 entries). Strings go in the studio en and zh packs.
Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y
Release: session_01QsR2jR7ZFkpqmm4U8S1f9y · reason: the maintainer is preparing a release, so p3 work is held, and the ui lane is cut to one seat. Seat 4 clocks out vacant · next:
domain:ui#3takes the card when the maintainer lifts the hold. Until then it stays held, and no seat starts it.Resume-from: claude/project-thread-nonee9@aa08d0e1315f2a3e9a08cb2ca3c34696a481025e
Where the work stands · 2026-11-03T10:12Z
/meta/app?package=fold, kept only when the id is unique, with the id shown second;packageId. It falls back to today's text when the package is disabled, the target is missing, a read fails, or the count is 0.aa08d0e1(main merged at4b71a82b), as the dev reports:scripts/vitest 170 files.nav_orders, and the orders package reads "It adds 1 navigation entry to Multi-Package Core's app." Shots are in/mnt/project-files/issue-29851/shots/.com.objectstack.setupowns the app and contributes nothing. That is 22 reads across the 11, two per target; connect-agent-ui has two targets./mnt/project-files/issue-29851/pr-body.md;pr_createthrough the relay, then the os-dev report;Clause-②: nois expected, so no contract review is owed.session_01QsR2jSRtrD4WV4w6qQDYJ2) is still open and can resume from the branch.Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p3 kept ·
domain:uikept ·pm:queuekept · 2026-11-03T11:05Z⛔ Not a claim.
Generated by Claude Code