Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions docs/architecture/rfcs/human-attention-wishlist-v0.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ The current seams do not compose into that outcome:
non-notifying optional-human template;
- an open `user_action` can enter the user notification channel even when it is
non-blocking;
- `todo suggest` creates a read-only candidate queue that requires later
promotion; the retired `todo capture-followups` command wrote only agent
work and never provided a human-wish route;
- the retired `todo suggest` command only emitted an advisory prompt; the
retired `todo capture-followups` command wrote only agent work. Neither
provided a durable human-wish route;
- the compact turn envelope carries required execution and writeback actions,
but no signed optional sidecar hint.

Expand Down Expand Up @@ -369,11 +369,11 @@ ownership, and lifecycle are already those of a non-blocking user action.
Rejected. Current interaction behavior can notify every visible user action,
and substring or prose classification would make routing authority ambiguous.

### Keep wishes only in `todo suggest`
### Keep wishes only in an advisory suggestion

Rejected. The suggestion surface is intentionally read-only and requires later
promotion, so it cannot preserve a small opportunity discovered as a normal
turn side effect.
Rejected. An advisory proposal requires later promotion, so it cannot preserve
a small opportunity discovered as a normal turn side effect. Retiring the
standalone suggestion command does not close this lifecycle gap.

### Write every opportunity as an agent todo

Expand All @@ -394,7 +394,6 @@ Only after the first slice produces real usage evidence should LoopX consider:
- a user preference or digest policy for wishlist visibility;
- accept/decline convenience commands and atomic agent-todo promotion;
- value/acceptance metrics based on typed lifecycle events;
- teaching `todo suggest` to return separate agent candidates and human wishes;
- external projection sinks that render the existing wishlist lane.

These are not required for v0 and must not delay the non-blocking authoring
Expand Down
9 changes: 4 additions & 5 deletions docs/architecture/rfcs/human-attention-wishlist-v0.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ LoopX 已经区分阻塞性的 `user_gate` todo 与非阻塞的 `user_action` to
- heartbeat 指南要求记录高价值候选,却没有定义 wishlist 写命令或生命周期;
- `todo_write_hint` 提供 gate、user-action 和 agent-todo 模板,却没有“不通知的可选人类请求”模板;
- 一个打开的 `user_action` 即使非阻塞,也可能进入用户通知通道;
- `todo suggest` 只产生只读候选队列,还需要后续 promotion;已退役的
`todo capture-followups` 只写 agent work,从未提供 human wish 路由;
- 已退役的 `todo suggest` 只生成 advisory prompt;已退役的
`todo capture-followups` 只写 agent work。两者都没有提供持久化 human wish 路由;
- compact turn envelope 带有必须执行的动作和写回,却没有签名过的可选 sidecar 提示。

结果是一种可以避免的生产偏差:agent 要么把可选价值升级成 blocker,要么制造提醒噪音,要么遗忘它。
Expand Down Expand Up @@ -269,9 +269,9 @@ v0 拒绝。它会扩大每个 task-class switch、CLI validator、state project

拒绝。当前 interaction behavior 可能通知每个可见 user action;substring/prose classification 还会让 routing authority 变得模糊。

### 只把 wish 放在 `todo suggest`
### 只把 wish 留在 advisory suggestion 中

拒绝。Suggestion surface 刻意只读且需要后续 promotion,无法保存在普通 turn 中发现的小机会。
拒绝。Advisory proposal 需要后续 promotion,无法保存在普通 turn 中发现的小机会。退役独立 suggestion 命令不等于补齐这一生命周期。

### 把每个机会都写成 agent todo

Expand All @@ -288,7 +288,6 @@ v0 拒绝。它会扩大每个 task-class switch、CLI validator、state project
- 用户层的 wishlist visibility/digest preference;
- accept/decline convenience command 与原子 agent-todo promotion;
- 基于 typed lifecycle event 的 value/acceptance metric;
- 教会 `todo suggest` 分开返回 agent candidate 与 human wish;
- 渲染既有 wishlist lane 的 external projection sink。

这些都不是 v0 必需项,不应延迟非阻塞写入协议。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2808,8 +2808,10 @@ wrappers while retaining `prepareCoordinationProjectionCommit` and the shared
reducer used by live domain transactions. It also removes the unrelated public
`todo capture-followups` product command. That command retirement does not
remove, weaken, or rename the runtime shadow-capture mechanism described here.
`todo suggest` remains a manual read-only discovery entrypoint and is not part
of provider promotion qualification.
The standalone `todo suggest` prompt command is also retired; candidate
analysis uses the current agent and existing Todo read/authoring paths, without
adding a discovery wrapper or provider-promotion prerequisite. No stored Todo
or authority history is removed by either public command retirement.

#### Refactoring roadmap overview

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2227,8 +2227,9 @@ backend、实时双向同步或按命令拆开的权威;晋升后不支持的
`coordination.local_authority.mutate` 与 Todo compatibility-edit 执行包装,同时保留
实际领域事务仍复用的 `prepareCoordinationProjectionCommit` 与共享 reducer;另行删除
无关的公开产品命令 `todo capture-followups`。后一个命令的退役不删除、不削弱、也不
重命名本 RFC 的 runtime shadow-capture 机制。`todo suggest` 继续作为人工触发的只读
发现入口,不纳入 provider promotion 资格。
重命名本 RFC 的 runtime shadow-capture 机制。独立 prompt 命令 `todo suggest` 也退役;
候选分析复用当前 Agent 与既有 Todo 读取/写入路径,不新增 discovery 包装或 provider
promotion 前置条件。两个公开命令的退役都不删除已保存的 Todo 或 authority 历史。

