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.

[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

Closed as not planned

Description

@os-sales

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.

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Aug 21, 2026
  2. huangyiirene commented on Aug 21, 2026

    @huangyiirene
    Collaborator

    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 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.


    Generated by Claude Code

  3. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    关闭 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

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions