feat(control-plane): promote the personal Agent workspace - #3274
feat(control-plane): promote the personal Agent workspace#3274maxliux5 wants to merge 36 commits into
Conversation
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
huangruiteng
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub review-state fallback)
精确评审头(Exact Head): 3274@3f395f9f4208b0ff5037ef4fbec20fb4c3967535
Base: main | 类型: personal Agent workspace 干净提升(133 files, +33631/-288)
作者: huangruiteng(owner;maxliux5/NIU-123370/ACanvasHERE 等贡献合入)
详细中文评审
动机
#3269 因 DCO(历史 commit 缺 trailer)与 CLI 输出差分超预算被 REQUEST_CHANGES;本 PR 在最新 main 上重建干净提升分支,解决 DCO(Sign-off SUCCESS),并把集成隔离在 0b0a2d67。核心内容与 #3269 相同:Manager/Goal workspace、受限 router、Preview/Apply 安全边界、Session 真相投影。
改动思路
以当前 origin/main 为基重建(不落后于 main),作者历史尽量直接保留,未满足 DCO 的 commit 通过重建分支解决;生成 UI 资产与 runtime/tests/docs 分提交。路由安全模型与 #3269 一致(projection / typed_action / agent_chat / clarify;typed_action 需 canonical preview + fingerprint + 确认 + receipt)。
具体改动
与 #3269 同规模的 133 文件提升(apps/presentation 前端 + control-plane 投影/状态面),集成 commit 0b0a2d67 隔离 latest-main 同步;新增 status-server localhost fast-path 测试等。
关键内容讲解
- DCO 已解决:Sign-off check SUCCESS(P1-1 清除)。
- CLI 输出差分未解决:pytest 仍 FAILURE——
cli-output-base-head-differential-smoke.py报surface/status/crowded/json与multi_agent/jsonlines +5 (allowance 4);surface/status/small/jsonchars +130 (allowance 128)、compact_payload_chars +95 (allowance 93)。与 #3269/#3269b 相同根因,仍在 allowance 之外。 - 其余检查:build ×2、dependency-review SUCCESS;deploy SKIPPED。
对主干的风险
阻断项(P1)
- pytest FAIL(CLI base/head differential):agent-facing status JSON 输出仍超预算(lines +5 / chars +130);需收敛 status 输出或在逐项证据基础上更新差分 allowance(不能只改阈值)。
非阻断(P2)
- DCO 已清,可推进:CI 绿后仍需按提升门禁完成 router 安全/投影面的分片独立复核(本评审已覆盖 CI 证据与 diff 范围,完整逐行复核建议分片进行)。
验证矩阵(exact head 实测/CI)
| 场景 | 结果 |
|---|---|
| Sign-off(DCO) | SUCCESS(已修复) |
| pytest(CLI base/head differential) | FAILURE(lines +5 vs 4;small/json chars +130 vs 128) |
| build ×2 / dependency-review | SUCCESS |
| 作者本地验证 | 115 focused Python tests + dashboard/router/browser smokes + CUA(claimed) |
| diff 范围 | 133 files, +33631/-288 |
我的整体评价
干净重建解决了 DCO,方向与 #3269 一致且集成隔离清楚;但 agent-facing CLI 输出差分这一 P1 仍未解决(数值与 #3269 一致)。结论:REQUEST_CHANGES(窄化:收敛 status JSON 输出至 allowance 内或提供逐项证据更新差分 allowance;随后完成分片安全面复核)。
English Verdict
Verdict: REQUEST_CHANGES — exact head 3274@3f395f9f4208b0ff5037ef4fbec20fb4c3967535.
Summary: This clean promotion resolves the DCO blocker (Sign-off SUCCESS) and isolates the latest-main sync in one integration commit, but the second P1 from #3269 remains: CI pytest fails on the agent-facing CLI base/head differential (status rows lines +5 vs allowance 4; small/json chars +130 vs allowance 128). Builds and dependency-review pass. Once the CLI output budget is reconciled, the staged independent review of the router safety and projection surfaces can proceed.
Signed-off-by: maxliu <lualiudd@gmail.com>
huangruiteng
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
精确评审头(Exact Head): 3274@d030e6639077ae04994c81f3063a28d388000c1c
Base: main | 类型: Agent workspace 提升的 CLI 输出预算修复(2 files, +18/-2)
作者: huangruiteng(owner;多贡献者合入)
详细中文评审
动机
上一轮 REQUEST_CHANGES 的 P1(agent-facing CLI base/head 差分超预算)由新 commit d030e6639(fix(status): keep boundary diagnostics off hot path)修复:把 public_boundary_scan 从 status contract 的 hot-path 投影中移除,改为 checks 里的 deferred 提示(public boundary scan deferred for status hot path),并保留 check 命令作为发布前入口。
改动思路
最小收敛:status hot path 不再透传 public_boundary_scan 明细(减少 JSON 输出),只保留一行 deferred 提示;测试锁定新行为(无 capability 时 contract 不含 public_boundary_scan,checks 含 deferred 提示),新增专用回归测试。
具体改动
loopx/control_plane/status/collection.py(-1):从 hot-path 投影字段中移除public_boundary_scan。tests/control_plane/test_status_collection_material_capability_wiring.py(+19/-2):fixture 更新 + 新增test_status_collection_keeps_boundary_detail_off_the_hot_path。
关键内容讲解
- 预算修复验证:本地 exact head 复跑
cli-output-base-head-differential-smoke.pyPASS(此前 lines +5 / chars +130 超限已消失)。 - 行为保持:boundary 扫描未删除,只是移出 status hot path;
loopx check仍是发布前扫描入口(recommended_action 保留)。 - 回归锁定:新测试断言 deferred 提示存在、明细字段不在 contract。
对主干的风险
无阻断项。Sign-off、dependency-review SUCCESS;build ×2(一个 CANCELLED 为旧 run)、pytest IN_PROGRESS(无失败)。P2 保持:CI 绿后按提升门禁完成 router 安全/投影面的分片独立复核(本评审覆盖 CI 证据与关键修复点,完整逐行复核建议分片进行)。
验证矩阵(exact head 实测/CI)
| 场景 | 结果 |
|---|---|
cli-output-base-head-differential-smoke.py(本地复跑) |
PASS(P1 修复确认) |
test_status_collection_material_capability_wiring.py |
6 passed |
| Sign-off / dependency-review | SUCCESS |
| build ×2 / deploy | SUCCESS / CANCELLED(旧 run) |
| pytest(CI) | IN_PROGRESS(评审时刻) |
我的整体评价
一个字段的 hot-path 收敛即解决超预算,且不丢失扫描能力;本地差分 smoke 与回归测试全绿。结论:APPROVE(author-owned PR,以 COMMENTED 记录批准结论;合并前确认 CI pytest 绿)。
English Verdict
Verdict: APPROVE (author-owned PR; recorded as COMMENTED because GitHub blocks formal self-approval). The new commit keeps public_boundary_scan detail off the status hot path (deferred note only), which fixes the agent-facing CLI base/head differential: the previously failing differential smoke now passes at the exact head, along with the focused status-collection regression tests. Sign-off and dependency-review are green; CI pytest was in progress at review time.
Signed-off-by: maxliu <lualiudd@gmail.com>
huangruiteng
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
精确评审头(Exact Head): 3274@0eb251fe5046bcf59b26d7f38cac2d98afb657a7
Base: main | 类型: Agent workspace 提升 + latest-main merge sync
作者: huangruiteng(owner;多贡献者合入)
详细中文评审
动机
作者在已批准的 d030e6639(CLI 差分修复)之上再次同步最新 main(含已合并的 #3272/#3273),产生 merge head 0eb251fe5。评审目标是确认 merge sync 未引入新问题、PR 自身内容保持已批准状态。
改动思路
merge sync latest main:PR 自身 commit 序列不变(status hot-path 修复 d030e6639 保留),新增内容来自已合并的 #3272/#3273(与 PR 无关)。git log origin/main..origin/pr-3274c-head 显示 PR 专属提交仍为 workspace 提升 + status 修复 + merge sync。
具体改动
merge sync + 上一轮已批准的 status hot-path 收敛;PR 功能面不变(Manager/Goal workspace、受限 router、Preview/Apply 安全边界、Session 投影)。
关键内容讲解
- 内容保持:PR 专属 diff 仍包含
public_boundary_scan移出 hot path 的修复(差分 smoke 此前已 PASS)。 - merge 干净:新增内容仅为已合并的 #3272/#3273 包;无 PR 专属新代码漂移。
- 检查状态:Sign-off、dependency-review SUCCESS;build ×2、pytest IN_PROGRESS(无失败)。
对主干的风险
无阻断项。CI 无失败;合并前确认 build/pytest 完成且绿即可。
验证矩阵(exact head 实测/CI)
| 场景 | 结果 |
|---|---|
| PR 专属内容 vs 已批准头 | 一致(status 修复保留;新增为 merge sync) |
| Sign-off / dependency-review | SUCCESS |
| build ×2 / pytest(CI) | IN_PROGRESS(评审时刻,无失败) |
我的整体评价
merge sync 干净、已批准修复保留、CI 无失败;无需新的内容审查。结论:APPROVE(author-owned PR,以 COMMENTED 记录批准结论;合并前确认 CI 绿)。
English Verdict
Verdict: APPROVE (author-owned PR; recorded as COMMENTED because GitHub blocks formal self-approval). This head is a clean latest-main merge sync on top of the already-approved status hot-path fix; the PR-specific content is unchanged and the differential fix is retained. Sign-off and dependency-review are green, and CI build/pytest were still in progress with no failures at review time.
Promotion blocker resolved — exact head
|
|
这个好像有路径泄露。。 是不是得加下public safe护栏,比如toutiao这些
| |
huangrt01
|
|
***@***.***
|
---- 回复的原邮件 ----
| 发件人 | Max ***@***.***> |
| 发送日期 | 2026年08月17日 02:55 |
| 收件人 | huangruiteng/loopx ***@***.***> |
| 抄送人 | huangruiteng ***@***.***>,
Review ***@***.***> |
| 主题 | Re: [huangruiteng/loopx] feat(control-plane): promote the personal Agent workspace (PR #3274) |
maxliux5 left a comment (huangruiteng/loopx#3274)
Promotion blocker resolved — exact head \n\nThe previous CLI-output P1 is fixed in : the status hot path keeps the human-readable boundary check while the detailed remains available from the canonical # LoopX Contract Check
ok: False
registry: /Users/chou/.codex/loopx/registry.global.json
runtime_root: /Users/chou/.codex/loopx
scan_roots: ['.']
summary: errors=1, warnings=2, checks=5
Errors
docs/architecture/rfcs/long-running-agent-reliability-diagnostics-governed-delivery-v0.md:29: credential
Warnings
loopx-anthropic-ceo-research: active state has a state_projection_gap for agent; expand executable Next Action work into an open Agent Todo or user wait into an open User Todo
mew-goal: active state has a state_projection_gap for user; expand executable Next Action work into an open Agent Todo or user wait into an open User Todo
Checks
registry goals checked: 9
registry boundary: shared_local_registry push_allowed=False tracked=False ignored=False
user-gate scopes checked: 1 open multi-agent gates
runtime root resolved: /Users/chou/.codex/loopx
run-history goals=15 runs=198 contract.\n\nValidation:\n- remote : PASS\n- remote full : PASS (10m37s) on \n- local exact CLI base/head differential after latest-main integration: PASS\n- focused status + latest-main benchmark tests: 29 passed\n- offline contract smoke: PASS\n- dashboard build with Node 22.22.2: PASS\n- DCO, dependency review, release build: PASS\n\nLatest (#3272, #3273) is integrated cleanly in isolated signed-off commit ; branch is now 0 commits behind [Metrics(v3)] metrics new writer error: metrics sdk can not get agent socket path: dial unixgram /tmp/metric.sock: connect: no such file or directory, all metrics would be dropped
[Stats] 2026-08-17 02:54:35.208 failed to init cgroup collector: open /proc/self/cgroup: no such file or directory
Warn 2026-08-17 02:54:35,226 v1(7) remote_configer.go:212 192.168.1.22 - - default - 0 KITC: fetch remote config key: key=-/default/toutiao.xavier.chameleon/default/AddCreative, err: error=; KITC: get stress bot switch err: get key=/kite/stressbot/request/switch/global err: Get "http://toutiao.etcd.proxy/v2/keys/kite/stressbot/request/switch/global": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get circuitbreaker switch err: get key=/kite/circuitbreaker/switch/-/toutiao.xavier.chameleon/AddCreative err: Get "http://toutiao.etcd.proxy/v2/keys/kite/circuitbreaker/switch/-/toutiao.xavier.chameleon/AddCreative": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get degradation percent err: get key=/kite/switches/-/toutiao.xavier.chameleon/AddCreative err: Get "http://toutiao.etcd.proxy/v2/keys/kite/switches/-/toutiao.xavier.chameleon/AddCreative": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get circuitbreaker min sample err: get key=/kite/circuitbreaker/config/-/toutiao.xavier.chameleon/AddCreative/minSample err: Get "http://toutiao.etcd.proxy/v2/keys/kite/circuitbreaker/config/-/toutiao.xavier.chameleon/AddCreative/minSample": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get circuitbreaker err rate err: get key=/kite/circuitbreaker/config/-/toutiao.xavier.chameleon/AddCreative/errRate err: Get "http://toutiao.etcd.proxy/v2/keys/kite/circuitbreaker/config/-/toutiao.xavier.chameleon/AddCreative/errRate": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get timeouts and IDC configs err: get key=/kite/config/-/-/toutiao.xavier.chameleon/AddCreative err: Get "http://toutiao.etcd.proxy/v2/keys/kite/config/-/-/toutiao.xavier.chameleon/AddCreative": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get acl err: get key=/kite/acl/-/toutiao.xavier.chameleon/AddCreative err: Get "http://toutiao.etcd.proxy/v2/keys/kite/acl/-/toutiao.xavier.chameleon/AddCreative": consul: connection refused (try set CONSUL_HTTP_HOST in dev env)
Warn 2026-08-17 02:54:35,230 v1(7) consul_discoverer.go:33 192.168.1.22 - - default - 0 get ip stack policy from etcd key: etcdKey=/kite/priorityaddr/-///*/priority, error: error=Get "http://toutiao.etcd.proxy/v2/keys/kite/priorityaddr/-/*/*/*/priority": consul: connection refused (try set CONSUL_HTTP_HOST in dev env), degrade: degrade=true
Warn 2026-08-17 02:54:35,230 v1(7) discoverer.go:232 192.168.1.22 - - default - 0 KITC: discover call failed, err:error=consul: connection refused (try set CONSUL_HTTP_HOST in dev env), service: toService=toutiao.xavier.chameleon, idc: idc=-
Error 2026-08-17 02:54:35,230 v1(7) discoverer.go:110 192.168.1.22 - - default - 0 KITC: service discover key: key=toutiao.xavier.chameleon:-:default:, err: error=consul: connection refused (try set CONSUL_HTTP_HOST in dev env)
Info 2026-08-17 02:54:35,231 v1(7) main.go:91 192.168.1.22 - - default - 0 AddCreative error: KE.KITE/2 - Service discover error/113: idc=- service=toutiao.xavier.chameleon cluster=default env= err: no instance for service: toutiao.xavier.chameleon, idc: -, cluster: default, env:
Error 2026-08-17 02:54:35,231 v1(7) main.go:45 192.168.1.22 - - default - 0 vid: v0c47eg7007ac1fvprn5h1p07m8s2v30 add creative error
Info 2026-08-17 02:54:35,231 v1(7) main.go:48 192.168.1.22 - - default - 0 prepare review cid list: []. The new CI round is running for this exact head.\n\nFinal UI/CUA evidence remains applicable because the two post-CUA changes only narrow status JSON diagnostics and integrate non-dashboard mainline benchmark/package commits. The last real Chrome CUA pass covered Manager Overview → transient answer → full Chat → Overview, authoritative Session , default ↔ Beast theme, and 110% zoom with P0/P1/P2 = 0.\n\nLatest default-theme first screen:\n\nImage: Latest LoopX personal workspace (view on ***@***.*** please re-review the exact head after the new checks finish.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because your review was requested.Message ID: ***@***.***>
|
|
看下要不要处理
| |
huangrt01
|
|
***@***.***
|
---- 回复的原邮件 ----
| 发件人 | Max ***@***.***> |
| 发送日期 | 2026年08月17日 02:55 |
| 收件人 | huangruiteng/loopx ***@***.***> |
| 抄送人 | huangruiteng ***@***.***>,
Review ***@***.***> |
| 主题 | Re: [huangruiteng/loopx] feat(control-plane): promote the personal Agent workspace (PR #3274) |
maxliux5 left a comment (huangruiteng/loopx#3274)
Promotion blocker resolved — exact head \n\nThe previous CLI-output P1 is fixed in : the status hot path keeps the human-readable boundary check while the detailed remains available from the canonical # LoopX Contract Check
ok: False
registry: /Users/chou/.codex/loopx/registry.global.json
runtime_root: /Users/chou/.codex/loopx
scan_roots: ['.']
summary: errors=1, warnings=2, checks=5
Errors
docs/architecture/rfcs/long-running-agent-reliability-diagnostics-governed-delivery-v0.md:29: credential
Warnings
loopx-anthropic-ceo-research: active state has a state_projection_gap for agent; expand executable Next Action work into an open Agent Todo or user wait into an open User Todo
mew-goal: active state has a state_projection_gap for user; expand executable Next Action work into an open Agent Todo or user wait into an open User Todo
Checks
registry goals checked: 9
registry boundary: shared_local_registry push_allowed=False tracked=False ignored=False
user-gate scopes checked: 1 open multi-agent gates
runtime root resolved: /Users/chou/.codex/loopx
run-history goals=15 runs=198 contract.\n\nValidation:\n- remote : PASS\n- remote full : PASS (10m37s) on \n- local exact CLI base/head differential after latest-main integration: PASS\n- focused status + latest-main benchmark tests: 29 passed\n- offline contract smoke: PASS\n- dashboard build with Node 22.22.2: PASS\n- DCO, dependency review, release build: PASS\n\nLatest (#3272, #3273) is integrated cleanly in isolated signed-off commit ; branch is now 0 commits behind [Metrics(v3)] metrics new writer error: metrics sdk can not get agent socket path: dial unixgram /tmp/metric.sock: connect: no such file or directory, all metrics would be dropped
[Stats] 2026-08-17 02:54:35.208 failed to init cgroup collector: open /proc/self/cgroup: no such file or directory
Warn 2026-08-17 02:54:35,226 v1(7) remote_configer.go:212 192.168.1.22 - - default - 0 KITC: fetch remote config key: key=-/default/toutiao.xavier.chameleon/default/AddCreative, err: error=; KITC: get stress bot switch err: get key=/kite/stressbot/request/switch/global err: Get "http://toutiao.etcd.proxy/v2/keys/kite/stressbot/request/switch/global": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get circuitbreaker switch err: get key=/kite/circuitbreaker/switch/-/toutiao.xavier.chameleon/AddCreative err: Get "http://toutiao.etcd.proxy/v2/keys/kite/circuitbreaker/switch/-/toutiao.xavier.chameleon/AddCreative": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get degradation percent err: get key=/kite/switches/-/toutiao.xavier.chameleon/AddCreative err: Get "http://toutiao.etcd.proxy/v2/keys/kite/switches/-/toutiao.xavier.chameleon/AddCreative": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get circuitbreaker min sample err: get key=/kite/circuitbreaker/config/-/toutiao.xavier.chameleon/AddCreative/minSample err: Get "http://toutiao.etcd.proxy/v2/keys/kite/circuitbreaker/config/-/toutiao.xavier.chameleon/AddCreative/minSample": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get circuitbreaker err rate err: get key=/kite/circuitbreaker/config/-/toutiao.xavier.chameleon/AddCreative/errRate err: Get "http://toutiao.etcd.proxy/v2/keys/kite/circuitbreaker/config/-/toutiao.xavier.chameleon/AddCreative/errRate": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get timeouts and IDC configs err: get key=/kite/config/-/-/toutiao.xavier.chameleon/AddCreative err: Get "http://toutiao.etcd.proxy/v2/keys/kite/config/-/-/toutiao.xavier.chameleon/AddCreative": consul: connection refused (try set CONSUL_HTTP_HOST in dev env); KITC: get acl err: get key=/kite/acl/-/toutiao.xavier.chameleon/AddCreative err: Get "http://toutiao.etcd.proxy/v2/keys/kite/acl/-/toutiao.xavier.chameleon/AddCreative": consul: connection refused (try set CONSUL_HTTP_HOST in dev env)
Warn 2026-08-17 02:54:35,230 v1(7) consul_discoverer.go:33 192.168.1.22 - - default - 0 get ip stack policy from etcd key: etcdKey=/kite/priorityaddr/-///*/priority, error: error=Get "http://toutiao.etcd.proxy/v2/keys/kite/priorityaddr/-/*/*/*/priority": consul: connection refused (try set CONSUL_HTTP_HOST in dev env), degrade: degrade=true
Warn 2026-08-17 02:54:35,230 v1(7) discoverer.go:232 192.168.1.22 - - default - 0 KITC: discover call failed, err:error=consul: connection refused (try set CONSUL_HTTP_HOST in dev env), service: toService=toutiao.xavier.chameleon, idc: idc=-
Error 2026-08-17 02:54:35,230 v1(7) discoverer.go:110 192.168.1.22 - - default - 0 KITC: service discover key: key=toutiao.xavier.chameleon:-:default:, err: error=consul: connection refused (try set CONSUL_HTTP_HOST in dev env)
Info 2026-08-17 02:54:35,231 v1(7) main.go:91 192.168.1.22 - - default - 0 AddCreative error: KE.KITE/2 - Service discover error/113: idc=- service=toutiao.xavier.chameleon cluster=default env= err: no instance for service: toutiao.xavier.chameleon, idc: -, cluster: default, env:
Error 2026-08-17 02:54:35,231 v1(7) main.go:45 192.168.1.22 - - default - 0 vid: v0c47eg7007ac1fvprn5h1p07m8s2v30 add creative error
Info 2026-08-17 02:54:35,231 v1(7) main.go:48 192.168.1.22 - - default - 0 prepare review cid list: []. The new CI round is running for this exact head.\n\nFinal UI/CUA evidence remains applicable because the two post-CUA changes only narrow status JSON diagnostics and integrate non-dashboard mainline benchmark/package commits. The last real Chrome CUA pass covered Manager Overview → transient answer → full Chat → Overview, authoritative Session , default ↔ Beast theme, and 110% zoom with P0/P1/P2 = 0.\n\nLatest default-theme first screen:\n\nImage: Latest LoopX personal workspace (view on ***@***.*** please re-review the exact head after the new checks finish.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because your review was requested.Message ID: ***@***.***>
|
|
我解决一下,怎么还有本地地址了 |
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
huangruiteng
left a comment
There was a problem hiding this comment.
动机
本 PR 将 personal Agent workspace 从 RFC 提升为主干可评审的控制面变更集。本次新 head 0af856a2 是此前已评审 head 0eb251fe 合并 #3285(Lark CLI 发现与自动回复就绪)后的状态,没有新增作者特性提交。
改动思路
合并 #3285 的 8 个提交(26 文件,+2122/-95),把 Lark CLI 解析、Dashboard 健康面、事件收集与对应测试带入本分支;此前已批准的工作区内容保持不变。
具体改动
- 分支拓扑:
0af856a2 = 0eb251fe + Merge #3285,delta 与 #3285 自身 diff 完全一致,无冲突期外改动。 loopx/chat_server.py:+71 行(1460 → 1513),新增configured_lark_cli_bin、resolve_lark_cli_for_runtime、lark_cli_resolution公开快照等。- 其余 25 个文件为 #3285 已评审内容(cli_resolution、goal_topic_*、dashboard 与测试)。
对主干的风险
exact head 上两个必需检查失败,属于合并阻断项:
- Sign-off (DCO):
d1a02624、9ef6617b、6a874bd1、0af856a2缺少Signed-off-bytrailer。 - pytest maintainability ratchet:
module_metric_budget:loopx/chat_server.py超 1500 行上限(1513 行)且无 reviewed exception;本地复现 3 个测试失败(9 passed)。
已扫描 delta,未发现凭据或私有路径;build 与 dependency-review 通过;内容层面未发现新的产品缺陷,先前批准结论对新 head 的自身内容仍然成立。
我的整体评价
REQUEST_CHANGES,但修复是机械性的:整理并签署分支历史(建议 rebase 到最新 main,并对分支独有提交补 -s),同时让 chat_server.py 回到模块行数预算内(拆分/重构,或按仓库政策登记带 retirement plan 的 reviewed exception),然后重跑 CI。修复后即可回到 APPROVE。
English verdict: Request changes. The new head only merges previously approved #3285 content, but required CI is red: DCO trailers are missing on 4 commits, and the maintainability ratchet fails because loopx/chat_server.py (1513 lines) exceeds the 1500-line module budget without a reviewed exception. The fix is mechanical — sign the history and either split the module or record a reviewed exception — then rerun checks.
huangruiteng
left a comment
There was a problem hiding this comment.
评审结论(Verdict)
按 exact head f8a63838e0413baa0dc2fafe5e0e6b4c06e945d0 复评:REQUEST_CHANGES。本轮新增 3 个提交(Lark Goal Topic 直连路由 + canary 基线),本地 35 个相关测试和 maintainability ratchet 通过;但上一轮的 DCO 阻断项仍未修复,Sign-off 检查继续失败。
动机
新 head 在上一轮 REQUEST_CHANGES 之上继续推进 personal Agent workspace 提升,并加入 #3292 的 Lark Goal Topic 直连路由与 chat_server.py 模块预算基线。评审重点是确认上一轮机械性阻断项是否清除,以及新增 delta 是否引入新问题。
改动思路
事件消费改为使用 compact event envelope,不再为每条消息调用 message history 查询;root_id 缺失时仅在目标聊天恰好绑定一个 Goal Topic 时安全回填,否则报 topic_context_ambiguous/topic_context_missing。同时把 chat_server.py 的 1513 行写入 module_metric_baseline.json,使 maintainability ratchet 通过。
具体改动
goal_topic_connections.py:路由决策拆出decide_lark_topic_event,返回matched/reason/route;对invalid_event、chat_mismatch、topic_mismatch、self_message给出 typed reason,并投影到连接健康面。goal_topic_runtime.py:不再调用enrich_lark_event_reply_context做消息回读;单绑定聊天可用 topic root 回填,多绑定则安全跳过。event_inbox.py:新增lark_event_mentions_bot,provider-nativementioned/mentions直接命中时返回direct_mention。module_metric_baseline.json:为loopx/chat_server.py登记 1513 行 ceiling;本地 ratchet 报告ok,无 unreviewed debt。- UI 与测试:Lark 事件阻断说明、settings 页展示、3 个测试文件的决策表/负例扩展。
对主干的风险
阻断项(P1)
- Sign-off 仍失败:
d1a02624、9ef6617b、6a874bd1、0af856a2仍缺Signed-off-bytrailer;这与上一轮完全一致,需要整理并签署分支历史后重跑。
非阻断(P2)
dependency-review失败为 GitHub codeload 503/502 基础设施问题,不是依赖变更本身;重跑即可。decide_lark_topic_event不再使用incoming_mode:即使配置为mentions,绑定 Topic 内的未提及消息也会被路由(测试已把“unmentioned 不路由”改为“路由”)。如果这是有意语义,请同步更新连接/文档字段;否则应恢复mentions门禁。lark_event_mentions_bot新增后没有聚焦单测,建议补mentioned=True、mentions名称归一化、大小写/@前缀等用例。chat_server.py通过 baseline 登记解决模块预算,但没有 retirement plan;若采用“reviewed exception + 退役计划”的政策路径,请补充计划或确认 baseline grandfathering 为既定政策。
我的整体评价
新增 delta 本身质量不错:路由决策 typed 化、单绑定回填安全、测试覆盖了 ambiguous/mismatch 负例,本地 35 个相关测试与 ratchet 均通过。当前唯一硬阻断是 DCO:对 4 个提交补 Signed-off-by(建议 rebase 后 git commit --amend -s 重写分支历史),并重跑 dependency-review 与 pytest;CI 绿后即可回到 APPROVE。P2 项建议在合入前顺手处理或明确记录。
English Verdict: Request changes. The new head improves routing safety (typed decisions, single-topic fallback, no per-message history reads) and passes local Lark tests plus the maintainability ratchet, but the same four commits still lack Signed-off-by trailers, so Sign-off remains red. Dependency-review failure is codeload infra; rerun after signing history. Non-blocking P2s: incoming_mode is no longer enforced, lark_event_mentions_bot lacks focused tests, and the chat-server baseline has no retirement plan.
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Fix Lark CLI discovery and automatic reply readiness Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
f8a6383 to
47d7910
Compare
huangruiteng
left a comment
There was a problem hiding this comment.
结论:REQUEST_CHANGES(审阅 head 47d7910)
阻塞发现(findings first)
-
[P1] 安装包用户无法启动本 PR 明确承诺的
loopx dashboard。apps/presentation/dashboard/README.md:119-127把它描述为“安装 LoopX 后可在任意目录运行”,但loopx/dashboard_launcher.py:8-20默认从已安装的loopx模块向上寻找仓库级scripts/dashboard-dev.sh;pyproject.toml:42-50的 wheel 只收录loopx*包和少量 package data,不包含scripts/dashboard-dev.sh或apps/presentation/dashboard/。我从本 head 构建 wheel、装入干净 venv 后运行loopx --format json dashboard,稳定得到loopx_dashboard_start_v0/ok=false/dashboard launcher is missing。现有tests/test_dashboard_command.py:50-129只 mock 入口或手工复制一个“完整源码树”,因此没有覆盖已安装边界。最小修复是把可发布的 dashboard artifact/launcher 放进loopx包内并从包内启动;若这轮只支持源码 checkout,则必须收回“安装后任意目录可运行”的产品承诺。两种方案都应补一个 clean-wheel install smoke,证明 launcher 和静态资产真实存在。 -
[P1]
incoming_mode="mentions"被静默忽略,未 @agent 的普通 topic 消息也会启动 Agent turn 并自动回复。loopx/extensions/lark/goal_topic_connections.py:595-646读取routing,却从未判定incoming_mode;loopx/extensions/lark/goal_topic_runtime.py:35-44的事件投影还丢掉了mentioned/mentions。当前测试tests/extensions/test_lark_goal_topic_connections.py:502-526甚至在配置mentions后明确断言mentioned=False仍会路由。随后process_lark_goal_topic_event()会持久化事件、调用 answer、回复并 ACK,而answer_lark_goal_topic()会真实开启/恢复 Agent session 并提交 turn。与此同时 UI 仍在context-drawer.tsx:331和lark-settings-page.tsx:444向用户承诺 “Someone mentions the Agent”。这是未披露的默认行为、成本与发言权限变化。最小修复是让事件投影保留 provider-native mention/reply 事实,在唯一的 typed routing decision 中对mentions返回明确的not_addressed;补mentions + unmentioned => ignored、mentions + mentioned/reply-to-bot => routed、all => routed的正负测试。另一条可接受路径是彻底删除mentions模式并同步 UI/文档/迁移说明,但不能保留一个不生效的配置。
动机
这项改动本身有明显产品价值:它把分散在 RFC 和后续 PR 中的个人 Agent workspace 收敛为 Manager Overview/Chat、Goal Chat/Tasks/Files、Session 结果、受控写操作、附件以及 Lark Goal Topic 连接,让用户不必在多个 CLI/原型之间拼装一条操作链。真实受益者包括本地安装用户、希望从 dashboard 查看多个 Goal 的操作者,以及希望从 Lark topic 继续同一 Goal 会话的用户。相较只改 UI,PR 同时补齐状态投影、chat runtime、typed action preview/receipt 与 topic runtime,方向是对的;但“可从安装包启动”和“只在被提及时回复”正是入口与权限边界,不能依赖源码 checkout 或 UI 文案来假定成立。
改动思路
主链路分成三层:loopx dashboard 负责拉起状态、Chat 和 Vite workspace;dashboard 读取 public-safe status/session projection,并把显式控制送入 chat action service;写操作走 preview → state fingerprint → 用户确认 → apply → receipt,避免自由文本直接改控制面。Lark 链路则是 provider event → compact projection → profile/chat/topic 解析 → decide_lark_topic_event() → inbox 持久化 → durable Agent session → reply/ACK。正向路径里,明确 action 的指纹复验与 receipt 是合理的 authority owner;负向路径里,stale preview、无效 event、chat/topic mismatch、self-message,以及缺 root 且多 binding 的 ambiguous case 都能 fail closed。
当前两个缺口都发生在“边界所有者”选错或缺失处:发布入口把源码开发脚本当成安装时 artifact;Lark 则把 typed incoming_mode 存进状态和 UI,却没有让路由决策拥有并执行该状态。更干净的方案是分离 source-dev launcher 与 package runtime launcher,并让一个 typed route helper 同时拥有 mode、addressed facts 和 reason code,而不是再在 listener、UI 或 prose 中补判断。
具体改动
该 head 相对 merge-base 共 138 个文件、+36046/-298。按变更面分类,约 74 个生产文件(约 24k 行)、44 个测试/fixture(约 10k 行)、11 个文档文件(约 1.3k 行),另含构建产物与配置;这是完整产品纵切面,不是局部 UI patch。活跃调用点也真实存在:CLI 注册 dashboard/chat,chat server 创建 runtime/action services,dashboard 调用对应 HTTP contracts,Lark listener 会进入 topic runtime,所以这些并非未来 scaffolding。
关键代码讲解
launch_dashboard()(loopx/dashboard_launcher.py)是安装用户的唯一入口,但当前只解析仓库根脚本;这正是 wheel 复现失败的 ownership seam。ChatActionService(loopx/chat_actions.py)集中做 action normalization、preview、fingerprint 复验和 receipt,是本 PR 最值得保留的可逆写入合同;明确控制优先、低置信度/缺字段澄清的设计有实际价值。decide_lark_topic_event()(loopx/extensions/lark/goal_topic_connections.py)已经拥有 binding、target、chat/topic 和 self-message 判定,本应也是incoming_mode的唯一裁决者;现在 typed state 被读取后丢弃。process_lark_goal_topic_event()与answer_lark_goal_topic()(goal_topic_runtime.py)把成功路由升级为真实 session turn、回复与 ACK,因此上游一次误分类不是展示问题,而是会产生计算成本和外部发言的行为变化。
对主干的风险
两条 P1 都能从触发状态追到用户可见结果:clean wheel 缺仓库级脚本,导致首要启动命令直接失败;mentions binding 收到 mentioned=False 事件时仍返回 route,随后提交 Agent turn 并回消息。前者破坏安装兼容性,后者扩大成本与回复授权范围。typed-state lens 的结论是:枚举存在,但决定点没有执行它;behavior-disclosure lens 的结论是:测试已改成 all-message 语义,UI/文档和默认配置却仍声称 mention-only。相反,通用 control-plane 文案仍保持 Goal/domain-neutral,chat 的“先预览、后确认”也由 fingerprint/receipt 机器执行,未发现 guidance 被冒充 obligation 的新增问题。
历史 review 也已逐项对照:当前文件树与上次 request-changes 的 f8a6383 完全相同,说明这次 rewrite 修复了 DCO(当前 Sign-off 已绿),但没有修复非 DCO 发现。lark_event_mentions_bot 不是生产路由的裁决点;给新增的 1513 行 loopx/chat_server.py 加 module-metric baseline 只是压住告警,并未给出拆分/退役计划。PR 描述仍把 DCO 写成“remaining gate”,需要刷新;git diff --check origin/main...HEAD 还在生成 bundle 中报 4 处 trailing whitespace。历史讨论里另有一条误带 host-local 诊断文本的公开内容,请维护者编辑/删除;此处不复述。
验证方面:GitHub 的 DCO、dependency review、Pages build、Python pytest、release artifact build 当前均通过;我在 exact head 上额外运行 dashboard command + Lark connection/runtime 的 focused suite,35 passed。同一 head 的 clean-wheel 安装复现失败,git diff --check 失败。绿色源码树测试不能替代这两个缺失的安装/语义负例。
我的整体评价
我认可把 personal workspace 提升为正式控制面的方向,尤其认可 typed action 的可逆写路径、session truth 和 topic 级绑定;这不是“没价值”的 PR。但当前规模很大,且两个最关键的用户承诺在发布边界上不成立,所以结论必须是 REQUEST_CHANGES / hold,不能靠现有全绿 CI 合并。复审只需要聚焦三组证据:① clean wheel 中实际包含并能定位 dashboard runtime/artifact;② mention/all/reply-to-bot 三类路由的正负测试与 UI/文档一致;③ git diff --check 清零,并说明新 hot module 的近期拆分 owner/计划。请同时更新 PR 描述和清理历史公开诊断文本。完成后我愿意按新的 exact head 重新审,不要求推倒 workspace 架构。
English verdict: REQUEST_CHANGES. The workspace architecture is valuable, but the advertised installed loopx dashboard path is absent from the wheel, and incoming_mode="mentions" is silently treated as all-messages, causing unaddressed topic messages to start Agent turns and replies. Re-review requires a clean-wheel launch contract, typed mention-mode enforcement with negative tests, and the noted hygiene/history cleanup.
huangruiteng
left a comment
There was a problem hiding this comment.
追加架构 review:收敛为一套 operator 前端
Findings
-
[P1] 合并前请删除旧 dashboard,而不是把它作为隐藏的第二套产品继续维护。 当前默认
/已经进入新的 Personal Workspace,但apps/presentation/dashboard/src/router.tsx:14-27仍保留view=ops/share状态,apps/presentation/dashboard/src/views/dashboard-page.tsx:9013-9428通过?view=ops切回整套 legacy workbench;apps/presentation/dashboard/README.md:162-166和smoke/home-route-smoke.ts:31-34又把这条双轨当成长期合同。结果是同一个dashboard-page.tsx已长到 9,839 行,同时维护两套导航、信息架构、状态派生和浏览器验证。PR 还新增了 1,313 行的独立ChatPage及/chat路由,而 Personal Workspace 已经拥有 Manager/Goal Chat,这又形成一套重复交互。这个结构会让后续安装包修复也没有唯一答案:loopx dashboard、chat server 和 Vite 到底应该交付哪一套 UI?最小修复不是再加兼容文案,而是明确 Personal Workspace 是唯一的本地 operator shell:
- 删除
?view=ops、view=share兼容分支、旧 shell 及只为它存在的组件、文档和 smoke; - 把
ChatPage中仍有价值的能力并入 Manager/Goal Chat 后,删除独立页面、路由和重复入口; loopx dashboard、本地 chat/status 服务和可发布 wheel 应服务同一个 canonical build artifact。开发态 Vite 和 wheel 中的静态产物可以是同一源码的不同交付形态,但不能是两套产品实现;- public
/frontstage可以继续作为无本地状态的 showcase/developer surface,但不要再保留第二个 live operator mode;真实本地状态只进入 Personal Workspace。
- 删除
旧 dashboard 中值得吸收的增量
删除前请做一次 capability parity 盘点,但只迁移小而明确的增量,不要把旧页面原样塞进新 shell:
- 系统健康摘要:把
StatusContractFreshnessWarning、GlobalRegistryHealthPanel、ContractHealthPanel、promotion readiness/gate 和 decision freshness 收敛成 Manager Overview 的一张 “System health / 为什么阻塞” 卡片或 drawer;保留 typed projection 与修复提示,不保留旧布局。 - 跨 Goal 检索与 Agent 占用信息:吸收
ProjectTodoExplorer的搜索/角色/状态筛选,以及AgentManagementPanel中的claimed_by、workspace ref、stale claim、handoff note、evidence refs;这些适合进入 Manager 搜索或 context drawer,而不是继续一套大盘。 - 选中 Goal 的高级诊断:
RunHistoryPanel和ControlPlaneSettingsPanel里若仍有真实维护者使用的 run evidence、reward dry-run、quota/orchestration preview,应放到 Goal 的 “高级诊断” 内,并继续走 typed preview → explicit apply → receipt。没有 active caller 或稳定合同的 raw 控件直接删除。 - Chat 的少量独占信息:独立
ChatPage的 completed decision history、host-gate 和 receipt readback 可以并入现有 Chat timeline;Goal Studio 等重复展示若没有独立 caller 就不要迁移。 - 开发者调试能力:live/example/file source 切换、raw queue filters、extension projection inspector 可下沉到
/frontstage/developer或 CLI,不应占用第二个 operator frontend。
Open question / assumption
我假设本 PR 的产品决策是 Personal Workspace 取代旧 operator dashboard,而 public frontstage 仍是独立的只读展示面。如果不是,请先在 PR 里说明两个 operator shell 分别服务哪类不可合并的用户任务;目前 diff 证明不了双轨长期存在的收益,反而已经产生明显的体积和所有权成本。
Product / architecture judgment
Personal Workspace 的方向是对的:Manager + Goal channel、typed action、Session truth、Tasks/Files/Lark 都应在一个连贯 shell 内完成。旧 dashboard 的价值主要是若干诊断投影,而不是它的页面结构。正确的抽象边界应是“一套 operator UI + 多个 typed read models/drawers”,不是“新首页 + 隐藏旧工作台 + 独立 Chat + frontstage ops”。这次 promotion 正是完成替换的窗口;继续保留旧实现,会把临时迁移成本永久化。
Validation
- 审阅 exact head:
47d791049ff3df8841bf99c3360dffedc3386484。 - 已核对 router、
DashboardPage的view=ops分支、独立ChatPage/build entry、README、status contract 和 route smoke;这些文件明确把双轨当成现状,而不是未使用代码。 - 当前 GitHub DCO、dependency review、Pages build、Python pytest 与 release artifact build 均通过,但它们不判断产品表面是否重复。
- 本地尝试运行
smoke:home-route,因该 review worktree 未安装 dashboardnode_modules、tsc不可用而未执行;本发现来自静态路由与显式 smoke 断言,不依赖运行时猜测。
Merge decision
REQUEST_CHANGES / hold。 请在同一 PR 内完成旧 operator dashboard 删除、列出迁移/删除的 capability mapping,并用一个 canonical route 的 browser acceptance 证明 Manager Overview、Goal Chat/Tasks/Files、系统健康摘要和高级诊断都来自同一套前端。不要把清理留成“合并后再做”的无 owner follow-up。
- Unify floating conversation tray for Goal Tasks and Manager Overview - Distinguish quick prompts between immediate send and draft preparation - Add tray close button with escape keyboard handler to avoid board occlusion - Protect advice questions and add negation checks across workspace router - Sanitize task drafts extracted from agent replies - Clean up bundle trailing whitespace for diff check compliance Signed-off-by: maxliu <lualiudd@gmail.com>
feat(control-plane): Personal Workspace 单轨收敛与端到端验收介绍🌟 架构收敛与重构概览 (Architecture Convergence)根据 1. 彻底废除旧版 Ops 双轨与独立 Chat(代码净减 8,660+ 行)
🎨 核心功能界面与交互设计 (Key Surfaces Walkthrough)1. 管家总览(Manager Overview)
2. Goal Tasks 任务看板与会话托盘(Goal Tasks & Conversation Tray)
3. Goal Chat 与 Files 视图
4. Context Drawer(上下文诊断抽屉)
🧪 自动化端到端验收与测试结果 (Verification Evidence)1. Orca Tab 真实浏览器 E2E 验收:🎉 20/20 全部 PASS (0 Fail)在
2. Smoke 与编译全量通过:
|
|
复审结论(exact head 1. 动机这轮的核心目标是把 Personal Agent Workspace 提升为唯一产品前端,删除旧 dashboard / ops / share 壳层,同时保留旧界面中仍有独立产品价值的小能力。这个收敛方向是对的:同一份状态不应由两套信息架构、路由和交互模型分别解释。 2. 改动思路相较上次 review,这个 head 已经真正执行了“只留一套前端”:
因此我不再要求恢复任何旧 dashboard。跨 Goal 搜索、更多高级诊断等小能力,如果以后有真实 caller 和稳定契约,可以在这一套前端上继续补,不应成为保留旧壳层的理由。 3. 具体改动与当前 blocker当前行为主线主要落在
4. 对主干的风险
本轮验证: 5. 我的整体评价这次重构有明显价值,而且对上次“删掉老 dashboard,只保留一套前端”的要求响应得比较彻底;System Health 的迁移也说明不是机械删除,而是在吸收旧界面的有效增量。当前我维持 Request changes,但 blocker 已从架构方向收敛为三个清晰的收尾项:迁移 browser acceptance、清理/重建 bundle、修复 DCO。完成后,这个 PR 就接近可合并状态。 |
huangruiteng
left a comment
There was a problem hiding this comment.
Requesting changes on exact head 45afe04796a991b39fcfcf8af281ed3f74a3c133.
The main architectural concern from the earlier review is resolved: the legacy dashboard/ops/share shell and the independent ChatPage are gone, both delivery entrypoints now share one router/source, and the useful System Health signal has been absorbed into Manager Overview. Please do not restore the old dashboard.
Three merge blockers remain:
- The browser acceptance contract is stale after the new Manager Overview default.
npm run smoke:home-browserandnpm run smoke:personal-workspacefail because they expect Goal-scoped prompts before a Goal is selected, whiledashboard-home-browser-smoke.mjsstill asserts the removed?view=opsstate. Update the smokes to validate Manager Overview first, select a Goal explicitly, then validate Goal-scoped prompts; remove the legacy view assertions. git diff --checkfails on trailing whitespace inloopx/web/chat/assets/index-DPJPAOeh.js(lines 20, 28, 36, and 44). Regenerate or normalize the committed artifact and re-run the check against the exact base/head range.- The DCO Sign-off check is still red. Commits
a89908cb4b21d4dc9e858ee527ee9c4d253072e3and45afe04796a991b39fcfcf8af281ed3f74a3c133currently lack aSigned-off-bytrailer.
Local validation: the dashboard build, action-packet, chat-route, home-route, personal-workspace-router, usage-progress, and personal-workspace contract checks pass. Both browser smokes and git diff --check fail. Remote build, pytest, and dependency review pass; DCO fails.
…d clean legacy dual-track ops panels - Remove legacy view=ops / view=share dual-view branching and standalone /chat route / ChatPage - Eliminate ~7,300 lines of obsolete legacy ops panels from dashboard-page.tsx - Integrate WorkspaceSystemHealth into ManagerOverview to highlight control-plane & registry issues - Update smoke tests and contract assertions for the unified single-operator frontend architecture - Rebuild production chat bundle assets Signed-off-by: maxliu <lualiudd@gmail.com>
… refine streaming auto-scroll - Format payload.contract.summary into human readable text and guard all deep payload health checks with optional chaining - Remove deprecated ops query filters from searchSchema in router.tsx - Auto-scroll manager chat on message text delta updates - Add aria-hidden to decorative attention icon in goal-tasks-view - Rebuild production chat bundle assets Signed-off-by: maxliu <lualiudd@gmail.com>
…nd clean legacy ops assertions - Update dashboard-home-browser-smoke and personal-workspace-browser-smoke to assert Manager Overview default state first, then explicitly select Goals - Fix manager prompt button texts and actions across browser smokes - Extend manager projection question matchers in dashboard-page.tsx for global backlog queries - Strip trailing whitespace in generated chat bundle and normalize assets - Ensure all commits pass DCO sign-off requirements Signed-off-by: maxliu <lualiudd@gmail.com>
45afe04 to
b41872c
Compare
修复完成与端到端复验报告 (Resolving Owner Review Blockers)针对 Owner @huangruiteng 在 exact head 1. 浏览器 Smoke 随 Manager Overview 默认态迁移
2.
|
huangruiteng
left a comment
There was a problem hiding this comment.
复审结论:Request changes
复审基于精确 head b41872c2c8170b996dd2b5b552573d49f298338b。这轮已经正确完成最重要的架构收敛:旧 dashboard/ops/share shell 与独立 ChatPage 被删除,/ 只保留 Personal Agent Workspace,原有 System Health 的小增量也被吸收到 Manager 总览。这个方向值得保留;但当前仍有两个会破坏真实用户路径的 P1 blocker,以及一处与新架构相反的公开文档漂移。
Findings
-
[P1]
loopx dashboard在标准 wheel 安装后仍无法启动。apps/presentation/dashboard/README.md:119-127承诺“安装 LoopX 后可从任意目录运行”,但loopx/dashboard_launcher.py:8-20默认从已安装的loopx包向上寻找scripts/dashboard-dev.sh;pyproject.toml:42-55只把loopx*与静态loopx/web/chat资源打进 wheel,仓库根目录下的scripts/dashboard-dev.sh和apps/presentation/dashboard不在安装物中。用当前 head 构建 wheel、安装进全新 Python 3.13 venv 后运行loopx --format json dashboard,稳定返回LoopX dashboard launcher is missing: .../site-packages/scripts/dashboard-dev.sh。最小修复是让安装态入口只依赖 wheel 内资源(或把可启动的 launcher/UI 资源作为明确 package data 安装并从包内解析),并新增“build wheel → fresh venv install → 从任意 cwd 启动/完成 readiness”的回归;不能只在 source checkout 里测。 -
[P1]
incoming_mode="mentions"仍是未执行的配置,普通未 @ 机器人的 topic 消息会进入 Agent Session 并自动回复。decide_lark_topic_event()在loopx/extensions/lark/goal_topic_connections.py:595-646读取了routing,却只消费reply_mode,没有检查incoming_mode;同时loopx/extensions/lark/goal_topic_runtime.py:35-44的 collector projection 主动丢弃mentioned/mentions。更直接的是tests/extensions/test_lark_goal_topic_connections.py:502-526配置incoming_mode="mentions"后,反而断言mentioned=False仍成功路由。这样 UI 中“仅 @ 机器人时回复”的选项与运行时行为相反。最小修复是:保留一个 provider-normalized、content-free 的 addressed/mentioned typed field,在 routing decision 中按incoming_modefail closed,并补mentions + unmentioned => not_addressed/no session/no reply与all + unmentioned => matched两条负/正回归。 -
[P2] dashboard README 仍在公开描述已删除的第二套 operator 前端。
apps/presentation/dashboard/README.md:149-205继续说明?view=ops、view=share、legacy operator tools 和 reward controls;但当前apps/presentation/dashboard/src/router.tsx:13-54的/search schema 只有goalId/statusUrl,这些 route 已删除。请把这段压缩成当前唯一 Personal Workspace 的运行与边界说明;/frontstage?mode=ops是另一条只读 public-safe projection 路径,可以保留,但不要再称为默认 dashboard 的 legacy workbench。
动机
PR 要把个人 Agent 工作区从原型提升为 LoopX 唯一 operator 产品面,同时把 Goal Chat、Tasks、Files、System Health、Lark Topic 连接与受控 action proposal 放进一条可操作路径。旧结构的主要成本是两套 dashboard/Chat 路由与两套组件树并存,用户和维护者无法判断哪个才是 canonical frontend;本轮删除旧 shell,已经直接降低了这个复合成本。非目标应继续保持清楚:/frontstage 的 showcase/developer/ops public-safe 展示面不是第二套 operator home,也不应该恢复已删除的 legacy dashboard。
改动思路
整体做法是正确的:把 / 固定到 DashboardPage,让 Manager 总览承担跨 Goal 状态、对话与 System Health;Goal 内再切换 Chat/Tasks/Files。Chat side effect 通过本地 API、session/turn 与 action proposal/preview/confirm/receipt 分层,而不是让浏览器直接写控制面。Lark Topic 则以 connection binding 保存目标与 routing 配置,再由 collector/runtime 读取事件并进入 Goal session。
但两个边界还没有闭环:安装入口把 source checkout 当成 release layout;Lark routing 把 incoming_mode 当成展示字段而非机器义务。这两处都不是文案问题,而是 caller-visible default behavior 与实现不一致。
具体改动
关键代码讲解
router.tsx:13-54:searchSchema只接受goalId/statusUrl,dashboardRoute的唯一 component 是DashboardPage;这证明旧view=ops/share分支已真正从 canonical operator router 删除,而不是仅隐藏。launch_dashboard()(loopx/dashboard_launcher.py:15-20):输入只有可选LOOPX_RELEASE_ROOT,关键 invariant 是 release root 下必须存在scripts/dashboard-dev.sh;随后以该目录为 cwd 直接subprocess.call。source checkout 正路径成立,wheel 安装负路径由 launcher 自己抛错,当前没有 fallback 或 package-owned consumer。decide_lark_topic_event()(goal_topic_connections.py:595-646):先按 chat/topic/self-message 匹配,再构造route返回给 runtime;routing的 side effect 只体现在reply_mode,incoming_mode没有进入任何 branch,因此 consumer 无法区分未 @ 消息。_EVENT_PROJECTION(goal_topic_runtime.py:35-44):这是 collector 到 routing 的 authoritative input seam;它保留 ids/content/sender/thread,却删除 mention 元数据,使下游即使想 enforcementions也没有 typed pre-state。
正向路径:用户打开 / → DashboardPage 汇总 public-safe status → 选择 Goal/Manager Chat → local chat backend 创建或恢复 session/turn → action 先 preview/confirm,再产生 receipt;本轮 router/browser smokes覆盖了这条单前端主路径。
负向路径一:wheel 用户运行 loopx dashboard → launcher 解析到 site-packages → 找不到 repo-level script → 在 UI readiness 前失败。负向路径二:Lark topic 收到未 @ 的普通消息 → projection 丢失 mentioned state → decision 只看 chat/topic → 返回 matched route → runtime 可启动/续接 session 并回复;错误责任目前没有停在 routing boundary。
按 exact base..head,PR 规模为 139 个文件、约 +34.8k/-7.8k:production/runtime、UI、browser/unit smokes、docs 与生成 bundle 都有改动。删除旧 UI 是高价值净简化;但整体仍属大型垂直切片,code volume 评价为 partly avoidable。最高价值的继续收缩不是再加抽象,而是修掉上述两个 contract gap、删改旧 README 真相,并让 launcher/mention behavior 各由一条薄的 durable regression 锁定。
对主干的风险
- 安装面 blast radius 高:release wheel 的所有
loopx dashboard用户都会在启动前失败;CI 的 source-tree build 绿灯无法覆盖。 - 消息权限/噪声风险高:
mentions被 UI 呈现为用户选择,但 runtime 实际按all工作,可能在群 topic 中对普通消息启动 Agent 并回复。现有类型集合INCOMING_MODES={mentions,all}是 typed enum 的起点,但没有进入 transition helper;这正是 typed state 声明与 delivery semantics 分离造成的 false negative。 - 行为披露风险中等:唯一前端是有意的默认行为变化,代码与 browser smoke 已体现;README 仍描述旧默认,用户会按不存在的 URL/controls 操作。
- 通用 control-plane 的错误文案未发现新的领域绑定问题;action preview/confirm 是机器强制义务而不是“建议”,这部分 guidance-vs-obligation 边界是清楚的。
验证结果:GitHub DCO、dependency review、Frontstage Pages build、Python tests、Release Artifacts build 全绿;本地 npm ci、npm run build、personal-workspace/home/browser 与 router/schema/action/chat smokes通过,聚焦 Python 测试 52 passed。上述失败来自额外的 clean-wheel 真实安装回归与对 routing 状态机/测试语义的直接检查,因此绿 CI 不足以消除 blocker。
我的整体评价
方向认可、实现需修改后再合并。 旧 dashboard 已按要求删除,System Health 等有价值增量也被吸收进唯一 frontend,这一轮不是推倒重来。请只收口三件事:修通安装态 loopx dashboard、让 incoming_mode 成为真正的机器路由约束、同步 README 到单前端现实。完成后在新 exact head 复跑 clean-wheel、mention negative path 与现有 UI smokes,再请求复审。
English verdict: REQUEST_CHANGES on exact head b41872c2c8170b996dd2b5b552573d49f298338b. The single-frontend consolidation is the right architecture and preserves the useful System Health increment, but the installed-wheel launcher is still broken, incoming_mode="mentions" is not enforced, and the dashboard README still documents deleted legacy routes.
…tions routing - Launch Personal Workspace directly from packaged bundle in installed wheel mode - Enforce incoming_mode=mentions constraint in Lark topic connection to prevent accidental responses to unaddressed messages - Retain mentioned/addressed fields across Lark event projection - Add durable regression tests for installed launcher lifecycle and Lark routing - Update dashboard documentation to reflect Personal Workspace as the sole operator interface Signed-off-by: maxliu <lualiudd@gmail.com>
🛠️ 复审问题修复与端到端验收报告 (Commit:
|
Signed-off-by: maxliu <lualiudd@gmail.com>
Signed-off-by: maxliu <lualiudd@gmail.com>
…ule line budget Signed-off-by: maxliu <lualiudd@gmail.com>

Summary
Promotes the personal Agent workspace RFC onto the latest
mainas one reviewable control-plane change set.Latest first screen
The Beast theme, 110% zoom, narrow layout, mobile navigation, and keyboard focus paths were also exercised during real-browser acceptance.
Capability lineage and attribution
Original PR links remain the canonical review history. Authors are preserved where commits could be promoted directly. Integration-only conflict resolution remains isolated from capability commits.
Safety model
Free text routes through the constrained contract:
Explicit controls have priority.
typed_actionstill requires canonical preview, state fingerprint, user confirmation, and receipt. Negation, compound intent, low confidence, and missing fields fail into clarification.Validation
completed / 1/1)Integration notes
origin/mainand is not behind it at publication time.