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
1 change: 1 addition & 0 deletions docs/product/use-cases/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ They do not grant domain providers core control-plane authority.
- [Issue and PR work](issue-pr/README.md)
- [Cross-runtime implementation and review](cross-runtime/README.md)
- [Office operations](office-operations/README.md)
- [Steward: an owner sentence becomes a confirmed team](steward/README.md)
90 changes: 90 additions & 0 deletions docs/product/use-cases/steward/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# Steward: An Owner Sentence Becomes A Confirmed Team

Status: qualification case. It records what the local steward journey proves on
the workspace today, which beats are still unproven, and how to reproduce both.
It is product guidance, not a new capability, contract or scheduler.

The case is grounded in one deterministic browser scenario
(`examples/personal-workspace-browser/steward-journey.mjs`) that runs on synthetic
data. The fixture substitutes the agent turn; everything the case describes is a
fact the workspace surfaces render, not a claim about a live Goal.

## When This Case Applies

- an owner wants work to start from one sentence instead of a filled-in form;
- the work needs more than one Agent or more than one lane, so staffing is
itself part of the answer;
- the owner wants to keep confirming, correcting and reading results in one
place instead of relaying between Agent conversations.

## The Journey

| Beat | What the owner does | What the workspace shows | State |
| --- | --- | --- | --- |
| 1 | Looks at the first screen | Goal board lanes (needs you / running / observing / scheduled), each Goal card naming its Agent and its next sentence | Proven |
| 2 | Asks the steward in the Goal conversation | The ask becomes an accepted Turn and the admitted team plan card lands in the same conversation | Proven |
| 3 | Reads the card | Per lane: the Agent, the first bounded Todo with priority and action kind, the acceptance signal, and an explicitly unstaffed lane that keeps the work it did not staff; the quota envelope and stop condition; a statement that confirming is what creates the lanes | Proven |
| 4 | Confirms | Exactly one apply and one durable write; the card reports that LoopX state will refresh | Proven, but see gap 2 |
| 5 | Checks who can actually work | — | Gap 3 |
| 6 | Corrects or pauses one lane | — | Gap 4 |
| 7 | Waits for a lane to fail and asks who fixes it / judges completion | — | Gaps 5, 6 |

Beats 5–7 are recorded by the scenario as typed gaps with the probe that looked
for them. They are not "not implemented here" hand-waving: the scenario names
the selectors and phrases it searched for and what it found instead.

## Patterns

1. **Ask for an outcome, not an org chart.** One sentence with the outcome and
the constraint produces a plan card; naming Agents before the outcome turns
coordination into the owner's job.
2. **Read four facts before confirming.** Agent, first bounded Todo, acceptance
signal and staffing gap. A card that cannot show a gap is not yet reviewable.
3. **Treat the gap lane as information, not failure.** An unstaffed lane keeps
the work it could not staff and names the reason, so the owner can decide to
drop it, staff it, or accept partial delivery.
4. **Confirmation is a durable write.** Confirming sends exactly one apply and
performs one durable write; the surface must not claim a lane exists before
that write, and must say what the write produced afterwards.
5. **Judge delivery by the returned result, not by the conversation.** A reply
or a message is not a completed lane. Until gap 6 closes, treat the
conversation as the request channel and the Goal's own state as the truth.
6. **Correct in the conversation the work came from.** Steering an active run is
supported today; correcting a confirmed lane commitment is not yet, so avoid
confirming a plan whose lanes may need to be withdrawn.

## Reproduce

```sh
# development surfaces
LOOPX_PERSONAL_WORKSPACE_SCENARIO=steward-journey \
node examples/personal-workspace-browser-smoke.mjs

# packaged workspace bundle
LOOPX_PERSONAL_WORKSPACE_PACKAGED=1 \
LOOPX_PERSONAL_WORKSPACE_SCENARIO=steward-journey \
node examples/personal-workspace-browser-smoke.mjs
```

The run writes `steward-journey-report.json` (beats, gaps, probe evidence) and
per-beat screenshots under `output/playwright/personal-workspace/`, which is
gitignored. No live Goal, Agent, credential or local path is read or captured.

## Recorded Gaps And Owners

| # | Gap | Evidence the scenario recorded | Owner surface |
| --- | --- | --- | --- |
| 1 | The steward's bounded prompt set (`找下一步` / `看阻塞` / `查证据`) is defined in the client model but not reachable from the conversation | probe: no steward-prompt element, no prompt phrases before the owner types | workspace composer |
| 2 | A confirmed plan does not distinguish committed / partial / all-gap / stale / rejected per lane | probe: the only outcome sentence is the generic applied notice | steward plan commit (roadmap R1 remainder) |
| 3 | No per-lane readiness ladder (registered → bound → launchable → executing) | probe: no lane-readiness element or phrase | steward readiness (roadmap R2 / audit F6) |
| 4 | No lane-level correction (pause or supersede a confirmed commitment) | probe: no lane-correction element; only run steering exists | shared alignment (roadmap R4) |
| 5 | A failed lane does not name its blocker owner and next step | probe: no lane-blocker element or phrase | recovery/continuation (roadmap R3) |
| 6 | Completion is not judged by the lane's returned result | probe: no lane-return element or phrase | return delivery (roadmap R3) |

## What This Case Does Not Claim

- It does not qualify a live steward conversation: the fixture substitutes the
agent turn, so the model/runtime behind the intake stays untested here.
- It does not qualify Lark audiences or any cloud/remote worker.
- It does not turn a passing smoke into product acceptance for a Goal whose
plan was confirmed with real consequences.
66 changes: 66 additions & 0 deletions docs/product/use-cases/steward/README.zh-CN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# 管家:一句话变成一个被确认的团队