#### 重构主线总览

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -983,8 +983,10 @@ readers but does not finish Todo writers, retention/compaction or promotion.
unused public `todo capture-followups` batch command instead of migrating it;
ordinary `todo add` remains available but is not claimed to preserve the
retired command's atomic batch, deduplication, or replay contract. The
read-only, manually invoked `todo suggest` surface remains, but is not a
provider-default prerequisite.
standalone `todo suggest` prompt command is also retired. Candidate analysis
stays with the current agent and existing Todo read/authoring paths; it does
not need a renamed command or a new wrapper protocol. See the
[discovery and compatibility boundary](../../reference/protocols/long-horizon-agent-state-protocol-v0.md#candidate-discovery-and-command-retirement).
- Depends on T1–T3 and the shared RFC's [D1–D3](shared-goal-authority-state-provider-v0.md#durability-execution-cards), including owner approval
and the explicit legacy migration window. Search remaining imports and
public command routes before deleting old Markdown business writers,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -763,8 +763,9 @@ T3/D1 reader,未完成全部 Todo writer、retention/compaction 或 promotion
和 team-plan 事务仍复用 projection reduction 与 commit preparation,因此这些
公共内核保留。同一审计直接退役无实际调用的公开批量命令
`todo capture-followups`,不再为它继续迁移;普通 `todo add` 仍可用,但不宣称保留
已退役命令的批量原子性、去重或 replay 合同。人工触发、只读的 `todo suggest`
保留,但不是 provider 默认切换的前置条件。
已退役命令的批量原子性、去重或 replay 合同。独立 prompt 命令 `todo suggest`
也直接退役;候选分析由当前 Agent 结合既有 Todo 读取和写入路径完成,不增加改名命令
或包装协议。见[发现与兼容边界](../../reference/protocols/long-horizon-agent-state-protocol-v0.md#candidate-discovery-and-command-retirement)。
- 前提是 T1–T3 和 shared RFC 的 [D1–D3](shared-goal-authority-state-provider-v0.zh-CN.md#持久化执行卡),包括 owner 批准及明确的 legacy 迁移窗口。
搜索剩余 import 和公开路由后,删除旧 Markdown 业务 writer、capture-only adapter、
重复 reference aggregate。
Expand Down
1 change: 0 additions & 1 deletion docs/reference/protocols/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ scanning a chronological list.
- [`typed_date_resume_trigger_v0`](typed-date-resume-trigger-v0.md): timezone-aware one-shot Todo resume and stable due receipt v0
- [`typed_date_resume_trigger_v0`](typed-date-resume-trigger-v0.zh-CN.md): timezone-aware one-shot Todo resume and stable due receipt v0 (中文)
- [`todo_detail_cold_path_v0`](todo-detail-cold-path-v0.md): Todo detail cold path v0
- [`todo_suggestion_prompt_v0`](todo-suggestion-prompt-v0.md): Todo suggestion prompt v0
- [`turn_envelope_v0`](turn-envelope-v0.md): Turn envelope v0
- [`loop_turn_loop_disposition_v0`](turn-loop-controller-v0.md): Loop Turn Loop Disposition v0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ them directly.
| `connection_state` | `loopx connect`, `bootstrap`, `doctor`, `sync-global` | Whether the repo is connected, read-only, bootstrapped, stale, or missing local state. |
| `local_state_boundary` | `.gitignore`, `loopx check`, getting-started docs | Keep `.loopx/`, `.codex/goals/`, `.local/`, raw logs, credentials, and private paths out of public commits. |
| `todo_item_v0` | `loopx todo`, active-state todo sections, `loopx/status.py` | Formal work unit with role, status, task class, action kind, claim, dependency, resume, and evidence metadata. |
| `suggested_todo` | `loopx todo suggest`, `todo_suggestion_prompt_v0` | Candidate decision queue; not formal backlog until promoted by user/controller. |
| `interaction_contract_v0` | `loopx quota should-run`, `docs/quota-allocation.md` | Splits user, agent, and CLI obligations before an automated turn spends compute. |
| `agent_lane_next_action_v0` | `loopx quota should-run --agent-id ...`, `docs/project-agent-todo-contract.md` | Per-agent selected runnable todo without replacing the goal-level next action. |
| `agent_workspace_guard_v1` | `loopx quota should-run`, selected todo and repository policy | Blocks repository delivery until the current peer uses a compliant worktree/branch. |
Expand All @@ -47,6 +46,29 @@ them directly.
| `delivery_outcome` | `loopx/delivery_outcome.py`, `loopx/history.py`, `loopx/status.py` | Machine-readable result tier: surface-only, outcome gap, outcome progress, or primary goal outcome. |
| `rollback_packet_v0` | `docs/reference/protocols/rollback-packet-v0.md` | Compensating action record linking todo, commit, event, decision, external resource, and validation plan. |

### Candidate discovery and command retirement

`todo suggest` and its `todo_suggestion_prompt_v0` packet are retired. The
command only emitted instructions for the current agent; it did not inspect
the repository or persist candidates. There is no replacement discovery
command, nested packet, or compatibility alias.

Read existing work with `loopx todo list --goal-id <goal-id> --role agent
--status open --limit 50`. This is a bounded view: an open Todo is not proof of
current execution eligibility, and a limited view is not the complete frontier.
Keep the existing quota/Turn revalidation before selecting work.

Ask the current project agent to analyze uncovered work using the relevant
repository evidence and existing Todos. Proposals remain advisory until the
user or authorized controller selects them for `loopx todo add`; analysis
does not grant execution authority. `todo plan` remains the existing Goal's
caller-invoked planning checkpoint, not a drop-in suggestion replacement.

Scripts that parsed the retired prompt must remove that step and use their
existing agent interaction. The former Todo `--from` and `--trigger` options
are removed; `--limit` retains its existing `todo list` meaning. No persisted
Todo, journal or provider state migration is required.

## Projection Protocol

Projection protocol fields are read-only views. They may summarize, rank, and
Expand Down Expand Up @@ -272,8 +294,6 @@ Partially aligned:
- `task_graph_projection_v0` is specified but not yet a stable dashboard input.
- Commit-to-todo linkage is convention-based through PR text, commit messages,
todo evidence, and rollout refs.
- `todo suggest` produces a prompt packet for the user's agent; it is not a
fully autonomous repo analyzer.
- External-resource partial success is not yet a generic protocol.

Not yet aligned:
Expand Down
67 changes: 0 additions & 67 deletions docs/reference/protocols/todo-suggestion-prompt-v0.md

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ def run_cli(*args: str) -> subprocess.CompletedProcess[str]:


def assert_contains(text: str, needle: str, label: str) -> None:
if needle not in text:
# Help wrapping can split words at hyphens; only whitespace is incidental here.
if "".join(needle.split()) not in "".join(text.split()):
raise AssertionError(f"{label} missing {needle!r}")


Expand Down
Loading
Loading