Slate v2 全量发布回归审计:如何把"删除即完成"改造成"门禁即事实"的发布工程
【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate
本文以 docs/plans/2026-04-07-slate-v2-full-release-regression-audit-plan.md 为主体,结合当前仓库的
packages/slate源码结构、docs/slate-v2决策文档与benchmarks/targets基准产物,讲解 Slate v2(plate 仓库中的新一代事务型富文本内核)在"替换 legacy Slate"这一目标上,如何通过全量回归审计、删除表面盘点、发布门禁重建与声明纪律,把发布姿态从"看起来完成了"推进到"每一个断言都有对应证明"。
导读:本篇技术指南围绕 Slate v2 的全量发布回归审计计划展开,它回答一个非常实际的问题——当一次大重构删除了上千个历史测试与源码文件之后,凭什么声称"可以替换旧版"?文章会给出该计划的七大工作流、1239 条删除路径的处置方法、发布门禁的完整构成、Target B 翻绿的六项验收标准,以及可直接复现的审计命令;读完你可以把这套"删除表面盘点 → 逐桶处置 → 门禁强制 → 声明收窄"的方法论直接迁移到自己的大型重构发布流程中。
一、审计动机:为什么"删除即完成"站不住脚
这份审计计划的开篇立场非常直接:Slate v2 的目标是让目标仓库(文档中记为/Users/zbeyens/git/slate-v2,对应审计时正在进行的全新分支)达到诚实的生产发布姿态,以替换 legacy Slate。计划毫不回避地指出三个"难听的事实":
battle-tested(久经战场考验)这一说法不成立——因为旧证明体系中有大块内容是在没有明确替代品的情况下被直接删除的;- 字面意义上的"零回归风险"是幻想;
- 真正可兑现的门槛只有四条:
- 已声明覆盖的功能族(family)内没有已知行为回归;
- 没有任何被删除的证明表面(proof surface)处于"未分诊"状态;
- 没有超出门禁套件(gated suite)实际验证范围的发布声明;
- 没有比已测量车道(measured lanes)更宽的性能声明。
这四条构成了全文的总纲:发布声明的宽度必须等于证明的宽度。任何"我删了旧测试,但新测试还没补上,先发布再说"的路径,都不被这份计划接受。
二、当前判定:Target B 今天还不能翻绿
计划给出的当前判定是Target B: Go尚不诚实,原因有四点:
- 历史回归语料仍远大于重建后的 oracle 表面——旧版有上千个测试文件,重建的契约测试只是其中一小部分;
- 贡献者可见面的恢复虽然关闭,但加宽后的功能族证明深度仍落后于笼统声明;
- 公共/包级声明仍然窄于"完全替换 legacy Slate";
- 性能证据仍是逐车道(lane-by-lane)的,且当前结果参差不齐(mixed)。
与此同时,早前审计草案中暴露的问题里,有一部分已经关闭:
- 贡献者可见槽位恢复(contributor-facing slot recovery):
android-tests、check-lists、code-highlighting、custom-placeholder、inlines、search-highlighting、slate-hyperscript七个槽位均已恢复;
- 实时文档不再指向已删除的贡献者槽位;
- 根替换命令图(replacement command graph)已恢复,包括:替换兼容性命令、替换基准命令、
slate-browser根证明命令; - 根
tsconfig.json不再指向已删除的*-v2包路径。
这些"已关闭"清单很重要:它说明审计不是停留在批判层面,而是边审计边把能修复的洞补上。当前仓库中 docs/slate-v2/release-readiness-decision.md(2026-04-18 更新)延续了这一立场,判定依然是"Not release-ready",并把主阻塞点收窄为"最终同轮(same-turn)集成/构建/类型/检查/性能闭合"。
三、七大有序工作流:从声明纪律到性能复审
审计计划把全部工作组织为七个按顺序执行的工作流,每一节都包含状态(Status)、当前读法(Current read)、退出条件(Exit condition)。
3.1 Claim Discipline(声明纪律)——已完结
核心问题:发布文档与 README 说的必须与真实能力一致,不能假装"全面替换"。
当前读法:
- 实时判定文档保持
Target B: No-Go; - 实时文档以诚实口径描述加宽后的当前功能族表面,不再假装整体替换。
相关文件(已转换为仓库相对路径):
- docs/slate-v2/overview.md
- docs/slate-v2/release-readiness-decision.md
- docs/slate-v2/replacement-gates-scoreboard.md
- 各包的 README(如 packages/slate/README.md)
退出条件:保持现状,直到下面列出的其余阻塞项真正关闭。
这一节的工程价值在于:"文档不撒谎"本身就是一个可追踪的工作流。当前仓库的 docs/slate-v2/replacement-gates-scoreboard.md 就是这套纪律的产物——它用一张表格逐行记录每个 tranche 门禁的状态、当前 owner、证明命令,并写下三条硬规则:"一个门禁不会因为旁边的证明是绿的而变绿""一个门禁不会因为有草稿价值而变绿""一个门禁只有在所属 tranche 诚实退出时才变绿"。
3.2 Contributor-Facing Concept Recovery(贡献者可见概念恢复)——首轮已关闭
核心问题:重构中删除的"贡献者可见概念"(比如某个示例、某个测试入口)必须落到一个最近的当前概念槽位,否则贡献者会面对死链接或凭空消失的功能。
当前读法:当前恢复批次(seven-slot matrix)中的每个被删除贡献者概念,现在都有:
- 一个当前概念槽位(current conceptual slot);
- 一个证明 owner;
- 一个文档 owner。
该工作流不再阻塞第一轮恢复,而是作为后续删除的规则留存("以后删除概念必须先落到槽位"),而不是一个活跃的缺失槽位队列。
3.3 Rebuild The Real Release Gate(重建真实发布门禁)——命令图已恢复
核心问题:发布路径必须运行"发布声明所依赖的证明",而不是在发布时绕开测试。
当前状态:目标 clone 的根package.json中恢复了如下脚本族:
test:replacement:compat:localtest:replacement:gate:localtest:slate-browser:*bench:replacement:*
并且prerelease现在会依次经过:
yarn build:rollupyarn test:replacement:gate:localyarn lint:release
仍然待办:
- 同轮绿色发布证据(same-turn green release evidence);
- 维护者需要能一句话解释"为什么
lint:release是发布检查下限,而不是噪音较大的全仓yarn lint"。
要求的门禁发布栈(Required gated release stack):
yarn test:mochayarn workspace slate-react run testyarn workspace slate-dom testyarn test:replacement:compat:local或 CI 安全等价命令- 所有已声明功能族的浏览器车道
- 已测量的基准车道
退出条件:一条发布命令强制执行文档所依赖的同一套证明栈,且维护者能不假思索地解释这条命令。
说明:
yarn test:replacement:gate:local等命令定义在审计文档所指的 slate-v2 目标 clone 中;当前 plate 仓库根 package.json 采用 pnpm + Bun + Turbo 的工具链,对应的基准门禁命令以bench:*前缀呈现,例如bench:core:huge-document:compare:local、bench:react:huge-document:legacy-compare:local,其产物与证据元数据记录在 benchmarks/targets/history/slate-v2-latest.json。
3.4 Rebuild The Package Regression Oracle(重建包级回归预言机)——进行中
核心问题:被删除的历史包级测试必须逐功能族分诊,不能让一个微小的契约壳假装替换庞大的旧语料库。
当前读法:snapshot-contract.ts已镜像77 行 legacy oracle rows,覆盖:
moveEditor.beforeEditor.afterselectsetPointdeselectwrapNodesunwrapNodesliftNodesdelete
计划承认这是"真实的进展",但与旧语料相比仍然很小。对照当前仓库 packages/slate/src 的源码结构可以看到这些能力确实存在于实现中:
transforms/目录下有moveNodes.ts、select.ts、setPoint.ts、deselect.ts、wrapNodes.ts、unwrapNodes.ts、liftNodes.ts、deleteText.ts等实现,且多数带同目录.spec.tsx测试(如 packages/slate/src/transforms/wrapNodes.spec.tsx、packages/slate/src/transforms/setPoint.spec.tsx);internal/editor/下保留了getPointBefore.ts、getRange.ts、last.ts、next.ts、parent.ts、previous.ts、unhangRange.ts等一批带.spec.tsx的方法级测试;interfaces/editor/下同时保留editor-api.ts与legacy-editor.ts,与审计计划"新 API 与 legacy 兼容面并存、但 legacy 只保留仍值得保留的部分"的路线一致。
对每个被删除的包测试桶,要求做三分类:
mirrored now(现已镜像);supportable next(下一步可支撑);explicit skip(显式跳过)。
退出条件:包测试收缩要么被解释清楚,要么被重建,要么被显式地从范围内切除——不允许"既没解释也没重建"地悬着。
3.5 Rebuild Direct Browser Proof For Deleted Family Lanes(重建被删除功能族的直接浏览器证明)——进行中
核心问题:replacement-compatibility.test.ts有用,但它不能完全替代针对当前功能族的直接浏览器证明。
当前读法:
- 当前功能族浏览器证明已存在:richtext、markdown、forced-layout、styling、hovering-toolbar、editable-voids、images、embeds、tables、scroll-into-view;
- 被删除的直接车道如
iframe、plaintext、read-only、shadow-dom、select,现在被显式映射而不是静默消失。
被删除的浏览器车道必须二选一:
- 恢复为直接的当前功能族车道;
- 显式移入"仅对比(comparison-only)/范围外(out-of-scope)"。
退出条件:没有任何被删除的浏览器车道停留在"悬而未决"状态。
3.6 Re-Audit Public Package Scope Deletions(重新审计公共包范围删除)——进行中
核心问题:包移除与公共表面删除属于发布范围决策,不是内部清理,必须逐项给出结论。
已关闭的决策:
slate-hyperscript:作为活跃包槽位恢复,根 Mocha smoke 证明已补,旧 fixture 语料留在发布门槛之外;- 根
tsconfig.json:移除过期的*-v2包引用; - 根命令图:替换与
slate-browser命令恢复; - Rollup / React 19 互操作:
react/jsx-runtime命名导出处理恢复; slate-browser包集成:根 workspace 依赖恢复,包级 Node 类型声明补齐。
仍需审计:
packages/slate/src/**packages/slate-react/src/**packages/slate-dom/src/**
退出条件:每个公共/包级删除要么恢复、要么被替换、要么被显式切出发布承诺。
3.7 Only Then Revisit Perf(最后才回到性能)
核心问题:当前测出的单个 richtext 回归不是主要阻塞点;在行为与证明欠债关闭之前,性能措辞必须保持狭窄。
保持原样的已测车道:
- placeholder
- huge-document
1000-block - richtext blockquote toggle
- markdown blockquote shortcut
- editable-void insert
x5 - table cell edit
退出条件:
- 先关闭行为/测试回归;
- 性能语言仍然只匹配已测车道。
这条顺序原则值得强调:性能数字只有在行为正确的前提下才有意义。这也解释了为什么计划把性能放在第七位而不是第一位。
四、贡献者可见概念矩阵:七槽位恢复的脊柱
这份矩阵是概念恢复的脊柱——Target B翻绿之前,每个被删除的贡献者可见概念都必须落到一个最近的当前概念槽位。完整矩阵如下:
| Legacy 概念 | 当前状态 | 最近的当前概念槽位 | 证明 owner | 文档 owner | 备注 |
|---|---|---|---|---|---|
android-tests | 已恢复 | android-tests当前中心,指向 IME/移动输入车道 | android-tests.test.ts | docs/general/contributing.md、实时文档 | 恢复为贡献者可见的 IME 测试中心 |
check-lists | 已恢复 | check-lists当前交互式清单槽位 | check-lists.test.ts | 示例文档 + 替换文档 | 在当前的EditableBlocks接缝上恢复 |
code-highlighting | 已恢复 | code-highlighting当前可编辑 token 高亮槽位 | code-highlighting.test.ts | 示例文档 + 替换文档 | 在当前 projection 接缝上恢复 |
custom-placeholder | 已恢复 | custom-placeholder当前占位符接缝槽位 | placeholder.test.ts | 示例文档 + 替换文档 | 当前接缝用placeholderprop,而非旧的renderPlaceholder接缝 |
inlines | 已恢复 | inlines当前槽位,由links及内联族表面支撑 | inlines.test.ts | 根/示例文档 + 替换文档 | 当前槽位比旧的单体示例更窄 |
search-highlighting | 已恢复 | search-highlighting当前槽位,由当前高亮投影支撑 | search-highlighting.test.ts | 示例文档 + 替换文档 | 当前槽位使用投影驱动高亮 |
slate-hyperscript | 已恢复 | slate-hyperscript包槽位,带当前 smoke 证明 | 根 mocha 车道 + 包 smoke | 文档 + 包声明 | 旧 fixture 语料留在发布门槛之外 |
这张表的用途不只是"记录恢复",更是未来的删除协议:任何新的概念删除,都必须先找到它的"最近的当前概念槽位",否则不允许删除。
五、发布门禁清单(Release-Gate Manifest)
这是恢复期间对"当前替换声明"所要求的本地证明栈:
规范命令:
yarn test:replacement:gate:local
清单成员:
yarn testyarn test:replacement:compat:local- 当前浏览器车道:
android-testscheck-listscode-highlightinginlinescustom-placeholdersearch-highlightingrichtextmarkdown-shortcutsmarkdown-previewforced-layoutstylinghovering-toolbareditable-voidsimagesembedstablesscroll-into-view
- 基准车道:
- placeholder
- huge-document
- richtext
- markdown
- editable-voids
- tables
开放缺口(Open gap):清单存在并已接入根命令;但真正重要的是加宽功能族声明背后证明的深度与真实性,而不是命令名是否存在。这一句点出了审计计划的方法论核心:门禁脚本只是形式,脚本背后每一条断言是否有真实证明才是实质。
六、删除表面全量清单:1239 条路径的处置分区
这份清单是审计计划的"账本"。所有计数来自命令:
cd /Users/zbeyens/git/slate-v2 && git diff --diff-filter=D --name-only计划定义了四个处置桶(disposition buckets):
blocked-restore-or-cut:直接影响发布声明、仍需要显式决策的删除表面;closed-by-note:之后由"实时证明 + 专门关闭说明"协调的删除表面;internal-rewrite-audit:可能没问题、但仍需导出/API 审计的删除源码表面;release-doc-noise:本身不阻塞声明的删除文档。
全部删除路径的精确分组:
| 删除路径 | 数量 | 处置桶 |
|---|---|---|
packages/slate/test/interfaces/** | 576 | blocked-restore-or-cut |
packages/slate/test/transforms/** | 408 | blocked-restore-or-cut |
packages/slate/test/operations/** | 31 | blocked-restore-or-cut |
packages/slate/test/normalization/** | 20 | blocked-restore-or-cut |
packages/slate/test/utils/** | 11 | blocked-restore-or-cut |
packages/slate/test/index.js | 1 | blocked-restore-or-cut |
packages/slate/test/jsx.d.ts | 1 | blocked-restore-or-cut |
packages/slate-react/test/** | 8 | blocked-restore-or-cut |
packages/slate-history/test/** | 17 | closed-by-note |
playwright/integration/examples/** | 2 | closed-by-note |
site/examples/ts/** | 1 | closed-by-note |
packages/slate-dom/src/** | 13 | internal-rewrite-audit |
packages/slate-react/src/** | 30 | internal-rewrite-audit |
packages/slate/src/** | 116 | internal-rewrite-audit |
packages/slate-dom/CHANGELOG.md | 1 | release-doc-noise |
packages/slate-history/CHANGELOG.md | 1 | release-doc-noise |
packages/slate-react/CHANGELOG.md | 1 | release-doc-noise |
packages/slate/CHANGELOG.md | 1 | release-doc-noise |
分组总计:1239 条删除路径,0 条未匹配路径。也就是说,每一条删除都被纳入了某个处置桶——这正是"没有删除证明表面处于未分诊状态"这条发布门槛的可验证体现。
6.1 A 类:被删除的包测试表面
packages/slate/test删除:1048 条,精确桶划分:
interfaces/**— 576transforms/**— 408operations/**— 31normalization/**— 20utils/**— 11index.js、jsx.d.ts各 1
发布动作:在声称"完全替换置信度"之前,必须重建或显式切除每个功能族。
packages/slate-react/test删除:8 条,精确文件:
chunking.spec.tsdecorations.spec.tsxeditable.spec.tsxreact-editor.spec.tsxtsconfig.jsonuse-selected.spec.tsxuse-slate-selector.spec.tsxuse-slate.spec.tsx
发布动作:为每个删除的接缝重建直接运行时覆盖,或从声明中切除。
packages/slate-history/test删除:17 条,状态为 closed-by-note,由 docs/plans/2026-04-09-slate-v2-slate-history-deleted-test-family-closure.md 对照实时history-contract.ts证明表面关闭。精确文件包括isHistory/after-edit.js、isHistory/after-redo.js、isHistory/after-undo.js、isHistory/before-edit.js、undo/delete_backward/block-join-reverse.tsx、undo/insert_break/basic.tsx、undo/insert_fragment/basic.tsx、undo/insert_text/basic.tsx等 15 个测试文件,外加index.js与jsx.d.ts。
发布动作:按专门关闭说明保持该测试族关闭;slate-history包删除工作已完全关闭,依据是 docs/plans/2026-04-09-slate-v2-slate-history-deleted-test-family-closure.md 与 docs/plans/2026-04-09-slate-v2-slate-history-package-residue-closure.md。
6.2 B 类:被删除的浏览器证明表面
Playwright 示例测试删除:2 条,closed-by-note,依据 docs/plans/2026-04-09-slate-v2-playwright-integration-examples-deleted-family-closure.md 对照当前浏览器证明栈关闭:
playwright/integration/examples/huge-document.test.tsplaywright/integration/examples/select.test.ts
当前映射:select在直接当前 richtext 浏览器接缝上恢复;huge-document是显式"更优切割",由冻结的基准车道持有。这一点在当前仓库的基准产物中可得到印证——benchmarks/targets/history/slate-v2-latest.json 记录了core-huge-document-compare、react-huge-document-full、react-huge-document-browser-trace等车道及其问题描述、运行命令与证据产物路径。
6.3 C 类:被删除的示例表面
TypeScript 示例删除:1 条:site/examples/ts/custom-types.d.ts,closed-by-note,依据 docs/plans/2026-04-09-slate-v2-site-examples-ts-custom-types-closure.md——在当前结构化类型契约下显式跳过。
JavaScript 示例删除:0 条:site/examples/js/**下无剩余删除路径。
发布动作:示例/浏览器族按专门关闭说明保持关闭;示例表面恢复实质完成。
6.4 D 类:与被移除表面绑定的贡献者文档漂移
已发现的精确漂移:
docs/general/contributing.md引用了playwright/integration/examples/check-lists.test.ts与/examples/android-tests;site/examples/Readme.md仍写着replacement-candidate,仍把Rich Inline当作替换候选锚点。
发布动作:贡献者文档已重新定向到恢复后的当前表面;剩余维护工作是记录漂移而非寻找死链。
6.5 E 类:被删除的公共包表面
整包移除(早期审计快照):packages/slate-hyperscript/**共 39 条删除路径,包括CHANGELOG.md、Readme.md、package.json、src/creators.ts、src/hyperscript.ts、src/index.ts、src/tokens.ts,以及test/fixtures/下 30 余个*.tsxfixture(cursor-across-element.tsx、element-nested-string.tsx、fragment-string.tsx、text-full.tsx等)、test/index.js、test/jsx.d.ts、tsconfig.json。
发布动作(已解决):
slate-hyperscript作为活跃包槽位恢复;- README/文档引用恢复;
- 根 Mocha smoke 证明覆盖该贡献者可见包槽位;
- 旧 fixture 语料留在发布门槛之外。
早期审计快照中的大型源码表面删除,精确桶划分:
packages/slate/src/editor/**— 56packages/slate/src/interfaces/**— 19packages/slate/src/transforms-node/**— 11packages/slate/src/utils/**— 9packages/slate/src/core/**— 8packages/slate/src/transforms-selection/**— 7packages/slate/src/types/**— 3packages/slate/src/transforms-text/**— 3packages/slate-react/src/hooks/**— 16packages/slate-react/src/components/**— 7packages/slate-react/src/chunking/**— 6packages/slate-react/src/plugin/**— 2packages/slate-react/src/utils/environment.ts、custom-types.ts、@types/direction.d.ts— 3packages/slate-dom/src/utils/**— 10packages/slate-dom/src/plugin/**— 2packages/slate-dom/src/custom-types.ts— 1
发布动作:对照三个维度逐桶审计:公共导出(public exports)、被替换的证明(replaced proof)、文档承诺(docs promise)。
6.6 F 类:被删除的 CHANGELOG 文件
精确文件:packages/slate/CHANGELOG.md、packages/slate-dom/CHANGELOG.md、packages/slate-history/CHANGELOG.md、packages/slate-hyperscript/CHANGELOG.md、packages/slate-react/CHANGELOG.md。
发布动作:低优先级,仅当发布工具或包文档仍假设这些文件存在时才需要处理。当前仓库中 packages/slate/CHANGELOG.md 依然存在,说明这一族文件在 plate 仓库中已被保留。
七、Target B 翻绿的六项验收标准
只有全部满足,Target B才能从No-Go翻回Go:
- 本计划中的每一条被删除证明表面都有已记录的处置:restored(恢复)/ replaced(替换)/ explicit scope cut(显式范围切除);
- 实时文档与仓库文档与该处置一致;
- 发布脚本运行真实替换门禁;
- 包测试收缩由重建的覆盖来解释,而不是靠一厢情愿;
- 贡献者文档不再指向已删除表面;
- 性能措辞仅限于已测车道。
这六条其实是"声明纪律"的落地形式:每一条都可以被机械地检查,而不是靠维护者的口头保证。
八、可复现的审计命令(Repro Commands)
刷新本计划时使用以下精确命令:
cd /Users/zbeyens/git/slate-v2 git diff --diff-filter=D --name-only git diff --diff-filter=D --name-only | rg '^packages/slate/test/' git diff --diff-filter=D --name-only | rg '^packages/slate-react/test/' git diff --diff-filter=D --name-only | rg '^packages/slate-history/test/' git diff --diff-filter=D --name-only | rg '^playwright/integration/examples/' git diff --diff-filter=D --name-only | rg '^site/examples/ts/' git diff --diff-filter=D --name-only | rg '^site/examples/js/' git diff --diff-filter=D --name-only | rg '^packages/slate-hyperscript/'这套命令的工程含义值得展开:git diff --diff-filter=D是 Git 的"只看删除"过滤,配合rg按包目录分桶,就可以把一次大型重构的所有删除路径机械地产出,再与计划的处置清单逐行核对。这正是"1239 条删除、0 条未匹配"这个数字的由来——它是可重复执行的账目,不是一次性的估算。
九、审计之后:仓库中的延续证据
这份审计计划并非孤立文档,当前仓库中保留了它后续状态的延续证据:
- docs/slate-v2/release-readiness-decision.md(2026-04-18):判定仍为"未达发布就绪",但明确表示"包运行时阻塞阶段已过,活跃 owner 是最终声明宽度闭合",并给出了
packages/slate、slate-history、slate-hyperscript、slate-dom、slate-react各包的"实质性进展"清单; - docs/slate-v2/replacement-gates-scoreboard.md(2026-04-18):逐门禁记录 tranche 1–8 状态与 v2 北极星门禁(overlay 架构闭合、源码作用域 overlay 失效、React 运行时局部性、超大文档 overlay 姿态等)及其证明命令;
- docs/slate-v2/overview.md:把审计计划放在
slate-v2迁移程序的阅读顺序中,并定义了文档所有权矩阵; - docs/slate-v2/references/pr-description.md:作为维护者面向的 PR 描述来源,把"哪些 issue 修复了、哪些只是相关、哪些未声明"逐条记账,并明确规则——"不要因为听起来相关就添加 issue 编号,那是 PR 正文变成 bullshit 的方式"。
这些文件共同说明一个事实:这份 2026-04-07 的审计计划不是一次性的,而是被后续文档持续继承和推进的发布基线。它确立的方法论——删除表面逐条记账、门禁命令强制执行、声明宽度等于证明宽度、性能措辞不越界——已经内化成了整个 slate-v2 迁移程序的日常工作方式。
十、可迁移的工程要点
把这份计划的思路提炼成可复用的检查清单:
- 发布前先做删除账本:
git diff --diff-filter=D --name-only配合按目录分桶的rg,把每一次重构的删除路径全部枚举出来,逐条标注处置桶; - 删除必须落到槽位:任何被删除的贡献者可见概念(示例、测试入口、文档锚点)都必须找到"最近的当前概念槽位",否则不允许删除;
- 门禁脚本必须等于发布声明:
prerelease跑什么,文档就声称什么;不存在"文档说全绿、发布脚本跳过测试"的组合; - 性能声明永远收窄:性能数字只在行为正确、回归关闭之后才有发布意义,措辞只匹配已测车道;
- 用关闭说明代替口头承诺:每类删除表面用一份专门的 closure note 记录处置依据,链接到对应证明文件,使任何后来的维护者都能回溯"为什么这条可以删"。
这套方法论对任何"大重构替换旧系统"的项目都成立:发布不是功能完成的时刻,而是证据链闭合的时刻。
【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考