mcpField
B
build-now-adapt-later

build-now-adapt-later

github.com/rheinmir开发10247 次安装2 周前更新
代码仓库

关于 build-now-adapt-later

build-now-adapt-later 是一种用于部分信息尚未确认、但大部分工作可以先行的开发工作流。它将假设集中在单一适配器边界内,让核心功能先基于稳定契约构建和测试。

主要功能

  1. 01梳理未知事项及其来源
  2. 02定义稳定的领域契约
  3. 03将假设隔离到配置和适配器
  4. 04基于契约构建并测试核心
  5. 05准备一致性测试和适配清单
  6. 06防止假设越过边界

适用场景

  1. 01开发文档不全的硬件协议
  2. 02外部 API 暂不可用时继续构建
  3. 03将依赖生产环境的数据与核心逻辑隔离

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/rheinmir/setup --skill build-now-adapt-later

安装后在 Claude Code 中输入/build-now-adapt-later确认已加载。

详细介绍

技能:build-now-adapt-later

立即交付确定的部分;隔离不确定的部分,让之后只需修改一个文件即可定稿。

内容

目的和背景
  • **目的:**当任务因信息缺失或尚未验证而受阻时,立即构建所有不依赖未知因素的内容,并将未知因素隔离在一个适配器边界之后,这样之后只需修改一个文件即可完成适配。
  • **触发条件(何时使用):**任务中有些事实目前无法确定(未记录的字节布局、未经确认的端口/字节序、暂时无法调用的外部 API、只有通过真实硬件或生产环境才能确定的值)——但大部分工作实际上并不依赖这些事实。不要因为等待而拖住整个项目,也不要把猜测的值散布到整个代码库。划定一个边界。
  • **非目标:**如果未知因素就是整个任务的核心(例如“我们不知道要构建什么”),或者现在就能轻松解决未知因素,则不要使用(此时直接解决即可)。此外:不要猜测后再把猜测说成已经验证;不要为了“保险起见”抽象已经确定的内容(过度设计)。
思维模型

所有依赖稳定领域契约的内容都应立即构建并测试。 所有依赖未知因素的内容都放在一个适配器之后,默认采用有文档记录的最佳猜测,标记为 verified:false,并且只需修改一处即可替换。

unknowns (⚠️ + source-of-truth) → contract ổn định (không ⚠️) → quarantine (1 config + 1 adapter, verified:false) → core build đủ trên contract → mock cùng contract → Adapt-kit (checklist + conformance) → guard boundary.

输入和输出契约
字段必需?含义
输入任务 + 规格说明,其中包含标记为 ⚠️“待验证”的项目是大部分工作不依赖未知因素
输入每个未知因素的最佳猜测文档否缺少时 → 仍必须为默认值记录来源 + 安全失败
输出契约(领域类型/接口)是不包含任何 ⚠️ 值
输出隔离区中的配置 + 适配器是包含所有未知因素,标记为 verified: false,每个 ASSUMPTION 值都注明来源
输出今天即可运行的核心代码 + mock,并通过 E2E 测试是基于契约构建 + 测试
输出ADAPT-CHECKLIST + 一致性测试/向量是切换 verified:true 前的门禁
输出交接说明是已构建并验证的内容、仍属猜测的内容,以及每个 ⚠️ 的单文件定稿路径
规则和能力
  • RULE-01(MUST):适配器及其配置是未知因素唯一允许存在的位置。同一个猜测出现在两个文件中 = 泄漏。
  • RULE-02(MUST):每个猜测都必须标记并注明来源。绝不要在代码或说明中将猜测说成已经验证。
  • RULE-03(MUST):在 verified:false 时,默认行为必须安全失败,不能乐观处理——在一致性验证证明猜测正确之前,一律假设猜测有误(尤其是涉及实体、财务或破坏性操作的内容)。
  • RULE-04(MUST):只隔离真正未知的内容。不要为了“保险起见”抽象已经确定的内容——那是过度设计,不是隔离。
  • RULE-05(MUST):契约是下游工作所依赖的交付物。保持稳定;有计划地扩展,不要随着每个猜测而扩展。
  • RULE-06(MUST):在交接说明中明确写明:构建并验证了什么、哪些内容仍是猜测且待处理,以及每个 ⚠️ 的单文件定稿路径。
  • 能力:阅读现有规格说明/文档;编写项目代码(契约、核心代码、适配器、mock、测试);无需访问真实硬件/生产环境。
失败边界
  • 未知因素就是整个任务的核心(“还不知道要构建什么”)→ 不适用此技能,请向用户澄清。
  • 未知因素可以轻松解决 → 立即查明,不要隔离。
  • 一个猜测值出现在两个位置 → 隔离已失效 → 在修复之前处于 blocked 状态(第 7 步)。
  • 一致性验证未通过 → 保持 verified:false,默认行为采用安全失败(partial,并在交接说明中明确指出)。

用法

工作流概览
StepTypeInputsActionOutputs/exitFailure/next
W01judgmentspec列出未知项,标记 ⚠️ + 事实来源未知项列表能低成本查到 → 不算未知项
W02judgment未知项定义稳定边界(契约)不含 ⚠️ 的契约契约含有 ⚠️ → 重做
W03effect未知项隔离:1 个配置 + 1 个适配器,采用最佳猜测 + verified: false配置 + 适配器—
W04effectcontract完整构建边界之上的所有部分已测试的核心导入隔离区的值 → 修复
W05effectcontract + adapter使用同一契约创建 Mock/Stub离线 E2E—
W06effectadapter交付 Adapt-kit:ADAPT-CHECKLIST + 一致性验证工具包—
W07deterministiccodebase守护边界(lint/审查说明)无泄漏有泄漏 → 修复后再继续

各步骤详情(W01–W07 的事实来源):

  1. 列出未知项。 列出所有你尚不知道或无法验证的事实。为每项标记 ⚠️,并注明其事实来源(真实硬件、生产数据、缺失的文档或利益相关方的决定)。如果某个“事实”现在就能低成本查到——先查清;它不算未知项。

  2. 定义稳定边界(契约)。 编写领域层接口,供其他所有部分使用——类型、函数签名或消息架构,描述的是意图,而不是未知的编码方式。规则:契约中不得包含任何 ⚠️ 值。(例如,使用 SemanticCommand/Telemetry 模型,而不是字节偏移量;使用 PaymentRequest,而不是网关的线格式。)

  3. 隔离未知项。 将每个依赖未知项的常量都放入同一个配置文件,并将每段依赖未知项的逻辑都放入契约后的同一个适配器模块。根据现有文档为每项设置一个最佳猜测默认值,标记为 // ASSUMPTION (source / not verified),并添加明确的 verified: false 标记。只有适配器了解未知项。

  4. 完整构建边界之上的所有部分。 UI、业务逻辑、传输、安全/错误处理、验证:全部基于契约编写,完整实现并经过测试。它们绝不导入隔离区中的值。

  5. 构建使用同一契约的 Mock/Stub。 这样无需真实的未知项,整个系统今天就能端到端运行。让 Mock 遵循同一适配器/配置,以便之后也能用作一致性验证工具。

  6. 交付 Adapt-kit。 提供 (a) 简短的 ADAPT-CHECKLIST——确定未知项后完成适配的具体步骤(编辑配置 → 编辑适配器 → 运行一致性验证 → 将 verified:true 设为 true),以及 (b) 一致性测试/测试向量;在生产环境或真实硬件上信任猜测值之前,必须通过这些测试。

  7. 守护边界。 添加 lint 规则或审查说明:隔离的值不得泄漏到适配器之外。如果某个猜测常量出现在两个地方,就说明隔离已被破坏——继续之前先修复。

分支
IDKindGuard行为Skip / failureRejoin
B01recoveryW07 发现某个猜测值出现在两个地方移至 adapter/config,删除第二处副本—W07
B02conditional_required项目中存在 llmwiki/编写 draft report(Delivery 部分)不存在 llmwiki/ → 跳过结束
验证与停止

必须满足:核心测试 + Mock E2E 基于契约运行并全部通过;一致性测试/测试向量是将 verified:true 设为 true 的唯一关卡。需要审查:契约不含 ⚠️,边界没有泄漏(lint 规则或审查说明)。交接内容完整列出已构建/已验证与猜测/待处理项后,即可停止。

示例
  • 正面: lite3-controller-ui — MotionSDK 协议(命令代码、字节偏移、字节序、端口)尚未通过硬件验证 → 定义 SemanticCommand/Telemetry 契约,将 protocol.config + motionsdk-codec 隔离,基于契约完整构建 UI/WS/bridge/safety,使用 UDP mock host 实现离线 E2E 测试,Adapt-kit 将敲定协议变成只需修改一个文件。
  • 边界/失败: 用户说“还不知道这个应用是做什么的,先构建再说” → 未知因素涵盖整个任务 → 不应用此技能,应先澄清需求。支付网关的 wire format 尚不明确时,默认 verified:false 必须拒绝真实交易(故障安全),不能假定交易成功。
参考 — 快速模板(根据技术栈调整)
contract/         # stable domain types — NO unknown values        (built now, tested now)
  └ model.*       #   intent-level: commands, telemetry, requests
core/             # UI / logic / transport / safety on the contract (built now, tested now)
adapter/
  ├ config.*      # ⚠️ ALL unknown constants + verified:false       (quarantine)
  └ codec.*       # ⚠️ encode/decode against the unknown            (quarantine, swap 1 file)
mock/             # speaks the same adapter → E2E offline + conformance harness
ADAPT-CHECKLIST.* # 5-step finalize procedure when the unknown is known
conformance.*     # vectors that gate verified:true
参考 — 完整示例(本指南的提炼来源)

lite3-controller-ui:MotionSDK 协议(命令代码、字节偏移、字节序、端口)未经真实硬件验证。契约 = SemanticCommand/Telemetry;隔离区 = protocol.config + motionsdk-codec;完全基于契约构建 UI/WS/bridge/safety;通过 UDP mock host 实现完整的离线 E2E 测试;Adapt-kit(检查清单 + 一致性测试向量)让最终敲定协议只需修改一个文件。参见 llmwiki/wiki/draft/orca/150626-lite3-adapter-isolation.md。

交付 — 输出报告(仅当项目中存在 llmwiki/ 时)

工作完成后,撰写一份草稿报告,以便追溯决策。

1. 文件名: llmwiki/wiki/draft/orca/DDMMYY-<ten>.md — DDMMYY = 今天,<ten> = 2–4 个 kebab 格式单词。

2. 撰写:

---
type: draft
title: "DDMMYY-<ten>"
status: proposed
tags: [<skill-name>, output-report]
timestamp: YYYY-MM-DD
---

# DDMMYY-<ten>
**Type:** draft
**Status:** proposed
**Tags:** build-now-adapt-later, output-report
**Proposed:** YYYY-MM-DD

## What
<One sentence — what was built now vs what was quarantined>

## Boundary
- Contract: <the stable domain types/interface>
- Quarantine: <config + adapter files holding the ⚠️ unknowns>

## Unknowns (⚠️) pending verification
| Unknown | Best-guess source | Finalize by |
|---------|-------------------|-------------|

## Files
| File | Action |
|------|--------|

## Notes
- Invoked via: `/build-now-adapt-later` skill

## Origin
- **Draft:** `wiki/draft/orca/DDMMYY-<ten>.md`
- **Commit:** _(filled by verify-before-commit)_
- **Date promoted:** _(filled by verify-before-commit)_

3. 在 llmwiki/wiki/index.md 中追加一行,并在 llmwiki/wiki/log.md 中追加一行。

评论

支持 Markdown