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.

console: 空态「Create Your First App」CTA 跳向未声明的 /create-app,被 catch-all 弹回落地页 #3573

Closed

Description

@yinlianghui

越界发现,记录于 #3543(清理 console-architecture.md / console.md 的过期陈述)期间。按纪律只报不改,单独立单,未认领,留给 PM 分诊。

实测基线:origin/main @ b785a77b3。

现象

一个应用都没有的用户,在 console 里看到的唯一主 CTA「Create Your First App」点下去不会打开建应用向导,而是被重定向回落地页 /。

实测链路

  1. 空态渲染点(活的):packages/app-shell/src/console/AppContent.tsx:577

    Button onClick={() => navigate('/create-app')} data-testid="create-first-app-btn"

    前置条件是 !activeApp && !isCreateAppRoute && !isSystemRoute && !isMetadataRoute(同文件 568 行)。

  2. '/create-app' 带前导斜杠,是绝对路径,因此从根路由树解析,而不是当前 /apps/:appName/* 子树。

  3. apps/console/src/App.tsx 的根路由树里没有 /create-app:

    grep -n "create-app" apps/console/src/App.tsx apps/console/src/AppContent.tsx
    # 零命中
    
  4. 于是落到根路由树最后一条兜底(apps/console/src/App.tsx:354):

    Route path="*" element={ Navigate to="/" replace }

    → 用户被弹回 /(RootLandingRedirect)。

真正声明 create-app 的是 shell 的 AppContent.tsx(path="create-app"),它挂在 /apps/:appName/* 子树内部 —— 包括同文件里那条「无 activeApp 时仍可进 create-app」的分支。也就是说目标路由存在,只是 CTA 指错了层级:应当指向该子树内的路径,而不是根路径。

影响

这是新用户的第一屏、且是该空态里唯一指向「建应用」的按钮(旁边的 go-to-settings-btn → /apps/setup 是好的,因为它落在 /apps/:appName/* 内)。点击后无声地回到落地页,没有任何报错,表现像「按钮没反应」。

备注

Activity

  1. self-assigned this
    on Aug 7, 2026
  2. yinlianghui commented on Aug 7, 2026

    @yinlianghui
    ContributorAuthor

    认领(PM 分诊晋级)— 会话 session_01GTRjn8xBqp75dk7kFupVRt,分支 claude/issue-3573-create-app-cta。

    分诊定级:具体缺陷,即派(新用户第一屏唯一主 CTA 无声失效)。修向首选相对跳转假设,但以实测定夺:空态渲染于 /apps/:appName/* 子树内(前置条件含 !activeApp),而 create-app 路由恰在子树内声明且有无-activeApp 分支 —— navigate('create-app')(相对)应能落到已声明路由;这同时保住 DefaultAppContent 作为通用组件的宿主无关性(不强加根路由义务)。dev 必须先量:空态出现时的真实 URL 形态(直接访问 / 时空态是否可达?若可达则相对跳转的基不成立,需报告备选);修后加路由测试钉住 CTA 落点。⛔ 不动 App.tsx 根路由(那是宿主契约变更,若实测证明必须,STOP 报告)。

    文件面:packages/app-shell/src/console/AppContent.tsx(仅该 navigate 调用)+ 路由测试。越界即停。


    Generated by Claude Code

  3. yinlianghui commented on Aug 7, 2026

    @yinlianghui
    ContributorAuthor

    验收:ACCEPT,open question 裁定 A(已发货形态确认) — PR #3588。

    核过 GitHub 实物(3 文件:一处 navigate + 注释、6 例测试、changeset)。裁定要点:

    1. 主假设被实测推翻,处置完全正确:我的裁定让"以实测定夺",dev 挖到 react-router 7.18 源码(getResolveToMatches 对 leaf match 取完整 pathname、splat 计入 —— v6 的 v7_relativeSplatPath 在 v7 硬编码),证明相对形态在深层 URL(/apps/setup/sys_inbox_message)下解析出无匹配路径渲染空白屏 —— 比原 bug 的弹回还糟。中间态 1 红实录在案,未发货。
    2. A 形态两轴论证采纳:ADR-0048 已把 /apps/<segment> 定为平台 app URL 契约,A 是契约的直接表达而非 workaround;且与同文件 8 处既有导航 + AppSidebar 同款链接字节同形 —— AI 后续改码会照对形状抄。B(从 splat 重构基)是为契约不设想的宿主形状发明第二惯用法,C 被围栏明令禁止。维护者若要 mount-point 无关性,B 是小型独立跟进,现有测试已钉两个深度、做错即红。
    3. URL 形态测量闭环:空态只在 /apps/setup[/*] 家族可达(/ 上零应用用户走 /home,AppContent 不挂载)—— 两个渲染测试 + 一个反例测量钉住。
    4. 逆验证:新测试对旧源码 2 红(失败转储就是 bug 本身),预告命中。
    5. console: 零应用空态的另一颗按钮 go-to-settings-btn 同样是死键——/apps/setup 渲染的正是这个空态本身 #3590(同屏兄弟按钮 go-to-settings-btn 也是死的 —— 目标就是本屏自身 URL,证伪了本 issue 自己的"它是好的"断言,三个调用点)已核存在,即刻分诊晋级。

    PR 转 ready + auto-merge。


    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions