Skip to content

feat(workspace): suggest next steps from the Goal's current state - #6535

Merged
huangruiteng merged 5 commits into
loopx-project:mainfrom
songoow:codex/digest-suggestions-20261015
Oct 15, 2026
Merged

huangruiteng merged 5 commits into
loopx-project:mainfrom
songoow:codex/digest-suggestions-20261015

Conversation

@songoow

@songoow songoow commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

The Goal composer's "Suggestions" disclosure offered five fixed chips ("Ask what's next", "Ask what blocks", …) that read nothing about the Goal. A Goal with two decisions waiting on the owner and three blocked tasks got the same row as a quiet one.

This derives up to three suggestions from facts the Goal already projects, in the owner's priority order, and keeps the shipped steward prompt row below them unchanged.

Fact (source) Suggestion Action
Decisions waiting on the owner (goal_workspace_digest_v0.needsYou) "Handle N decision(s) waiting on you" Opens the overview's owner rail in place; no message
Blocked work (digest.work.classes.blocked, titles from rail.blocked) "Explain N blocked task(s)" Sends a question that names up to two real task titles
A failing acceptance criterion (projectGoalAcceptanceCriteria) "Why “…” fails" Sends a question that names the criterion
Observed idle executor with open work and nothing waiting on the owner (WorkspaceGoalExecution.kind === "idle") "Nothing is running · continue N open task(s)" Sends a continue request
All work done, nothing waiting or blocked "All N task(s) done · review the results" Opens the Results view

A stopped Goal gets no derived suggestion (Resume is the masthead's control). unknown execution is never read as idle. The collapsed summary line shows the first suggestion so the owner sees it without expanding.

Derived suggestions above the steward prompt row

Owner / placement. goal-suggestions.ts is a pure derivation over the shared TypeScript digest and the existing frontend projections; it adds no new source of truth and no model call. The steward prompt set in chat-model.ts is untouched, so steward-journey and every existing chip journey keep passing.

Review round 2 (head after c7e2bd9c4, rebased onto current main)

  • Decisions reuse the typed classification. open_decisions takes the attention owner's needsYou.blocking; optional user actions are listed but never counted, and an unknown or unavailable count is not zero (no decision, no idleness).
  • "All done" is a completeness claim. review_results needs complete work coverage with a known zero open count; an empty listing of a partial projection never finishes a Goal. Idle counts the owner's projected open work when known.

Validation

  • Browser scenario goal-suggestions-live (real service): a disposable real Chat/Todo owner serves status.json; loopx todo add --task-class user_action stays optional and suggests nothing, a later user_gate becomes the first suggestion with a count equal to the lane's own, and acting on it opens the overview showing the gate. Only the status path is proxied.
  • Fixture scenario goal-suggestions adds a second workspace whose lane reads "0 等你决定 · 另有 1 项可选" and "部分 · 已列出 5 项中的 0 项" and asserts neither a decision nor a completion suggestion.
  • goal-suggestions.test.mjs (10 cases): stopped Goal → none; decision first with count and age; blocked titles from the rail, at most two, missing ids skipped; failing criterion cited by description; idle requires observed idle, open work and no waiting decision, unknown and running never idle; finished Goal only when nothing waits or blocks, empty Goal none; needsYou unavailable is not zero; cap of three in priority order.
  • Browser scenario goal-suggestions (dev build): collapsed summary carries the first suggestion; derived row above the steward row; decision chip opens the overview showing the waiting gate; blocked chip sends a Turn whose text quotes a real fixture task title and leaves no draft; a stopped Goal shows the plain summary and no derived row.
  • personal-workspace-contract.test.mjs pins the stopped/unknown guards, derivation from the shared digest, and both locales for the new keys. steward-journey passes unchanged. dashboard tsc --noEmit, check:css-custom-properties, generate_semantic_inventory.py --changed-from HEAD (no new carriers).

Not covered. Installed App and real-model acceptance. The suggestions appear in the Goal Chat composer before the first message and in the folded Overview composer. The folded view places both suggestion rows in one popover; long trigger text is ellipsized.

Default change. None for the steward prompt row. The derived row is additive and absent when no fact applies.

🤖 Generated with Claude Code

Current main integration

Current authored head: d9b6073b48a5d3d014a2443bff639d73aec5d9b7. It integrates official main 9fc858cbd8ee6d0268a4af11ed0f86e84ae6f755, including the merged load boundaries #6541. The only conflict was the existing workspace contract smoke's adjacent assertion blocks; both the proposal's complete checks and main's lazy-loading checks were retained verbatim. The net proposal path set is unchanged; no new behavior, vocabulary, permission, configuration or visual design is introduced by this reconciliation.

The existing goal-suggestions, goal-suggestions-live, goal-showcase, capability-scope and navigation-sorting pass in the compiled packaged frontend. The real disposable Todo owner still distinguishes optional actions from gates; partial work is never declared complete. All10 selector cases pass. The earlier current-source development/packaged controls remain bound to their named source; the integrated tree was rebuilt and re-exercised.

The packaged browser failure reports route.fetch: Request context disposed in the shared durable-goal-order.mjs teardown. That scenario has the identical blob in the prior head, its base and the integrated main; its original full local scenario passes here. This does not establish the hosted race's root cause or repair it, so the failed job remains failed evidence. A new natural full qualification is required; no manual rerun was requested.

Common validation: the combined workspace contracts, frontend typecheck, focused module tests, normal Chat bundle build, source-integrity readback and whitespace/public-boundary checks pass. The signed merge commit has the identical Git tree that was tested before publication, all branch commits retain DCO, and the remote author head/base were read back. The existing Settings path is exercised after adopting the lazy-load boundary.

The author branch was advanced normally without force. New exact-head independent review and complete natural hosted CI remain required; earlier approvals and cancelled/failed jobs do not qualify this head. No PR merge, deployment, review publication, manual hosted rerun, model run or benchmark launch is performed here. Installed adoption and broader product acceptance remain separate.

@songoow

songoow commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

CI's build job failed in the goal-showcase phone check: on the Goal overview the folded composer positioned only the steward prompt row as an absolute popover, so the new derived row widened the trigger and pushed the popover (and its 配置定时检查 chip) past the 390px viewport. Fixed by rendering both rows inside one popover panel (derived row above, hairline, steward row below) and ellipsizing a long summary hint; the chat view is unchanged. goal-showcase, goal-suggestions and steward-journey pass locally on the new head.

@mergify

mergify Bot commented Oct 15, 2026

Copy link
Copy Markdown

This pull request has merge conflicts with main and cannot be merged
until they are resolved. Please rebase or merge the base branch, @songoow.

Choose the remote for the base repository, not an out-of-date fork.
For a fork clone, first inspect git remote -v; upstream must point
to https://github.com/loopx-project/loopx.git. If it is absent, add it
with git remote add upstream https://github.com/loopx-project/loopx.git.
Then run:

git fetch upstream
git rebase upstream/main
# Resolve each conflict, git add the resolved files, then git rebase --continue.
git push --force-with-lease origin HEAD

For a same-repository clone whose origin points to
https://github.com/loopx-project/loopx.git, use origin instead of
upstream for fetch/rebase. If you prefer merging the base, use
git merge <base-remote>/main and push normally.

Keep the DCO Signed-off-by trailer on every commit when you rebase.
https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork

@mergify mergify Bot added the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Oct 15, 2026
@songoow
songoow force-pushed the codex/digest-suggestions-20261015 branch from baea4a2 to c7e2bd9 Compare October 15, 2026 15:20
@mergify mergify Bot removed the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Oct 15, 2026

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max

精确头 c7e2bd9c4fc2d24c8243f3dfb42c248200500d41;实际基线 2abf983157f71153b7bc910a67aa8f7753fe9d9b。

动机

回到某个 Goal、想知道接下来该做什么的所有者。原来快捷提问固定不读状态;新行应直接指向真实待决定、受阻或未通过的事项,省去重新描述上下文。候选把建议接进已打包的 Goal 页面和原提问入口,但两种合法投影下会给出与概况矛盾的决定数或全部完成提示。本 PR 不新增执行权限、验收规则或真实模型能力。

改动思路

建议作为无 IO 的局部前端投影,消费既有 typed digest 并复用原导航/发送入口,归属合理;但派生事实必须沿用 owner 的 blocking 与 coverage 语义。当前 PR 应同时交付正确事实、单一折叠菜单和失败/部分状态回读;不能只靠新 helper 的八个同形夹具确认状态真实。保留小型纯函数、原发送和导航路径比新增 backend store 或模型调用更合适;不需要更大的重构。所有者可以自愿点一次已有上下文的建议,不需重填已知事实;原本需要确认的决定仍应由原 owner 处理,不能从统计数推导执行权。

新事实行位于固定 steward 行之前,折叠摘要携带首条建议;Overview/Tasks 用同一 popover 容纳两行,长摘要省略、Escape 关闭、减少动态效果的样式仍有效。独立查看了打包 showcase 的整屏桌面/390px构图、英文及失败区;hero、owner栏与输入框保持原层级。手机新面板未越界,Escape 实测关闭。

具体改动

按本头完整审查12路径 +329/-6(含一张公开合成 PNG):57行局部推导、58行单测,page接线/双语文案/两处样式,workspace contract与npm入口,新catalog场景及91行浏览器用例,用户指南说明新默认。没有新持久化状态或后端权限。

独立依据 docs/architecture/rfcs/goal-workspace-surface-v0.md,spec_revision 2abf983157f71153b7bc910a67aa8f7753fe9d9b,尤其§2、§5.3、§5.6和§9:V2要求同快照计数同义,Needs you排除非阻断愿望;V6要求未知/部分状态真实;V9禁止仅打开视图就执行。V2、V6在下述两项反例中 not_met;V9保持,查看与切页没有Turn请求。

关键代码讲解

  1. deriveGoalSuggestions(goal-suggestions.ts:31)处理停止态、决定、受阻标题、失败条件、idle与results,再限三项。复用事实的方向正确,但35行的 listed 是列出的全部 attention,并非 blocking;53行的 work.open 是已列出的未完成工作,并非完整来源的零工作证明。
  2. goalSuggestions / applyGoalSuggestion(personal-workspace-page.tsx:1235起)从当前Goal、共享digest、执行与验收条件派生;点击决定或成果只切视图,另外三类通过旧 sendMessage 发送带当前标题/条件的请求。渲染没有直接副作用,quickPromptBlocked仍约束发送。
  3. personal-composer-tools-panel(goal-overview.css:77)把两行一起定位,修复了此前只定位固定行导致窄屏溢出的形状;summary省略与减少动态效果规则一起更新。CSS token检查通过;这不修复事实选择错误。

对主干的风险

[P1] 不要把部分列表的零项当成全部完成(goal-suggestions.ts:53–54)。 我用同一打包页面输入一个合法部分投影:canonical open_count=5,列表为空,done=3。共享概况明确显示“部分 · 已列出5项中的0项/总数未知”,新菜单却出现“3项任务全部完成 · 查看成果”。基线只显示泛化快捷提问,没有该错误声明。应要求完整、当前的work coverage及规范的已知零open,再给“全部完成”;补partial/unknown与真正完整零项的反例,不能删掉概况的不确定性来配合标签。

[P2] 决定数应取blocking而非listed(goal-suggestions.ts:35–37)。 把真实原生生成的普通 user_action(无blocks_agent/global_gate)放进合成工作区,实际打包UI的同一概况为“0等你决定/另有1项可选”,新摘要却说“先处理1项等你决定的事项”。listed包含可选项,也不是有界来源的总blocking数。应沿用 needsYou.blocking,并保留null/unavailable/partial;当前测试把listed与blocking设成同一数,无法分辨这类错误,且把unavailable编码成idle条件的零项。

独立验证:8个Node用例、workspace contract、正常bundle构建/typecheck、packaged goal-suggestions/goal-showcase/steward-journey和CSS检查通过;原live readiness/correction/recovery/return缺口照旧保留。premerge三direct、十三selected全过,无manual hold。语义advisory未发现支持的carrier,但它的有限扫描不是此新TS union/提示语的等价证明。上述两个反例通过实际编译产物、生产typed digest和Ego浏览器观察,使用合成API及原生Todo快照;源码与基线分别正常构建,手机390px和Escape回读也验证了。没有真实模型、安装App或受保护操作;未查询/派发/等待CI。

语义与 CI 对齐

GoalSuggestion应保持前端局部闭合集,不需新共享authority协议;问题是已有typed字段被重新解释。V2/V6的修复应在现有selector和同一打包caller完成,再验证optional、partial、unavailable、stopped及普通正例。既有Task看板历史总数等基线问题未归因给本PR;本次两条新事实标签才是新增回归。

我的整体评价

REQUEST_CHANGES。机制成本与归属合理,但long_horizon和user_experience在两个合法状态下 regression:已知未完成工作被宣称完成,可选事项被提升为决定。绿色helper/static检查不能补足该差异。最小修复是复用规范blocking/coverage语义并补独立的真实入口反例,不是加新存储、提高超时或扩展成另一套建议框架。固定提问仍可用,不影响修复期间的原有入口;安装采用、真实模型及完整M3验收继续独立。

English verdict: REQUEST_CHANGES - c7e2bd9; the compiled UI mislabels optional attention as a decision and claims all work done from a partial zero-listed projection. Eight unit cases, three packaged scenarios and local premerge pass, but both independent base/head browser counterexamples fail at this head.

if (input.execution?.kind === "idle" && digest.work.open > 0 && waiting === 0) {
suggestions.push({ kind: "continue_idle", open: digest.work.open });
}
if (digest.work.open === 0 && (digest.work.done ?? 0) > 0 && waiting === 0 && blocked === 0) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] 部分列表的零项不能证明全部完成。用 canonical open_count=5、当前列表为空、done=3 的合法部分投影,实际打包页面概况显示“部分 · 已列出5项中的0项/总数未知”,这里却生成“3项任务全部完成 · 查看成果”。基线没有这项错误声明,用户可能因此漏掉已知的未完成工作。请沿用 work 的规范总数和 coverage:只有完整、当前且已知零 open 才显示全部完成,并补 partial/unknown 与真正完整零项的打包入口反例。

const { digest } = input;
if (digest.lifecycle.activation === "stopped") return [];
const suggestions: GoalSuggestion[] = [];
const waiting = digest.needsYou.availability === "ok" ? digest.needsYou.listed : 0;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] 等你决定应读 blocking,不能读 listed。普通 user_action 不带 blocks_agent/global_gate 时是可选项;把原生生成的这种 Todo 送入实际打包页面,同一概况显示“0等你决定/另有1项可选”,新摘要却显示“先处理1项等你决定的事项”。listed 还会把有界列表数量误当已知 blocking 总量。请复用 needsYou.blocking 并保留 null/unavailable/partial 的语义,补 listed 与 blocking 不相等、来源不可用的反例;目前两者相等的夹具覆盖不到这个回归。

@mergify

mergify Bot commented Oct 15, 2026

Copy link
Copy Markdown

This pull request has merge conflicts with main and cannot be merged
until they are resolved. Please rebase or merge the base branch, @songoow.

Choose the remote for the base repository, not an out-of-date fork.
For a fork clone, first inspect git remote -v; upstream must point
to https://github.com/loopx-project/loopx.git. If it is absent, add it
with git remote add upstream https://github.com/loopx-project/loopx.git.
Then run:

git fetch upstream
git rebase upstream/main
# Resolve each conflict, git add the resolved files, then git rebase --continue.
git push --force-with-lease origin HEAD

For a same-repository clone whose origin points to
https://github.com/loopx-project/loopx.git, use origin instead of
upstream for fetch/rebase. If you prefer merging the base, use
git merge <base-remote>/main and push normally.

Keep the DCO Signed-off-by trailer on every commit when you rebase.
https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork

@mergify mergify Bot added the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Oct 15, 2026
songoow and others added 4 commits October 16, 2026 01:46
The Goal composer's "Suggestions" row was five fixed chips that ignored
what the Goal is actually waiting on. Derive up to three suggestions from
the shared workspace digest, the Todo list, the execution observation and
the acceptance observation, each citing a fact the owner can see:

- decisions waiting on the owner open the overview's owner rail in place;
- blocked work sends a question that names the blocked tasks;
- a failing acceptance criterion sends a question that names it;
- an observed idle executor with open work asks the steward to continue;
- a finished Goal points at its results.

A stopped Goal gets no suggestion, an unknown execution state is never read
as idle, and nothing waits on the owner before "idle" applies. The collapsed
summary line carries the first suggestion. The shipped steward prompt row
stays below, unchanged, so existing journeys keep their chips.

The derivation is a pure module with a node test; the browser scenario
proves the summary hint, the derived row above the steward row, the
in-place decision action, the blocked question quoting a real task title
and sending without a draft, and a stopped Goal showing no derived row.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: song <liusongstep@gmail.com>
CI's goal-showcase phone check found the shipped "配置定时检查" chip pushed
off-screen on the Goal overview: the folded composer positioned only the
steward prompt row as an absolute popover, so the new derived row stayed
in flow and widened the trigger, moving the popover's right anchor past
the 390px viewport.

Both rows now live in one popover panel. The derived row stacks above the
steward row with a hairline, the trigger keeps its width, and a long
summary hint ellipsizes instead of crowding the composer pill. The chat
view is unchanged. goal-showcase, goal-suggestions and steward-journey
pass locally.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: song <liusongstep@gmail.com>
Review found two legal projections where the composer's derived
suggestions contradicted the shared overview:

- "All N tasks done · review the results" appeared for a Goal whose owner
  counted five open tasks while the listing was empty. Finishing is a
  completeness claim: it now needs complete work coverage with a known
  zero open count, never an empty partial listing.
- "Handle 1 decision waiting on you" appeared for an optional user action.
  Decisions now reuse the attention owner's typed blocking count; optional
  items are listed but never counted, and an unknown or unavailable count
  is not zero, so it neither suggests decisions nor proves idleness.

The idle suggestion counts the owner's projected open work when known.
Unit tests add the optional-only, unknown-count and partial-listing
counterexamples; the contract test pins the two rules; the fixture
scenario opens a second workspace whose lane shows "0 waiting, 1
optional" and "5 open, 0 listed" and asserts neither suggestion appears;
the user guide states both rules.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: song <liusongstep@gmail.com>
Add goal-suggestions-live: a disposable real Chat/Todo owner serves
status.json; a user_action raised through the CLI never becomes a decision
suggestion while the lane shows it as optional; a user_gate does, with the
suggestion count equal to the lane's own count, and acting on it opens the
overview that shows the gate. Only the status path is proxied.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: song <liusongstep@gmail.com>
@songoow
songoow force-pushed the codex/digest-suggestions-20261015 branch from c7e2bd9 to 1bf88da Compare October 15, 2026 17:57
@songoow

songoow commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks for the two counterexamples; both are fixed on head 1bf88dadc4686e1364fc100badba649de0f89b06 (rebased onto current main).

[P1] Partial listing claimed "all done". review_results now requires the digest's complete work coverage with a known zero open count (work.coverage === "complete" && work.projectedOpen === 0 && work.open === 0); an empty listing of a partial projection never finishes a Goal. The fixture scenario now opens a second workspace whose lane reads "部分 · 已列出 5 项中的 0 项" and asserts no completion suggestion.

[P2] Optional attention counted as a decision. open_decisions now reuses the attention owner's typed needsYou.blocking; listed is no longer read anywhere in the selector (pinned by the contract test). An unknown or unavailable blocking count is not zero: it suggests no decision and no longer proves idleness either, which corrects the earlier test that encoded "unavailable" as an idle condition. The idle suggestion counts the owner's projected open work when known, not only the listed part.

Validation on this head. goal-suggestions.test.mjs 10/10 (optional-only, unknown-count and partial-listing counterexamples added); personal-workspace-contract.test.mjs with new pins for both rules; dashboard tsc --noEmit; fixture scenario goal-suggestions (gate and blocked positives, plus the second workspace with "0 等你决定 · 另有 1 项可选" and "5 open, 0 listed" showing neither suggestion); real-service scenario goal-suggestions-live (disposable real Chat/Todo owner: loopx todo add --task-class user_action stays optional and suggests nothing, a later user_gate becomes the first suggestion with a count equal to the lane's own, and acting on it opens the overview showing the gate); generate_semantic_inventory.py --changed-from HEAD reports no new vocabulary carriers. The user guide states both rules.

@mergify mergify Bot removed the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Oct 15, 2026
@mergify

mergify Bot commented Oct 15, 2026

Copy link
Copy Markdown

This pull request has merge conflicts with main and cannot be merged
until they are resolved. Please rebase or merge the base branch, @songoow.

Choose the remote for the base repository, not an out-of-date fork.
For a fork clone, first inspect git remote -v; upstream must point
to https://github.com/loopx-project/loopx.git. If it is absent, add it
with git remote add upstream https://github.com/loopx-project/loopx.git.
Then run:

git fetch upstream
git rebase upstream/main
# Resolve each conflict, git add the resolved files, then git rebase --continue.
git push --force-with-lease origin HEAD

For a same-repository clone whose origin points to
https://github.com/loopx-project/loopx.git, use origin instead of
upstream for fetch/rebase. If you prefer merging the base, use
git merge <base-remote>/main and push normally.

Keep the DCO Signed-off-by trailer on every commit when you rebase.
https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork

@mergify mergify Bot added the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Oct 15, 2026
Signed-off-by: song <liusongstep@gmail.com>
@mergify mergify Bot removed the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Oct 15, 2026

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max

APPROVE:两项原阻断已修复,独立质量资格仍未通过。 精确头 d9b6073b48a5d3d014a2443bff639d73aec5d9b7;实际不可变 merge-base 9fc858cbd8ee6d0268a4af11ed0f86e84ae6f755。

发布前发现 rebase:旧头 1bf88dadc4686e1364fc100badba649de0f89b06 → 当前 d9b6073b48a5d3d014a2443bff639d73aec5d9b7,实际基线 9fc858cbd8ee6d0268a4af11ed0f86e84ae6f755。逐一核对当前13路径,其中10个Git blob相同。生产selector/marker、typed digest、模型事实来源、Overview和相关样式/文案/场景未变;页面只整合已在主干的Settings lazy/Suspense,contract附其断言,6535的CSS另附loading类。其余主干变化不算作本PR改动。独立acceptedRFC、AGENTS与design在新基线逐字相同,frontend-delivery新增的按需加载说明已读。两个候选与两个基线在新头重新正常构建,10/11单测、contract、CSS、5/6打包场景(含真实一次性Todo后端)及premerge产品检查全部重跑通过。前述额外Ego画面和DOM/存储反例是在rebase前同批旧头执行,依此调用路径失效检查复用,并非声称新头又开Ego。6545当前helper另独立重跑未知201完成反例仍得1。两次整体premerge的质量资格失败仍保留;没有把旧收据改成当前资格。

动机

回到某个 Goal、想知道接下来该做什么的所有者。原来快捷提问固定不读当前状态;新行直接引用真实待决定、受阻任务或未通过条件,省去重新描述上下文。当前打包页面已正确区分可选提醒与阻断决定,也不会把部分列表的零项当作全部完成;明确点击后沿用原导航或发送入口。本 PR 不新增执行权限、验收规则、模型能力或调度服务。质量资格仍缺当前差异的收据,完整安装采用、真实模型旅程和父级工作区验收不由这次代码评审证明。

改动思路

建议保持为局部纯函数,消费同一份类型化 digest 并复用原导航与发送入口;决定用 blocking、完成用完整覆盖和已知零 open,避免重新定义事实。当前 PR 交付可用且事实一致的建议切片;安装采用与原有质量资格由既有交付 owner 继续验证,代码批准不解除独立合并门槛。当前事实来自原类型化投影,是否新增只由足够观察证据决定;不需要让用户重填已有上下文。原任务只需打开Goal并自愿选择已有入口,新增准备、澄清、确认回合均为0。原有作用域和执行许可仍由原操作owner承担,展示出现不代表可执行。

源码路径用文字说明为:Status/Todo owner -> buildPersonalHomeModel -> shared GoalWorkspaceDigest -> deriveGoalSuggestions -> composer summary/buttons -> existing navigation or sendMessage after click。这是解释而非执行证据;没有渲染流程图,使用下文前后状态与实际caller读回避免把示意图当验证。代表性有数据的整屏已检查目标、owner、状态、下一步是否同时清楚;只有变化和建议占用新的注意力。

具体改动

独立规范 docs/architecture/rfcs/goal-workspace-surface-v0.md,spec_revision 9fc858cbd8ee6d0268a4af11ed0f86e84ae6f755。先读已接受的§2、§5.3、§5.6、§5.7及对应验证,再评估本提案;更新的RFC检查点不能自证实现。判定:V2 implemented;V6 implemented;V9 implemented。V2关注同快照事实同义,V5关注无变化安静和已读,V6关注未知/部分的真实性,V9保留原副作用边界;只列本次实际适用的标准。

本次重新审查完整13路径 +518/-7,包含66行纯selector、72行单测、页面55行接线、两处样式、20行双语文案、contract/npm、两个浏览器场景及catalog、用户指南和公开合成截图。没有新持久化数据、CLI、权限或模型服务;源码变动只属于已有Goal展示能力。上轮旧头的两个阻断按现头完整重验,没有只看修复提交或把rebase带来的主干历史算进本PR。

关键代码:deriveGoalSuggestions(goal-suggestions.ts:31起)让停止态无建议,决定数取可用owner的blocking,未知继续为null。idle只在真实观测idle、有未完成工作且已知没有待决定时出现。完成分支要求coverage=complete、projectedOpen=0、listed open=0且done>0;当前合成真实入口中,5项open却0项列出不再出现“查看成果”,完整3done/0open仍能打开成果。

goalSuggestions和applyGoalSuggestion(page:1253/1272起)从当前digest、Todo、执行与验收条件派生;决定/成果仅导航,其他建议把已知标题或条件带入原sendMessage。原quickPromptBlocked约束保持,渲染和刷新不发送。composerSuggestions(page:2154起)把两行放入同一折叠面板,固定提问不消失;390px长条件可换行,Escape和既有减少动态效果规则保留。

对主干的风险

没有当前阻断性代码发现。原P1:部分列表的0项被说成全部完成,已由实际打包5open/0listed反例验证修复。原P2:普通user_action被当成决定,当前同屏为0决定、1可选且没有决定建议;原生一次性Todo后端场景也分别创建optional及user_gate,证明不是仅把fixture改到与代码同形。真正阻断仍出现,完整零open的成果入口仍可用,修复没有把全部建议一并关闭。

同一当前调用者另验证来源顺序反转和其他Goal新增230条可选项:当前Goal的建议内容不变;完成任务不会被提升为Goal验收通过。十个Node用例覆盖不可用attention、未知coverage/执行、停止态、idle、计数大于列出数量及三项上限。桌面整屏检查了目标、状态、原输入框与下一步的层级,390px长文案没有横向溢出。原对话恢复、模型调用效果和真实安装采用不由这些合成画面证明。

面向后续的有界重构检查已经落实在事实owner:blocking与coverage沿用digest,局部union不注册成共享生命周期协议;继续保留66行纯函数和既有click handler比新增建议后端更容易测试、回滚。相邻大页面未复制新的决策源,本次没有必要追加无关抽层或迁移。

独立验证:当前候选正常构建/typecheck;新基线与两个候选四个arm均在rebase后重新正常构建;额外Ego观察按上述失效检查复用,当前打包场景另已重跑。10个Node用例和五个打包场景、workspace contract和CSS均通过;native live场景使用一次性真实Todo/HTTP/CLI,不是活跃Goal。私有反例通过原始合成API进入真实生产模型与编译页面,明确保留合成边界。未调用付费模型、安装产品或派发/查询/等待远程CI。

premerge三项direct与十三项selected产品检查全执行通过、0manual hold;整体exit1/ok=false,quality_receipt_missing。这是当前差异的独立质量资格状态,尚未满足,未改写或补造收据,不能说整体canary绿色。diff/DCO检查通过。开发期语义advisory先于全树semantic执行;它报告0个支持的carrier,不能证明新TS union、局部JSON或提示语没有语义风险,全树检查通过也不能覆盖本次独立业务反例。

语义与 CI 对齐

该能力仍属于当前前端展示owner。无feature-off或opt-in主张,新默认已在公共指南披露;不虚构关闭模式的等价证明,也不从提示出现推导调度、验收或合并权限。新命名只覆盖局部建议/观察,不暗示更广的Agent生命周期。安装、真实模型、完整父级验收与质量资格分别保留边界;已有基线任务历史总数等未触及问题不归咎于本PR。所有当前失败原样保留,不删断言、扩大超时或放宽预算。

我的整体评价

APPROVE:当前两个事实错误已修复,未发现新的阻断性代码问题。该批准仅针对这个可用展示切片;质量收据缺失和任何仍有效的评审阻断必须按原owner另行关闭,当前不宣称可合并。 建议保持为局部纯函数,消费同一份类型化 digest 并复用原导航与发送入口;决定用 blocking、完成用完整覆盖和已知零 open,避免重新定义事实。当前 PR 交付可用且事实一致的建议切片;安装采用与原有质量资格由既有交付 owner 继续验证,代码批准不解除独立合并门槛。

English verdict: APPROVE — the current head fixes both prior factual defects. Optional attention is not a blocking decision, partial zero-listed work is not complete, and the genuine complete-zero Results path still works. Ten tests, five packaged scenarios and independent current base/head browser cases pass; the missing quality receipt remains a separate merge hold.

@huangruiteng
huangruiteng merged commit 7961c76 into loopx-project:main Oct 15, 2026
10 of 11 checks passed
@songoow
songoow deleted the codex/digest-suggestions-20261015 branch October 15, 2026 19:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants