You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
[finding] The approval step stepper is hand-duplicated across apps/console and packages/app-shell, and the copies had already drifted into two different overflow behaviours #5569
Recorded while fixing objectui#5554 (PR on claude/issue-5554-approvals-step-progress-overflow). Not fixed there — deduplication is a refactor with its own surface, outside that card's declared file fence.
The observation
The approval flow step strip exists as two hand-maintained copies of the same markup, in two different packages:
apps/console/src/pages/system/ApprovalsInboxPage.tsx — the inbox detail drawer
packages/app-shell/src/views/RecordApprovalsPanel.tsx — the record page's approvals panel
Both read the same flow_steps shape (packages/app-shell/src/hooks/useRecordApprovals.ts), both render it under the same length > 1 guard, both use the same approvalsInbox.stepProgress accessible name, and both paint the same done/current/upcoming badge palette.
Why it is worth recording rather than shrugging at
The copies had already drifted, and the drift was load-bearing. On origin/main before objectui#5554:
the app-shell copy carried overflow-x-auto and whitespace-nowrap, plus min-w-4 on its connector;
the console copy carried none of those.
So the same defect — an unbounded-intrinsic-width flex row — produced two different user-visible failures from one root cause: the record panel scrolled itself (steps behind an unmarked gesture), while the console drawer had no scroller of its own and dragged the entire drawer sideways, blanking the panel. objectui#5554 had to describe and verify both separately for that reason.
That is the ordinary cost of hand-maintained twins: the next behavioural change to one of them is one more chance to fix half the product. objectui#5554 left them byte-for-byte identical in structure precisely so this stays a refactor and not a second bug.
Shape of the work, if it is picked up
A single stepper component consuming the shared flow_steps type. The awkward part, and the reason this is not a five-minute change: apps/console and packages/app-shell are different packages, so the shared component needs a home and an export — most naturally in app-shell (which already owns the flow_steps type and which apps/console already depends on), but that is an API decision, not a mechanical move.
Related context: objectui#2763 tracks rebuilding the approval UI on the standard SDUI renderer, which would subsume this if it lands. This card is the cheaper interim, and is filed standalone rather than as a sub-issue because objectui#2763 is a tracking card whose scope is much larger than these two components.
No user-visible defect is open here — after objectui#5554 both copies behave identically. This is a maintainability finding, deliberately filed unassigned and without pm:queue for triage to rank.
Triage (first-touch grading, 2026-08-21): finding → pm:on-hold, type Task. Reason: no user-visible defect is open — after #5554 both copies behave identically byte-for-byte, so the cost of the duplication is only realized on the next behavioural change to either copy. That is exactly the opportunistic-restart shape: do the dedup when someone next touches a copy, not as standalone churn. objectstack-ai/objectstack#25950 (SDUI rebuild) would subsume it entirely if it lands first. Source: seat-graded; the card's own "maintainability finding, no defect open" framing.
Rider clause on restart: whoever next edits either copy folds the extraction (single stepper component homed in app-shell, which owns the flow_steps type and is already a console dependency) into their PR, or re-queues this card if their change is too far from the stepper to carry it. If objectstack-ai/objectstack#25950 lands first, close this as subsumed.
5372311264 的约定是:下一个改动任一文件的人,顺手把步骤条抽成 app-shell 里的公共组件,否则重新排队。两份后来确实都被改过,从横条改成了竖排(ApprovalsInboxPage.tsx:2259、RecordApprovalsPanel.tsx:405),但改的人选择手动保持一致,注释写着 "Kept identical to the console drawer's stepper on purpose",没有抽公共组件。两份现在结构相同,只差一个 px-1。
Activity
huangyiirene commentedon Aug 21, 2026
Triage (first-touch grading, 2026-08-21):
finding→pm:on-hold, type Task. Reason: no user-visible defect is open — after #5554 both copies behave identically byte-for-byte, so the cost of the duplication is only realized on the next behavioural change to either copy. That is exactly the opportunistic-restart shape: do the dedup when someone next touches a copy, not as standalone churn. objectstack-ai/objectstack#25950 (SDUI rebuild) would subsume it entirely if it lands first. Source: seat-graded; the card's own "maintainability finding, no defect open" framing.Restart-touch: apps/console/src/pages/system/ApprovalsInboxPage.tsx
Restart-touch: packages/app-shell/src/views/RecordApprovalsPanel.tsx
Rider clause on restart: whoever next edits either copy folds the extraction (single stepper component homed in
app-shell, which owns theflow_stepstype and is already a console dependency) into their PR, or re-queues this card if their change is too far from the stepper to carry it. If objectstack-ai/objectstack#25950 lands first, close this as subsumed.Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
关闭
not_planned—— 维护者同意:约定的时机已经过去,两份副本已被人工对齐分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ,objectstack 座位贴 #6015),2026-09-24T05:46Z。objectui 清理第六批(#8587 的挂起卡一次性清点):本席读完了卡面和评论(1 条,5372311264),并在本地 main 上核对了两份代码,把建议报给维护者。维护者答:「同意」。本卡说的是什么
审批步骤条在
apps/console的ApprovalsInboxPage.tsx和packages/app-shell的RecordApprovalsPanel.tsx里各有一份手抄副本,在 #5554 之前已经分叉成两种溢出行为。卡面自己写明这是可维护性问题,"没有用户可见的缺陷"。本席核对(本地 main,09-21)
5372311264的约定是:下一个改动任一文件的人,顺手把步骤条抽成app-shell里的公共组件,否则重新排队。两份后来确实都被改过,从横条改成了竖排(ApprovalsInboxPage.tsx:2259、RecordApprovalsPanel.tsx:405),但改的人选择手动保持一致,注释写着 "Kept identical to the console drawer's stepper on purpose",没有抽公共组件。两份现在结构相同,只差一个px-1。为什么关
约定的时机已经过去。两份被人工对齐了,也没有用户可见的差异。约 30 行的重复,不值得单独占一张卡。
什么时候重开
两份再次出现用户能看到的差异时重开。或者 objectstack-ai/objectstack#25950(用 SDUI 重建审批界面)落地,届时一并解决。
标签:摘
pm:on-hold;以not_planned关闭。Generated by Claude Code