Repository navigation
product(desktop): capture deferred work in a project-aware Work Board #2560
Description
English
Parent roadmap: #2469
Related architecture: #2290
Problem
Useful follow-up work is frequently discovered while an Agent is executing a different task:
- a bug is noticed but should not interrupt the current objective;
- a refactor or product idea deserves to be preserved for later;
- a side conversation identifies a concrete action item;
- the user wants to remember work without starting another Session immediately.
Today this context usually remains buried in conversation history, is copied into an external tracker, or distracts the active task. Maka lacks a lightweight bridge between “we noticed this” and “start an auditable Agent task later.”
Product direction
Add a local-first Work Board that can hold deferred work in either:
- a project-scoped board; or
- a global, unassigned Inbox.
A board item is a user-owned work intention, not an Agent execution claim. It may originate from a main conversation, a side conversation, or manual entry. Later, the user can start it as a normal Maka task/Session while preserving its source context.
The intended loop is:
conversation or side chat
-> capture deferred work
-> project board / global Inbox
-> start as a new task
-> Session execution
-> link result and evidence back to the item
Important boundary
Do not overload the Session Task Ledger from #2290.
- Session Task Ledger: the model-owned, bounded execution plan inside one Session.
- Work Board: user-owned, cross-Session deferred work and task entry points.
A board item may launch and link to a Session, but it must not be injected into every model turn or silently become part of the active plan. Runtime execution state remains authoritative in existing Session/AgentRun/TaskRun facts.
Proposed v1 experience
Board scopes
- Inbox: project-independent ideas and unclassified work.
- Current project: work associated with the selected Maka project.
- Items can be moved between Inbox and projects.
Minimal states
- Inbox
- Todo
- In progress
- Done
“Waiting”, “blocked”, and “recoverable” should come from a linked active Session projection rather than being manually invented board states.
Capture paths
- Manual “Add item” from the board.
- From a main-conversation message or selection.
- From side chat, for example: “Do not handle this now; add it to the current project todo.”
- The Agent may propose a board item, but creation requires an explicit user action or unambiguous user instruction. No silent backlog generation.
Start-task path
- “Start task” creates a normal Maka Session in the selected project/workspace.
- The initial task context contains a concise item summary and typed source references, not a blind dump of the full conversation.
- The board item links to the Session and reflects its projected execution state.
- Completing or failing a Session does not automatically falsify user intent; the item presents the linked outcome and lets the user confirm completion or reopen it.
Provenance and review
Each captured item should preserve, when available:
- source Session id;
- source message/side-conversation reference;
- project id or global scope;
- creator (
useror Agent suggestion confirmed by user); - linked execution Session(s);
- result references such as changed files, validation, artifacts, or PRs when later available.
Delivery plan
Phase 0 — contract and authority
- Define the minimal BoardItem contract and lifecycle.
- Decide the local persistence owner and mutation boundary.
- Define typed provenance references and project/global scope.
- Specify how linked Session status is projected without copying Runtime state.
- Add exhaustive contract and migration tests.
Phase 1 — capture and list MVP
- Add a compact Work Board surface in the existing task/workbar area; do not introduce a new top-level module.
- Support global Inbox and current-project filtering.
- Support manual create, rename, move, complete/reopen, and archive.
- Preserve source references for conversation-originated items.
- Cover empty, loading, error, and offline/local persistence states.
Phase 2 — side-conversation capture
- Add an explicit “Add to Work Board” action to side conversations.
- Parse destination only from explicit intent: current project, named project, or Inbox.
- Show a confirmation containing title and destination before/after mutation.
- Keep the active task unchanged.
- Add a real behavior test proving capture does not submit or alter the active Session plan.
Phase 3 — start as task
- Add “Start task” from a board item.
- Create a new Session with the correct project/workspace and concise source context.
- Link the new Session back to the board item.
- Project running/waiting/blocked/recoverable/completed state from existing authorities.
- Add a first-success journey: capture in side chat -> open board -> start task -> finish -> review linked result.
Phase 4 — evidence and refinement
- Link completion evidence and deliverables from the Completion Packet work in roadmap(product): evolve Maka into a durable Agent workspace #2469.
- Add lightweight prioritization and ordering only after the core loop is validated.
- Evaluate whether a column board is useful; begin with a compact list if it better fits the existing workbar.
Acceptance criteria
- A user can capture deferred work without interrupting the active task.
- An item can belong to a project or the global Inbox.
- Side-chat capture preserves a source reference and never silently creates items.
- Capturing an item does not mutate the active Session Task Ledger.
- A board item can start a new normal Maka Session in the correct workspace.
- Linked execution status is projected from existing Runtime authorities, not copied into a second execution-state authority.
- Completion can link to evidence/results and can be reopened by the user.
- Desktop behavior has a real capture-to-completion journey test.
- Local data survives restart and has a safe migration/backup story.
Non-goals
- Building a full replacement for Linear, GitHub Projects, or Jira.
- Team collaboration, cloud sync, assignees, sprints, estimates, or roadmaps in v1.
- Replacing the Session Task Ledger, Plan mode, Automations, or Agent Graph.
- Automatically turning every Agent suggestion into backlog noise.
- Treating manually moved columns as authoritative Runtime execution state.
简体中文
中文
问题
Agent 执行一个任务时,经常会发现值得后续处理、但不应该打断当前目标的工作:
- 发现一个 bug,但本次任务不急着修;
- 想到一个重构或产品想法,希望以后再做;
- 侧边栏对话整理出了明确行动项;
- 用户希望先记住问题,而不是立即启动新 Session。
目前这些内容通常埋在历史对话里、被复制到外部工具,或者干扰当前任务。Maka 缺少一座从“发现问题”通往“以后启动一个可审计 Agent 任务”的轻量桥梁。
产品方向
增加一个本地优先的 Work Board / 工作看板,支持:
- 归属于某个项目;
- 或进入不归属项目的全局 Inbox。
看板事项代表用户拥有的工作意图,不是 Agent 对执行状态的声明。它可以来自主对话、侧边栏对话或手工录入,之后再启动为普通 Maka 任务/Session,并保留来源上下文。
目标闭环:
主对话或侧边栏
-> 捕获暂缓事项
-> 项目看板 / 全局 Inbox
-> 启动为新任务
-> Session 执行
-> 将结果和证据关联回事项
重要边界
不要复用或扩张 #2290 的 Session Task Ledger:
- Session Task Ledger:模型在单个 Session 内维护的、受预算限制的执行计划。
- Work Board:用户拥有的、跨 Session 的暂缓事项和任务入口。
看板事项可以启动并关联 Session,但不能被注入每轮模型上下文,也不能静默进入当前执行计划。实际运行状态继续由现有 Session、AgentRun、TaskRun 权威事实决定。
v1 体验建议
范围
- Inbox:与项目无关或尚未分类的事项。
- 当前项目:归属于所选 Maka 项目的事项。
- 事项可以在 Inbox 和项目之间移动。
最小状态
- Inbox
- Todo / 待处理
- In progress / 进行中
- Done / 完成
“等待、阻塞、可恢复”等状态应从关联 Session 投影,而不是再造一套手工看板状态。
捕获入口
- 在看板中手工添加。
- 从主对话消息或选中文本创建。
- 从侧边栏对话创建,例如:“这个问题本次先不处理,加入当前项目待办。”
- Agent 可以建议加入,但只有用户明确操作或明确指令后才能创建,不能静默堆积事项。
启动任务
- “开始任务”在对应项目/工作区创建普通 Maka Session。
- 初始上下文只包含简洁事项摘要和强类型来源引用,不盲目灌入整段历史对话。
- 看板事项关联该 Session,并展示其投影状态。
- Session 完成或失败不应自动篡改用户意图;事项显示关联结果,由用户确认完成或重新打开。
来源与复核
每个事项应尽可能保存:
- 来源 Session id;
- 来源消息或侧边栏对话引用;
- 项目 id 或全局范围;
- 创建者(用户,或经用户确认的 Agent 建议);
- 关联执行 Session;
- 后续产生的文件变更、验证、Artifact、PR 等结果引用。
交付计划
Phase 0 — 契约与权威
- 定义最小 BoardItem 契约和生命周期。
- 决定本地持久化所有者与写入边界。
- 定义强类型来源引用和项目/全局范围。
- 定义如何投影关联 Session 状态,避免复制 Runtime 状态。
- 增加完整契约和迁移测试。
Phase 1 — 捕获与列表 MVP
- 在现有 task/workbar 区域增加紧凑 Work Board,不新增顶级模块。
- 支持全局 Inbox 与当前项目筛选。
- 支持手工新增、改名、移动、完成/重开和归档。
- 对来自对话的事项保存来源引用。
- 覆盖空、加载、错误和本地离线持久化状态。
Phase 2 — 侧边栏对话捕获
- 在侧边栏对话增加明确的“加入工作看板”操作。
- 只根据明确意图决定当前项目、指定项目或 Inbox。
- 写入前后展示标题和目标位置确认。
- 不改变当前任务。
- 增加真实行为测试,证明捕获不会提交消息或修改当前 Session 计划。
Phase 3 — 启动为任务
- 为看板事项提供“开始任务”。
- 在正确项目/工作区创建新 Session,并注入简洁来源上下文。
- 将新 Session 关联回看板事项。
- 从现有权威投影运行、等待、阻塞、可恢复和完成状态。
- 增加首次成功旅程:侧边栏捕获 -> 打开看板 -> 启动任务 -> 完成 -> 查看关联结果。
Phase 4 — 证据与体验完善
- 接入 roadmap(product): evolve Maka into a durable Agent workspace #2469 后续 Completion Packet 的完成证据与交付物。
- 核心闭环验证后再增加轻量优先级和排序。
- 验证列式看板是否真的需要;若紧凑列表更适合现有 workbar,则先使用列表。
验收标准
- 用户可以记录暂缓工作,不打断当前任务。
- 事项可以属于某个项目,也可以进入全局 Inbox。
- 侧边栏捕获保留来源引用,且不会静默创建事项。
- 捕获事项不会修改当前 Session Task Ledger。
- 看板事项可以在正确工作区启动为普通 Maka Session。
- 关联执行状态来自现有 Runtime 权威投影,不复制成第二套执行状态。
- 完成事项可以关联结果/证据,也可以由用户重新打开。
- Desktop 有覆盖捕获到完成闭环的真实旅程测试。
- 本地数据重启后仍存在,并具有安全迁移与备份方案。
非目标
- 构建 Linear、GitHub Projects 或 Jira 的完整替代品。
- v1 不做团队协作、云同步、负责人、Sprint、估时或 Roadmap。
- 不替代 Session Task Ledger、Plan mode、Automation 或 Agent Graph。
- 不把 Agent 每个建议自动变成待办噪音。
- 不把手工移动的列当成 Runtime 执行状态权威。
Activity
somewan820 commentedon Aug 14, 2026
Hi, I'd like to take Phase 0 of this issue.
I'm also the assignee of #2290 (Session Task Ledger), so I want to state the boundary explicitly: Phase 0 would define the BoardItem contract and persistence ownership without depending on the Session Task Ledger. That means:
task_*tools;task.ledger.query;workflow_task_ledger_*tables;I'll post the BoardItem contract, provenance model, and state-projection boundary here for review before opening a PR. Could you assign me?
简体中文
你好,我想接手本 issue 的 Phase 0。
我也是 #2290(Session Task Ledger)的 assignee,所以先明确边界:Phase 0 将定义 BoardItem 契约和持久化归属,不依赖 Session Task Ledger。具体包括:
task_*工具;task.ledger.query;workflow_task_ledger_*表;我会先把 BoardItem 契约、provenance 模型和状态投影边界发在这里评审,再开 PR。能把我 assign 上吗?
somewan820 commentedon Aug 14, 2026
Phase 0 — BoardItem contract, provenance model, and state-projection boundary
This is the Phase 0 review post I promised: define the minimal BoardItem contract and lifecycle, decide the local persistence owner and mutation boundary, define typed provenance references and project/global scope, and specify how linked Session status is projected without copying Runtime state. No PR is opened yet — I'll wait for review convergence (and the current stabilization window) before writing code.
1. Repository facts I verified on
mainactive / running / waiting_for_user / blocked / review / done / archived / aborted(packages/core/src/session.ts,packages/runtime-host/src/protocol/session-continuity.ts).created / running / waiting_for_user / completed / failed / cancelled(packages/core/src/agent-run.ts).ProjectRecord.id) in the operational-state database (packages/storage/src/project-catalog.ts).docs/side-conversation.md).runtime.sqlite,OPERATIONAL_STATE_DATABASE_NAME) is the shared local authority for session metadata, project catalog, scheduled tasks, task ledger, and related workflow state.createOperationalStateBackupsnapshots the whole database, so a new table in that DB is automatically covered by the existing backup/restore story.CREATE TABLE IF NOT EXISTSmigrations withrecord_jsonrows (packages/storage/src/sqlite-workflow-schema.ts).docs/session-task-ledger-lifecycle.md).2. BoardItem contract (proposal)
Lifecycle decisions in this proposal:
scopeandstateare separate axes. Inbox is a bucket; an Inbox item still has a user state. The board UI may render Inbox as a column, but the contract does not overload "inbox" into a status.Allowed state transitions (user-confirmed only):
archivedis a logical hide flag, not a state. Storage keeps the row; reads exclude archived items unless explicitly requested. No hard delete in v1 (Q5).Scope changes (
inbox <-> project) are allowed in any state and do not reset the user state.doneis user intent, never derived from a Session. Completing or failing a linked Session only updates the projected chip; the user confirms completion or reopens the item.No
task_*tools, notask.ledger.query, and noworkflow_task_ledger_*reads/writes anywhere in this feature.3. Provenance model
sessionId,messageId, and (when available)runId/turnId. Side-chat capture also storesparentSessionId.excerptis snapshotted into the item at capture time. This is what makes a side-chat item survive the temporary fork's deletion; the typed refs are best-effort links, not hard dependencies.provenance.kind = 'manual'.creator.kind = 'agent_suggestion'requiresconfirmedAt, and creation only happens through an explicit user action or unambiguous instruction. The board never writes itself.resultRefsis part of the contract shape now, but population happens in Phase 3/4. Phase 0 only fixes validation and the union.4. Persistence owner and mutation boundary
Proposal:
Owner: a new
WorkBoardStoreinpackages/storage, backed by the operational-state database (runtime.sqlite), following the existingrecord_jsonpattern.Table (additive migration, workflow schema 8 → 9):
Single writer: the Desktop main process. The renderer gets a read-only projection through IPC and reloads on a signal-only change event (same pattern as the task panel). Runtime Host is not involved; there are no model-visible tools; the board is never injected into model context or the turn tail.
Backup/migration: because the table lives in
runtime.sqlite, the existingcreateOperationalStateBackupcovers it without manifest changes. Migration is additive only, no DROP, no data loss; the migration test inventory is updated.CLI/TUI can read the same store later through a shared projection, but v1 mutation is Desktop-only (Q8).
5. State-projection boundary
The stored item never carries execution state. A linked Session's status is projected at read time from existing authorities:
SessionContinuitySnapshot(session lifecycle), AgentRun headers (latest run), RuntimeEvent (execution facts), and Agent Graph (delegated work) — exactly the authorities listed in RFC: Radically slim the Session Task Ledger #2290's boundary comment.record_json, and never mutates a Session.6. Phase 0 contract tests (proposed)
work-board-item.test.ts: decode/validate the item schema; state transition whitelist; scope/provenance invariants; field and array bounds; archive idempotency.work-board-store.test.ts: create/rename/move/complete/reopen/archive; persistence across store reopen; filtering by inbox/project and archived; additive migration from schema 8.work-board-backup.test.ts: a board item survivescreateOperationalStateBackup→ restore.work-board-projection.test.ts: given fixture Session/AgentRun/RuntimeEvent/Graph facts, the projection returns the expected chip without writing anything.7. Open questions for maintainers
resultRefsin Phase 0: keep the union shape now (validated, unused until Phase 3/4), or move it entirely to Phase 4?donebut last runfailed), I propose showing both raw facts without synthesizing a verdict. Agree?240title chars,4_000notes chars,1_000items,16linked sessions are placeholders — should they be tightened or confirmed during P1?Once these converge, I'll open the Phase 0 PR: contract types + validation, additive migration, store, projection tests, and backup test — still without any UI or Runtime Host changes.
简体中文
Phase 0 — BoardItem 契约、来源模型与状态投影边界
这是我在 #2560 里承诺的 Phase 0 评审稿:定义最小 BoardItem 契约与生命周期、确定本地持久化归属和写入边界、定义强类型来源引用与项目/全局范围,并说明如何从现有权威投影关联 Session 状态,而不复制 Runtime 状态。暂不开 PR,等 review 收敛(以及当前稳定化窗口)后再写代码。
已核实的仓库事实
active / running / waiting_for_user / blocked / review / done / archived / aborted。created / running / waiting_for_user / completed / failed / cancelled。ProjectRecord.id)。runtime.sqlite是共享本地权威库(session metadata、project catalog、scheduled tasks、task ledger 等都在这里);现有备份会整体快照该库,因此新表自动纳入备份。CREATE TABLE IF NOT EXISTS+record_json模式。BoardItem 契约(提议)
关键决定:
todo -> in_progress、in_progress -> todo/done、done -> todo/in_progress(reopen)。完成态不会由 Session 自动推导。archived是逻辑隐藏标记,v1 不做硬删除。sessionId/messageId(有则含runId/turnId),侧边栏另存parentSessionId;同时落一份有界excerpt快照。confirmedAt且由用户明确确认,绝不静默创建。task_*工具、task.ledger.query,不读写workflow_task_ledger_*。持久化归属与写入边界
packages/storage的WorkBoardStore,落在runtime.sqlite,沿用record_json模式。workflow_work_board_items(item_idPK +created_at/updated_at/scope_kind/project_id/record_json),workflow schema 8 → 9 增量迁移,不 DROP、不删数据。状态投影边界
SessionContinuitySnapshot、AgentRun、RuntimeEvent、Agent Graph 纯投影:Phase 0 测试
开放问题
resultRefs现在只定形状、Phase 3/4 再填充,还是整体推到 Phase 4?done、runfailed),投影同时展示两个原始事实、不做合成结论,是否可以?以上收敛后我会开 Phase 0 PR:契约类型 + 校验、增量迁移、store、投影测试和备份测试,不含 UI 与 Runtime Host 改动。
AI assistance disclosure: Codex helped structure and draft this comment. I reviewed the issue discussion and the repository facts above, and I own the final position.
liugddx commentedon Aug 14, 2026
Thanks for taking the time to investigate this issue so thoroughly and for writing down the authority boundary before opening a PR. The main direction is sound, especially the separation from the Session Task Ledger, keeping execution state as a projection, using the operational-state database, and requiring explicit user confirmation for agent suggestions.
I would support Phase 0 after the following contract issues are resolved:
The 1,000-item limit conflicts with archive-only retention. If archived rows count toward the limit, a user eventually becomes permanently unable to create items. If they do not count, storage remains unbounded. Phase 0 should define whether the limit applies to active items, each scope, or the whole database, and what happens at the limit. My preference is no total-item hard cap in Phase 0: bound page/query size instead, and allow permanent deletion of archived items.
The lifecycle should allow
todo -> done. A Work Board item represents user intent, not proof of execution. Users should be able to complete an item without first starting a Session or moving it throughin_progress. Suggested transitions:The execution projection is broader than the stable authority currently exposed.
latestRunStatus, the proposed syntheticrecoveryState, andgraphStateare not all directly available from one current canonical projection. Recomputing them from Session, AgentRun, RuntimeEvent, and Agent Graph on every list load also leaves query cost and consistency undefined, particularly with up to 1,000 items and 16 links per item.Please keep Phase 0 to facts directly available from the current continuity contract, for example:
Add recovery or graph-derived fields only after a canonical read interface and an actual UI requirement exist. The board should not invent a second recovery verdict while trying to avoid a second execution authority.
Move
resultRefsentirely to Phase 4. The proposed union prematurely fixes artifact identity, Completion Packet identity, and RuntimeEvent addressing before their consumers and contracts have converged. A reserved but persisted field is still a compatibility commitment. Adding an optional field in a later schema is safer than guessing the future reference model now.Encode provenance invariants in the type. The current shape permits both a main-conversation provenance with
parentSessionIdand a side-chat provenance without it. Please split those into distinct discriminated variants soparentSessionIdis required only forside_chat.Likewise, enforce the archive invariant: active items must not have
archivedAt, while archived items must have it. This can be represented as a union or enforced by the decoder.Enforce scope/project consistency in SQLite. The proposed table currently permits an Inbox row with a project id and a project-scoped row without one. Please add a constraint equivalent to:
Reads should also reject disagreement between indexed columns and
record_json.scope, otherwise they become competing authorities.Define mutation concurrency explicitly.
updatedAtis not a revision: multiple changes may occur in the same millisecond, and a stale renderer projection could overwrite newer state. The main process should accept semantic patch commands rather than replacement records, serialize/transactionalize mutations, and preferably expose a monotonic revision or CAS contract. Please include a test proving concurrent rename/move/archive operations do not lose updates.The following decisions look good and should remain:
runtime.sqliteowns local persistence.record_json.My suggested minimal Phase 0 is therefore: the strict item/provenance contract, SQLite migration and store, semantic mutations with concurrency behavior, paginated queries, archive/delete behavior, backup/restore tests, and only the smallest linked-session projection supported directly by existing authorities. Defer
resultRefs, composite recovery/graph projection, and placeholder total-count limits.Overall, this is a strong proposal with the right architectural boundary, but it should be reduced before implementation so Phase 0 remains genuinely minimal.
中文评审意见
感谢你认真关注并深入调查这个 Issue,也感谢你在开 PR 前先明确权威边界。方案的主方向是正确的,尤其是与 Session Task Ledger 隔离、运行状态只做投影、使用 operational-state 数据库,以及 Agent 建议必须经过用户明确确认。
我建议解决以下契约问题后再认可 Phase 0:
1,000 项上限与只归档不删除冲突。 如果归档项计入上限,用户最终会永久无法创建事项;如果不计入,存储仍然无界。建议 Phase 0 不设总事项硬上限,只限制分页/查询大小,并允许永久删除已归档事项。
生命周期应允许
todo -> done。 Work Board 表达用户意图,不是执行证明。用户应当能够直接完成尚未启动 Session 的事项,不必先经过in_progress。执行投影超出了当前稳定权威直接提供的范围。
latestRunStatus、综合recoveryState和graphState并非来自一个现有规范投影;每次列表加载跨 Session、AgentRun、RuntimeEvent、Agent Graph 重算,也没有定义成本和一致性。Phase 0 应只保留当前 continuity contract 直接提供的 Session 状态和当前 turn/run 事实,恢复或图状态等有规范读取接口和真实 UI 需求后再增加。resultRefs整体推迟到 Phase 4。 当前 union 提前固定了 Artifact、Completion Packet 和 RuntimeEvent 的引用身份。即使标记为 reserved,只要进入持久化 schema 就成为兼容性承诺。未来按真实契约添加可选字段更安全。用类型编码 provenance 不变量。 当前类型允许 main conversation 带
parentSessionId,也允许 side chat 缺少它。应拆成两个 discriminated variants。归档状态也应保证 active 时没有archivedAt,archived 时必须有。SQLite 应约束 scope/project 一致性。 Inbox 必须没有
project_id,project scope 必须有。读取时还应验证索引列与record_json.scope一致,避免形成两个冲突的事实源。明确 mutation 并发契约。
updatedAt不是 revision,同一毫秒可能发生多次更新,旧 renderer projection 也可能覆盖新状态。主进程应接收语义化 patch command,而不是整个旧 record;mutation 应串行化并置于事务中,最好提供单调 revision 或 CAS,并测试并发 rename/move/archive 不丢更新。以下决定可以保留:
runtime.sqlite负责本地持久化;record_json;建议将 Phase 0 收缩为:严格的 item/provenance 契约、SQLite migration 与 store、具有并发语义的命令式 mutation、分页查询、归档/删除行为、备份恢复测试,以及现有权威直接支持的最小 linked-session projection。推迟
resultRefs、综合 recovery/graph 投影和占位性质的总量上限。总体而言,这是一份架构边界正确的扎实方案,但实现前还需要继续做减法,确保 Phase 0 真正最小。
somewan820 commentedon Aug 14, 2026
Thanks for the review. I accept all seven points, and I'll narrow Phase 0 accordingly. Revised contract and scope:
todo <-> in_progress,todo -> done,in_progress -> done,done -> todo | in_progress. Completion is always user intent and is never derived automatically.recoveryState/graphStatestay out until a canonical read interface and a real UI requirement exist.4.
resultRefsmoves entirely to Phase 4. The Phase 0 schema does not contain the field.5. Provenance becomes three discriminated variants:
manual/main_conversation/side_conversation.main_conversationrejectsparentSessionId;side_conversationrequires it. The archive invariant is enforced both in the type and by the decoder (active items have noarchivedAt; archived items must have it).6. SQLite gains a scope/project CHECK constraint (inbox rows must have
project_id IS NULL; project rows must have one). Reads validate that the indexed columns agree withrecord_json.scope, treating disagreement ascorrupt_record.7. Mutations are semantic patches (independent
title/notes/scope/statefields;notes: nullclears), never full-record replacement. Writes are serialized and transactional, each item has a monotonicrevision, and mutations accept an optionalexpectedRevisionCAS. A concurrency test proves rename/move/archive do not lose updates.Phase 0 deliverables (no UI, no Runtime Host, no model tools):
packages/core: BoardItem contract, provenance, lifecycle validation, paginated query;packages/storage: additive workflow schema 8→9 migration (workflow_work_board_items+ CHECK + index),WorkBoardStore(create / update / archive / unarchive / remove / paginated list + CAS);Once this converges, I'll open the Phase 0 PR.
简体中文
感谢评审,7 点我都接受,Phase 0 按你的意见收窄。修订后的契约和范围:
todo <-> in_progress、todo -> done、in_progress -> done、done -> todo | in_progress。完成始终是用户意图,不自动推导。recoveryState/graphState等,等有规范读取接口和真实 UI 需求后再加。4.
resultRefs整体移到 Phase 4,Phase 0 schema 不含该字段。5. provenance 拆成三个 discriminated variants:
manual/main_conversation/side_conversation;main 禁止parentSessionId,side 必须有;归档不变量用类型 + decoder 双重保证(active 无archivedAt,archived 必有)。6. SQLite 加 scope/project CHECK 约束(inbox 必须无
project_id,project 必须有);读取时校验索引列与record_json.scope一致,不一致按corrupt_record处理。7. mutation 全部是语义化 patch(title/notes/scope/state 独立字段,
notes: null清除),不替换整条旧记录;写入串行化并事务化;每项有单调revision,支持expectedRevisionCAS;补并发 rename/move/archive 不丢更新的测试。Phase 0 交付范围(不含 UI / Runtime Host / 模型工具):
packages/core:BoardItem 契约、provenance、生命周期校验、分页 query;packages/storage:workflow schema 8→9 增量迁移(workflow_work_board_items+ CHECK + 索引)、WorkBoardStore(create / update / archive / unarchive / remove / 分页 list + CAS);以上收敛后我再开 Phase 0 PR。
AI assistance disclosure: Codex helped structure and draft this comment. I reviewed the issue discussion and own the final position.
somewan820 commentedon Aug 15, 2026
Thanks for the review. Phase 0 is now implemented and the PR is ready for review:PR #3028
The implementation follows the maintainer-approved Phase 0 contract discussed in this issue.
The latest review also confirmed:
notes: undefinedhas been fixed.notespatch semantics are now explicitly covered:undefined→ unchangednull/""/ whitespace-only → clearrecord_jsonfails closed.recoveryState,graphState, orresultRefswere introduced.The relevant core/storage tests, typechecks, builds, and Biome checks all pass.
Ready for review. Thanks!
简体中文
感谢之前的评审。Phase 0 现在已经完成,并已提交 PR,欢迎 review:PR #3028
本次实现遵循了这个 Issue 中 maintainer 已确认的 Phase 0 contract。
最新一轮 review 也确认:
notes: undefinedP1 已修复。notes的 patch 语义现在有完整测试覆盖:undefined→ 保持不变null/""/ 纯空白字符串 → 清除revision仍然严格递增。record_json会 fail closed。recoveryState、graphState或resultRefs。相关的 core/storage tests、typecheck、build 和 Biome checks 均通过。
现在可以进行 review 了,谢谢!
somewan820 commentedon Aug 15, 2026
Hi liugddx — PR #3028 (Work Board Phase 0) is ready for review, but Astro-Han's review on the PR raised a product-scope question that I think only you can close, so I am posting the same reconciliation here before pushing any further commits.
Implementation status (all three findings from Astro-Han's review, fixed in
476eb218b):Revision CAS — read/check/write is now a single
BEGIN IMMEDIATEtransaction forupdate/archive/unarchive/remove, closing the cross-process overwrite race while keeping the in-process write queue.Linked-session projection — the projector (module, test, and package export) was removed. It was a parallel DTO using Core
TurnStatus, which cannot representwaiting_for_user/cancelledfrom the canonical continuity contract. It will be rebuilt beside the real Runtime Host / Desktop continuity adapter when Phase 3 has a consumer.Indexes — schema v9 now ships
(scope_kind, project_id, updated_at DESC, item_id DESC)and(updated_at DESC, item_id DESC).EXPLAIN QUERY PLANon populated data confirms no full-table scan or temporary sort for unscoped, scoped, and cursor queries.Migration test — now builds a schema-8 database from the released v0.1.6 operational-state fixture plus the exact v8 workflow DDL, then runs the real 8→9 migration path.
On scope: every semantic in PR #3028 maps to your 7-point review (#2560 (comment)) and the accepted revision (#2560 (comment)). #2290's Option 2 governs SessionTodo, not Work Board, and #2290 explicitly allows Phase 0 to proceed independently (#2290 (comment)).
The only Phase 0 item with no consumer today is
linkedSessions: the field exists in the schema, but Phase 0 has no mutation path that writes it and no UI or runtime caller reads it; Phase 3 "start as task" is the intended consumer.Could you confirm:
(a) Phase 0 remains the approved contract after #2290 Option 2, or should it be re-scoped to capture / list / complete / delete with optional project and source context?
(b)
linkedSessionsstays in schema v1, or moves to Phase 3 via a future additive migration?(c) The linked-session projection is formally deferred, or should Phase 0 include an implementation based on the canonical
SessionContinuitySnapshot/TurnSnapshot?Once you confirm, I will either keep the PR as-is or apply the narrow change before requesting merge.
简体中文
你好 liugddx —— PR #3028(Work Board Phase 0)已经可以 review,但 Astro-Han 在 PR 上提出的产品范围问题,我认为只有你能收口,所以在 push 任何新 commit 之前,把同样的对齐说明发在这里。
实现状态(Astro-Han review 的三个 finding 已在
476eb218b修复):Revision CAS:
update/archive/unarchive/remove现在是同一个BEGIN IMMEDIATE事务内完成 read/check/write,关闭跨进程覆盖竞争,同时保留进程内 write queue。Linked-session projection:projector(模块、测试、package export)已删除。它是一套平行 DTO,使用 Core
TurnStatus,无法表达 canonical continuity 中的waiting_for_user/cancelled。等 Phase 3 有真实消费者后,再放到 Runtime Host / Desktop continuity adapter 旁边实现。索引:schema v9 现在包含
(scope_kind, project_id, updated_at DESC, item_id DESC)和(updated_at DESC, item_id DESC)。用真实填充数据跑EXPLAIN QUERY PLAN确认:unscoped、scoped 和 cursor 查询都不再全表扫描或临时排序。Migration 测试:现在用发布的 v0.1.6 operational-state fixture + 精确的 v8 workflow DDL 构造 schema-8 库,走真实 8→9 迁移路径。
关于范围:PR #3028 的每个 semantic 都能对应你的 7 点 review(https://github.com/maka-agent/maka-agent/issues/2560#issuecomment-5294753604)和已接受的修订版(https://github.com/maka-agent/maka-agent/issues/2560#issuecomment-5294956443)。#2290 的 Option 2 约束的是 SessionTodo,不是 Work Board;#2290 也明确允许 Phase 0 独立推进(https://github.com/maka-agent/maka-agent/issues/2290#issuecomment-5298957426)。
Phase 0 里唯一今天没有消费者的是
linkedSessions:字段在 schema 里,但 Phase 0 没有任何 mutation 路径写入它,也没有 UI 或 runtime 调用方读取;Phase 3 “start as task” 才是消费者。能否确认:
(a) #2290 Option 2 之后,Phase 0 是否仍然以已批准契约为准,还是收缩为 capture / list / complete / delete + 可选的 project/source context?
(b)
linkedSessions留在 schema v1,还是移到 Phase 3(未来 additive migration)?(c) linked-session projection 是否正式推迟,还是 Phase 0 就要基于 canonical
SessionContinuitySnapshot/TurnSnapshot实现?你确认后,我会保持 PR 现状,或先做这个收窄改动再请求 merge。
fix(core,storage): defer linkedSessions to Phase 3 and bound active-l…
somewan820 commentedon Aug 15, 2026
Following up on your decisions — PR #3028 now matches the confirmed Phase 0 scope:
linkedSessionsis deferred to Phase 3 and removed from the Phase 0 contract/store/tests; the Phase 0 contract rejects the field in create input and stored records.SessionContinuitySnapshot/TurnSnapshotbeside the real continuity adapter.archived = 0list queries under archive-heavy data, with regression coverage in the store and migration tests.PR #3028 has been updated (commit
833481e64) and is ready for review. Once it passes, Phase 3 can pick uplinkedSessionsand the projection adapter.简体中文
跟进你的决定——PR #3028 现在与确认后的 Phase 0 范围一致:
linkedSessions推迟到 Phase 3,已从 Phase 0 契约/store/测试中移除;Phase 0 契约会在 create input 和已存记录里拒绝该字段。SessionContinuitySnapshot/TurnSnapshot实现。archived = 0list 查询的扫描成本,并已在 store 与 migration 测试中覆盖。PR #3028 已更新(commit
833481e64)并 ready for review。通过后,Phase 3 可以接手linkedSessions和投影 adapter。feat(core,storage): add Work Board Phase 0 contract and store (#3028)
somewan820 commentedon Aug 17, 2026
Phase 0 complete — PR #3028 merged
Work Board Phase 0 has landed via PR #3028 (squash commit
18c526c5a, merged 2026-08-17, approved by both liugddx and Astro-Han).What landed:
manual/main_conversation/side_conversation), user-owned lifecycle (todo/in_progress/done), archive invariant, exact-shape validation, and semantic patch semantics.WorkBoardStorewithBEGIN IMMEDIATEtransactional writes, monotonic revision +expectedRevisionCAS, keyset pagination bound to the query filters, archive-before-delete, active-row partial indexes, and fail-closed corruption detection.docs/work-board-contract.mdrecords the boundary, mutation contract, and deferrals.Maintainer-confirmed deferrals remain in place:
linkedSessions→ Phase 3, linked-session projection → Phase 3 (beside the canonical continuity adapter),resultRefs→ Phase 4. No Runtime Host, model-visible tools, or turn-tail injection were introduced.Next step is Phase 1 (separate kickoff comment follows).
简体中文
Phase 0 已完成 — PR #3028 已合并
Work Board Phase 0 已通过 PR #3028 落地(squash commit
18c526c5a,2026-08-17 合并,liugddx 与 Astro-Han 均已 approve)。落地内容:
manual/main_conversation/side_conversation、用户拥有的三态生命周期todo/in_progress/done、归档不变量、exact-shape 校验、semantic patch)。WorkBoardStore采用BEGIN IMMEDIATE事务、单调 revision +expectedRevisionCAS、绑定查询过滤条件的 keyset 分页、先归档后删除、active-row partial index、fail-closed 损坏检测。docs/work-board-contract.md记录了边界、mutation 契约与 deferral。maintainer 确认的 deferral 保持不变:
linkedSessions→ Phase 3、linked-session projection → Phase 3(放到 canonical continuity adapter 旁边)、resultRefs→ Phase 4。没有引入 Runtime Host、模型可见工具或 turn-tail 注入。下一步是 Phase 1(kickoff 评论随后发布)。
somewan820 commentedon Aug 17, 2026
Phase 1 kickoff — Work Board capture/list MVP
Phase 0 is merged (see previous comment). Per the delivery plan, I'm starting Phase 1: a compact Work Board surface in the existing task/workbar area, with global Inbox + current-project filtering, manual create / rename / move / complete / reopen / archive, and empty / loading / error / offline-local states.
Implementation slices: main-process
WorkBoardStore+ IPC → preload bridge → workbar panel. No Runtime Host involvement, no model-visible tools, no turn-tail injection.If the panel placement or the Inbox/project filter behavior should differ from the issue, let me know before I wire the UI; otherwise I'll post the Phase 1 PR here when it's ready.
简体中文
Phase 1 kickoff — Work Board capture/list MVP
Phase 0 已合并(见上一条评论)。按 delivery plan,我开始 Phase 1:在现有 task/workbar 区域做紧凑的 Work Board 面,支持全局 Inbox + 当前项目过滤,手工新增 / 改名 / 移动 / 完成 / 重开 / 归档,以及 empty / loading / error / 本地离线状态。
实现切片:main 进程
WorkBoardStore+ IPC → preload bridge → workbar 面板。不涉及 Runtime Host、模型可见工具、turn-tail 注入。如果面板位置或 Inbox/项目过滤行为和 issue 描述有出入,请在 UI 接线前告诉我;否则 Phase 1 PR 就绪后我会贴在这里。
somewan820 commentedon Aug 17, 2026
Phase 1 PR ready for review — Work Board capture/list MVP
PR #3135 implements the Phase 1 capture/list MVP from the delivery plan, on top of the merged Phase 0 contract/store.
What it adds:
WorkBoardStore; the renderer is a read-only IPC projection that reloads on theworkBoard:changedsignal.Boundary unchanged: no Runtime Host involvement, no model-visible tools, no turn-tail injection;
linkedSessionsand the linked-session projection remain deferred to Phase 3.Verification: desktop main/preload builds pass, full desktop typecheck passes, Work Board IPC tests pass. Full desktop suite runs in CI.
简体中文
Phase 1 PR 已就绪 — Work Board capture/list MVP
PR #3135 实现了 delivery plan 中的 Phase 1 capture/list MVP,基于已合并的 Phase 0 契约/store。
新增内容:
WorkBoardStore;renderer 是只读 IPC 投影,收到workBoard:changed信号后重载。边界不变:不涉及 Runtime Host、模型可见工具、turn-tail 注入;
linkedSessions和 linked-session projection 仍推迟到 Phase 3。验证:desktop main/preload build 通过,desktop 全量 typecheck 通过,Work Board IPC 测试通过;全量 desktop 测试由 CI 运行。
somewan820 commentedon Aug 24, 2026
Phase 1 merged — proposed next planning checkpoint
PR #3135 has merged as
863d7ae2c. Phase 0 and the Phase 1 capture/list MVP are now complete.Following @liugddx's review and the sequencing recorded in the Phase 1 doc, I will not start Phase 2 next. I propose that the next PR be a deliberately thin, default-off Phase 3 validation spike whose only goal is to test whether users return to the board and start work from it:
Start taskhappy path for an existing project-scoped board item;Before implementation, could maintainers confirm these three choices?
Start taskunavailable for Inbox items until an explicit project picker exists. This avoids silently choosing a workspace.linkedSessionscontract/migration, while continuing to read execution status only from the canonical continuity authority? I recommend a persistent link because an in-memory link cannot validate the “return later” loop across restart. If that is still too much machinery for the spike, I can keep the link experiment-only and defer the schema change.Once these are confirmed, I will turn the answer into a bounded technical slice and open the spike PR before doing any Phase 2 or Phase 4 work.
简体中文
Phase 1 已合并 — 下一步规划确认
PR #3135 已通过
863d7ae2c合并,Phase 0 与 Phase 1 capture/list MVP 已完成。按照 @liugddx 的 review 和 Phase 1 文档中确认的顺序,我不会直接开始 Phase 2。下一 PR 建议先做一个默认关闭、严格收窄的 Phase 3 验证 spike,只验证“用户是否会回到看板并从事项启动任务”:
Start taskhappy path;实现前请 maintainer 确认三点:
Start task,避免静默选择工作区。linkedSessions契约/迁移,同时执行状态仍只从 canonical continuity authority 读取?我倾向持久化,因为纯内存关联无法验证重启后的“稍后回来”闭环;如果对 spike 来说仍然过重,也可以先做仅实验可见的关联,把 schema 变更继续延后。这些边界确认后,我会把结论整理成一个有界技术切片,先提交 spike PR,再考虑任何 Phase 2/Phase 4 工作。
AI assistance disclosure: Codex helped inspect the merged PR and issue history and draft this planning checkpoint. I reviewed it and own the proposed scope and follow-up.
somewan820 commentedon Sep 2, 2026
Hi @liugddx, just following up on the Phase 3 validation spike proposal above.
PR #3135 is merged, and I am keeping implementation paused until the three scope questions are confirmed:
Start taskpathlinkedSessionsin the spike, or defer that schema changeIf the proposal is approved as written, a short confirmation is enough and I will prepare the default-off spike PR. Please let me know if any of the three points should be changed.
No rush — I just wanted to make sure this did not get lost in the issue queue. Thanks!
liugddx commentedon Sep 2, 2026
Thanks for following up. I rechecked the merged Phase 0/1 contracts and the current task-entry/session-creation path on
main@72eb982d5. The sequencing is still right: validate thecapture -> revisit -> startloop before Phase 2 or Phase 4. I approve a thin default-off spike, with the following scope corrections.Project-scoped only: yes, but the target must be Host-scoped. A persisted Work Board scope currently contains only
projectId, while task creation actually targets(profileId, hostId, projectId). Do not infer a Runtime Host from the project id or silently use whichever project is currently selected. EnableStart taskonly when the current Task Entry catalog resolves the item through an explicitDesktopNewTaskTarget, including project aliases, to an available and non-archived project. Otherwise disable it with an actionable reason. Inbox remains unsupported until it has an explicit target picker.Reuse the existing first-send owner.
session.createcreates an empty Session; Composer first-send currently owns readiness, the initial message, optimistic presentation, and cleanup when create/send fails. The Work Board must not add a parallelcreate Session -> send messageIPC flow. For the spike, the smallest path is: select the resolved Task Entry target, open the new-task surface, seed a bounded draft, and let the normal first-send path create/start the Session. Persist the link only after the normal submission has produced the durable Session/Turn outcome. The initial draft should use fields that have a production producer today: title plus optional notes. Do not invent a new provider-visible typed-reference format for conversation provenance before Phase 2 supplies that capture path.The link must be persistent in this spike. An experiment-only in-memory link cannot test the reason the store exists: returning after navigation/restart. Add a semantic, idempotent
linkSessionmutation owned byWorkBoardStore; do not expose whole-array replacement to the renderer and do not copy Session status into the item. The durable reference must be Host-scoped rather than a baresessionId, so a later reader can locate the Session on the correct Runtime Host. If Session creation succeeds and link persistence fails, retry must attach the same Session rather than create a duplicate, and the failure must remain visible/actionable. The board item's user-ownedstatemust not change automatically.Dogfooding is sufficient for the go/stop decision; product telemetry is not required. Please define the evidence checklist before implementation: whether the item existed before the action, whether the user completed the normal first send, whether the link survives restart and reopens the correct Host/Session, and whether any duplicate/orphan Session or manual repair was needed. Record the results here and make the go/stop decision explicit. The flag should be temporary experiment wiring, not a new persisted setting or public contract.
So the approved spike is narrower than a new Work Board execution subsystem: existing project item -> explicitly resolved Host/project target -> normal new-task draft/first-send -> durable idempotent link -> reopen after restart. Keep side-chat capture, Inbox target selection, execution-status projection, evidence/result refs, automatic completion, prioritization, and board redesign out. Phase 2 and Phase 4 remain paused until this produces a clear go decision.
简体中文
谢谢跟进。我基于已合并的 Phase 0/1 契约和当前
main@72eb982d5的 Task Entry / Session 创建链路重新核对过。顺序仍然正确:先验证捕获 -> 回看 -> 启动闭环,再决定是否继续 Phase 2/4。可以做 default-off 的薄 spike,但需要收紧以下边界:首期只支持 project item 可以,但目标必须带 Runtime Host 作用域。 Work Board 当前只持久化
projectId,实际创建任务需要(profileId, hostId, projectId)。不能只凭 project id 推断 Host,也不能静默使用当前选中的项目。只有 Task Entry catalog 能把事项解析成明确、可用、未归档的DesktopNewTaskTarget时才显示/启用Start task;需要兼容 project alias。Inbox 继续禁用,等明确的 target picker。复用现有 first-send 权威。
session.create只创建空 Session;readiness、首条消息、乐观展示和失败清理由 Composer first-send 负责。Work Board 不应再造一套创建 Session -> 发送消息IPC。最小 spike 应切换到解析后的 Task Entry target,打开新任务面并写入有界 draft,由正常 first-send 创建和启动 Session;只有正常提交产生了持久 Session/Turn 后才写回关联。首期 draft 只使用当前已有真实生产入口的 title + 可选 notes;Phase 2 尚未提供对话捕获,不要提前发明新的 provider-visible typed reference 格式。关联必须持久化。 纯内存关联无法验证“稍后回来”和重启后的闭环。新增由
WorkBoardStore持有的语义化、幂等linkSessionmutation,不允许 renderer 整体替换 linkedSessions,也不复制 Session 状态。持久引用必须是 Host-scoped,不能只有裸sessionId。如果 Session 已创建但回链失败,重试必须关联同一个 Session,不能再建一个;失败必须可见、可操作。事项的用户状态不能自动变化。Dogfood 足够作为 go/stop 信号,不需要产品 telemetry。 实现前先固定记录项:事项是否早于启动动作存在、用户是否完成正常 first send、重启后是否能重新打开正确 Host/Session、是否产生重复/孤儿 Session 或需要手工修复。结果写回本 Issue,并明确做 go/stop 决定。flag 只用于临时实验,不新增持久设置或公开契约。
因此批准的 spike 是:已有 project item -> 明确解析 Host/project target -> 正常 new-task draft/first-send -> 持久且幂等的回链 -> 重启后可重新打开。side-chat capture、Inbox 选项目、执行状态投影、result/evidence refs、自动完成、优先级和看板重设计继续排除。得到明确 go 结论前,Phase 2/4 保持暂停。
somewan820 commentedon Sep 3, 2026
Hi @liugddx — PR #4598 (Work Board Phase 3 start-task spike) has been rebased onto the latest
main(b9748a773) and the conflicts are resolved. Could you please review when you get a chance?What the rebase did:
main.onSessionResolvedcontract: an existing-Session send never reports a resolved Session, so the Work Board link path only binds a task to a Session whose first message actually projected (onNewTaskSessionResolved→linkWorkBoardSession).Local verification on the updated head (in progress / results):
@maka/desktoptypecheck: 0 errorsgit diff --check: cleanThe
testCI check is queued/running on the updated head.somewan820 commentedon Sep 4, 2026
已按 #4598 的 review 意见(3 个 P1 + 2 个 P2)完成修复并推送到 PR(新增 commit
18904be75):linkSession成功后才清除 claim;失败保留 Session id,同一 item 再次 Start 复用同一 Session 重试,不再创建重复 SessionworkBoard:linkSession校验 board item 的 project 所有权,Host validator 收到expectedProjectId并比对 Session 目标 project,跨 project 链接被拒绝linkedSessions改为单链接契约(新链接替换旧链接),不再无限追加;读取路径对旧多条目保持容错DEV环境,生产构建即使设置 flag 也不暴露实验路径新增 7 个测试覆盖上述场景;桌面 main-process 套件 2074 passed / 0 failed,typecheck / biome / 架构检查均通过。
@liugddx 麻烦有空再 review 一下,谢谢!
somewan820 commentedon Sep 4, 2026
感谢第二轮 review!已按新意见(2 个 P1 + 1 个 P2)修复并推送(commit
07065c5f2):draftKey只是 target-scoped draft bucket,已改为 app-shell 在每次打开 New Task surface 时递增 owner nonce(newTaskSurfaceNonceRef),claim 绑定 nonce。同 Host/project 重开 surface(相同 draftKey)是不同实例,首次发送不再误消费 claim——已补同 target 回归测试workBoard:linkSession现在把校验前读到的item.revision作为expectedRevision传入store.linkSession,store 在写事务内 CAS(不匹配抛operation_conflict)。并发 move 无法再写入错误 project 的 Session——已补 revision CAS fail-closed 测试,cross-project 测试改为 production 形状的 Session workspace 投影docs/work-board-contract.md已注明,持久化 pending-link intent 留待后续阶段)新增测试全绿:桌面 main-process 2076 passed / 0 failed,typecheck / biome / 架构检查通过。CI 正在跑(含先前 flaky prompt-rail e2e 的重跑验证)。
@liugddx 再麻烦看一眼,谢谢!
somewan820 commentedon Sep 28, 2026
Phase 3 dogfooding update (PR #5775)
I updated the Phase 3 documentation in
b4f08a9. The repository now records this as a mechanism-level result, rather than a contributor-declared final GO.This comment is the contributor evidence/request; no maintainer go/stop decision is recorded here yet. The decision remains pending on this issue.
Recorded run (2026-09-28, local development renderer with
VITE_MAKA_WORK_BOARD_START_TASK=1):Phase 3 dogfood fixeddid not pre-exist. It was created and then revisited in the same sitting.local, Hostceeaf9c96959c19f67f044adc9e05ba959f4810d576ff13498922e2da1ecaffe, and projectcf023c18-e57a-4dbc-9a47-fbe277892e63(maka).9a5a1cd1-c0a1-4be0-9510-97cef234db28.106/0. The direct SQLite check readworkflow_work_board_items.record_json. These are contributor-run observations; CI did not perform the manual renderer run.Limits and proposed status:
This verifies the mechanism: project item -> resolved Host/project target -> normal first send -> durable link -> restart/reopen. Please record the maintainer go/stop decision here; the proposed current status is mechanism verified, delayed return-use pending.
简体中文
本次记录已将结论收窄为“机制已验证”,不再由贡献者自行宣布最终 GO。由于事项是在同一次操作中创建并回看,尚未验证隔一段时间后用户是否会回到 Work Board;Phase 2 和 Phase 4 继续暂停,等待这里的维护者 go/stop 决策以及 delayed return-use 证据。
AI assistance disclosure: Codex helped structure this update from the
contributor-provided run record and review feedback. The contributor verified
the observations and owns the final status.
liugddx commentedon Sep 28, 2026
Phase 3 decision: GO for the start-task mechanism; Phase 2 and Phase 4 stay paused
Thanks @somewan820 for the run record and for narrowing the conclusion in #5775. I checked the record against the code at
b4f08a9, and the six-file targeted command reproduces at 106/0.Decision: GO for the mechanism. The run shows that the Phase 3 start-task path works end to end:
I accept this path as the Phase 3 mechanism.
What this unlocks. A follow-up PR may expose Start task outside development builds as an opt-in, default-off experimental entry, provided it:
work-board-contract.md, retry durability). Persisting the pending-link intent is the straightforward fix;What stays paused. The Phase 1 assumption is that users return to the board and start tasks from it, and this run doesn't establish that: the item was created and started in the same sitting. Phase 2 and Phase 4 remain paused until this thread has at least one run where the item was created on one day and started from the board on a later day. Record it with the same checklist fields, including any failed or repaired runs. I'll revisit Phase 2/4 on that evidence.
Status: mechanism verified (GO); delayed return-use pending; Phase 2/4 paused.
简体中文
决定:机制层面 GO。 这次试用证明了 Phase 3 "开始任务"链路端到端可靠:
我认可这条链路作为 Phase 3 的机制。
放行内容。 后续 PR 可以把"开始任务"作为需要用户主动开启、默认关闭的实验入口,开放到非开发构建,前提是:
继续暂停。 Phase 1 的前提是"用户会回到看板来开始任务",这次试用没能证明:事项是在同一次操作里创建并启动的。Phase 2 和 Phase 4 继续暂停,直到本 issue 里至少有一次"事项在某天创建、隔天之后才从看板启动"的试用记录。记录时使用同一份检查清单,失败或做过修复的试用也要一并记录。有了这类证据,我再重新评估 Phase 2/4。
状态:机制已验证(GO);延迟回访待验证;Phase 2/4 暂停。
docs(work-board): record Phase 3 dogfooding evidence (#5775)
somewan820 commentedon Sep 30, 2026
Phase 3 delayed return-use follow-up (contributor evidence)
This is a contributor evidence update and request for re-evaluation; it is not a
maintainer go/stop decision. The follow-up branch records the run in
docs/work-board-phase3.mdat10b743823.Run: 2026-09-30 local development renderer
看下明天天气(
c250ba05-764b-4dcc-9a96-f6ca5061d578) pre-existed the run. The read-onlyrecord was created at
2026-09-21T17:01:44.823Z, last updated before the runat
2026-09-22T07:36:59.279Z, and had an emptylinkedSessionsarray.local, Hostceeaf9c96959c19f67f044adc9e05ba959f4810d576ff13498922e2da1ecaffe, projectcf023c18-e57a-4dbc-9a47-fbe277892e63(maka).VITE_MAKA_WORK_BOARD_START_TASK=1using the Vitedevelopment renderer and Electron at
http://127.0.0.1:5174/.Task surface with the bounded item title. The send streamed and completed in
1 minute 19 seconds after one city clarification (Shanghai). A sandboxed Bash
weather lookup failed, then the normal web-fetch fallback completed; this was
not a Session-link failure and needed no manual repair.
the completed conversation reopened with the same prompt and transcript.
Current project showed Open session, which returned to that same
conversation.
workflow_work_board_items.record_jsonfound revision9, exactly oneHost-scoped link to Session
0215bc49-ab13-43b3-afff-19be12cb42f6, and updatedAt2026-09-30T07:05:44.657Z. A read-onlysession_create_claimsquery over thesurrounding one-minute window returned exactly that one claim. No duplicate
or orphan Session was observed on this successful path.
because doing so would require mutating the local runtime database. The
documented spike limitation therefore remains; manual repair was none.
Verification
npm --workspace @maka/runtime-host run build— passed.npm --workspace @maka/desktop run build:renderer— passed.node --test apps/desktop/dist/main/__tests__/work-board-panel.test.js apps/desktop/dist/main/__tests__/work-board-start-task-gate.test.js— 8 passed, 0 failed.git diff --checkandnpm run check:asf-headers— passed.npm run buildremains blocked in the pre-existing runtimeExperimental_OpenResponsesBareExtensionAPI mismatch inpackages/runtime/src/deepseek-web-search-codec.ts; the manual renderer runand SQLite inspection were not performed by CI.
The later-day run now supplies the delayed return-use evidence requested in the
maintainer decision. Until a maintainer updates the decision, the recorded
status remains mechanism verified (GO); delayed return-use pending; Phase 2/4
paused. Please record whether this evidence changes that status.
简体中文
这是贡献者的延迟回访证据和复评请求,不是维护者决定。事项在更早日期已存在,9 月 30 日从看板启动;首发完成,重启后从看板打开同一会话,SQLite 中只有一个 Host 作用域关联和一个创建 claim。成功路径没有重复/孤儿会话,也没有手工修复;关联失败后重启再重试仍未覆盖,原有 spike 限制保留。
在维护者更新决定前,状态继续保持:机制已验证(GO);延迟回访待定;Phase 2/4 暂停。
AI assistance disclosure: OpenAI Codex helped structure this update from the
contributor-verified renderer and SQLite observations. The contributor owns the
final status.
somewan820 commentedon Sep 30, 2026
Correction to the verification note above
The dogfood checkout's
@maka/runtime-hostbuild passed before I rebased thefollow-up branch onto the current
origin/main. On the exact rebased head(
e23dd7f15), that build now stops at the baselineTS2367comparison inpackages/runtime-host/src/server/canonical-turn-snapshot.ts, introduced bythe current mainline handoff change (#5853); no runtime-host files are changed
by this follow-up. The root build also remains blocked by the existing
Experimental_OpenResponsesBareExtensionmismatch inpackages/runtime/src/deepseek-web-search-codec.ts.The renderer build still passes, and the final-head Work Board/controller
focused suite passes
122/122when run with the required local cachepermissions. The docs now distinguish the historical dogfood build result from
the current-main baseline blockers.