新增 Platform 任务化总览入口#2083
Conversation
📊 状态卡片 — PR 已创建(不需要人介入)
🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
📊 状态卡片 — CI 运行中(不需要人介入)
🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
📊 状态卡片 — 等待 review / coverage 收尾
🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## feat/2026-06-08_workflow-studio #2083 +/- ##
===================================================================
+ Coverage 84.08% 84.15% +0.06%
===================================================================
Files 1048 1045 -3
Lines 71079 70931 -148
Branches 9173 9161 -12
===================================================================
- Hits 59765 59690 -75
+ Misses 7294 7224 -70
+ Partials 4020 4017 -3
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
📊 状态卡片 — CI 已通过(不需要人介入)
🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
📊 状态卡片 — reviewer x5 已派发(不需要人介入)
🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
🤖 Architect review approve: Platform 总览未引入架构边界回退TL;DR
详细说明本轮只看 PR #2083 相对 关键证据:
📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: architect
verdict: approve
---
## Verdict
approve - no architecture compliance concerns found in the scoped PR diff.
## Evidence
- `apps/aevatar-console-web/config/routes.ts:95` adds `/platform` as the first visible Platform entry, while `routes.ts:107`, `routes.ts:119`, `routes.ts:149`, `routes.ts:155`, and `routes.ts:161` preserve the existing deep-link paths as task-labeled menu entries; this matches the approved issue-2082 scope and does not introduce hidden compatibility routes.
- `apps/aevatar-console-web/src/shared/navigation/platformRoutes.ts:10` defines a typed frontend-only `PlatformModuleKey`, `platformRoutes.ts:32` centralizes existing Platform paths, and `platformRoutes.ts:119` adds only a `/platform` href builder; no backend/API/proto/runtime/actor/projection contract is changed.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:519` reads the existing service catalog query, `index.tsx:528`/`index.tsx:538`/`index.tsx:548` sample existing governance/deployment/traffic read helpers, and `index.tsx:354` uses local recent-run handoff only for an honestly labeled UI summary; no command flow, readmodel materialization, query-time projection priming, or new durable authority is introduced.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:609` through `index.tsx:633` builds CTAs back to the existing route helpers and runtime links; service identity stays as `serviceId` and actor seed stays as `actorId`, with no `memberId`/`workflowId`/`publishedServiceId` identity mixing in the diff.
- `apps/aevatar-console-web/src/shared/navigation/platformRoutes.test.ts:33` and `apps/aevatar-console-web/src/pages/platform/index.test.tsx:152` assert the new module order, preserved deep-link paths, summaries, and CTA navigation; tests are in scope for this reviewer only as evidence that route/resource semantics are pinned.
- Scoped grep over the PR diff found no new Old/New refactor-history source comments, no `.refactor-loop` production references, no `5000`/`5050` ports, no external-repo references, no new `*WriteActor`/`*ReadActor`/`*Store` split, and no schema/protocol files.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:architect:approve⟦AI:AUTO-LOOP⟧ |
🤖 Tests reviewer 结论:rejectTL;DR
详细说明主要缺口集中在新增 另外,页面新增了成功但空目录、无 service、无 actor seed,以及 bindings/deployments/traffic 局部失败等摘要分支;现有 fallback 测试只覆盖 📎 完整 codex 原始输出(存档备查)pr: 2083
|
🤖 Quality review: comment(可读性建议,不阻断)TL;DR
详细说明
📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: quality
verdict: comment
---
## Verdict
Comment: the PR is focused and readable overall, but the new overview page repeats the same loading summary return shape enough times that a small helper would improve maintainability.
## Evidence
- `apps/aevatar-console-web/src/pages/platform/index.tsx:191` repeats the same `status: "loading"`, `text: t("platform.overview.summary.loading", ...)`, `tone: "info"` object; the same shape appears again at lines 244, 260, 302, 318, and 387. Six near-identical inline copies make future copy changes easy to miss and cross the local DRY threshold for this review.
- `apps/aevatar-console-web/src/shared/navigation/platformRoutes.ts:41` exports `platformNavigation`; this matches the existing `runtimeNavigation` convention and is not dead code from a quality perspective.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:516` has a large React page component, but the added branch-heavy logic is already split into summary builders; I did not find a new method with concerning cyclomatic complexity.
## What would change your verdict
Extract the repeated loading summary into a tiny local helper, for example `buildLoadingSummary()`, and reuse it from the summary builders.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:quality:comment⟦AI:AUTO-LOOP⟧ |
🤖 Product review:comment-only,P0 路径成立但英文计数文案需 polishTL;DR
详细说明从 #2082 的用户问题看,本 PR 把 Platform 从技术对象列表变成 我只留一个非阻塞产品 copy 建议:英文摘要当前会在一条数据时显示 📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: product
head_sha: 024b5a24ccf56e8dea2e3146ffcff821cde75ec7
verdict: comment
---
## Verdict
Comment-only: the PR solves the P0 product outcome, but a few English count summaries should be pluralization-safe before this becomes a polished user-facing overview.
## Evidence
- Source issue #2082 defines the user problem as Platform navigation exposing backend object labels first, forcing users to understand `Services / Governance / Deployments / Event Stream / Topology` before deciding where to go; it asks for a default task-oriented Platform Overview, unchanged deep links, task-language labels, and one-line module descriptions with summaries and primary CTAs.
- PR #2083 stays inside that product boundary: its body says it closes #2082, adds `/platform`, keeps `/services`, `/governance`, `/deployments`, `/runtime/runs`, and `/runtime/explorer`, and uses existing frontend reads plus local run handoff without new backend/API/proto/runtime/workflow contract.
- `apps/aevatar-console-web/config/routes.ts:95` adds `/platform` as the visible Platform `Overview` entry, while `:107`, `:119`, `:149`, `:155`, and `:161` preserve the existing deep-link paths with task-language menu labels.
- `apps/aevatar-console-web/src/shared/navigation/platformRoutes.ts:43` through `:84` defines exactly five Platform module descriptors, ordered as capabilities, access rules, releases, runs, and runtime map, each with title, description, fallback, CTA, and a route path to the existing module.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:186` through `:420` handles loading, unavailable, empty/fallback, and ready summaries for the five modules; `:504` through `:510` gives each module a primary CTA; `:716` through `:738` explicitly tells users the deep links remain unchanged.
- Product copy concern: `apps/aevatar-console-web/src/locales/en-US.ts:50`, `:75`, and `:99` use plural-only templates, so common one-count cases render as "1 policies", "1 deployments", and "1 recent local runs"; the new test fixture at `apps/aevatar-console-web/src/pages/platform/index.test.tsx:164` through `:167` confirms those strings appear. This is not a blocker because the workflow remains usable, but it weakens product polish and trust on a first-entry overview.
## What would change your verdict (only if comment or reject)
Use pluralization-safe copy or neutral count wording for the English one-count summaries, for example "Policies: {policyCount}; active bindings: {bindingCount}", "Visible deployments: {deploymentCount}", and "Recent local runs: {runCount}; latest status {status}".
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:product:comment⟦AI:AUTO-LOOP⟧ |
🤖 UI review:comment-only,布局通过,缺少可审截图TL;DR
UI 说明我按 PR head 关键证据:
非阻塞建议: 📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: ui
head_sha: 024b5a24ccf56e8dea2e3146ffcff821cde75ec7
verdict: comment
---
## Verdict
comment-only: the new Platform overview renders as a coherent, responsive operational entry page, but the PR lacks a rendered `/platform` visual artifact for a substantial new UI surface.
## Evidence
- `apps/aevatar-console-web/config/routes.ts:95` adds `/platform` as the first visible Platform menu item, and `apps/aevatar-console-web/config/routes.ts:107` through `:163` keep the surrounding deep-link routes visible under task-oriented labels.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:59` defines the module grid as `repeat(auto-fit, minmax(min(100%, 260px), 1fr))`, which is the right resilience pattern for this five-card overview.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:136` and `:648` switch the summary band from a desktop four-column grid to a one-column compact layout below the `md` breakpoint.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:473` uses an `article` with `aria-labelledby` per module, and `apps/aevatar-console-web/src/pages/platform/index.tsx:504` through `:511` gives each CTA a visible text label and normal button keyboard semantics.
- Playwright smoke on PR head `024b5a24` with a mocked authenticated session at `1440x1000`: no horizontal overflow, selected menu text is `Overview`, summary band is 1096px wide, module cards lay out at 262px width, and CTA buttons stay 40px high.
- Playwright smoke on the same page at `390x900`: no horizontal overflow, no visible elements outside the viewport, and all five module CTAs remain 260px wide by 40px high in a single-column layout.
- PR body verification only reports `/platform` redirecting to `/login?redirect=%2Fplatform`; there is no attached rendered screenshot, Playwright trace, or story preview for the new authenticated overview page.
- Browser console shows a non-blocking Ant Design deprecation warning from `apps/aevatar-console-web/src/pages/platform/index.tsx:716` because the footer `Space` still uses `direction` instead of the newer `orientation` prop.
## What would change your verdict
Attach or link one rendered `/platform` visual artifact for desktop and mobile using an authenticated or mocked session, and preferably update the footer `Space` prop to remove the deprecation warning.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:ui:comment⟦AI:AUTO-LOOP⟧ |
📊 状态卡片 — reviewer r1 完成,进入 fixing(不需要人介入)
🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
🤖 Fix round 1: 补齐 Platform overview 测试覆盖已补齐 tests reviewer 阻塞项:5 个模块 CTA 路由、空服务目录、依赖查询部分失败。 Raw fix report# Fix report for PR 2083 round 1
## Applied
- Added focused component tests for all five Platform overview module CTA routes generated from the first service and actor context: capabilities, access and rules, releases, runs, and runtime map.
- Added a distinct successful empty service catalog test that verifies guidance copy and confirms dependent governance/deployment/traffic queries stay disabled.
- Added a partial dependent-query failure test that keeps capability catalog data visible while governance and release summaries honestly fall back to unavailable copy.
- Extracted the repeated loading summary object into a small local `buildLoadingSummary()` helper.
- Updated English one-count summary copy to neutral count wording for policies, deployments, and recent local runs.
- Replaced the Platform overview footer `Space` `direction` prop with the existing project-supported `orientation` prop.
## Rejected as false positive
- None.
## Blocked
- None.
## Validation
- `pnpm --dir apps/aevatar-console-web test --runInBand apps/aevatar-console-web/src/pages/platform/index.test.tsx`: passed, 9 tests.
- `pnpm --dir apps/aevatar-console-web tsc`: passed.
- `git diff --check`: passed.
- `bash tools/ci/test_stability_guards.sh`: passed.
- `pnpm --dir apps/aevatar-console-web build`: passed; build emitted `platform/index.html`.
## Recommendation for next round
- Re-run review-gate against the updated Platform overview tests and confirm no remaining UI artifact-only comment is treated as blocking.
⟦AI:AUTO-LOOP⟧
FIX_DONE:2083:round-1:applied-6:rejected-0:blocked-0⟦AI:AUTO-LOOP⟧ |
📊 状态卡片 — fix round 1 已推送,CI 运行中(不需要人介入)
🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
📊 状态卡片 — CI 已通过,reviewer r2 已派发(不需要人介入)
🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
🤖 Architect r2: approveTL;DR
详细说明本轮实际检查了 变更集中在 机械检查也未发现新增 Old/New refactor-history source comment、 📎 完整 codex 原始输出(存档备查)pr: 2083
|
🤖 Quality review r2: commentTL;DR
详细说明本轮只从 readability、naming、simplicity、dead code 角度看当前 diff。整体实现聚焦在 Platform 总览入口,没有发现明显 scope creep、无效抽象或注释污染。 发现两个 advisory 质量点:
这些不属于 must-fix-before-merge,所以 verdict 是 📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: quality
verdict: comment
---
## Verdict
Comment: the PR is focused and readable overall, but it adds one unused public navigation export and leaves the new page's main component larger than the review heuristic prefers.
## Evidence
- `apps/aevatar-console-web/src/shared/navigation/platformRoutes.ts:41`: `platformNavigation` is exported but has no caller in the current head; `git grep` only finds this export. This is small public surface without a current production or test consumer, so it should either stay private until needed or be used by route/menu callers now.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:500`: `PlatformOverviewPage` is a new component whose body runs from line 500 through line 725, mixing query setup, summary/href derivation, and JSX layout. The helper functions above it are readable, but extracting a summary band and/or module grid component would keep the main page flow closer to the preferred <=80-line method/component heuristic.
## What would change your verdict (only if comment or reject)
Remove the unused `platformNavigation` export or route a real caller through it, and split the `PlatformOverviewPage` render body into smaller named presentational components without changing behavior.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:quality:comment⟦AI:AUTO-LOOP⟧ |
🤖 Product review r2 approve:Platform P0 用户路径已闭环TL;DR
详细说明我只复核了 PR #2083 当前 live head 关键产品证据:
我没有发现产品侧阻塞项:用户问题、主路径、空态/错误态/加载态、scope honesty、copy 和 trade-off visibility 都达到本轮合并要求。 📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: product
head_sha: b9c6d01034cff5f3800243623b27f64dd8781f22
verdict: approve
---
## Verdict
Approve: the live PR head solves the P0 Platform overview user problem within the authorized frontend scope, with honest summaries, preserved deep links, and clear task-oriented copy.
## Evidence
- Source issue #2082 defines the user problem as Platform exposing backend-object labels first, forcing users to understand `Services / Governance / Deployments / Event Stream / Topology` before choosing a next step; it asks for a default task-oriented Overview, unchanged deep links, task-language labels, one-line module explanations, summaries, and primary CTAs.
- PR #2083 declares the same scope: it closes #2082, adds `/platform`, keeps `/services`, `/governance`, `/deployments`, `/runtime/runs`, and `/runtime/explorer`, and explicitly avoids backend/API/proto/runtime/workflow contract changes while using existing frontend reads and local run handoff signals.
- `apps/aevatar-console-web/config/routes.ts:95` adds `/platform` as the first visible Platform `Overview` entry, while `apps/aevatar-console-web/config/routes.ts:107`, `:119`, `:149`, `:155`, and `:161` preserve the existing Platform deep-link paths under task-language labels: `Capabilities`, `Access & Rules`, `Releases`, `Runs`, and `Runtime Map`.
- `apps/aevatar-console-web/src/shared/navigation/platformRoutes.ts:43` through `:84` defines the five Platform modules requested by the issue, each with title, description, fallback, CTA, and existing route target; this keeps the Overview product promise aligned with the navigation model instead of adding an unrelated landing page.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:194` through `:403` handles ready, loading, unavailable, and guidance/fallback summaries for capabilities, access rules, releases, runs, and runtime map; this covers the primary path, empty/no-signal path, partial error path, and recovery guidance without pretending weak signals are complete facts.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:593` through `:618` computes scoped CTA hrefs from the first visible service and actor context, then `apps/aevatar-console-web/src/pages/platform/index.tsx:687` through `:696` wires those hrefs into the five module cards, so the Overview gets users into the existing module workflows rather than stopping at static copy.
- `apps/aevatar-console-web/src/locales/en-US.ts:47` through `:104` and `apps/aevatar-console-web/src/locales/zh-CN.ts:47` through `:104` provide clear user-facing module names, descriptions, summaries, fallback/error copy, and CTAs in the repo's supported product languages. The previous English one-count issue is fixed with neutral count wording at `en-US.ts:50`, `:75`, and `:99`.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:713` through `:720` makes the trade-off visible in-product: deep links stay unchanged and the page is only a task-first starting point. The PR body also states the same scope and validation, so maintainers can see that this is a P0 frontend entry-point change rather than a new backend overview contract.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:product:approve⟦AI:AUTO-LOOP⟧ |
🤖 Tests review r2: approveTL;DR
详细说明这轮我只审了当前 PR diff 和 live head。 路由侧也有对应覆盖: 📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: tests
verdict: approve
---
## Verdict
Approve: the current live head has behavior-level coverage for the Platform overview entry, module routing, menu registration, and fallback/error states.
## Evidence
- `apps/aevatar-console-web/src/pages/platform/index.test.tsx:188` covers rendering the five task modules and verifies live summaries computed from catalog, binding, deployment, traffic, and recent-run fixtures.
- `apps/aevatar-console-web/src/pages/platform/index.test.tsx:206` through `apps/aevatar-console-web/src/pages/platform/index.test.tsx:241` cover every module CTA and assert the destination path plus scoped service or actor query context.
- `apps/aevatar-console-web/src/pages/platform/index.test.tsx:243` covers the successful empty-catalog branch and asserts dependent binding/deployment/traffic reads are not fired without a selected service.
- `apps/aevatar-console-web/src/pages/platform/index.test.tsx:259` and `apps/aevatar-console-web/src/pages/platform/index.test.tsx:275` cover partial dependent-query failures and full service-catalog failure with explicit unavailable/guidance copy.
- `apps/aevatar-console-web/src/shared/navigation/platformRoutes.test.ts:34` and `apps/aevatar-console-web/src/shared/navigation/platformRoutes.test.ts:52` cover the new overview href, module order, route registration, renamed menu items, and menu ordering; `apps/aevatar-console-web/src/shared/navigation/navigationMenuSelection.test.ts:18` covers `/platform` selection.
- Diff scan found no added skipped/manual tests, no `only` tests, no sleep/timer pacing, no polling allowlist changes, and no assertion loosening in the touched tests.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:tests:approve⟦AI:AUTO-LOOP⟧ |
🤖 UI review r2:comment-only,当前布局通过,仍建议补可审截图TL;DR
详细说明我按当前 live head UI 证据:
仍保留 comment 的原因是 PR 讨论/实现 artifact 里仍没有可持久查看的 authenticated 📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: ui
head_sha: b9c6d01034cff5f3800243623b27f64dd8781f22
verdict: comment
---
## Verdict
comment-only: the current Platform overview UI is responsive and interaction-safe, but the PR still lacks a durable desktop/mobile rendered visual artifact for this substantial new page.
## Evidence
- `apps/aevatar-console-web/src/pages/platform/index.tsx:59` uses `repeat(auto-fit, minmax(min(100%, 260px), 1fr))`, giving the five module cards a resilient wrap pattern instead of fixed columns.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:136` and `apps/aevatar-console-web/src/pages/platform/index.tsx:632` switch the summary band from desktop four-column layout to a single-column compact layout below `md`.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:457` labels each module `article` with its heading, and `apps/aevatar-console-web/src/pages/platform/index.tsx:488` through `:495` uses visible text Ant Design buttons for the CTAs, so keyboard and accessible-name behavior are plausible.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:700` now uses `Space orientation="vertical"`, so the r1 footer `direction` deprecation warning is resolved on the current head.
- `apps/aevatar-console-web/src/pages/platform/index.test.tsx:188` through `:287` now cover the main rendered module summaries, all five CTA route interactions, empty catalog guidance, partial dependency failure copy, and catalog failure fallback.
- Playwright smoke on current head `b9c6d01034cff5f3800243623b27f64dd8781f22` at `1440x1000` with mocked authenticated `/platform`: no horizontal overflow (`bodyScrollWidth=1440`, `viewportWidth=1440`), five cards rendered, Platform menu selected `Overview`, summary band measured `1096px` wide, module cards measured `262px` wide, and CTA buttons stayed `220px x 40px`. Screenshot captured locally at `/tmp/pr2083-platform-desktop-r2.png`.
- Playwright smoke on the same current head at `390x900`: no horizontal overflow (`scrollWidth=390`, `viewportWidth=390`), no visible element outside the viewport, five cards rendered in one column, and all five CTA buttons stayed `260px x 40px`. Screenshot captured locally at `/tmp/pr2083-platform-mobile-r2.png`.
- Browser console still reports the existing app-level Ant Design `ConfigProvider autoInsertSpaceInButton` deprecation, but no Platform-overview-specific warning remains after the footer prop change.
- Current PR discussion and fix report provide CI/test validation, but I did not find a durable attached or linked rendered screenshot/trace for authenticated `/platform` in the PR artifact itself.
## What would change your verdict (only if comment or reject)
Attach or link one desktop and one mobile authenticated `/platform` screenshot or Playwright trace to the PR/implementation artifact so reviewers and maintainers can audit the new visual surface without rerunning local mocks.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:ui:comment⟦AI:AUTO-LOOP⟧ |
📊 状态卡片 — review-gate r2 通过,等待人工 review/merge
🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
📊 当前状态 — base 已切到 workflow-studio(不需要人介入)
下一步自动会做:派 focused loop worker 保留 workflow-studio 与 platform overview 两侧 locale 语义,解决冲突后由 controller commit/push,再等待 CI 重新跑。 何时需要人介入:只有冲突解析后验证仍失败且需要产品取舍时才会升级。 🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
📊 当前状态 — base 冲突已修复并已推送(不需要人介入)
下一步自动会做:继续观察新一轮 GitHub CI;如果失败,再按 loop 派 focused fix worker。 何时需要人介入:只有 CI 失败且需要产品/取舍判断时才会升级。 🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
🤖 Architect review:阻塞,Platform 总览需收敛到设计 tokensTL;DR
详细说明这次 diff 的路由和前端读取边界本身没有看到新的 backend/proto/actor/projection/schema 风险: 阻塞点在前端架构规则:CLAUDE.md 明确要求“前端改动优先抽取 design tokens / CSS variables,不接受大面积零散硬编码。”AGENTS.md 也要求“优先抽取 design tokens / CSS variables / theme tokens,统一颜色、字体、间距、圆角、阴影与动效,不接受大面积零散硬编码。” 当前新增的 建议修复方式:保留当前 UI 结构和路由语义,把这些颜色移动到一个小的语义 token 层,或直接使用 📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: architect
verdict: reject
---
## Verdict
reject - the PR adds a full frontend Platform page with a sizeable hard-coded color palette instead of design tokens/CSS variables, which regresses the repository frontend architecture rules.
## Evidence
- `apps/aevatar-console-web/src/pages/platform/index.tsx:67` through `index.tsx:164` define the new page surface, cards, icon well, summary band, and metric styles with raw `#ffffff`, `#e5e7eb`, `rgba(...)`, `#eef6ff`, `#135fb8`, `#4b5563`, `#f8fafc`, `#edf2f7`, `#0f172a`, and related values. `index.tsx:495`, `index.tsx:499`, and `index.tsx:650` through `index.tsx:690` add more inline raw color values in rendered text. This is a new full-page visual surface, not a small one-off value. It violates CLAUDE.md: "`前端改动优先抽取 design tokens / CSS variables,不接受大面积零散硬编码。`" and AGENTS.md: "`优先抽取 design tokens / CSS variables / theme tokens,统一颜色、字体、间距、圆角、阴影与动效,不接受大面积零散硬编码。`"
- Positive checks from the same diff: `apps/aevatar-console-web/config/routes.ts:95` adds only the frontend `/platform` route; `apps/aevatar-console-web/src/shared/navigation/platformRoutes.ts:32` centralizes existing Platform paths; `apps/aevatar-console-web/src/pages/platform/index.tsx:519` through `index.tsx:555` read existing frontend query helpers; and scoped grep found no new Old/New refactor-history comments, no `.refactor-loop` production references, no external repo references, no backend/proto/actor/projection/schema files, no new `*WriteActor`/`*ReadActor`/`*Store` split, and no forbidden `5000`/`5050` port text.
## What would change your verdict
Replace the new page's raw hex/rgba palette with semantic frontend tokens backed by Ant theme tokens or CSS variables. Concretely, the card, icon, summary band, metric, and text colors should come from a small named token layer or `var(--ant-...)`/`theme.useToken()` values, so the Platform overview does not introduce a parallel page-local design palette.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:architect:reject⟦AI:AUTO-LOOP⟧ |
🤖 Tests review: comment, coverage is merge-safe with advisory gapsTL;DR
详细说明本次只看测试覆盖与测试质量,不评价生产代码架构或 UI 设计。新增测试不是单纯渲染冒烟: 未发现新增 建议补但不阻塞: 📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: tests
verdict: comment
---
## Verdict
Test coverage is adequate for merge, but the new overview page would benefit from a few more behavior tests around task handoff links and non-catalog-error fallback states.
## Evidence
- `apps/aevatar-console-web/src/pages/platform/index.test.tsx:152` covers the happy path with real rendered summaries and one CTA navigation to `/services?serviceId=service-alpha`; this is a behavior test, not a smoke or mock-only test.
- `apps/aevatar-console-web/src/pages/platform/index.test.tsx:178` covers the service catalog failure path and empty local runs fallback without adding polling sleeps or weakened assertions.
- `apps/aevatar-console-web/src/shared/navigation/platformRoutes.test.ts:34` and `:52` assert the new `/platform` entry, module order, route labels, and preserved deep-link paths, which matches the new `platformRoutes.ts` public behavior.
- `apps/aevatar-console-web/src/shared/navigation/navigationMenuSelection.test.ts:18` covers `/platform` selection as a first-class menu item.
- Coverage gap, advisory: `apps/aevatar-console-web/src/pages/platform/index.tsx:609` to `:633` builds five task handoff hrefs, but the page test only clicks "Open capabilities". There is no rendered-page assertion that "Review access and rules", "Manage releases", "Inspect runs", or "Open runtime map" preserve the first service identity and actor context.
- Coverage gap, advisory: `apps/aevatar-console-web/src/pages/platform/index.tsx:238` to `:420` has distinct fallback/unavailable branches for access rules, releases, and runtime map when downstream queries fail or the first service lacks deployment/actor data. The added page tests cover catalog failure and no local runs, but not those branch-specific outcomes.
- Stability check: the frontend test diff adds no `[Skip]`, `.skip`, manual category, `Task.Delay`, `WaitUntilAsync`, timer pacing, `Assert.True(true)`, `not.toThrow`, or assertion loosening patterns.
## What would change your verdict (only if comment or reject)
Add one focused `PlatformOverviewPage` test that clicks the remaining module CTAs and asserts the resulting pathname/search params, plus one branch-focused test for service-present/downstream-unavailable or service-present/no-actor fallback summaries.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:tests:comment⟦AI:AUTO-LOOP⟧ |
🤖 Quality review: commentTL;DR
详细说明我按三点 diff 打开了实际 touched files,并重点检查命名、死代码、无必要抽象、重复、方法复杂度、注释和无关改动。 发现一个质量建议: 建议把这段重复逻辑抽成一个很小的 helper,例如 未发现 in-scope 的死代码、泛化命名、单实现抽象、无关 drive-by cleanup 或 refactor self-doc 违规。 📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: quality
verdict: comment
---
## Verdict
Readable and focused overall, but the new overview repeats the same loading summary literal enough times that it should be extracted for clarity.
## Evidence
- `apps/aevatar-console-web/src/pages/platform/index.tsx:191`, `apps/aevatar-console-web/src/pages/platform/index.tsx:244`, `apps/aevatar-console-web/src/pages/platform/index.tsx:260`, `apps/aevatar-console-web/src/pages/platform/index.tsx:302`, `apps/aevatar-console-web/src/pages/platform/index.tsx:318`, and `apps/aevatar-console-web/src/pages/platform/index.tsx:387` each return the same `status: "loading"`, `text: t("platform.overview.summary.loading", ...)`, `tone: "info"` object. This crosses the checklist's `>=3 near-identical inline copies` threshold and makes future wording/status changes require touching every summary builder.
## What would change your verdict (only if comment or reject)
Extract the repeated loading summary into one small helper such as `buildLoadingModuleSummary()` or a `loadingPlatformModuleSummary()` factory, then call it from the summary builders.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:quality:comment⟦AI:AUTO-LOOP⟧ |
🤖 Product review comment: P0 任务入口已成立,导航本地化映射有小缺口TL;DR
详细说明我按 #2082 的 P0 验收目标、R2 consensus 和 PR 当前 head 唯一产品侧 comment 是左侧菜单本地化映射: 📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: product
head_sha: 396745d6666cd5818b1ce0ed6a88597044cb2d51
verdict: comment
---
## Verdict
comment-only: the PR solves the P0 Platform task-overview user problem, with one non-blocking localization gap in the left navigation label wiring.
## Evidence
- Source issue #2082 states the product problem clearly: Platform currently exposes backend-object labels first, making users understand `Services / Governance / Deployments / Event Stream / Topology` before knowing where to go; the requested P0 outcome is a task-oriented default Overview, unchanged deep links, task-language labels, one-line module explanations, lightweight summaries, and primary CTAs.
- PR #2083 declares the same scope in its body: close #2082, add `/platform`, keep `/services`, `/governance`, `/deployments`, `/runtime/runs`, and `/runtime/explorer`, and use existing frontend reads plus local run handoff without adding backend/API/proto/runtime/workflow contracts.
- `apps/aevatar-console-web/config/routes.ts:116` adds `/platform` as the visible Platform `Overview` item, while `apps/aevatar-console-web/config/routes.ts:128`, `:140`, and `:170` keep the existing module paths under task labels `Capabilities`, `Access & Rules`, and `Releases`; the PR also keeps the runtime runs and runtime map routes in the Platform group. This fits the issue's "do not break deep links" constraint.
- `apps/aevatar-console-web/src/shared/navigation/platformRoutes.ts:43` through `:84` defines the five requested Platform modules with title, description, fallback, CTA, and existing route target. That gives the overview a concrete task map instead of a marketing or static directory page.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:194` through `:403` handles loading, unavailable, empty/fallback, and ready summaries for capabilities, access rules, releases, runs, and runtime map. The copy labels weak signals as guidance/unavailable rather than claiming complete operational readiness.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:593` through `:618` builds CTAs into the existing module workflows using the first visible service and actor context, and `apps/aevatar-console-web/src/pages/platform/index.tsx:687` through `:696` wires those hrefs into the five cards. The user can act from the overview rather than just read about modules.
- `apps/aevatar-console-web/src/locales/en-US.ts:40` through `:110` and `apps/aevatar-console-web/src/locales/zh-CN.ts:40` through `:110` provide specific module descriptions, summaries, fallbacks, and CTAs in both supported product languages; the earlier one-count English copy issue is now neutralized at `en-US.ts:53`, `:78`, and `:102`.
- Non-blocking copy/localization gap: `apps/aevatar-console-web/src/app.tsx:170` through `:178` maps localized menu message ids for existing paths but omits `/platform`, while `apps/aevatar-console-web/src/app.tsx:716` through `:730` only localizes menu items present in that map. In a Chinese session, the new menu item can therefore fall back to the route's raw `Overview` name even though `nav.items.overview` exists in `zh-CN.ts:36`. This does not block the journey because the label is understandable and the page itself is localized, but it is product polish debt for a new first-class nav entry.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:713` through `:720` makes the trade-off visible in-product: existing deep links remain unchanged and the page only adds a task-first starting point. The PR body also surfaces the same frontend-only boundary and validation scope.
## What would change your verdict (only if comment or reject)
Add `/platform: "nav.items.overview"` to `NAVIGATION_MENU_MESSAGE_IDS` and cover it with the existing navigation/menu test pattern so the new first-class Platform entry localizes like the other visible Platform items.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:product:comment
⟦AI:AUTO-LOOP⟧ |
🤖 UI review reject: Platform 总览视觉层需收敛到 Aevatar tokensTL;DR
详细说明我按当前 PR head 阻塞点不是布局是否会立即炸开: 阻塞点是设计系统一致性。这个 PR 新增的是完整 另一个非主要但需要一起补的点:当前 PR 讨论里没有 durable 的 authenticated 建议修复边界很小:保留现有信息结构和路由,把 cards / icon well / summary band / metrics / tag / text / border / radius / shadow 收敛到 📎 完整 codex 原始输出(存档备查)---
pr: 2083
role: ui
head_sha: 396745d6666cd5818b1ce0ed6a88597044cb2d51
verdict: reject
---
## Verdict
reject - the new Platform overview is structurally responsive, but its main cards, summary band, and metrics introduce a page-local hard-coded visual system instead of the existing Aevatar token/component primitives.
## Evidence
- `apps/aevatar-console-web/src/pages/platform/index.tsx:67` through `:164` define the new module cards, icon well, summary band, and metric tiles with raw `#ffffff`, `#e5e7eb`, `#eef6ff`, `#135fb8`, `#4b5563`, `#f8fafc`, `#0f172a`, and `rgba(...)` values. This is the primary visual structure of a new full page, not a small exception.
- `apps/aevatar-console-web/src/pages/platform/index.tsx:479`, `:483`, and `:635` through `:674` continue that page-local palette in rendered text and metrics, so state labels and hierarchy will not automatically follow the app theme tokens.
- Surrounding Platform surfaces already have reusable visual primitives: `apps/aevatar-console-web/src/shared/ui/aevatarWorkbench.ts:521` exposes `buildAevatarPanelStyle`, `:541` exposes `buildAevatarMetricCardStyle`, and `:560` exposes `buildAevatarTagStyle`; `apps/aevatar-console-web/src/pages/Deployments/index.tsx:468` and `:475` use the metric token helpers for comparable operational metric cards.
- The frontend design canon explicitly requires token-first implementation: `docs/canon/frontend-design.md:260` through `:268` says colors, spacing, radius, shadows, and related values should converge on CSS variables, theme tokens, or reusable primitives, and names `aevatarWorkbench.ts` as the preferred shared home.
- The responsive mechanics are otherwise reasonable: `apps/aevatar-console-web/src/pages/platform/index.tsx:59` uses `repeat(auto-fit, minmax(min(100%, 260px), 1fr))` for the five module cards, and `:630` through `:632` switches the summary band to the compact one-column style below `md`.
- Accessibility basics are plausible: each module uses `article aria-labelledby` at `apps/aevatar-console-web/src/pages/platform/index.tsx:457`, and the CTAs are visible Ant Design buttons at `:488` through `:495`.
- State coverage is present in the UI contract: `apps/aevatar-console-web/src/pages/platform/index.tsx:186` through `:403` covers loading, empty/guidance, unavailable, and ready summary states, and `apps/aevatar-console-web/src/pages/platform/index.test.tsx:188` through `:287` exercises the main summaries, CTA routing, empty catalog, partial failure, and catalog failure cases.
- I did not find durable desktop/mobile screenshot or trace evidence attached to the current PR artifact; the PR body only records an unauthenticated `/platform` smoke redirect, and earlier PR comments reference local `/tmp` screenshots rather than reviewable artifacts.
## What would change your verdict (only if comment or reject)
Refactor the Platform overview visual layer to use the existing Aevatar theme token primitives or a small semantic token wrapper backed by `theme.useToken()`/`aevatarWorkbench.ts` for cards, icon wells, summary metrics, tags, text, borders, radius, and shadows; then attach or link desktop and mobile rendered `/platform` screenshots or a Playwright trace for the authenticated overview surface.
⟦AI:AUTO-LOOP⟧
REVIEW_DONE:2083:ui:reject⟦AI:AUTO-LOOP⟧ |
摘要
本 PR 关闭 #2082,为 Platform 增加一个任务化的可见入口,并把左侧 Platform 导航改成更贴近用户目标的 SaaS 语言。
/platform总览页,作为 Platform 分组第一项。/services、/governance、/deployments、/runtime/runs、/runtime/explorer。Overview、Capabilities、Access & Rules、Releases、Runs、Runtime Map。影响范围
apps/aevatar-console-web/config/routes.tsapps/aevatar-console-web/src/pages/platform/index.tsxapps/aevatar-console-web/src/pages/platform/index.test.tsxapps/aevatar-console-web/src/shared/navigation/platformRoutes.tsapps/aevatar-console-web/src/shared/navigation/*.test.tsapps/aevatar-console-web/src/locales/en-US.tsapps/aevatar-console-web/src/locales/zh-CN.ts验证
pnpm --dir apps/aevatar-console-web install --frozen-lockfile:通过,lockfile 未变。pnpm --dir apps/aevatar-console-web tsc:通过。pnpm --dir apps/aevatar-console-web test --runInBand:通过,115 suites / 785 tests。pnpm --dir apps/aevatar-console-web build:通过,产出platform/index.html。bash tools/ci/test_stability_guards.sh:通过。git diff --check HEAD~1..HEAD:无输出。/platform会按当前产品鉴权重定向到/login?redirect=%2Fplatform,未伪造 NyxID session;页面渲染由组件测试和 build 覆盖。边界
Closes #2082