状态:qualification 案例。它记录本机管家旅程今天在工作台面上证明了什么、哪几拍还没有证明,以及如何复现两者。它是产品侧使用说明,不是新能力、新契约或新调度器。

本文案的事实来源是一个确定性的浏览器场景(`examples/personal-workspace-browser/steward-journey.mjs`),全部跑在合成数据上。fixture 顶替了 agent turn;本文描述的每一句都是工作台面渲染出来的事实,不是对某个真实 Goal 的断言。

## 什么情况下适用

- 老板想用一句话启动工作,而不是填表;
- 这项工作需要不止一个 Agent 或不止一条 lane,所以“有没有人干”本身就是答案的一部分;
- 老板想在同一个地方确认、纠偏、看结果,而不是在多个 Agent 会话之间来回转发。

## 旅程七拍

| 拍 | 老板做什么 | 界面显示什么 | 状态 |
| --- | --- | --- | --- |
| 1 | 看首屏 | Goal 看板四条 lane(需要你/执行中/观察中/已安排),每张 Goal 卡给出 Agent 与下一步那句话 | 已证明 |
| 2 | 在 Goal 对话里向管家提要求 | 这句话成为一个被接受的 Turn,被准入的团队计划卡落在同一个对话里 | 已证明 |
| 3 | 阅读计划卡 | 每条 lane 的 Agent、第一刀 Todo(含优先级与 action kind)、验收信号,以及一条明确“未配齐”并保留未派工工作的 lane;配额包络与停止条件;以及“确认才会建 lane”的说明 | 已证明 |
| 4 | 确认 | 恰好一次 apply、一次 durable write;卡片提示 LoopX 状态将刷新 | 已证明,但见缺口 2 |
| 5 | 检查到底谁能干活 | — | 缺口 3 |
| 6 | 暂停或撤销某条 lane | — | 缺口 4 |
| 7 | 等某条 lane 失败,问谁负责修 / 用什么判定完成 | — | 缺口 5、6 |

第 5–7 拍由场景以 typed gap 记录,并带上“探针找过什么”的证据:不是“这里先不做”的一句话,而是列出了查找的选择器和文本、以及实际找到什么。

## 推荐姿势

1. **说要结果,不要点将。** 一句话给出结果与约束,让计划卡来回答“谁来做”;先点名 Agent 会把协调变成老板的活。
2. **确认前先看四件事**:Agent、第一刀 bounded Todo、验收信号、缺人情况。看不到缺口的卡片还不具备可评审性。
3. **缺人 lane 是信息,不是失败。** 未配齐的 lane 会保留它没能派出去的工作并给出原因,老板可以选择砍掉、补人、或接受部分交付。
4. **确认是一次落地的 durable 写入。** 确认只发一次 apply、只做一次 durable write;卡片不能在写入前声称 lane 已存在,写入后必须说明产生了什么。
5. **用回传结果判定交付,不要用对话判定。** 一条回复不等于一条 lane 完成。在缺口 6 关闭前,把对话当请求通道,把 Goal 自身状态当事实。
6. **在产生工作的那个对话里纠偏。** 对运行中的 Turn 纠偏今天已支持;对已确认 lane 承诺的纠偏还没有,所以不要确认一张可能需要撤回 lane 的计划。

## 如何复现

```sh
# 开发态台面
LOOPX_PERSONAL_WORKSPACE_SCENARIO=steward-journey \
node examples/personal-workspace-browser-smoke.mjs

# 打包态工作台
LOOPX_PERSONAL_WORKSPACE_PACKAGED=1 \
LOOPX_PERSONAL_WORKSPACE_SCENARIO=steward-journey \
node examples/personal-workspace-browser-smoke.mjs
```

运行会在 `output/playwright/personal-workspace/`(已 gitignore)下写出 `steward-journey-report.json`(拍子、缺口、探针证据)与每拍截图。不读取、不截取任何真实 Goal、Agent、凭证或本地路径。

## 已记录缺口与归属

| # | 缺口 | 场景记录的证据 | 归属面 |
| --- | --- | --- | --- |
| 1 | 管家快捷提示(找下一步 / 看阻塞 / 查证据)只定义在客户端模型里,对话里点不到 | 探针:老板输入前既无 steward-prompt 元素,也无提示文本 | 工作台输入区 |
| 2 | 确认后不区分 committed / partial / all-gap / stale / rejected | 探针:只有一条通用的“已应用”提示 | 管家计划落地(roadmap R1 剩余项) |
| 3 | 没有 per-lane readiness 阶梯(registered → bound → launchable → executing) | 探针:无 lane-readiness 元素或文本 | 管家 readiness(roadmap R2 / 审计 F6) |
| 4 | 没有 lane 级纠偏(暂停或撤销已确认承诺) | 探针:无 lane-correction 元素;只有运行中 Turn 的纠偏 | shared alignment(roadmap R4) |
| 5 | lane 失败后不说明阻塞归属与下一步 | 探针:无 lane-blocker 元素或文本 | 恢复与继续(roadmap R3) |
| 6 | 不用 lane 的回传结果判定完成 | 探针:无 lane-return 元素或文本 | 交付回收(roadmap R3) |

## 本文案不主张什么

- 它不资格化真实管家对话:fixture 顶替了 agent turn,因此接入背后的模型/运行时在这里仍未测试;
- 它不资格化飞书受众,也不资格化任何云端/远端 worker;
- 它不把一条通过的 smoke 当成“某个真实确认过的 Goal 已被产品验收”。