跳到主要内容

为一个论题设计的六个 Plan(以及更名为 Charter 的那天)

· 阅读需 12 分钟

纸面上六个 Plan,实际跑了五个 —— Sentinel 在 4 月 25 日至 28 日之间的第一次系统性实验。正是这一轮把一个手工的模式变成了 Charter,即框架中有边界的工作单元。

1. 一个说明了很多事情的脚注

在 2026 年 4 月 30 日撰写的 charter-telemetry.md 提案中,文档顶部有一条术语说明:

"本文档所称'Charter',在 Sentinel 实验中(PLAN-01..06)称为'Plan'。以下引用的实证数据沿用这些历史 Plan 的原始名称;架构形态和前瞻性示例则使用新的正式名称'Charter'。"

这是一条技术性脚注,平实无华。但它精确记录了制品更名的那个瞬间——更有意思的是,它记录了一项存档决策,本博客同样遵守这一决策:当时被称为 Plan 的,在原始记录中依然叫 Plan。向后改写名称,会伪造溯源记录。

这篇文章涉及五天内发生的两件事:框架的首次系统性实验——Sentinel 的六个 Plan,在 4 月 25 日至 28 日之间执行——以及紧随其后、在 4 月 30 日发生的更名。这并非两件独立的事,一件导致了另一件。


2. 纸面六个 Plan,实际五个

本次实验设计了六个 Plan(PLAN-01PLAN-06),实际执行了五个。PLAN-04 从未运行:它停留在一份包含七项延期功能的目录清单状态,罗列了我们想做但测试周期无法覆盖的事项。如实说明这一点是应有的诚实,因为验证该论题的文档(thesis-validation.md)在其汇总表中公开记录了这一情况:

Plan规模内容格式
PLAN-01XS治理文档部署v1
PLAN-02S管理端点(gcp-resourcev1
PLAN-03XS合约版本升级v1
PLAN-05M按服务配置异常阈值v2
PLAN-06XS手动重算基准线v3
(PLAN-04 目录)7 项延期功能的路线图,未执行

五个 Plan,四种不同规模:三个 XS、一个 S、一个 M。领域刻意选取异构——运维部署、两个管理端点、合约升级、带配置逻辑的后端功能。这不是合成基准测试,而是 Sentinel 在 4 月 25 日至 28 日之间的真实代码,被划分为有边界的工作单元,以三个模型(Copilot、Gemini、Claude)作为外部审计方,逐一审计。

第六个 Plan 未能执行,这件事有两层意义。显而易见的一层是:实验超出了时间预算。更耐人寻味的是:PLAN-04 是这批 Plan 中唯一规模较大的——七个累积功能,没有自然边界。偏偏这个 Plan 没能跑完,已经在暗示这种格式能承载的规模上限。小型 Plan 可以;路线图式的 Plan 不行。这个经验后来被正式确立,无需任何人专门写明:StrayMark 的 Charter 今天是*"有边界的工作单元,耗时数小时到数天,对应一个分支"*,而非季度路线图。


3. 实验在自身迭代中演进

五个已执行的 Plan 产生了三种不同的格式。这不是随意为之,而是因为每个周期都暴露了上一个格式未能捕捉到的内容。

  • v1 —— 前三个 Plan(010203)沿用原始格式执行。在审计 AILOG 中识别出五个反复出现的模式,但没有一个被正式化为模板。它们以习惯的形式存在,而非合约。

  • v2 —— 针对 PLAN-05,将这五个模式固化进 TEMPLATE.md,并在 README 中添加了"格式约定"章节。仅限文档层面:尚无可执行的内容。假设是:如果格式明确,外部审计方的判断会更趋于一致。AILOG-020 直言不讳:"内部沿用已久但无名可循的模式,对外部审计方而言是不可见的。正式命名,能把实践变成公开的信号。"

  • v3 —— 针对 PLAN-06,新增了一个模式(自动清单漂移检测),并且这次引入了可执行工具scripts/check-plan-drift.sh,约 145 行 bash 脚本,用于验证实际交付内容是否与 Plan 中的声明相符。格式第一次从纯文本转变为带有验证器的形态。

我想指出的是这条曲线的形态。v1 捕捉了潜在实践,v2 为其命名,v3 编写了检查它的程序。这正是任何有效标准化的完整弧线——只不过压缩进了五个 Plan,而非五年。

这也是某个事物最早的具体证据——两个月后,它会在 CHARTER-CHAIN-EVOLUTION.md 中被明确命名为模式 1(pre-declare refresh)和模式 2(amend-on-emergence)。在那里作为元模式被正式确立的内容,最初在 4 月,只是一个无名的习惯。


4. 最有力的证据:外部审计方的收敛

论题中最关键的假设是:"结构化记录能减少失效模式,当外部审计方介入时,这种减少是可观测的。" 验证方式:将每个 Plan 的产出——修改的文件、AILOG、TEMPLATE 下的 Plan 文档——提交给三位未参与开发的审计方(Copilot、Gemini,以及 Claude 的批判性分析),比较汇总评分。

thesis-validation.md 报告的 PLAN-05 数据(第一个使用 v2 格式的 Plan,也是唯一一个 M 规模的 Plan)十分清晰:

"5 个周期中最佳的综合审计方校准度(Copilot 9.25,Gemini 9.5)。累积假设已验证:TEMPLATE v2 + 丰富的 AILOG 减少了外部审计的歧义面。"

两个异构模型,不同的指令,在这批 Plan 中规模最大的 Plan 上收敛于 9.3/10——不是最小的那个。这是信号,不是噪声。在 v3 的 check-plan-drift.sh 运行时,这一结果得到了复现:

"PLAN-05(含已知漂移):脚本报告 3 个遗漏文件:evaluator_test.go(F4)、repository.go(F1/R6)、statuscenter/service.go(F5)—— 正好是 Copilot+Gemini 在审计中捕获的 3 处漂移。零误报。"

自动化脚本与两位外部审计方在哪些 Plan 文件未完成这件事上完全一致。这不是在论证脚本有多智能——它不过是 bash 加 grep,再简单不过。这是在论证 Plan 格式一旦正式化,就能让任何检查方(人类、智能体、脚本)看到相同的内容。结构化规范不需要智能就能被审计:它需要的是清晰。


5. 实验未能证明的事

这一节是我最希望留存在记录中的,因为它考验博客是否愿意诚实。

thesis-validation.md 的明确设计目标是打破该论题,而非捍卫它。文档第一行写道:

"本文档将用数据检验这一论题。它不是为了捍卫它,而是试图打破它。目标是:一位不认同该论题的读者,只需阅读本文,就能判断现有证据是支持、修正还是反驳它。"

将论题的六个假设与证据对照后,最终结论如下:

#假设结论
1Vibe coding 无法规模化部分验证*(无对照组)*
2结构化记录减少失效模式已验证
3合规性作为无额外工作的副产品已验证*(待真实人工审计方测试)*
4审批很少是非此即彼的无证据——待多参与方项目验证
5Stage 比 commit 更适合作为可追溯单元已验证
6就地签署优于事后重建部分验证*(未测试加密签署)*

三个假设完全验证,两个部分验证,一个无证据,零个被反驳。关于非二元审批的假设未经测试,因为 Sentinel 是单一所有者项目;要得出结论,需要一个有多位签署方的真实团队。加密签署——Sigstore、哈希链、仅追加日志的技术保证——未经演练,因为没有 Plan 涉及流程的那个部分。这在文档中作为明确的空白保留,而非含糊其辞的断言。

实验未能证明的事,比它证明了的更重要。如果我们发布六个绿灯,而非五个诚实的结论,这个博客就成了营销材料。避免这种情况的方式,是直言不讳:这里有我们没有证据的假设,单一操作者项目无法生成这些证据。其他人会生成;框架将随着这些数据的积累而成熟。


6. 为什么 Plan 变成了 Charter

4 月 30 日的更名不是营销行为。原因字面上写在 WHAT-IS-A-CHARTER.md 中:

"GitHub SpecKit 已经用'plan'这个词(/speckit.planplan.md)指代另一种制品,这一名称冲突在同时使用两套流程的采用者文档中造成了摩擦。"

SpecKit 已经有了 plan.md,StrayMark 也有。在同时使用两者的采用者文档中,相邻段落里的 plan 指代着不同的东西。更名是为了消除这一冲突。

但在这个务实动机背后,有一个值得点明的细节。这两种制品确实不同,且区别是结构性的:

SpecKit plan.mdStrayMark Charter
粒度完整功能(数周,多个用户故事)有边界的工作单元(数小时到数天,一个分支)
主要内容技术栈、依赖、项目结构、constitution 检查门待修改的具体文件、验证命令、R<N> 风险
验证方式Constitution Check(事前门控)漂移检查 + 外部审计(事后门控)
优化目标前置清晰度事后可追溯性

SpecKit 所称的 plan 更像是带有架构骨架的 ADR。StrayMark 所称的 Charter 更像是带有合约验证和审计锚点的任务卡片。它们是互补制品,而非竞争关系;SPECKIT-CHARTER-BRIDGE.md 在 5 月对此做了明确说明。但在讨论互补性之前,名称冲突必须先得到解决。

我认为值得重点强调的是这一伴随决策:Sentinel 的历史记录——AILOG、遥测数据、check-plan-drift.shsentinel/docs/plans/ 文件夹——保留了 Plan 这个名称。WHAT-IS-A-CHARTER.md 本身这样论述:

"Sentinel 的历史记录(Plan 01–06、sentinel/docs/plans/sentinel/scripts/check-plan-drift.sh、AILOG 与 YAML 遥测数据 PLAN-NN.telemetry.yaml)保留原始名称——它们是特定时刻的实证记录,改写历史会伪造这份记录。"

改写历史会伪造记录。 对我而言,这句话才是这次更名的真正核心。框架存在的目的是保存溯源记录,而非改写它。当制品更名时,变化是前瞻性的:从 4 月 30 日起,新创建的是 Charter。旧的、实验期间的那些,仍然是 Plan。这种不一致是刻意为之的,而这种不一致本身就是证据。

4 月 30 日更名的另一个伴侣——遥测提案——在同一天出现,事后看来原因显而易见:如果这个涌现出来的模式值得一个新名称,它也值得结构化的度量。charter-telemetry.schema.v0.json 架构,包含投入时间、检测到的漂移、规模、领域等字段,是今天用于机器化度量的工具,而 Sentinel 在 4 月时还在用手写 YAML 进行度量。Plan 被更名为 Charter 的同一天,我们决定开始计数 Charter。


7. 结语

从这个过程中,我提炼出四点:

  1. 实验的设计目标是打破,而非确认。 "它不是为了捍卫,而是试图打破" —— 这字面上就是验证论题的文档的职责定义。任何值得尊重的技术博客都必须能承受这种框架。

  2. 六个设计中的 Plan,四天内执行了五个。 那个未能执行的(规模最大,包含七个功能的路线图)偶然间成为了工作单元能承载多大规模的第一条证据。今天的 Charter 是通过合约约定有边界的;在 4 月,边界是偶然形成的。

  3. 格式在实验内部自我演进:从习惯,到模板,到脚本。 五个 Plan 产生了三个版本的格式。v1 → v2 → v3 的曲线,是任何有效标准化的曲线——只是被压缩了。

  4. 更名源于务实,而非营销。历史保存源于原则。 Plan 在 Sentinel 中依然叫 Plan,因为当时它就叫那个名字。Charter 从 4 月 30 日起开始使用。框架不改写自己的存档——这正是它值得追溯的原因。

下一篇将介绍两个相近的里程碑,它们将全新的能力定性地编码为正式规范——Charter 作为一等实体(PR #65,fw-4.4.0)和外部多模型审计周期audit-skills-designaudit-cli-flow,发布版本 fw-4.7 → fw-4.9)。那就是 Sentinel 实验成为 CLI 功能的地方。


参考锚点:提案 thesis-validation.mdcharter-telemetry.md(均为 2026-04-30)。Charter 的规范定义:WHAT-IS-A-CHARTER.md。运行时架构:dist/.straymark/schemas/charter-telemetry.schema.v0.json

本文档在生成式 AI 工具(Claude 4.7)的协助下撰写;内容的全部责任由人类作者承担。