Memory 主体
Group context/revision、Turn owner snapshot、merge/cutover evidence、ungroup reset trigger。
私人 Memory 的有效 owner 永远只有一个。Ungrouped 继续用老表;进入 Group 后直接切到 Group 的一份 Memory,不再展示多组概念。
work_session_context只服务未分组 Work Session;沿用已发布表和 wire 名称。
非空 Session Memory 以固定格式 append 一次,留下不可变证据,然后活跃 Session owner 置空。
普通 Group 用 work_session_private_group.context;PIWG 用当前用户的 work_project_group_projection.context。共享 Project Rules/Memory 保持原样。
把 v0.0.1 已存在的 grouped Session Memory 按 Group 确定性拼接上移。
initial 后若旧 Server 又写 Session Memory,只补合并没有被精确覆盖的新 revision/content。
Session ID、revision、原文全部相同,并且 merge kind 与完成 epoch 的 run kind 匹配。
Turn 创建时冻结 owner 与目录集合,后续移动 Session 或编辑目录不会篡改已建任务。
Group context/revision、Turn owner snapshot、merge/cutover evidence、ungroup reset trigger。
Group 目录 binding 与 Turn 目录 snapshot;可以被独立 feature flag 关闭。
把 handler 层 creator 检查提升成数据库复合外键。
已经执行早期 255 的数据库不会重跑旧编号,需要新编号替换危险 trigger。
持久化 initial/reconciliation 类型,使 cutover 后旧 writer 污染可恢复、可审计。
| 对象 | 新增 | 数据库约束 |
|---|---|---|
work_session_private_group | context、context_revision | revision > 0;最多 32,000 codepoints 与 131,072 UTF-8 bytes |
work_project_group_projection | context、context_revision |
PIWG 在这里新增的是私人 projection Memory;老的共享 Project Rules/Memory 继续走老字段。
agent_task_queue 增加 work_private_memory_scope、work_private_memory_group_kind、work_private_memory_group_id。CHECK 只允许:三列全空、Session owner、完整 Group owner。这样 Group A 创建的 Turn 不会因 Session 后来移到 B 而写进 B。
work_group_memory_merge 保存来源 Session/revision/原文/hash、目标 Group/revision/全文 hash、source order、merge kind、cutover epoch。UNIQUE(epoch, source_session_id) 防同批重复;保留原文而不是只留 hash,才能真实回滚与审计。正常 Context 路径不读它。“不可变”是应用和发布规则;schema 没有另设 trigger/RLS 禁止管理员直接 UPDATE/DELETE,受控数据库权限和 runbook 仍是证据完整性的一部分。
work_group_memory_cutover 保存 epoch、initial|reconciliation、source/group count、manifest SHA-256。部分唯一索引保证最多一个 initial。
它覆盖普通移出、Group 删除、PIWG dismiss、Project delete/access revoke 与 FK cascade,不依赖每个 handler 都正确实现。
只要已有 cutover、merge evidence、非空/非初始 revision 的 Group Memory,或任务 owner snapshot,就抛异常。仅在确认从未承载有效数据时才删 trigger、表和列。生产 cutover 后的回滚不能靠 255 down,而要按 ledger 恢复 Session owner。当前没有自动 --rollback 命令;恢复 SQL/脚本与 representative snapshot rehearsal 仍是生产前 release blocker(OpenSpec task 4.9)。
| 字段 | 语义 |
|---|---|
workspace_id / creator_id | Workspace 与私人 owner |
private_group_id / project_id | XOR:必须且只能有一种 Group owner |
daemon_id | 路径所在设备;同样的路径字符串可在不同设备分别注册 |
local_path / path_key | 展示/执行路径与 daemon canonicalize 后的判重键 |
label / position | 1–200 字符显示名与稳定排序 |
private Group FK 同时约束 group/workspace/creator;256 的 Project FK 先只约束 project/workspace,creator projection 由 257 补严。部分唯一索引按 creator + group + daemon + path_key 判重;排序索引按 position、id 返回。
agent_task_queue.work_group_directory_snapshot 是非空 JSON array,默认 []。它冻结 Server 当时选择的当前 Runtime 设备目录,客户端不可写。claim 时由 Server 根据 claimant capability、持久 Runtime capability 与 feature flag 校验、剥离或 requeue;daemon 负责声明能力并消费通过校验的 snapshot。
目录表有任何 row,或任一 task snapshot 非空,就拒绝 destructive rollback。目录功能正常回滚是关闭 work_group_directories_v1 并保留 binding,不是删表或删用户本地文件。
先从已有 Project 目录 binding 中 SELECT DISTINCT workspace_id, creator_id, project_id,幂等补建缺失的 work_project_group_projection;再增加:
(workspace_id, creator_id, project_id) → work_project_group_projection(workspace_id, user_id, project_id)
因此 PIWG 目录从“属于这个 Workspace 的 Project”收紧为“属于当前 creator 的私人 PIWG projection”。projection 删除时目录 cascade。Down 只删 FK,不猜测和删除 up 阶段补建的 projection,可能留下无害空 row,但不会误删 Memory。
早期 255 trigger 曾可能在 expand schema 与旧 Server 共存时,因 ungroup/delete 直接清空仍然权威的 grouped Session Memory。已执行数据库不会自动重跑后来修订的 255,所以 258 用 CREATE OR REPLACE FUNCTION 把 exact evidence fence 安装到这些数据库。
258 是过渡兼容形态:placement evidence 可直接授权;历史/reconciliation merge 只要关联到已完成 epoch 即可。259 再把 merge kind 与 run kind 配对收紧。
Down 故意是 no-op:只输出 NOTICE,不恢复已知会丢数据的旧函数。安全修复一直保留到未来明确移除整个 255 模型。
run_kind,历史 completion 默认 initial。已有 reconciliation completion/evidence 时拒绝 down。否则先恢复不引用 run_kind 的 258 安全函数,再删除 initial 唯一索引、把 merge kind 收窄、最后删除 run_kind。
42703。当前顺序已修复,并覆盖无 context、无 evidence 原文保留、historical exact evidence 清空、reconciliation evidence 拒回滚和 down 后重新 up。真正执行历史合并的是 server/cmd/work_group_memory_cutover/main.go,不是 migration 里的一条大 UPDATE。
work_group_memory_cutover --preflight --read-only work_group_memory_cutover --apply \ --cutover-epoch <initial-uuid> \ --expected-manifest-sha256 <approved-final-scan-sha256>
若旧 writer 在 initial 后写出新 grouped Session revision/content,startup fence 拒绝新 Server;停止旧 writer 后,用新 epoch 只选择未被精确 evidence 覆盖的来源:
work_group_memory_cutover --reconcile --preflight --read-only work_group_memory_cutover --reconcile --apply \ --cutover-epoch <new-reconciliation-uuid> \ --expected-manifest-sha256 <approved-reconciliation-sha256>
完成 epoch 在没有新污染时可幂等重试;同 epoch 出现新来源必须拒绝并重新 preflight/换 epoch,避免旧审批 hash 被挪作新用途。
允许启动;fresh DB 也属于此类。
拒绝启动,要求 initial preflight/apply。
拒绝启动,要求新 reconciliation epoch。
| 时点 | 正确动作 | 不要做 |
|---|---|---|
| expand 后、cutover 前 | 继续旧 Server;关闭新 surface;保留未合并原文 | 先启动只认 Group owner 的新 Server |
| initial apply 失败 | 让 transaction rollback;修正 manifest/容量/在途任务 | 手改 completion/evidence |
| cutover 后回旧 binary | 写栅栏、排空 Turn、按 ledger 恢复 Session owner,再切 binary;生产前先固化恢复 SQL/脚本并 rehearsal | 跑 255 down;双读两套 owner |
| 旧 writer 污染 | 新 epoch reconciliation | 重跑 initial、清空来源、复用旧 epoch |
| 关闭目录功能 | 关 work_group_directories_v1,保留 binding | 跑 256 down、删除本地目录 |
没有新环境变量、Secret、DNS、TLS、Ingress 或第三方控制台配置。
| 工作 | Owner / 时机 | 阻塞项 |
|---|---|---|
| Early/Exact/Final Scan 与容量例外闭环 | 数据 owner + release captain;候选冻结前 | 生产 cutover |
| 停旧 writer/worker,排空或取消在途 grouped snapshot | release captain;维护窗 | authoritative cutover |
| 保存并双人核对 manifest SHA-256 | 数据 owner + release captain;apply 前 | cutover |
| initial apply,核对数量与 startup fence | release captain;维护窗 | 新 Server 启动 |
| 固化 rollback SQL/脚本并做 representative v0.0.1 snapshot rehearsal | 数据 owner + release captain;生产 cutover 前 | emergency rollback readiness |
| 保留 evidence 与旧 Session rows | 数据 owner;回滚窗口 | 数据恢复能力 |
| macOS/Windows 目录 UAT | Desktop/QA owner;feature 开启前 | 目录功能发布 |
reconciliation 只在真实污染时发生,不是周期任务。持续成本是回滚窗口内的证据存储、发布期 fence/flag 监控,以及下一稳定版本对临时 fence 的移除审批。
255–259 已全部应用。
1 个 initial epoch,把 11 个来源合入 3 个 Group。
当前无未被精确 evidence 覆盖的非空 grouped Memory。
当前 QA snapshot 不需要恢复批次。
这是 2026-08-18 production-shaped QA DB 的只读证据,不替代正式生产 Final Scan。
/api/config 返回 200 并广告相关 capability。Codex in-app Browser 不受锁屏影响,但其 URL 安全策略拒绝本机 localhost,并禁止换其他 surface 绕过,因此不能宣称真实功能 UI 已通过 Browser 验收。此公开 HTML 可用 Browser 验收;真实 UI 需要 Browser 可访问的 QA 域名或人工验收。