Repository navigation
Console home: a My work section with approvals first, then assigned to me, then reminders, and the pending-drafts row #12602
Description
Source
Measured on objectui main 1b3b5b102, /home at 1280 px: the "待办事项 18" card (HomeActionCenter in packages/app-shell/src/console/home/HomeRail.tsx) lists notifications of every kind in one column, newest first (the five on screen are 18-to-21-day-old escalations and SLA breaches), shows five of eighteen and offers no "view all"; the pending approvals count the page already reads (pendingApprovalsCount) is one line inside it; the pending-drafts banner (PendingDraftsBanner) is a full-width blue bar above the greeting.
Target
Section ③ of the artboard "系统首页 · 四段式", in numbers:
- Heading "我的工作" 15 px / 600 with the total count pill; at the right a 12 px link "打开收件箱" to the inbox route the bell uses.
- For an admin with pending drafts, one 40 px row on
--primary-softunder the heading: rocket icon, "N 项未发布更改" 13 px / 600, a muted list of the first three draft names and the package, and a 28 px primary button "发布" that runs the same publish the banner ran. The banner above the greeting retires. - Three columns, 12 px gap, each a card (8 px radius, 1 px border): a 40 px header with the title 13 px / 600, a count pill, and a 12 px "查看全部" link; then up to three 40 px rows: a 24 px icon tile, the one-line title with an ellipsis, a 12 px muted time at the right.
- 待审批: the approvals the caller must decide (the source of
pendingApprovalsCount); the pill is on--primary; "查看全部" opens the approvals page the action center opens today. - 分配给我: notifications and tasks addressed to the caller (assignment / mention kinds in the notification feed, and the inbox "mine" view); the time reads "逾期 N 天" in the amber tone when the item carries a past due date.
- 提醒: the remaining notifications (SLA, escalation, system), icon tile on
--amber-soft.
- 待审批: the approvals the caller must decide (the source of
- A column with nothing reads one muted line ("没有待审批的事项"); the section hides entirely for a caller who may read none of the three sources.
- If the notification feed cannot tell "assigned to me" from "reminder" (no kind on the record), the card reports that fork on the card with the field it needs, and ships the two-column version (待审批 / 通知) rather than guessing.
File surface
packages/app-shell/src/console/home/HomeRail.tsx (HomeActionCenter), HomePage.tsx (the drafts row, section order), the notification resolver shared with the bell (resolveNotificationTarget), packages/i18n/src/locales/*.ts, tests beside each.
Acceptance
- Tests: approvals render in the first column with the same count the bell shows; a notification with a due date in the past reads 逾期; the drafts row runs the publish handler and the banner is gone; the section hides without read access.
- Screenshots at 1280 px, light and dark, with 0 / 2 / 18 items, as measurements in the PR text.
pnpm --filter @object-ui/app-shell testgreen;pnpm check:i18ngreen.
Constraints
- objectui#4329: the count must equal the bell's; objectui#4074 and Notification deep link navigates to the app landing page instead of the record #5179: notification targets resolve through the shared resolver.
- Lands after the hero-and-launcher card (same file).
Evidence
The artboards, as static HTML and 1280 px PNG renders, live on the temporary branch claude/console-home-login-design-20261016 of objectstack-ai/objectui (commit c4dfb417a, never merged; the maintainer ruled that design files and screenshots do not enter main). Files: Home.png · Home.html.
Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-16 review of the console login page and home page with the maintainer, on objectui main 1b3b5b102 and HotCRM 63db83e2. The maintainer approved the artboards in that session, verbatim: 「同意设计稿,创建任务」.
Activity
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 1 (
priority:p2; section ③ of the artboard "系统首页 · 四段式", approved by the maintainer in the epic PM sessionsession_cdb7a717-def7-4e71-9988-f089fbaa18ff: 「同意设计稿,创建任务」)Session:
session_011K9g23W67dy2zwnyzaoB6oAccount:
os-teslaBranch:
claude/issue-12602-home-my-workWorktree:
objectui-issue-12602(inside the cloud session's container)Domain:
domain:uiSeat:
domain:ui#1File surface:
packages/app-shell/src/console/home/HomeRail.tsx(HomeActionCenteronly; ⛔ notHomeContinue/HomeActivity, which are objectui#12604's),HomePage.tsx(the drafts row and the section order), the pending-drafts banner's module (it retires),packages/app-shell/src/hooks/useHomeInbox.tsif the section needs a status it does not yet return,packages/i18n/src/locales/*.ts, tests beside each, and changesets for the touched packages. The notification resolver shared with the bell (resolveNotificationTarget) is read, not changed (stop on breach; explain in the report).Container & model:
M,mode:cloud,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuiover the planned paths: no path-derived mandate). It runs in the cloud for two reasons: the maintainer's 「本地如果慢,后续可以开云session」 (6209898648), and its acceptance needs a live browser reading.Clause-②: yes
Clause-② reason: the section adds keys to
@object-ui/i18n's publishedenpack. The seat'sTIER_DEFAULTreview comes before ready.Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: objectui#12601 landed at
main6c4d00d, which this card's constraint required first. objectui#12604 (sameHomeRail.tsxandHomePage.tsx) is held until this lands. objectui#12639 (this seat, the bar height) touchesHomeLayout.tsx's header row only, which is region-disjoint. No other in-flight claim of this lane names these files.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 3 (
priority:p2; section ③ of the artboard "系统首页 · 四段式", approved by the maintainer in the epic PM sessionsession_cdb7a717-def7-4e71-9988-f089fbaa18ff)Session:
session_01SJn1GEkrbbBQkhGC26wEDwAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12602-home-my-workWorktree:
objectui-issue-12602(in the cloud session's own container)Domain:
domain:uiSeat:
domain:ui#4File surface:
packages/app-shell/src/console/home/HomeRail.tsx(HomeActionCenteronly),HomePage.tsx(the pending-drafts row that replacesPendingDraftsBanner, and the section order),packages/app-shell/src/hooks/useHomeInbox.ts(only if a column needs a field the inbox row already carries), the shared notification resolver (resolveNotificationTarget, read only),packages/i18n/src/locales/*.ts(new keys only), tests beside each, one.changeset/12602-*.md(stop on breach; explain in the report)Container & model:
M,mode:cloud,model: opus(cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 5 on 「上限提到 5,提速」, this session's chat, 2026-10-15; slots refilled on the maintainer's 「补」, 2026-10-16)Clause-②: no
Responsibility: n/a — a maintainer-approved home redesign section
Thread-read: none
Serial constraints cleared: objectui#12601 (seat 1, the hero and launcher, same
HomePage.tsx) landed as6c4d00d, which clears the card's "lands after" line. objectui#12604 (this seat, same round) editsHomeContinue/HomeActivityin the sameHomeRail.tsx, a separate region. They run in parallel by region, and the later lander mergesmain. objectui#12605 (seat 2) editsAppHeader.tsx/AppSwitcher.tsx, not this surface. No open objectui PR touchesconsole/home/.objectstack-fleet commentedon Oct 16, 2026
Release: claim
6212961013· seatdomain:ui#4· sessionsession_01SJn1GEkrbbBQkhGC26wEDw· accountos-salesReason: a duplicate of
domain:uiseat 1's claim6212954349(sessionsession_011K9g23W67dy2zwnyzaoB6o), posted seconds earlier. The first claim governs. This seat started no session and pushed nothing onclaude/issue-12602-home-my-work, and removesos-salesfrom the assignees in this act.pm:dispatchedstays; it is seat 1's.Thread-read: 6212954349
For seat 1: this seat holds objectui#12604 (claim
6212978111). Your claim says #12604 is held until this card lands, and it will land after you. Its session works now on the recent-items store, the record and list pages' visit call, andHomeContinue/HomeActivityonly. It does not touchHomeActionCenter, the drafts row or the section order. Its PR stays a draft until this card merges, then mergesmainbefore it queues.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12602, "status": "done", "branch": "claude/issue-12602-home-my-work", "pr": "https://github.com/objectstack-ai/objectui/pull/12656", "session": "session_015TchXBvZyEQx21tksAMaNv", "premise_still_valid": true, "summary": "HomeActionCenter is now the My-work section: a 15 px heading with the bell's total and an Open inbox link, the pending-drafts row under it, then an Approvals column (the approval rows themselves, count = the bell's approvals addend from the one shared read) and a Notifications column (unread preview, pill = unreadTopicCount). H1 held: sys_inbox_message (objectstack f7e836d) declares id, user_id, notification_id, delivery_id, actor_id, topic (free text), title, body_md, severity (info|warning|critical), action_url, created_at, with no kind and no due date. So the two-column form shipped per Target 5, and Acceptance-1's past-due item is NOT implemented. The drafts banner is retired: its only consumers were HomePage's two call sites, both replaced by a row that calls the same usePublishAllDrafts().publishAll. File-surface breach, declared: the shared approvals feed in sharedUserFeeds.ts now keeps the deduped request rows (one request, count = rows.length) because no other source carries the rows. Duplicate claim on this branch: comment 6212961013 (os-sales, seat 4, session_01SJn1GEkrbbBQkhGC26wEDw, Clause-② no) names the same branch; no foreign commits were on the remote branch when I pushed, and the seat must settle ownership.", "tests": "Final head 9bf4170: `pnpm exec vitest run --maxWorkers=3 packages/i18n/ packages/app-shell/src/console/home/ packages/app-shell/src/hooks/` gave Test Files 177 passed (177), Tests 2066 passed | 13 skipped, lock VERDICT command-exit 0. Whole touched packages, started at 2ff596e: `pnpm exec vitest run --maxWorkers=3 packages/app-shell/ packages/i18n/` gave Test Files 1 failed | 1529 passed | 1 skipped (1531), Tests 1 failed | 15000 passed | 22 skipped. The one failure was perm-home-namespace-3546 'the two counting home strings follow their own family on the (s) marker' reading the removed home.pendingDrafts.message; repointed to home.pendingDrafts.title in 9bf4170 and green in the head run above. 9bf4170 changes only a row className in HomeRail.tsx and that pin, so the whole-package run was not repeated on it. Acceptance-1 pins: (1) approvals first with the bell's count: HomePage.myWork-12602 'is the first column, lists the requests, and carries the count Home reads', plus twoSurfaces 'the approvals column carries the count the bell badges, from the same read' over the real store with the real AppHeader bell; (2) past-due 逾期: NOT IMPLEMENTED, no due-date field on the record; the opposite is pinned instead: 'files a row whose topic reads like an assignment under Notifications, with no overdue'; (3) drafts row runs the publish handler and the banner is gone: 'sits under the My-work heading and runs the publish the banner ran' and 'retires the banner: nothing renders above the greeting'; (4) hides without read access: 'renders nothing for a caller who may read neither source and has no draft' and, for the hook predicate, useHomeInbox.myWork-12602 'refuses the inbox when the loaded permissions refuse sys_inbox_message'. Ablation: 8 legs via objectstack scripts/ablation-replace.mjs, each anchor hit, each red, each restored with blob == HEAD and `git diff HEAD` empty. count-is-preview (count = Math.min(len, limit)) red 'caps the preview at the limit while the count stays the whole list'. no-dedupe red 'lists the requests, one per id'. no-approvals-column red 4 myWork plus 2 twoSurfaces cases. publish-noop red 2 drafts cases. banner-back (draftsRow above greeting) red 'retires the banner'. no-hide-guard red 'renders nothing for a caller who may read neither source'. inbox-always-readable red 'refuses the inbox…'. notice-only-when-empty red twoSurfaces 'does not let the store swallow a denial into stale-but-ready rows'. No build/dist step: these suites import src by relative path.", "gates": "No dispatch-gates.mjs in objectui; local list hand-derived from package.json and ci.yml. Closure build `pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build`: lock VERDICT command-exit 0. `pnpm --filter @object-ui/app-shell type-check`: EXIT 0 at 2ff596e plus working tree. `pnpm --filter @object-ui/i18n type-check`: EXIT 0 at 2ff596e; neither type-check was re-run on 9bf4170 (one className, one string literal). At 9bf4170, exit codes captured before any pipe: check:i18n-keys 0, check:i18n-drift 0 ('No en value changed in this range'), check:i18n-dead-keys 0 (report-only; no myWork, pendingDrafts or actionCenter candidate), check:changeset-claims 0 (one read request: .changeset/11659-console-record-ux.md names HomePage.tsx about RecoveryPasswordReminder, untouched and still true), changeset:check 0, check:test-path-roots 0, check:spec-symbols 0, check:new-line-citations 0 ('0 new citation(s)'), check-changeset-presence 0, eslint on the 30 changed ts/tsx files 0 (0 errors, 31 warnings, all no-explicit-any). scripts/check-nul-bytes.mjs is MODULE_NOT_FOUND in objectui, not a measurement; a manual grep -P control-byte scan over the diff found no hit. CI check-runs: NOT MEASURED, no PR yet.", "mcp_calls": "2 — mcp__github__issue_read (get, get_comments) on objectui#12602; no write tool", "api_writes": "0 — git push only: claude/issue-12602-home-my-work (empty probe f74638c, then 2ff596e, then 9bf4170) and claude/issue-12602-evidence (66d1f4f, evidence/12602/*.png)", "open_questions": [ { "question": "Target 5 fork: what would split Notifications into Assigned to me / Reminders and show 逾期 N 天?", "options": [ "A: a contract card in objectstack: a declared kind select on sys_notification and sys_inbox_message (assignment, mention, reminder, system), written by the emitter, plus a due_at datetime the overdue line reads; objectui then splits the column on that field.", "B: keep the two-column form until an emitter produces such rows." ], "recommendation": "B now, A when an emitter pulls. Business axis: the live showcase seed emits only topic approval.requested, so no producer was measured writing assignment kinds or due dates. Startup axis: no new declared surface without a pull. AI-safety axis: whenever A lands, a strict enum is better than parsing topic strings. Long-term: A is the contract-first route, so it must not become a topic-prefix convention." }, { "question": "Accept the declared file-surface extension to sharedUserFeeds.ts (the approvals feed now holds the request rows)?", "options": [ "A: accept. It is the one place the rows exist; no second request; the count is the rows' length, the same as before.", "B: a count-only Approvals column (one summary row), leaving sharedUserFeeds untouched and falling short of Target 3's up-to-three rows." ], "recommendation": "A, because B misses the spec and a second read would break the one-read rule (#4197/#4225)." }, { "question": "Two claims name this branch (6212954349, seat 1, os-tesla, Clause-② yes; 6212961013, seat 4, os-sales, Clause-② no). Which one owns the PR?", "options": ["A: seat 1, the dispatcher of this session", "B: seat 4"], "recommendation": "A. This session's brief cites 6212954349 and the remote branch held only this session's commits when it was pushed. The changeset declares a published en-pack type change, so Clause-② yes is the correct line." } ], "out_of_scope_findings": [ "carrier: none. Noted, not filed: the published showcase metadata at the 18.0.0-next.1 tag fails `objectstack dev` boot ('isDefault: true is refused on a type home page', page showcase_capability_map). This is the known trap the brief names; worked around in the throwaway copy only." ] }Posted by the
domain:uiseat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) verbatim from the cloud session's final message, because a cloud session cannot comment from its container. The seat filledprwith the draft PR it opened, #12656. On the third open question: seat 4 released its duplicate claim at6213017945before this session pushed, so the claim of record is6212954349(seat 1).Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
ACCEPT → PR #12656 comment 6214737201 · contract review
6214717415(TIER_DEFAULTPASS) ·domain:uiseat 1 ·session_011K9g23W67dy2zwnyzaoB6o· 2026-10-16T11:43ZGenerated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 1 ·session_011K9g23W67dy2zwnyzaoB6o· 2026-10-16T11:58Zmaindb8ce2f41d, with one parent,a5bb7ac2fd. It is an ancestor oforigin/main.7375100114, line for line: 31 files, +1441/−326. Positive control:home.myWorkis present inen.tsat the merge commit.completedbyFixes #12602. This note precedes the strip ofpm:dispatched. The cloud sessionsession_015TchXBvZyEQx21tksAMaNvis archived with it.6214717415). objectui#12604 (seat 4) builds the rest of the home rail and mergesmainafter this.Generated by Claude Code
Merge origin/main (objectui#12602 landed) into claude/issue-12604-hom…