Compare commits

...
Author SHA1 Message Date
weichen 4348d4ebc4 Record T1 verification results
Why: Delivery gate requires a verification record with per-case PASS evidence
  for the T1 contract task before requesting review.

Evidence: record covers core/agent-command/frontend/ui suites, combo test and
  the additive-compatibility check; contract change list enumerated.

Impact: Documentation only.

Refs: Dev task feature/core-cards-commands-r1
2026-09-30 06:27:15 +00:00
weichen 023daeffaa Merge pull request 'Add UI foundation proposal (inbox, command bus, workspaces)' (#8) from feature/ui-foundation-r0 into main 2026-09-30 05:48:38 +00:00
weichen cf801f25d7 Add UI foundation proposal (inbox, command bus, workspaces)
Why: Record the approved design for the interaction foundation phase — inbox/
  command-bus/workspace mechanisms sink into the base system, domain views stay
  plugin territory (target-system strategy), decisions D25-D33.

Evidence: proposal covers background, five UI principles, dialogue-completeness
  P0 constraint, module/repo split (Agent-System-UI, Agent-Command), contract
  sketch, task sequence T0-T5 and acceptance criteria.

Impact: Becomes the design baseline for T0-T5 tasks across five repos.

Refs: Agent-System-Dev feature/ui-foundation-r0
2026-09-30 05:48:38 +00:00
weichen 8bc875e7ab Merge pull request 'Record the parallel-duplication lesson, follow-ups, and startup config usage' (#7) from feature/duplication-lesson-records into main 2026-09-30 04:44:32 +00:00
weichen faeed84f01 Record the parallel-duplication lesson, follow-ups, and startup config usage
Why: boot-config 重复交付事故须按 documentation.md 经验闭环沉淀:根因与
检查动作入经验条目、处置与后续项入过程记录;使用指南启动节仍是纯 CLI
旧文案,需反映已上线配置面(PR#4/PR#12)。

Evidence: 经验条目按 lesson 模板(candidate 状态、事故时间线与完整 SHA
回链);usage §1.3 与已合入实现实测一致(config explain 逐字段来源与
DSN 脱敏、serve --config envs/dev.json 落 data-dev)。

Impact: docs/records/ 新增 lesson-parallel-session-duplication 与
boot-config-followups 两条;docs/guides/usage.md §1.3 重写为四源合并 +
多环境启动说明;无代码影响。

Refs: Agent-System-Backend PR#4(66b4bbf5)与 PR#5(8270acf5,已关闭留
差异清单);本仓 PR#6(配置面设计);Agent-System-Dev PR#12(a58f85e)。
2026-09-30 04:44:08 +00:00
weichen 84b3421b12 Merge pull request 'Design the startup configuration surface and instance conventions' (#6) from feature/config-surface into main 2026-09-30 04:15:04 +00:00
weichen abc1a6d784 Design the startup configuration surface and instance conventions
Why: the backend startup layer had only defaults and CLI flags; the
configuration standard's baseline (file, env, CLI layers, read-only explain,
instance isolation) requires the full pipe for dev/test/prod operation.
Evidence: fields and categories mapped one-to-one onto the existing app
Options; runtime settings API kept as the separate business-policy layer.
Impact: design record only; implementation follows in the backend repo.
Refs: standards/configuration.md; backend feature/config-surface
2026-09-30 04:15:03 +00:00
weichen 9b761245b2 Merge pull request 'Record the restore drill: safety net verified, chain gap closed' (#5) from feature/restore-drill into main 2026-09-30 04:03:24 +00:00
weichen 011fd13def Record the restore drill: safety net verified, chain gap closed
Why: the migration safety net (archive refs, bundles, SHA maps) had never
been exercised; verification rules treat untested recovery as a claim.
Evidence: 15/15 drill checks in a remote-only fresh environment (fsck, tip
and count matches, go test passing on the restored pre-rewrite tip, parent
gitlink reachability); the found gap — chain SHAs only in local bundles —
fixed by pushing refs/rewrite-backup/pre-2026-09-30-chain.
Impact: record-only; backend full-chain restore noted as a known, accepted
limitation.
Refs: 2026-09-30-history-migration.md; 2026-09-30-history-migration-sha-map.md
2026-09-30 04:03:24 +00:00
weichen 220513825e Merge pull request 'Archive the commit-level SHA maps into the records' (#4) from feature/archive-sha-maps into main 2026-09-30 03:54:59 +00:00
weichen 7bcc407704 Archive the commit-level SHA maps into the records
Why: the migration recovery data lived only on the migration workstation;
before the local backup bundles are retired, the maps belong in the
process repo per the single-source rule.
Evidence: combined from backups-2026-09-30/mapping-*.txt (10 repos + parent
+ restored chains); migration record pointer updated.
Impact: record-only; enables the scheduled local backup cleanup while
remote archive refs remain the full safety net.
Refs: 2026-09-30-history-migration.md
2026-09-30 03:54:59 +00:00
weichen 2ec3e509b2 Merge pull request 'Record the empty-list and shared-checkout delivery lessons' (#3) from feature/lessons-2026-09-30 into main 2026-09-30 03:48:33 +00:00
weichen c41087cf39 Record the empty-list and shared-checkout delivery lessons
Why: both 2026-09-30 incidents produced reusable causal knowledge (nil-slice
JSON null vs .map; shared-checkout conflicts and gitlinks pinning unpushed
commits) that meets the lesson bar of trigger, mechanism, checks, and
verified guards.
Evidence: incident records and fix PRs referenced inline; guards validated
in policy/adoption.md and the tool-adaptation matrices.
Impact: record-only; documents no product code.
Refs: Agent-System-Dev 8f7cf2d; Agent-System-Backend fix/empty-list-json
2026-09-30 03:48:20 +00:00
weichen 5280666dd8 Merge pull request 'Record the 2026-09-30 commit history migration' (#2) from feature/history-migration-record into main 2026-09-30 03:16:15 +00:00
weichen f8e7eb913b Record the 2026-09-30 commit history migration
Why: the composition-wide message normalization rewrote ten repos; the
governed-migration rule requires bundle backups, archive refs, SHA maps, and
a recovery record in the process repo.
Evidence: per-repo commit counts and empty tree diffs captured during
execution; remote mains verified against local after force-push.
Impact: record-only; documents no product code. Also records the
multitenancy delivery defect (gitlinks pinning unpushed commits) and its
remediation.
Refs: Development-Guidelines 0.1.0-draft.7 multi-repo.md; Agent-System-Dev ef89fc8
2026-09-30 03:15:58 +00:00
weichen b183511393 Merge pull request 'Adopt the task-startup gate and commit format in AGENTS.md' (#1) from feature/entry-docs-gate into main 2026-09-30 03:15:24 +00:00
10 changed files with 451 additions and 3 deletions
+17 -3
View File
@@ -28,16 +28,30 @@ make test # 全量测试
make demo # 一键演示(构建 + mock 模式启动)
```
### 1.3 启动
### 1.3 启动与配置(配置文件 / 环境变量 / 命令行)
```bash
agent-system serve [--addr 127.0.0.1:8787] [--data ./data] [--plugins ./plugins] [--mock]
agent-system serve [--config envs/dev.json] [--addr 127.0.0.1:8787] [--data ./data] [--plugins ./plugins] [--mock]
agent-system config explain [--config envs/prod.json] # 只读诊断:逐字段生效值与来源,DSN 脱敏
agent-system version
```
- `--data`:SQLite 数据库与工件对象目录(默认 ./data)。
启动参数四源合并,优先级从低到高:**内置默认 → 配置文件(`--config`,显式 JSON,无自动发现)→ 环境变量(`AGENT_SYSTEM_ADDR/DATA/PLUGINS/DSN/ARTIFACTS/AUTH/MOCK`)→ 命令行**;未显式传入的命令行参数不参与覆盖,删除 override 恢复继承。字段:`addr`(监听)、`data`(工作区根目录)、`plugins`、`dsn`(空 = 嵌入式 SQLite 档,非空 = PostgreSQL 档)、`artifacts`、`auth`(auto/on/off)、`mock`;未知键与类型错误在启动时定位报错,不静默失效。
**多环境启动**——仓库自带隔离示例 `envs/{dev,test,prod}.json`(data 根与 DB 互不重叠):
```bash
agent-system serve --config envs/dev.json # mock 开、./data-dev
agent-system serve --config envs/test.json # 127.0.0.1:8788、./data-test
agent-system serve --config envs/prod.json # PostgreSQL 档、auth on、独立卷
AGENT_SYSTEM_CONFIG=/etc/agent-system.json agent-system serve # 环境变量定位文件
```
- `--config`:显式配置文件(平面 JSON,键同上);单点覆盖仍可用 `--addr`/`--dsn` 等同名参数压过文件。
- `--data`:工作区根目录(SQLite 数据库与工件对象目录;默认 ./data)。
- `--plugins`:插件目录(声明资产热加载,见 §6)。
- `--mock`:演示模式——不调用任何模型,按脚本回放完整交互(首次体验推荐)。
- 模型、检索、限流等**运行时设置**在设置页(§2),属业务策略层,不进启动配置文件——设计边界与实例隔离约定见[配置面设计](../proposals/2026-09-30-configuration-surface.md)。
浏览器打开 `http://127.0.0.1:8787` 即三栏工作台(开发期前端热更新:Dev 仓 `make dev`)。
@@ -0,0 +1,39 @@
# 配置面设计:来源层级、字段与多实例约定
状态:已批准(随实现交付);主任务:Agent-System-Backend feature/config-surface。
规范依据:Development-Guidelines standards/configuration.md(单一解析管道/启动依赖/独立实例),本记录是其项目级消费,不复制其正文。
## 目标与非目标
目标:Agent-System 的**启动层**配置支持 内置默认 → 显式配置文件 → 环境变量 → 显式 CLI 四源合并,并提供只读 `config explain` 诊断;给出 dev/test/prod 实例约定。
非目标:运行时业务设置(/api/settings 的 user/project scope、profiles 模型路由)——那是配置类别表中的"产品业务策略"层,归授权服务读写,不参与启动合并;两者字段不重叠。
## 字段与类别(全部启动部署连接类)
| 字段 | 默认 | 环境变量 | 说明 |
|---|---|---|---|
| addr | 127.0.0.1:8787 | AGENT_SYSTEM_ADDR | 监听入口 |
| data | ./data | AGENT_SYSTEM_DATA | 工作区根目录(SQLite+工件默认根) |
| plugins | ./plugins | AGENT_SYSTEM_PLUGINS | 插件资产目录 |
| dsn | 空(嵌入式档) | AGENT_SYSTEM_DSN | PostgreSQL 档连接(explain 输出脱敏) |
| artifacts | 空(=<data>/artifacts) | AGENT_SYSTEM_ARTIFACTS | PG 档共享工件卷 |
| auth | auto | AGENT_SYSTEM_AUTH | on/off/auto |
| mock | false | AGENT_SYSTEM_MOCK(true/false) | 演示模式 |
配置文件:`--config <path>` 显式传入(JSON,键同上驼峰式);无自动发现、不从 cwd 猜(configuration.md"路径按明确 config root 解析")。未知键/类型错误须报出字段名;显式传入而缺失即报错。只有实际传入的 CLI 参数参与覆盖(flag.Visit 判定"显式")。
## dev / test / prod 实例约定(独立实例核对单)
| 维度 | dev | test | prod |
|---|---|---|---|
| 档位 | 嵌入式 SQLite | 嵌入式 SQLite | PostgreSQL(dsn) |
| data 根 | ./data-dev | ./data-test | 独立卷 + artifacts 共享卷 |
| addr | 127.0.0.1:8787 | 127.0.0.1:8788 | 按部署 |
| mock | true | false | false |
| auth | auto(=off) | off | on |
隔离要求(configuration.md 独立实例):三环境 data 根/artifacts/DB **不得目录重叠或同库**;实例身份来自 config 文件内容而非目录名/cwd;示例文件 `envs/{dev,test,prod}.json` 随仓提供,prod 示例不含真实 DSN。
## 验收
internal/config 单测覆盖:四源优先级、未设置 CLI 不覆盖、mock 布尔解析、未知键定位报错、缺文件报错、explain 源标注与 DSN 脱敏;`config explain` 只读(不建 DB、不写业务目录);三示例文件可被 `--config` 实际解析。
@@ -0,0 +1,107 @@
# 界面交互底座:任务收件箱、命令总线与工作区弹层 —— 设计与实施提案
状态:**已批准(2026-09-30 用户批准总体方案与 T0 实施计划)**;owner:weichen;主任务:Dev 仓 `feature/ui-foundation-r0`。
规范依据:Development-Guidelines(standards/module-contracts.md、standards/multi-repo.md、workflows/delivery.md);本文是项目级消费,不复制其正文。
撰写日期:2026-09-30。
输入:目标系统设计全集(`~/downloads/agent-system-design`,01–09 文档 + V2.2.1 原型);Agent-System 现状(v0.1.0 骨架)。
---
## 1. 背景与决策
### 1.1 战略
目标系统(智能研发管理系统:研发记忆与体系文档智能体,"两树一网"数据模型)**不直接实现**;先把 Agent-System 基座完善为 Kimi/Codex/Claude 级通用智能体工具(对话、检索研究、文档生成/总结),目标系统未来以插件形式承载。拆分判据:
- **通用交互机制 → 基座核心**:任务卡片收件箱、内联确认卡(双现/阻断/折叠)、命令总线(按钮与对话同源)、工作区弹出层、卡片↔消息互定位、徽标计数、拖拽投放、入口对称提示。
- **域数据与视图 → 插件**:文档树、追溯网、需求大表、变更单、记忆库笔记树、缺项分析、阶段门禁(目标系统 01–09 文档届时即插件需求基线)。
- **不采纳项**:按比例连续滚动同步(演示级实现,互定位已覆盖其价值);全局顶栏(D26 否决)。
### 1.2 界面五原则(从目标系统提炼,成为基座通用准则)
1. **中栏做空**:中栏只有对话与上传;一切有后果的操作收敛为卡片上的显式点击。
2. **消息是事件流,卡片是状态对象**:异步任务的有生命周期状态常驻右栏收件箱,不塞时间流。
3. **页面 = 加速器与显微镜**:弹层只承担深读/批量/空间导航,不承载任何唯一步骤。
4. **待办不沉没**:待决策事项进收件箱(筛选 + 计数 + 置顶 + 双现投影)。
5. **一切可解释、确认即留痕**:卡片带来源锚点;确认动作回写对话时间线 + 审计。
### 1.3 对话完备性(P0 硬约束)
从打开系统到完成一轮完整工作**全程只碰中栏**:建/切项目、建/切会话、上传(拖拽/粘贴/路径)、查资料、生成/总结文档、工件查看导出、画像与设置增改、插件装卸——每项都是命令总线上的注册命令;插件注册的每个操作**必须**同时声明命令路径(manifest 验收项)。"零页面走查"(建项目→拖资料→查资料→生成文档→导出→归档,唯一点击=对话流内确认卡)为每期回归用例;T0 退回(卸载全部插件)后剧本仍须全程通过。
## 2. 决策(D25–D33,延续 D1–D24 编号)
| # | 决策 | 理由 |
|---|---|---|
| D25 | 右栏终态**纯收件箱**,分两步:R2 收件箱置首(tabs 暂留)→ R4 工作区落地后移除经典 tabs(Plan/Todos 变"当前任务"常驻卡;工件/代理/插件面板变工作区) | 保留 tabs 的成本在心智不在代码;右栏只回答"现在要我做什么" |
| D26 | **不加全局顶栏**;中栏会话头左侧加项目徽章;通知 = 收件箱计数 + tab 角标 + toast | 对话区垂直空间优先;与 Kimi/Claude/Codex 一致;将来要加是纯加法 |
| D27 | **保留 `/` 命令菜单**;命令总线统一后 `/`、自然语言、按钮、卡片 action 四入口同源(POST /api/commands/{id},同一审计) | 与目标系统 V2.2.1"自然语言唯一"不冲突:两者同源不分叉;通用骨架保留效率入口,插件可配置隐藏 |
| D28 | UI 词汇新增 7 项:`progress / compare / tree / table / steps / tabs / timeline`;`graph` 远期,且追溯类视图强制"对象为中心 + 分组泳道 + 逐层展开 + 图标文字标签",禁止力导向裸图 | 目标系统五视图的表达需要;追溯图"看不懂"教训(用户裁定)固化为设计约束 |
| D29 | 新仓 **Agent-System-UI**(Dev 仓 `modules/ui`):UI 词汇渲染器 + 设计令牌 + 收件箱/卡片/工作区展示组件;纯展示(props 进 events 出);v1 源码组合(vite/tsconfig `@ui` 别名),出现第二宿主再包装发版 | 渲染层可复用与独立测试;不为几个类型建仓的判据未被突破(组件库是独立职责) |
| D30 | 新仓 **Agent-Command**(Dev 仓 `deps/agent-command`):命令 spec 格式、注册表、危险分级、执行结果四态(committed/accepted/rejected/unknown)、审计信封;纯 Go 无 I/O,宿主注入存储与执行;backend 经嵌套 submodule + replace 组合(`internal/cmdbus` 组合它,同 intentgate 之于 agent-intent) | 与 agent-intent 构成"识别→执行"分层的生态位;schema 权威在生态库,Core 只登记资产名(同 agent-intent 先例) |
| D31 | 对话完备性为基座 P0(见 1.3) | 用户裁定:"从项目创建到结束都可通过纯对话完成"是硬要求 |
| D32 | 卡片↔消息锚点互定位做;按比例连续滚动同步不做 | 目标系统 8.2 自认演示级应换锚点联动 |
| D33 | `cardsvc` / `cmdbus` 为 backend **L1 包**(不拆仓);模块卡写入 `modules/backend/policy/modules/`(项目既定约定的首次落地);模块卡中写明升级拆仓触发条件 | 规范:"不要为了复用两三个类型就新增一个独立公共仓库" |
## 3. 模块与仓网
### 3.1 既有仓职责增量
| 仓 | 增量 |
|---|---|
| Core | `activity.go`(ActivityCard 模型 + 状态机 + card.* 事件入信封);`hitl.go` 增 AnchorMessageID / Blocked / BlockReason;`ui.go` 增 D28 七词汇类型;`plugin.go` Provides 增 `commands` / `workspaces`、WorkflowStep 增 `card` kind、Workspace 声明类型;ts/types.ts 与 golden 样本同步 |
| Backend | 新 L1 包 `internal/cardsvc`(卡片生命周期/存储/API/事件发布/摄取卡/编排卡/HITL 投影卡)与 `internal/cmdbus`(组合 Agent-Command:注册、执行分发、审计落盘、danger→内联确认卡收口);server 增卡片与命令路由;ingest/squadadapter 产卡;`policy/modules/` 两张模块卡 |
| Frontend | Inbox 面板(收件箱/筛选/置顶/收纳/计数角标)、InlineConfirmCard(锚定内联/阻断/已决折叠/双现)、cardlink 互定位、拖拽投放区、OverlayHost 工作区弹层、⌘ 快捷键、左栏工作区快捷区 + 项目徽章 |
| Documents | 本提案、各任务验证记录、usage/插件开发指南更新 |
### 3.2 新仓接线(本提案 T0 落地)
- 建序:Gitea API 建仓(auto_init,描述按 §4)→ main 分支保护(禁直推 + 拒绝陈旧候选)→ 骨架与代码均经 feature 分支 + PR。
- Dev 仓:`git submodule add`(`modules/ui`、`deps/agent-command`);Makefile:`contracts` 双份生成(frontend + ui)、`test` 增 test-ui、`pin` 清单加两仓;build 链 core→contracts→frontend(经别名编入 ui)→backend。
- Backend:嵌套 `.gitmodules` 加 `deps/agent-command` + `go.mod replace agent-command => ./deps/agent-command`(T0 只接线,T1 消费)。
- 依赖方向:`frontend → ui → core(类型)`;`backend → agent-command`;Core 不依赖任何新仓;无环。
## 4. 契约设计要点(实现以 Core 为权威)
```
ActivityCard{ ID, ProjectID, ConversationID, SourceRunID, AnchorMessageID,
Kind: progress|confirm|compare|review-list|result|error|status|<plugin>,
Title, Status: active|action_required|done|resolved|failed|dismissed,
Tone: ok|warn|danger|info, Body: []UINode, Actions: []UIAction,
Pinned, CreatedAt, UpdatedAt }
事件:card.created / card.updated / card.status / card.resolved(入现有信封,消费方未知类型静默忽略)
API:GET /api/conversations/{id}/cards · POST /api/cards/{id}/actions/{actionId} · POST /api/cards/{id}/pin|dismiss
HITLCard 增:AnchorMessageID, Blocked, BlockReason;UIAction 增 Command(绑定命令 id,未绑定降级发消息)
CommandSpec(Agent-Command):{id,title,description,paramsSchema,danger:normal|high,binding}
danger=high 执行终点 = 内联确认卡;四入口 → POST /api/commands/{id} 同源审计
UI 词汇:progress{label,value,tone} compare{left,right} tree{nodes} table{columns,rows,rowActions}
steps{current,steps} tabs{tabs} timeline{items}
Workspace 声明(Core):{id,title,icon,shortcut,badgeTool?,body:[]UINode,refreshTool?}
v1 边界:收件箱按会话聚合(与事件路由一致);跨会话项目级收件箱为 follow-up
```
## 5. 实施计划
| 任务 | 内容 | 涉及仓 |
|---|---|---|
| T0(本任务,feature/ui-foundation-r0) | 本提案入库;两新仓建立与接线;UIRenderer+令牌迁入 ui(零行为变化);Makefile/构建链调整 | documents / ui / agent-command / frontend / dev |
| T1 core-cards-commands | Core 契约扩展 + golden + ts;Agent-Command v0(spec/registry/validate/conformance) | core / agent-command / frontend / dev |
| T2 inbox | backend cardsvc + 摄取卡/编排卡/HITL 投影卡;ui 卡片组件;frontend 收件箱置首 + 角标;mock `#upload` 演示 | backend / ui / frontend / documents / dev |
| T3 command-bus | cmdbus + 命令 API + intentgate 同源 + 内置命令全清单 + 审计;InlineConfirmCard + cardlink + 拖拽投放 + 入口对称提示 | backend / ui / frontend / documents / dev |
| T4 workspaces | Workspace 声明 + pluginhost + OverlayHost + 七词汇渲染器 + DocViewer/AgentTracker 迁入 + ⌘ 快捷键 + 移除经典 tabs(当前任务常驻卡替代)+ example 插件扩展 | backend / ui / frontend / documents / dev |
| T5 polish-retreat | T0 退回回归(零页面走查仍通过);状态灯形状+色双编码;收纳策略;文档更新 | 全部 / documents |
跨仓顺序遵守 multi-repo 五步:提供方(Core/Agent-Command)先合入 → 消费方适配 → 各仓 PR → Dev gitlink PR 固定组合 → 组合验证。
## 6. 验收
- 每任务验证记录入本仓 `docs/records/`;完成声明附 precheck / task-sync / test 三段输出(Dev 仓 AGENTS.md)。
- 证据矩阵:前端交互 = 组件测试 + 构建 + 真实浏览器用户流程;卡片事件纳入 Stream 游标/断连/终态对账验证;T5 零页面走查为系统级验收剧本。
- T0 特定验收:`make test` + `make build` 通过;前端渲染行为零变化(迁移为纯移动 + DocBridge 注入点,调用方接 store);新仓 main 有保护、gitlink 固定。
## 7. 剩余项
- 追溯类视图(graph 词汇)待插件立项时按 D28 约束单独设计。
- 跨会话项目级收件箱(v1 边界外)。
- 通知聚合策略(右栏在线/收起角标/铃铛远期)在 T5 细化。
- 顶栏若未来需要(全局搜索/跨项目通知),按加法引入,不回改本决策。
@@ -0,0 +1,29 @@
# 记录:boot-config 并行重复交付的处置与配置面后续项
日期:2026-09-30;任务主记录:Agent-System-Backend PR#5(已关闭,评论区留完整差异清单)。
关联(完整提交,跨仓可追):
- 已合入实现:Agent-System-Backend PR#4(66b4bbf55a6cf24b60a6d1d945825b0b44503f5f,main 1e621887097b3ac9524d7a272f03671b15f65d1e)
- 已批准设计:本仓 PR#6(abc1a6d7849cb2e2ab1ec84c230024ca40eaf980,[配置面设计](../proposals/2026-09-30-configuration-surface.md))
- 组合钉入:Agent-System-Dev PR#12(a58f85e0d0ade6e8b4da3afe9985985a38bae47a)
- 重复候选(已关闭):Agent-System-Backend PR#5(8270acf5e085be2177cc211ff31dd70891d3b538,分支 feature/boot-config)
## 处置
- 重复实现按协作规则"拒绝陈旧候选"处置:Backend PR#5 关闭(差异清单在评论区),Dev 任务 `task-finish --abandon` 回收(原因:与 feature/config-surface 重复交付)。
- 重复根因与预防动作见 [2026-09-30-lesson-parallel-session-duplication](2026-09-30-lesson-parallel-session-duplication.md)。
- 本记录合入后删除 Backend 远端分支 feature/boot-config(差异要点已沉淀至下节,不再依赖分支存续)。
## 代码级后续项(小改,待拍板后各自走任务)
1. **apikey 子命令支持 `--config`**:当前 prod 档管理密钥需手抄 DSN 与 data 目录;与 serve 同管道解析存储档定位即可。
2. **`--mock` 粘性残留**:mock(CLI/文件/环境)经 app 组合根 `MergeUser` 写入 user 设置并落库——重启不带参数仍保持 mock;建议改为启动注入(系统层,位于 defaults 与 user 之间),不落库。注意存量库可能已有 user 层 `runtime.mock=true` 残留,迁移时需处理。
3. **`GET /api/settings` 不含启动注入层**:API 消费方无法还原 defaults → system → user → project 完整覆盖链;建议附加脱敏 `system` 字段(向后兼容)。
## 设计级选项(与已批准配置面设计的非目标条目冲突,须先修订设计再实施)
1. **环境段式单文件 + `--env`**:单个 JSON 承载 dev/test/prod 多段,`--env` 显式选段(当前设计为 envs/ 多文件)。重复候选中已实现并单测验证(含段间 data 目录重叠告警),未采纳。
2. **配置文件携带 settings 子树**:模型密钥/检索/限流等经文件下发、注入系统层(不落库、设置页掩码显示,租户层仍可覆盖)。重复候选中已实现并验证(按设置 schema 校验、未知键定位报错),未采纳(设计明确非目标:"运行时业务设置……不参与启动合并")。
任一选项若采纳:先在 proposals/ 修订配置面设计(含非目标条目与实例隔离约定),再立实施任务;PR#5 评论区与分支存续期间可直接比对可用实现。
@@ -0,0 +1,148 @@
# 2026-09-30 历史迁移提交级 SHA 映射(归档自迁移工作机 backups-2026-09-30/mapping-*.txt)
## Agent-Intent
```
old new
1509d7472a9c1367124347e9bd9e91621adb6990 c3f1ae9209d45df976e01965e856c8acb08c52b6
3674dc4bfd0b49191d21f0afab4002381e41a429 b2fa5be60fd32920b90077e58bc9c6a5ec459b35
40c33d5edc93141f68eabe16599bab6fbf075d36 b58595fb386bce5c46a42676956e678581249fb1
452dddcea3618ef3dfaa7f3a428fdc48bc190de8 345c1fdf245e99f38c187be59d76ef87e77e2a78
52ce798ebf8270fb0de2346b2b33755269302665 8f9496d5d8e4f9651d247e15f8fb29a9ff21b44e
55780ae2cce4ae98d8b0557b8234af8833a7c522 bb2bed2240d975f872988ece9b406ab2463a03a1
55950f641436ba069f68e7d973354d652bc96344 b06715d80b9fa3687320e6ad24aaa4b0134437a5
7d9d505d6523ecbf3b103c64d766f463769f4015 ad447c55de7e0f0aee9daa2b0ed5680669184099
a2cf07f69331346c043775c1e983794ba2510c92 b450b03638350ba4f8b9590c6ad9f6cb1729eefc
ae2c80bd4c715f5408c28ca66740da0e2ee40153 65d0df473afe9a0cec6078bfc2b8f64e65a71f3c
```
## Agent-Native
```
old new
292142ac1a8b125488794e9374faee2cb1c8c579 f735f18a73f9c34173fcf15a56f6afd0bdeac966
3f0c6b2277e52f7b227b7f611d36818d8b5cb757 3f0c6b2277e52f7b227b7f611d36818d8b5cb757
49e6dd1e0fc65de7f259f21d2f63c56e5b165a48 49e6dd1e0fc65de7f259f21d2f63c56e5b165a48
57c049bd38708be7c87f8bfa3732a92b630213b4 57c049bd38708be7c87f8bfa3732a92b630213b4
5a998b3609a1ed8749371b26adba751082eb9096 5a998b3609a1ed8749371b26adba751082eb9096
7af37906d9ff7426d5ec3307ec04ee3dd4880039 7af37906d9ff7426d5ec3307ec04ee3dd4880039
c659dc17d5086a8128999011994fc2dbe73419d3 5e489ab2cbe74ef60ae1fb8e0238750b0c155027
cc8a6a7702db298305fae942a36d477b64b1ae8d cc8a6a7702db298305fae942a36d477b64b1ae8d
e65c6ba604c9079e1176d9449e295e0d09bedfd3 e65c6ba604c9079e1176d9449e295e0d09bedfd3
fedf671a487d28e66a9d30a3de9c6aa2fb0e0f15 fedf671a487d28e66a9d30a3de9c6aa2fb0e0f15
```
## Agent-Squad
```
old new
5454f7485e7cf8b7ea7432b3c3c680da8a99056e b6ff0ab55f4a41bc1d945610637b24e72a6c2b34
6a10c4272f6fec7dc86e0c47bf5b95cde0db21d5 6a10c4272f6fec7dc86e0c47bf5b95cde0db21d5
6a36308f0a80880d2d36ed317aa43d3746a9a2f7 f3d000f6a6a6fe9dd8c55c9fdf19d4769c8a0f02
7ddcb2180dedd080c9e2c6856e4b679c221b4e55 7ddcb2180dedd080c9e2c6856e4b679c221b4e55
850bbeb0a071f400758125ca778cf6d1a7ca4c80 850bbeb0a071f400758125ca778cf6d1a7ca4c80
a8d26683920837cd4ac92c0053b538a12cfcb98a a8d26683920837cd4ac92c0053b538a12cfcb98a
be5959d89af4ab38870865d43adff38c488483df be5959d89af4ab38870865d43adff38c488483df
bfec3c8930c9fb26ac27d8c9d8ae568903d36653 bfec3c8930c9fb26ac27d8c9d8ae568903d36653
d611dd2d7b9b9ae1cf88ae7deb1633582b5c06a9 d611dd2d7b9b9ae1cf88ae7deb1633582b5c06a9
```
## Agent-System-Backend
```
old new
06478c215dd7ecc684f5e255911848bd35e80a77 16fbd70721387af33d0f87afe7f86259e5446c4b
0a69a56d29694e454fc79e2a34aedeed934da09f c7736a19173ea56055c5000fdb04516965ea8abd
7a4d34fc8e11cc73f9a1b9027c115fdd118fb956 1f6cc530af55c32325e66b155529f338b754b0c6
8aa5e8da8b2004305c8c88fe826dc8b8072329d4 0d74ec94dd98fd44eb364057de98c926797008e8
97b90ad4c850b29168b1bf7ebcdf8444ee82e961 964e4fb545a18d7aad31c28377839f405a020363
a671d601dfd04dc387038c529422c92818adfbc9 30ad92730d754714b7b4689015a5ca1cea8f32ba
ffb62ea4b96c96fdadb43309009fc18c554a9af5 6832b7f0da76225f4c8aaf9ef713d2b8f5689bc1
ed923883b416fd1cf004873815a7530597cecd72 8ae5b2334a478d2c456559045f182f70cd09752c
```
## Agent-System-Core
```
old new
9179a23f0a02559955cb7b7cee07f2218427f362 9929d8f8adf4b73519ae3eca7956e9dc95cba05d
992d6014a82cdf2841f4b621d9fd38e7e9b9aefe 3cf6bac4561b6fed1bfc06cbe7596280164319a6
ab366cda6a06ce6dc7e91ae27cb99c521f9fad1c aa53004376b1d40293d3a85e58bae5b0e67ad61d
c1ed01683ea68e2951795c0ca9cafd1933a84a7c f2fcc2f62e148839e61c4b78bec7d95c6a424de8
c7ae99b13c659e8ec60eeb91386804c7ea2d1e57 95294268d8ee50b587c5348ff79b615b559b4af7
019617e302357f267463cb576adaa28690cd65df 40f73ddcac560294bc3a2b34e545decbc9f0de2a
```
## Agent-System-DEV-PARENT
```
old new
286fdaa9c27ad66894777bfbe4fa060936a968b3 6eaa9b6bea24eea683d69fea3c08430d42b9484d
4cc100fc7b34dbf49e132f17678605e1f7a717c8 23aa65c15c8a01d3537d704cc016c5994df0bc97
59e0bb6132b417749114d7910a72952bb29d94ae 39c7685567d6ef1cd81af9079dfbb47bd0d8e6c1
5c64b6b59582e52ad6c56a2a3e8f623f7826f77d afb74fee20dc1216ed04c5c91323b2a6c14dffb3
6a70d1a8054f000fb3ac7ae0b28572e435b13527 de886f02aaeb92218be158fc1ef1b7ebf7bac074
942abc93e9c2832bd1f7598dd21cd103f77f3bf7 b10310ca11b5677497f7d7c6ecf11e27d91e9c4b
9b9a018d0dd6bf695bfef40286054fcab22dfa27 6ab728d2826d750151c222ad02ec6cda6230b8e0
a7617d4cf02415be133c597cf274f7a73a878c6e 3092715bf68bc4cefb6515c157cd90cf9b5cba2e
b51e77e37b2604989a98d16d4c39690c4a7b18ae c7f8ba4ed5756ad3f1af9ecd4e93e680f7c6b775
ca5a157f933acd477beeae30740553f9ba9d1948 2ec10937877b9b0295b834ea9068213955afc0e0
```
## Agent-System-Documents
```
old new
0d6391005e3efe858a1421e85dbc2defc81134cd 8290cc6ef3e45b757251f81128b17cd9ecad8241
0e44064b61132a23a0786e822411ced74c9a439b 196baf7c8cd4d268fa1559e3ef5cd084d9415b0f
0ebb585e544201e2c659435fffd6c69d113eece3 5b945508959e3a433015dd890e93e67c449483df
624954adebd96e26aeb176f0ce272519ebb3c4fb 28278cd735d13c641c748ac3b7bc2cb375d0f560
ccf88b79958509c3c0a6e901b9d257522990cd02 d3a021391b49615410567775108982861b0b96dc
d7ce9444c8a602a1f8311e817433bbb95c8e19cb e13eb5c38ee45c2b8dbdba4794ae0ee2249c155e
e0c783b1724678f64c155a6463af5f3b2281fa2b 1683e17b20f8a97ca7317efd120c60811554508f
00cd40e46505bffd880bd3348a8712b4d5446eea 13fd7b3a55769778fa2926336e379ac6ca3df424
```
## Agent-System-Frontend
```
old new
204e2183001f2a8c53fb89a5303ef250c3ddd782 a80fae7dc6df0e1a5552715efc9ef1084726efed
5b6b52d652d6532a3ec67c746a933a317d9ee665 ff43b0d45446821cc797dd3cfd2051dbe7d2ca5f
9b8572aa7348c257eabb8940e4682d0a9e13f6a4 b24296ec1b19d4e3d55736daf22f23a486120a6b
dc46efc72901f0be6c49a70a448fea6ced65fc0b fd3c3dbe322fa954cd714802c65fe672a661b6b8
6395cc992e993519a4aea78db473186a58adf3c5 0c7466ae1543a981eec63c5e85c34eba1562f90a
```
## Agent-System-Releases
```
old new
2d8936c3f1154ab9fd76024ddfb0d4ee29cffab9 f3d153aec8a9b933b743c51d8df56a6c395f9450
6c40909d76cdb7056eaba26e8490b12e9670826b 8476a2d71d14103663d84f88efed80a949bbe9a4
a3ec7430fc0f651a755576b2c45cf7e6fd2c657f fed4ac83ea5f2cb244e58ad47796d938fa6face1
d66aa9cd61a9f4d75d52d27b3e7dbeb79c714ba6 43ac28d236e5f9e086f60ee4eb181726e669132e
```
## Error-Code-System
```
old new
28fa06eaa56a19906732681cc02474a87ac9d408 28fa06eaa56a19906732681cc02474a87ac9d408
95a03b75786827b215121c35845d3ca35afc03bb 95a03b75786827b215121c35845d3ca35afc03bb
b67696d393e7abfbdd16fdde1064c07f5ecd2f72 b67696d393e7abfbdd16fdde1064c07f5ecd2f72
bd53e9ba79a14b382d337b850fa8cc9e90151bd7 bd53e9ba79a14b382d337b850fa8cc9e90151bd7
bfe3346c33f0211c19ff24ca4346056b3c5f6b48 bfe3346c33f0211c19ff24ca4346056b3c5f6b48
dbeed2f1b67eb417ce089e7033a228578fbbeb03 dbeed2f1b67eb417ce089e7033a228578fbbeb03
```
## Logging-System
```
old new
0ea2ad297a1d037ce0cb69be2428da3a558df573 0ea2ad297a1d037ce0cb69be2428da3a558df573
2c5716fdcffbc4696fc0371afc70f39c44174201 2c5716fdcffbc4696fc0371afc70f39c44174201
7f5972007bdcb6047ce7f95ee891f53e0af9d136 7f5972007bdcb6047ce7f95ee891f53e0af9d136
bed0dbf076692b6ab17937f5f2d55ca94ac5f719 bed0dbf076692b6ab17937f5f2d55ca94ac5f719
```
@@ -0,0 +1,50 @@
# 2026-09-30 提交历史迁移记录(operation record)
- 状态:已完成;执行者:weichen;授权:用户批准的全仓提交信息规范化(一次性历史迁移)
- 规范依据:Development-Guidelines 0.1.0-draft.7 multi-repo.md「受控历史迁移例外」
## 背景与决策
提交格式升级为「英文祈使句主题行(≤100 列)+ Why/Evidence/Impact/Refs 四段 body」。用户明确选择全量改写既有历史而非仅向前生效;按新规范的安全网要求执行。
## 执行与安全网
1. 备份:各仓全量 bundle 存于迁移工作机 backups-2026-09-30/(<repo>-pre-rewrite.bundle);远端归档引用 refs/rewrite-backup/pre-2026-09-30 指向改写前各仓 main。
2. 工具:git-filter-repo 2.47.0,仅改 message(超长单行拆主题行+原文完整保留于 Details 段;多行消息不动);作者/日期/树零变化。
3. 校验:逐仓提交数一致、与备份 bundle 的树 diff 为空(父仓仅 gitlink 变化);逐仓远端 main 与本地比对确认。
4. 父仓:gitlink 同步重映射到子仓新 SHA,历史各提交保持可物化。
## 迁移中发现并处置的交付缺陷
父仓 a7617d4(多租户交付)的 4 个模块 gitlink 指向仅存在于本机子仓目录、从未推送远端的提交(core 019617e 等,共 9 条链),违反 multi-repo.md「依赖必须可从批准的远端获取」。处置:以 format-patch/am 将链重放到改写后子仓 main 并推送(消息同步规范化),父仓重映射钉住新 tip。该交付缺陷已按经验闭环流程另立 lesson。
## 新旧 SHA 关键映射(tip 级)
| 仓 | 旧 main | 新 main |
|---|---|---|
| Agent-Native | `292142ac1a8b125488794e9374faee2cb1c8c579` | `f735f18a73f9c34173fcf15a56f6afd0bdeac966` |
| Agent-Squad | `5454f7485e7cf8b7ea7432b3c3c680da8a99056e` | `b6ff0ab55f4a41bc1d945610637b24e72a6c2b34` |
| Agent-Intent | `7d9d505d6523ecbf3b103c64d766f463769f4015` | `ad447c55de7e0f0aee9daa2b0ed5680669184099` |
| Error-Code-System | `dbeed2f1b67eb417ce089e7033a228578fbbeb03` | `dbeed2f1b67eb417ce089e7033a228578fbbeb03` |
| Logging-System | `2c5716fdcffbc4696fc0371afc70f39c44174201` | `2c5716fdcffbc4696fc0371afc70f39c44174201` |
| Agent-System-Core | `c7ae99b13c659e8ec60eeb91386804c7ea2d1e57` | `40f73ddcac560294bc3a2b34e545decbc9f0de2a` |
| Agent-System-Backend | `7a4d34fc8e11cc73f9a1b9027c115fdd118fb956` | `8ae5b2334a478d2c456559045f182f70cd09752c` |
| Agent-System-Frontend | `9b8572aa7348c257eabb8940e4682d0a9e13f6a4` | `0c7466ae1543a981eec63c5e85c34eba1562f90a` |
| Agent-System-Documents | `e0c783b1724678f64c155a6463af5f3b2281fa2b` | `b1835113937979274809509e12b564fc5b98c0b9` |
| Agent-System-Releases | `a3ec7430fc0f651a755576b2c45cf7e6fd2c657f` | `fed4ac83ea5f2cb244e58ad47796d938fa6face1` |
| Agent-System-Dev(父仓) | `a7617d4cf024...` | `ef89fc8281761eb64413ad5fd9be68a0bd08755e` |
全量提交级映射(filter-repo commit-map)归档于本仓 [2026-09-30-history-migration-sha-map.md](2026-09-30-history-migration-sha-map.md)(源副本在迁移工作机 backups-2026-09-30/,其本地 bundle 按计划一周稳定后清理,远端归档引用仍保留);Releases 仓历史同步改写(fed4ac8 前为 a3ec743),其内容中引用的组件旧 SHA 以本记录为准对照。
## 恢复演练(2026-09-30 执行)
结论:**安全网可用**(15/15 检查通过),并修复一个演练前发现的真实缺口。
- 缺口与修复:父仓归档点 a7617d4 的 4 个 gitlink 钉在"未推送多租户链"上(core 019617e 等),这些 SHA 原本只存在于迁移工作机本地 chain bundle。已补推为各子仓远端归档引用 `refs/rewrite-backup/pre-2026-09-30-chain`,安全网自此完整落远端。
- 演练内容(只依赖远端,模拟新机器):core 全新 clone → 拉取双归档引用 → fsck 干净、预改写 tip 与记录一致(c7ae99b,5 提交)、链 tip 一致(019617e,8 提交)→ **在预改写恢复点上 `go test ./...` 通过**(功能恢复实证);父仓全新 clone → 拉归档点 a7617d4 → 4 个 gitlink SHA 逐一核对与各远端链归档可达性全部通过。
- 已知限制:backend 归档点的全链 `make test` 未演练(其嵌套子仓旧钉子需逐仓从归档引用物化,超出本次范围);如需完全恢复多租户交付点,按本记录与 SHA 映射表操作即可。
- 脚本留存:演练逻辑见迁移工作机 /tmp(一次性),判据已收录于本节,可按记录复现。
## 回退路径
任一仓可从归档引用或 bundle 强推回旧历史,父仓 gitlink 复旧后重新物化;恢复须按 release-operations 记录 operation record。
@@ -0,0 +1,11 @@
# 经验:Go nil 切片序列化为 JSON null 导致前端 .map 白屏
- 状态:validated(2026-09-30,Agent-System 0.1.0+多租户链)
- 触发条件/检索词:白屏 / Cannot read properties of null (reading 'map') / 空列表 / 新建项目后页面空 / conversations null / Go nil slice json
- 根因与来源:backend store 层 `var out []T` 空结果为 nil 切片,encoding/json 编码为 `null`;前端契约声明 `T[]` 并直接 `.map`。2026-09-30 新建项目实测 GET /api/projects/{id}/conversations 返回 `null`。修复提交见 Agent-System-Backend fix/empty-list-json(PR#2)。
- 下次应做的检查:新增任何列表出口时问一句"空结果返回什么"——对空集合先写回归断言 `json.Marshal(empty) == "[]"`;code review 对 store 层 `var out []` 模式保持警觉。
- 验证方法与防护:已落实 TestEmptyListsSerializeAsEmptyArrays(store 回归);修复后实测新项目 conversations/artifacts 均返回 `[]`。建议:前端对网络数据保留 `?? []` 兜底(未落实)。
- 适用与不适用:适用 Go 后端 + 任何把 JSON 反序列化结果当数组用的前端;不适用已显式区分 null/[] 语义的接口设计。
- 尚缺证据/防护:前端全局兜底未加;无 CI 级契约测试。
- 复核人、日期、版本:weichen,2026-09-30,组合 main 36d1393+
- 替代/退役条件:若引入契约级生成(OpenAPI/TS 类型 + 服务端校验)可吸收本检查,届时退役。
@@ -0,0 +1,11 @@
# 经验:并行会话同一需求重复交付——worktree 只隔离文件现场,不隔离任务认领
- 状态:candidate(根因已由事故证实;检查动作已定义但未机制化、未在后续任务演练)
- 触发条件/检索词:并行会话 / 重复实现 / 同一需求两个 PR / task-start 后上游合入同名功能 / 陈旧候选重复候选 / 检出里看不到刚合入的设计 / submodule 钉住旧版看不到新提案 / 需求去重
- 根因与来源:2026-09-30 boot-config 任务,两会话自共同基线(Dev main dca932c,04:09 合入)出发:并行会话 04:15 合入配置面设计(Documents PR#6,abc1a6d7849cb2e2ab1ec84c230024ca40eaf980)、04:19 合入实现(Backend PR#4,66b4bbf55a6cf24b60a6d1d945825b0b44503f5f)、04:27 钉入组合(Dev PR#12,a58f85e0d0ade6e8b4da3afe9985985a38bae47a);本会话 04:10 task-start(R0=dca932c,precheck 必读清单生成时设计尚不存在),04:25 提交等价实现(Backend PR#5,8270acf5e085be2177cc211ff31dd70891d3b538),判定重复后关闭。两个机制性缺口:① precheck/task-start 是**工作区完整性**门禁(树净/基线/子仓漂移),不做**需求去重**;`.task/` 任务卡提交在各任务自己的分支上,合入前互相不可见。② 父仓 gitlink 纪律使任务 worktree 的 documents 物化在钉住 SHA(2205138),刚合入 documents main 的设计对在途任务不可见,直到父仓钉入(04:27)才出现在检出里。
- 下次应做的检查:实施类任务**动手写代码前**三查(合计一分钟内):① Dev main `.task/` 在途任务卡主题(状态"进行中");② documents **origin/main**(fetch 后看,不信检出的钉住版本)`docs/proposals/` 是否有本需求的已批准提案——非目标条目同样有约束力;③ 目标子仓 origin/main 近 1–2 小时的合入主题。命中重叠立即停手向负责人确认分工,不要试图把自己的变体硬合进去。
- 验证方法与防护:已落实——本次按协作规则"拒绝陈旧候选"处置(Backend PR#5 关闭并在评论区留差异清单,Dev 任务 task-finish --abandon 回收),处置路径本身正例验证;建议未落实——① task-start 把任务卡推到共享 registry(或建 Gitea issue 认领),precheck 输出在途任务清单;② precheck 增加"碰撞雷达":fetch 并列出近 N 小时 Dev + 各子仓合入主题与 documents 新提案。
- 适用与不适用:适用多会话并行 + 父仓 gitlink 钉版本的多仓组合(本组合 11 仓);不适用单会话串行开发,也不适用于平台级工作区隔离已上线后的场景。
- 尚缺证据/防护:认领登记与碰撞雷达均未机制化(task.sh 未改造,属防护缺口);"三查"动作尚未在后续真实任务中演练验证有效。
- 复核人、日期、版本:weichen,2026-09-30,组合 main a58f85e0d0ade6e8b4da3afe9985985a38bae47a
- 替代/退役条件:task-start 认领登记 + precheck 碰撞雷达上线并以正负例验证后,本条目升级 validated 并将"三查"并入机制;若迁移到平台级每任务独立环境亦可退役检查动作。
@@ -0,0 +1,11 @@
# 经验:共享检出的并行现场冲突与 gitlink 钉未推送提交
- 状态:validated(2026-09-30,Agent-System 组合)
- 触发条件/检索词:工作树有他人未提交改动 / submodule detached HEAD / 父仓 gitlink 指向远端不存在的提交 / upload-pack not our ref / 无法物化 / precheck BUSY
- 根因与来源:两起同源流程缺陷——1) 多会话共用同一检出与子仓,后到者默认"检出归我",与在途任务 24 文件 1:1 重叠(侥幸未写);2) 多租户交付在 detached HEAD 子仓推进父仓 gitlink,9 条链从未推送远端,任何第三方 clone 无法物化(multi-repo"依赖必须可从远端获取"硬规则被违反)。
- 下次应做的检查:任务首次写前跑 make precheck(BUSY/SYNC 不得写);看到子仓 detached HEAD 视为他人现场或未建分支;推进 gitlink 前核对该提交已推送到组件远端(ls-remote 可见)。
- 验证方法与防护:已落实——precheck(含子仓脏/未初始化检测)、zcode PreToolUse 写路径守卫(拦截集成分支/detached/坏分支名)、git pre-commit/commit-msg、Gitea 11 仓分支保护(禁直推+拒绝陈旧候选,负例:直推 pre-receive declined);正负例证据见 policy/adoption.md 与两份 tool-adaptation 矩阵。
- 适用与不适用:适用本组合与任何"父仓 gitlink + 组件远端"的多仓开发;不适用单仓单人且无共享检出的场景。
- 尚缺证据/防护:合入需独立审批人未配置(单人仓库,required_approvals=0 如实登记);hook 对用户手改 IDE 文件不生效(仅拦 agent 工具调用与 git 操作)。
- 复核人、日期、版本:weichen,2026-09-30,组合 main 8f7cf2d
- 替代/退役条件:若迁移到平台级工作区隔离(每任务独立环境)可退役 precheck/写守卫部分;分支保护保留。
@@ -0,0 +1,28 @@
# T1 验证记录:Core 契约扩展 + Agent-Command v0(feature/core-cards-commands-r1)
被测版本组合:core=合并后 main(PR#2)+ agent-command=合并后 main(PR#2)+ frontend=PR#3 + ui=PR#3 + documents=本记录;Dev 组合 PR:见任务卡(feature/core-cards-commands-r1)。
initial_base_sha(R0):69e9471dafd275f98928ff005732b94c4b18b638(T0 合并提交)。
日期:2026-09-30。
## 结果
| 用例 | 结果 | 证据 |
|---|---|---|
| Core `go vet ./...` | PASS | 无输出(干净) |
| Core `go test ./...`(含黄金样本一致性) | PASS | ok agent-system-core;新增样本 activity_card / hitl_card_blocked / event_card_created / event_card_resolved / ui_vocabularies + 扩展 plugin_manifest 全部逐字节一致 |
| Agent-Command `go vet ./...` | PASS | 干净 |
| Agent-Command `go test ./...` | PASS | ok agent-command(spec 校验 10 负例 / 注册表生命周期 / 回执四态 / 并发冒烟)+ ok agent-command/conformance(command_spec、command_receipt 黄金样本) |
| Frontend `vitest run` | PASS | 9/9(contracts.ts 再生成后形状断言不变) |
| UI `tsc --noEmit` + `vitest run` | PASS | 类型干净;6/6 组件测试 |
| 组合 `make test` + `make build` | PASS | 在 Dev 分支最终 head 执行(证据见 Dev PR 与任务卡) |
| 兼容性核查 | PASS | 全部为增量(omitempty 字段/新类型/新事件类型);现有黄金样本不变;ts 镜像同步 |
## 契约变更清单(本任务落库)
- Core:`ActivityCard`(7 Kind × 6 Status + Terminal)、`card.created/updated/status/resolved` 事件与 payload、HITL `anchorMessageId/blocked/blockReason`、UI 词汇 7 项(progress/compare/tree/table/steps/tabs/timeline,Spec 后缀避免常量名冲突)、`UIAction.command`、manifest `provides.commands/workspaces`、`ActivityCardTemplate`(工作流 card 步骤)、`PluginWorkspace`。
- Agent-Command v0:`CommandSpec`(id 规范 `<domain>.<verb>`、paramsSchema、danger、binding + fail-closed 校验)、`Registry`(来源标记/启停/稳定错误)、`ExecReceipt` 四态(committed/accepted 必带 OperationID)、`AuditEnvelope`(入口归一 button/card/slash/chat/api)。
## 限制
- 本任务为契约与库层,无运行时行为可走查;端到端行为验证在 T2(收件箱)/T3(命令总线)的浏览器证据中覆盖。
- Core 黄金样本 `event_card_*` 的 payload 为内联 JSON 字面量(与既有事件样本同风格),未逐一驱动 CardPayload 序列化路径(后端 T2 接入时经事件管道覆盖)。