# Matt 工作流 × 飞书 CLI 全流程总结 > 状态:已通过真实 Feishu Base / Wiki POC 验证 > 更新时间:2026-07-26 > 覆盖范围:`setup-workflow-skills-feishu`、`to-spec-feishu`、`to-tickets-feishu`、`triage-feishu` ## 1. 结论 本次工作把 Matt Pocock 的工程工作流接入了飞书,并保持原 Matt skills 的规划、规格、垂直切片和分诊语义不变: - **Feishu Base 是状态、关系和查询的事实来源**:每个 Issue、Spec、Ticket 或其他产物对应一条记录。 - **Feishu Wiki / Docs 是长文档事实来源**:保存 Spec、Triage Notes、Agent Brief、Human Brief 等叙述性产物。 - **仓库仍保存代码侧事实**:代码、测试、ADR、`CONTEXT.md` 和被拒绝 enhancement 的 `.out-of-scope/` 决定不会复制成第二份事实来源。 - **所有 Feishu API 操作使用应用身份**:`--as bot --format json`,不回退到 user 身份或其他文档位置。 - **每次 Base 记录创建或更新都记录真实发起用户**:调用者是 bot,“最后更新人”保存当前 CLI 人类用户;“负责人”仍只表示执行责任人。 - **所有写入都需要回读验证**:API 返回 `ok:true` 只是第一层证据,Wiki 用 `docs +fetch`,Base 用 `record-get` 或完整分页查询复核。 ## 2. 当前资源与身份 | 项目 | 当前值 | | ---------- | -------------------------------------------------------------------------------------------------------------------- | | Base | [Matt 工作流多维表格](https://oppeinlink.feishu.cn/wiki/Cq6Kw9mrGi0KXDkBJJpcW57Lnmd?table=tblFvlnVuWhmvQKC&view=vewwNwcwaf) | | Base token | `HXzGbaFIAaHEpBsMMrfc0z1lnnb` | | 数据表 | `数据表` / `tblFvlnVuWhmvQKC` | | 主字段 | `文本` / `fldzLHLTca` | | 视图 | `表格` / `vewwNwcwaf`,29 个字段全部可见 | | Wiki 根节点 | [开发智能体文档仓库](https://oppeinlink.feishu.cn/wiki/RG7bwmoP0i6DJikbHqWcY959nLd) | | Wiki space | `7493342321238130707` | | 工作流文档 | [Matt 工作流 × 飞书 CLI:文档与进度管理工作流](https://oppeinlink.feishu.cn/wiki/L2qFwzIMAipZqlkbwoXc6Pofnxe) | | API 执行身份 | bot `迷迭香` / `ou_967b892ae067fd2e24d369a289a5b01e` | | 当前归因用户 | `于选辉` / `ou_aed469c8168cd31341fa94bf2d89bddd` | | 已验证 CLI | `lark-cli 1.0.76` | ## 3. 系统架构 ```mermaid flowchart LR Human["真实用户 / 维护者"] --> Conversation["对话确认与 Matt 工作流"] Conversation --> Auth["auth status --verify"] Auth -->|"验证 bot"| Bot["应用身份:迷迭香"] Auth -->|"冻结 user openId"| Attribution["业务归因:最后更新人"] Bot -->|"--as bot"| Base["Feishu Base\n状态、关系、查询"] Bot -->|"--as bot"| Wiki["Feishu Wiki / Docs\n长文档与叙述"] Attribution -->|"每次 record create / update"| Base Repo["代码仓库\n代码、测试、CONTEXT、ADR、out-of-scope"] --> Conversation Base -->|"产物文档"| Wiki Base -->|"代码引用"| Repo Base --> Verify["record-get / 完整分页回读"] Wiki --> VerifyDoc["docs +fetch 回读"] Verify --> Evidence["验证证据"] VerifyDoc --> Evidence ``` 关键边界: 1. bot 是 API 调用者,不自动等于“负责人”或“最后更新人”。 2. “最后更新人”由工作流显式写入当前已验证用户的 open ID。 3. “负责人”是工作执行责任,不因 CLI 操作而被覆盖。 4. Wiki 节点必须创建在配置的根节点下;失败时报告完整错误和 `x-tt-logid`,不切换身份或位置重试。 ## 4. 四个 Feishu skill | Skill | 何时使用 | 核心输入 | 核心产物 | Base / Wiki 策略 | |---|---|---|---|---| | `setup-workflow-skills-feishu` | 仓库接入或切换到飞书 tracker | Base 表格/视图 URL、Wiki 根节点 URL、Setup 模式 | repo tracker 合约;Bootstrap 另含 Base schema、Wiki setup 文档、POC 记录 | 默认 Reuse 只读复核既有设施;Bootstrap 才初始化并验证写路径 | | `to-spec-feishu` | 把已澄清的对话转成可执行 Spec | 对话、代码库上下文、测试 seam、可选来源 Issue | 完整 Wiki Spec + 一条 Base Spec | Wiki 保存完整规格;Base 保存身份、状态、摘要、验收和父项 | | `to-tickets-feishu` | 把 Spec / 计划拆成 tracer-bullet Tickets | 已确认 Spec、垂直切片、依赖图 | 每个切片一条 Base Ticket | V1 不创建 Ticket Wiki;通过父 Spec 取得文档;两遍写入关系 | | `triage-feishu` | 处理 Issue / PR 的分类、澄清和委派 | Issue/PR、代码验证、维护者决定、报告人反馈 | Base Issue 状态 + 可选 Triage Wiki dossier | Base 保存当前状态;Wiki 追加 Notes / Brief;拒绝决定以 repo 为准 | 这些 skill 的 `来源技能`仍使用逻辑流程名,例如 `setup-matt-pocock-skills`、`to-spec`、`to-tickets`、`triage`;不会把适配器名称写成新的业务枚举。 ## 5. 端到端工作流 ```mermaid flowchart TD Setup["setup-workflow-skills-feishu\n建立 repo 合约;按模式复用或初始化飞书资源"] --> Intake{"工作从哪里进入?"} Intake -->|"想法 / 已澄清对话"| SpecDraft["to-spec-feishu"] Intake -->|"外部 Issue / PR / 表单"| Triage["triage-feishu"] Triage --> NeedsInfo["needs-info\n等待报告人"] NeedsInfo -->|"最后反馈时间 > 最后分诊时间"| Triage Triage --> ReadyAgent["ready-for-agent"] Triage --> ReadyHuman["ready-for-human"] Triage --> Wontfix["wontfix / out-of-scope"] ReadyAgent --> Complexity{"是否需要正式 Spec?"} Complexity -->|"跨模块、需要设计决策"| SpecDraft Complexity -->|"范围已足够小且明确"| Implement["implement / tdd"] SpecDraft --> SpecArtifacts["Wiki Spec + Base Spec\n状态 ready-for-agent"] SpecArtifacts --> Ticketing["to-tickets-feishu"] Ticketing --> TicketGraph["Base Ticket 依赖图\nfrontier = 无未完成 blocker"] TicketGraph --> Implement Implement --> Review["code-review / 验证"] Review --> Done["已完成 + 验证证据"] Implement --> Blocked["阻塞 + 阻塞原因 + 下一步"] Blocked --> Implement ReadyHuman --> HumanWork["人类处理:判断、权限、设计或手工验证"] Wontfix --> Memory["Wiki 关闭说明;必要时 repo .out-of-scope/"] ``` 本次新增的硬依赖飞书适配止于 setup、Spec、Tickets 和 Triage;`implement`、`tdd`、`code-review` 等下游流程通过生成的 `docs/agents/issue-tracker.md` 公共合约继续消费同一 Base。 ## 6. Setup:一次性建立公共契约 ```mermaid flowchart TD Start["探索仓库"] --> Detect["检查 AGENTS/CLAUDE、docs/agents、domain docs、triage、monorepo"] Detect --> Tracker{"选择 issue tracker"} Tracker -->|"Feishu"| Inputs["只接受两个用户输入\nBase URL + Wiki 根 URL"] Inputs --> ReadSkills["读取 lark-shared / base / wiki / doc 规则"] ReadSkills --> Mode{"选择 Setup 模式\n默认 Reuse"} Mode -->|"Reuse:复用已配置资源"| Identity["验证 bot + user;冻结当前 user openId"] Mode -->|"Bootstrap:新建或显式重验"| Identity Identity --> Resolve["bot 解析 Base、table、view、Wiki root"] Resolve --> Diff["完整 field-list;按精确字段名计算缺失项"] Diff --> ReuseCheck{"选择的是 Reuse?"} ReuseCheck -->|"是,schema 完整"| ReuseDraft["展示 repo 文件与只读验证证据\n明确不会写 Base / Wiki"] ReuseCheck -->|"是,但发现 drift"| ReuseStop["停止;询问切换 Bootstrap\n或单独授权 schema repair"] ReuseCheck -->|"否"| BootstrapDraft["展示 repo 文件、缺失字段、Wiki 标题、POC 标题"] ReuseDraft --> ReuseConfirm{"用户确认 repo 文件?"} ReuseConfirm -->|"否"| ReuseDraft ReuseConfirm -->|"是"| RepoContract["生成 docs/agents/issue-tracker.md\n以及 triage/domain 合约"] BootstrapDraft --> BootstrapConfirm{"用户确认 Bootstrap 写入?"} BootstrapConfirm -->|"否"| BootstrapDraft BootstrapConfirm -->|"是"| Schema["只创建缺失字段;不静默转换冲突字段"] Schema --> WikiSetup["根节点下创建 Wiki setup 文档;append + fetch"] WikiSetup --> POC["创建 POC Base 记录;record-get"] POC --> RepoContract RepoContract --> Gate{"验证门通过?"} Gate -->|"否"| Report["报告具体错误、未运行项和边界"] Gate -->|"是"| Ready["其他 Matt skills 可开始消费"] ``` ### Setup 产物 - `AGENTS.md` 或 `CLAUDE.md` 中唯一的 `## Agent skills` 区块。 - `docs/agents/issue-tracker.md`:真实 Base/Wiki 坐标、命令、字段与身份合约。 - `docs/agents/triage-labels.md`:仅当 triage 已安装时生成。 - `docs/agents/domain.md`:单 context 或多 context 的领域文档规则。 - Reuse 模式不创建 Base 字段/记录或 Wiki 文档;只读验证既有资源并生成 repo-local 合约。 - Bootstrap 模式额外创建一份 Wiki setup 文档,记录实际命令、字段、状态机、失败与修正、验证证据。 - Bootstrap 模式额外创建一条 setup POC Base 记录,链接 Wiki 文档并证明写路径闭环;它不是每个项目的必跑步骤。 ## 7. to-spec:从对话到可执行规格 ```mermaid flowchart TD Context["对话 + 代码库 + Domain / ADR"] --> Seam["选择尽可能高的测试 seam"] Seam --> SeamConfirm{"用户确认 seam?"} SeamConfirm -->|"调整"| Seam SeamConfirm -->|"确认"| Draft["生成完整 Matt Spec"] Draft --> Search["按真实主字段精确查重"] Search --> Match{"精确匹配数量"} Match -->|"多个"| Disambiguate["停止并消歧"] Match -->|"一个,未明确修订"| Duplicate["停止并报告重复"] Match -->|"零个或明确修订"| CreateWiki["bot 在配置根节点下创建 Spec — 标题"] CreateWiki --> Append["append 完整 XML Spec"] Append --> Fetch{"docs +fetch 完整?"} Fetch -->|"否"| Stop["停止,不创建 Base"] Fetch -->|"是"| BaseSpec["创建或明确更新 Base Spec"] BaseSpec --> Parent["有来源 Issue 时写入所属父项"] Parent --> Readback["record-get 验证所有字段和最后更新人"] ``` ### Spec 产物契约 Wiki 文档标题为 `Spec — <标题>`,正文包含:Problem Statement、Solution、完整 User Stories、Implementation Decisions、Testing Decisions、Out of Scope 和 Further Notes。 对应 Base 记录至少包含: | 字段 | 值 | |---|---| | `产物类型` | `PRD/Spec` | | `来源技能` | `to-spec` | | `工作流阶段` | `规格` | | `状态` | `ready-for-agent` | | `协作模式` | `AFK` | | `产物文档` | Wiki Spec 链接 | | `结论/摘要` | Problem + Solution 摘要 | | `验收标准` | 可执行、可验证条件 | | `所属父项` | 可选的来源 Issue record ID | | `最后更新人` | 当前已验证 CLI 用户 | ## 8. to-tickets:从 Spec 到垂直切片依赖图 ```mermaid flowchart TD Spec["已确认 Spec / 计划"] --> Explore["可选:探索代码、prefactor 机会"] Explore --> Slice["拆成单上下文可完成的 tracer-bullet 垂直切片"] Slice --> Edges["为每张票声明真实 blocker"] Edges --> Quiz["用户确认粒度、合并/拆分和依赖边"] Quiz -->|"调整"| Slice Quiz -->|"批准"| ResolveParent["解析真实父 Spec record ID"] ResolveParent --> Search["逐标题查重;歧义时停止"] Search --> Pass1["第一遍:按依赖顺序创建全部 Ticket\n暂不写 blocker"] Pass1 --> IDs["保留每个返回的 record ID"] IDs --> Pass2["第二遍:写所属父项 + 前置依赖"] Pass2 --> Readback["逐条 record-get 验证父项、精确 blocker 集合、最后更新人"] Readback --> Frontier["frontier:所有 blocker 均完成且尚未认领的 Ticket"] ``` 每个 Ticket 是一条 Base 记录;V1 不创建独立 Wiki 文档。Ticket 的 `产物文档`留空,实现者沿 `所属父项`找到父 Spec,再取得其 Wiki 文档。 ### 普通垂直切片 ```mermaid flowchart LR A["Ticket A\n完整可验证切片\n无 blocker"] -->|"解锁"| B["Ticket B\n消费 A 的稳定输出"] B -->|"解锁"| C["Ticket C\n继续扩展端到端行为"] ``` ### Wide refactor 的 expand–migrate–contract ```mermaid flowchart LR Expand["Expand\n新旧形式并存"] --> M1["Migrate batch 1"] Expand --> M2["Migrate batch 2"] Expand --> M3["Migrate batch N"] M1 --> Contract["Contract\n删除旧形式"] M2 --> Contract M3 --> Contract M1 --> Integrate["可选:integrate-and-verify"] M2 --> Integrate M3 --> Integrate ``` ## 9. triage:Issue / PR 分诊与可恢复上下文 ### 关注队列 每次“显示需要关注的事项”都必须完整分页,并按创建时间从旧到新汇总三类: 1. `状态`为空或`待分诊`。 2. `状态=needs-triage`。 3. `状态=needs-info`且本地比较得到`最后反馈时间 > 最后分诊时间`。 不能用单页查询宣称“没有待处理事项”。报告人活动只更新时间,不直接改变状态;后续 triage run 再根据时间门禁重启分诊。 ### Triage 状态机 ```mermaid stateDiagram-v2 [*] --> 待分诊 待分诊 --> NeedsTriage: 初次进入维护者评估 state "needs-triage" as NeedsTriage state "needs-info" as NeedsInfo state "ready-for-agent" as ReadyAgent state "ready-for-human" as ReadyHuman NeedsTriage --> NeedsInfo: 信息不足 NeedsInfo --> NeedsTriage: 报告人有新反馈\n且反馈时间晚于分诊时间 NeedsTriage --> ReadyAgent: 事实充分且可委派 NeedsTriage --> ReadyHuman: 需要人类判断、权限或手工工作 NeedsTriage --> wontfix: 不实施 ReadyAgent --> 进行中: Agent 认领 ReadyHuman --> 进行中: 人类认领 进行中 --> 待评审 待评审 --> 已完成 wontfix --> [*] 已完成 --> [*] ``` 每个已分诊项必须恰好拥有: - 一个`类别`:`bug`或`enhancement`。 - 一个 canonical triage `状态`。 推荐阶段只读、不写飞书;维护者确认后才更新类别、状态、时间、摘要、证据和下一步。 ### Outcome 与叙述产物 ```mermaid flowchart TD Outcome{"维护者确认的 outcome"} Outcome -->|"needs-info"| Notes["Wiki 追加 Triage Notes\n已确认事实 + 具体问题"] Outcome -->|"ready-for-agent"| Agent["Wiki 追加完整 Agent Brief"] Outcome -->|"ready-for-human"| Human["Wiki 追加 Human Brief\n注明不能委派原因"] Outcome -->|"wontfix"| Close["Wiki 追加关闭原因"] Notes --> Fetch["fetch 最新 section"] Agent --> Fetch Human --> Fetch Close --> Fetch Fetch --> BasePatch["更新 Base 状态、产物文档、证据、下一步、时间、最后更新人"] Outcome -->|"拒绝 enhancement"| OOS["repo .out-of-scope/.md\n唯一决定事实来源"] OOS --> CodeRef["Base 代码引用保存 repo 路径"] Outcome -->|"已实现请求或拒绝 bug"| NoOOS["不写 .out-of-scope/"] ``` 所有 AI 生成的 triage 文档 section 必须带免责声明。一个 Issue 只复用一份 `Triage — <标题>` dossier,后续 append,不为每个状态新建文档,也不覆盖历史。 ## 10. 主执行状态机 ```mermaid stateDiagram-v2 [*] --> 草拟中 草拟中 --> 待确认 待确认 --> ReadyAgent: 可由 Agent 独立执行 待确认 --> ReadyHuman: 需要人类处理 state "ready-for-agent" as ReadyAgent state "ready-for-human" as ReadyHuman ReadyAgent --> 进行中: 设置负责人并认领 ReadyHuman --> 进行中: 人类认领 进行中 --> 阻塞: 出现 blocker 阻塞 --> 进行中: blocker 已解除 进行中 --> 待评审 待评审 --> 进行中: 评审要求修改 待评审 --> 已完成: 验证证据充分 草拟中 --> 已取代: POC 或被新方案替代 待确认 --> 已取代 ReadyAgent --> 已取代 进行中 --> 已取代 已完成 --> [*] 已取代 --> [*] ``` 状态一致性规则: - `状态=阻塞`时,`阻塞原因`和`下一步`必须非空。 - 设置`已完成`前必须有具体`验证证据`;无法验证时写“未运行”及原因。 - POC、废弃版本和超越记录进入`已取代`,不删除审计证据。 - `完成度`、`下一步`和`阻塞原因`必须与`状态`一致。 ## 11. 产物与关系模型 ```mermaid flowchart LR External["外部 Issue / PR / 表单"] -->|"来源链接、外部编号、报告人"| Issue["Base:需求/Issue"] Issue -->|"产物文档"| TriageDoc["Wiki:Triage dossier"] Spec["Base:PRD/Spec"] -->|"所属父项"| Issue Spec -->|"产物文档"| SpecDoc["Wiki:Spec — 标题"] TicketA["Base:实现 Ticket A"] -->|"所属父项"| Spec TicketB["Base:实现 Ticket B"] -->|"所属父项"| Spec TicketB -->|"前置依赖"| TicketA TicketA -.->|"沿父项取得文档"| SpecDoc TicketB -.->|"沿父项取得文档"| SpecDoc Issue -->|"代码引用"| RepoDecision["Repo:代码 / ADR / .out-of-scope/"] TicketA -->|"代码引用、验证证据"| Code["分支 / commit / PR / 测试"] TicketB -->|"代码引用、验证证据"| Code ``` ### 哪个系统保存什么 | 信息 | 事实来源 | 原因 | |---|---|---| | 当前状态、类别、负责人、进度、时间 | Base | 可筛选、排序、聚合和自动化 | | 父子关系、阻塞关系 | Base link 字段 | 可计算 frontier,不依赖文字解析 | | Spec、Triage Notes、Agent/Human Brief | Wiki / Docs | 长文档可读、可追加、可审计 | | 实现代码、测试、ADR、领域上下文 | repo | 与版本控制一致 | | 被拒绝 enhancement 的持久决定 | repo `.out-of-scope/` | 避免 Wiki 与 repo 产生两份决定事实 | | 命令、测试结果、回读事实 | Base `验证证据`,必要时 Wiki 详述 | 完成状态必须可核验 | ## 12. 身份与“最后更新人” ```mermaid sequenceDiagram participant H as 真实用户 participant C as Codex / 工作流 participant A as lark-cli auth participant B as Feishu bot participant T as Base record H->>C: 确认外部写入 C->>A: auth status --json --verify A-->>C: bot verified + user verified + user.openId C->>C: 冻结 CURRENT_USER_OPEN_ID C->>B: --as bot 创建或更新记录 B->>T: payload 包含最后更新人 = user.openId T-->>C: ok:true + record ID C->>T: record-get 回读 T-->>C: 最后更新人显示真实用户 ``` 这是一条业务审计契约,而不是飞书 UI 的系统“最后操作者”字段: - 写入执行者:bot。 - CLI 工作流真实发起者:`最后更新人`。 - 当前工作责任人:`负责人`。 - 每一次 Base create/update 都刷新`最后更新人`,包括仅修改状态、时间、关系、文档链接、证据或终态的 patch。 - schema、view 和纯读操作没有行级归因目标,不写该字段。 ## 13. Base 完整字段字典(29 个) 以下内容来自 2026-07-26 的实时 `field-list` 回读。 | # | 字段 | Field ID | 类型 / 取值 | 含义与使用规则 | |---:|---|---|---|---| | 1 | 文本 | `fldzLHLTca` | text,主字段 | 记录的业务标题;Spec/Ticket 查重使用真实主字段精确匹配。 | | 2 | 产物类型 | `fldlwQ46Ks` | single select:需求/Issue、PRD/Spec、实现 Ticket、Wayfinder Map、决策 Ticket、原型、研究、Handoff、ADR、领域词汇、Bug 诊断、代码评审、架构候选、教学资产 | 标识这条记录代表哪一种 Matt 工作流核心产物。 | | 3 | 来源技能 | `fldUMyVtoS` | multi-select:setup-matt-pocock-skills、grill-with-docs、grill-me、triage、diagnosing-bugs、wayfinder、to-spec、to-tickets、implement、tdd、code-review、improve-codebase-architecture、domain-modeling、prototype、research、handoff、teach | 记录创建或推进该产物的逻辑 Matt skills;使用逻辑流程名,不使用 Feishu 适配器后缀。 | | 4 | 工作流阶段 | `fldjAkNPqD` | single select:探索/澄清、决策、规格、拆票/规划、实现、验证/评审、交付、维护/学习、分诊 | 产物当前处于端到端流程的哪个阶段;与状态是两个维度。 | | 5 | 状态 | `fldHjFrlwJ` | single select:草拟中、待确认、待分诊、needs-triage、needs-info、ready-for-agent、ready-for-human、进行中、阻塞、待评审、已完成、wontfix、out-of-scope、已取代 | 全流程统一状态机;英文值保留 Matt triage canonical role 名称。 | | 6 | 类别 | `fldQWuceDX` | single select:bug、enhancement | Triage category role;每个被分诊项必须且只能有一个。 | | 7 | 决策票类型 | `fldFpkeDkj` | single select:research、prototype、grilling、task | Wayfinder 子决策票的处理方式;非决策票通常留空。 | | 8 | 协作模式 | `fldVwgWNRU` | single select:HITL、AFK | HITL 表示人类需要实时参与;AFK 表示 Agent 可独立推进。 | | 9 | 优先级 | `fldJv2ts2l` | single select:P0、P1、P2、P3 | 表示业务/执行优先级;与依赖 frontier 分开管理。 | | 10 | 负责人 | `fldGlPa1B1` | user,单值 | 当前直接执行责任人;必须使用真实飞书用户,不用纯文本姓名或 bot 代替。 | | 11 | 最后更新人 | `fld6nvDu18` | user,单值 | 最近一次通过 lark-cli 创建或更新该记录的真实人类用户;不代表飞书 UI 的 API 操作者。 | | 12 | 完成度 | `fldqNJjr0g` | number/progress,0–100% | 执行进度;需与当前状态保持一致。 | | 13 | 产物文档 | `fldorpkrbf` | text/plain | 该记录的 canonical Wiki/长文档链接;Spec 和 Triage dossier 使用,V1 Ticket 留空。 | | 14 | 验收标准 | `fldwbSY2pq` | text | 可验证完成条件;实现 Ticket 必填,Spec 保存主要测试/验收条件。 | | 15 | 验证证据 | `fldIQ0NQPO` | text | 实际命令、测试结果、复现、评审或 read-back 事实;终态的重要门禁。 | | 16 | 结论/摘要 | `fldmdDUJHh` | text | 决策结论、规格摘要、诊断根因、研究摘要或交付结果;长分析放 Wiki。 | | 17 | 阻塞原因 | `fldUsFDsTS` | text | 仅`阻塞`或`needs-info`时填写;说明当前为何不能继续。 | | 18 | 下一步 | `fldMY6XATm` | text | 解除阻塞或进入下一阶段所需的最小、直接动作。 | | 19 | 代码引用 | `fldNylIQ5y` | text | 分支、commit、PR、文件路径、review fixed point 或 `.out-of-scope/` 路径。 | | 20 | 截止时间 | `fldZP6Cm30` | datetime,`yyyy-MM-dd HH:mm` | 人工承诺的截止时间;不是自动推算时间。 | | 21 | 创建时间 | `fldnPF52hP` | created_at,只读 | 飞书自动记录的行创建时间;关注队列按此从旧到新排序。 | | 22 | 更新时间 | `fldd3rTk0I` | updated_at,只读 | 飞书自动记录的行更新时间;与业务归因字段不同。 | | 23 | 所属父项 | `flduS0iiPy` | self-link,双向 | Spec 指向来源 Issue、Ticket 指向父 Spec、决策 Ticket 指向 Wayfinder Map;写入真实 record ID。 | | 24 | 前置依赖 | `fldYkwZVu1` | self-link,双向 | 指向阻塞当前项的记录;所有依赖完成后当前项才进入 frontier。 | | 25 | 来源链接 | `fldp4F1S6m` | text/url | 原始 Issue、PR、表单或外部系统 URL。 | | 26 | 外部编号 | `fldpv8O5OW` | text | 原始外部系统编号;不能当作 Base record ID 使用。 | | 27 | 报告人 | `fld37AxlZf` | text | 报告人显示名或外部标识;兼容报告人不是飞书用户的场景。 | | 28 | 最后反馈时间 | `fldTwNj5Uz` | datetime,`yyyy-MM-dd HH:mm` | 报告人或外部来源最近一次新增反馈的时间。 | | 29 | 最后分诊时间 | `fldNy9eAgM` | datetime,`yyyy-MM-dd HH:mm` | 维护者最近一次确认并写回分诊结果的时间;与反馈时间比较决定 needs-info 是否重入队列。 | ### Link 字段边界 `所属父项`和`前置依赖`是自动化写入的正向事实来源。`lark-cli 1.0.76`可能返回同表双向关系的反向 field ID,但反向字段不一定能独立列出;在 CLI 明确回读证明前,不假设反向字段可以直接寻址。 ## 14. 关键 CLI 操作模式 ```bash # 身份门禁 lark-cli auth status --json --verify # Schema 与记录 lark-cli base +field-list --base-token --table-id --limit 200 --as bot --format json lark-cli base +record-search --base-token --table-id --keyword "" --search-field <PRIMARY_FIELD> --as bot --format json lark-cli base +record-upsert --base-token <BASE_TOKEN> --table-id <TABLE_ID> --json '<FIELD_MAP>' --as bot --format json lark-cli base +record-upsert --base-token <BASE_TOKEN> --table-id <TABLE_ID> --record-id <RECORD_ID> --json '<PATCH>' --as bot --format json lark-cli base +record-get --base-token <BASE_TOKEN> --table-id <TABLE_ID> --record-id <RECORD_ID> --as bot --format json # Wiki / Docs lark-cli wiki +node-create --space-id <SPACE_ID> --parent-node-token <ROOT_NODE_TOKEN> --obj-type docx --title "<TITLE>" --as bot --format json lark-cli docs +update --doc <OBJ_TOKEN> --command append --content @artifact.xml --doc-format xml --as bot --format json lark-cli docs +fetch --doc <OBJ_TOKEN> --detail with-ids --as bot --format json ``` 共同约束: - `record-upsert`不会按业务标题自动去重;创建前必须查重。 - link CellValue 必须使用真实 record ID,不能填标题或 Ticket 编号。 - 文档先成功 fetch,再把 Wiki 链接和相应状态写入 Base。 - 所有记录 create/update payload 都包含`最后更新人`。 - 失败后不改用 user 身份,也不改到 Drive 或其他 Wiki 位置。 ## 15. 已完成的真实 POC ### 应用身份全流程 POC - bot 成功在指定 Wiki 根节点下创建独立 Spec 与 Triage 文档。 - Wiki 创建结果返回正确的`parent_node_token`、`space_id`和自动用户权限。 - Base 成功创建 Spec、两张 Ticket 和一条 Issue。 - Ticket 父项和 blocker 边可回读。 - Issue 完成`needs-info → reporter feedback → ready-for-agent`时间门禁。 - 四条 POC Base 记录验收后均标记为`已取代`,Wiki 文档保留审计证据。 ### 最后更新人 POC | 产物 | Base record ID | 最终验证 | |---|---|---| | Spec | `recvqrDi2D3ky9` | bot 创建;`最后更新人=于选辉`;状态`已取代` | | Ticket A | `recvqrDoAyemKF` | 父项指向 Spec;归因正确;状态`已取代` | | Ticket B | `recvqrDoAyBBZB` | 父项指向 Spec;前置依赖仅指向 Ticket A;归因正确;状态`已取代` | | Issue | `recvqrDxnqoNUJ` | 完整 triage 状态流、时间门禁、Wiki Agent Brief、归因均通过;状态`已取代` | 相关文档: - [Spec — 最后更新人全流程验证](https://oppeinlink.feishu.cn/wiki/Cu10w5D5CiWetKk6dVfcT52YnNJ) - [Triage — 状态归因闭环](https://oppeinlink.feishu.cn/wiki/IvpowYL0si7JbVk0TzocQ5yvnPf) - [Spec — 应用身份全流程验证](https://oppeinlink.feishu.cn/wiki/MacgwbOOpibGaEkH901cZ56AnCe) - [Triage — 应用身份反馈闭环](https://oppeinlink.feishu.cn/wiki/R9s0whJvGimchUkhnjlcM1wcnkd) ## 16. 当前验证状态与边界 - Base schema 实时回读:29 个字段,`产物文档`唯一存在。 - Wiki 根节点完整分页:5 个直属子文档,`has_more=false`。 - 双身份验证:bot 和 user 均为 verified。 - 四个新 skill 均有`agents/openai.yaml`;受影响 skill 已通过`quick_validate.py`。 - 所有相关本地 skill、Wiki 文档和当前 vault 中,已移除被替换字段名的旧引用。 - Ticket V1 有意不创建 Wiki 文档;其长上下文来自父 Spec。 - `负责人`若无法解析为真实飞书用户就留空并报告,不能填 bot 或伪造数据。 - 未验证的命令、状态或产物不能写成“已完成”;需明确标记“未运行”及原因。 ## 17. 最小心智模型 ```mermaid flowchart LR Issue["Issue\n要解决什么"] --> Spec["Spec\n为什么与验收边界"] Spec --> Tickets["Tickets\n可独立交付的垂直切片"] Tickets --> Work["实现 / 测试 / 评审"] Work --> Evidence["验证证据"] Evidence --> Done["已完成"] Base["Base"] -.->|"管理状态、关系、责任、时间"| Issue Base -.-> Spec Base -.-> Tickets Wiki["Wiki"] -.->|"保存 Spec 与 Triage 叙述"| Spec Repo["Repo"] -.->|"保存代码、测试、ADR、决定"| Work ``` 一句话总结:**Base 回答“现在是什么状态、由谁负责、依赖谁”,Wiki 回答“为什么这样做、具体要求是什么”,repo 回答“实现和验证事实是什么”;四个 Feishu skills 负责在三者之间建立可回读、可审计的连接。**