Skip to content

通用 CI/CD 文档体系与工程报告规范指南 (Universal Specification) ​

本文档定义了一套适用于绝大多数软件工程(包括通用后台、SDK 基础库、CLI 工具以及移动/桌面端 App 项目)的通用文档与 CI/CD 报告管理规范。 其核心目标在于解决:技术变更与用户语言混杂、版本日志管理混乱、CI 自动化执行缺乏可见性、以及文档侵入生产二进制分发包等典型工程痛点。


一、 核心文档定义与分层职责矩阵 (Core Documentation Architecture) ​

任何具备可持续交付能力的工程,其文档体系应遵循“按目标受众与消费场景分层”的设计哲学,将内部开发归档、技术总结、自动化脚本入口与终端用户/应用商店发布说明彻底解耦:

文件 / 目录核心定位目标受众格式与内容规范
changes/历史版本完整技术变更档案核心开发者、代码审查人、架构师- 采用目录化管理历史版本文件(如 changes/v1.2.md)。
- 版本文件命名:仅保留前两位主次版本号(v<Major>.<Minor>.md);
- 文件内部结构:构建号/修订号(如日期+流水号、语义化 Patch)统一在文件内的二级标题(## Build <YYYYMMDD.N> 或 ## v1.2.1)中增量追加记录。
- 内部包含 ### Added, ### Changed, ### Fixed, ### Refactored, ### Security 等标准变更类型。
Release.md最新版本技术变更镜像CI 自动化脚本、发布引擎、工程团队- 权威镜像:内容与 changes/ 目录中最新版本文件保持 1:1 完全一致。
- 存在动机:作为 CI/CD 流水线与脚本提取当前版本技术改动的固定入口,彻底免除动态扫描与正则探测历史目录的脆弱性。
changeLog.md全生命周期版本索引与摘要依赖接入方、技术经理、开源社区- 全生命周期版本演进的索引总览(Executive Summary)。
- 按里程碑版本倒序汇总核心功能高光,并使用相对路径链接指向 changes/ 目录下的具体版本档案。
ReleaseNote.md用户友好化发布说明 (User-Facing)终端用户、产品运营、客户支持- 语言风格:彻底剥离底层代码重构、管道细节与私有技术名词,采用亲和、易懂的自然语言。
- 内容聚焦:新增了哪些实用功能、解决了哪些困扰用户的体验痛点、带来了哪些性能或交互提升。
index.md技术文档全景总索引与导航树全体工程人员、新加入成员- 工程文档中心(Docs Site)的根索引页,聚合架构设计、API 参考、部署运维、测试规范与核心版本文档的完整导航树。

二、 版本标识生成与编码规范 (Versioning Specification) ​

工程版本号不仅是对外发布的商业标识,更是 CI/CD 自动化流水线追踪构件产物、环境部署与代码 Commit 的核心锚点。

1. 核心版本公式与字段定义 ​

通用工程遵循 “手动规划主次版本 + 自动化年月日流水构建号” 的四段式定义:

$$\text{Version} = \underbrace{\text{MAJOR} ,., \text{MINOR}}{\text{规划版本 (手动维护)}} ,., \underbrace{\text{YYMM}}{\text{年月段 (CI 自动)}} ,., \underbrace{(10 + \text{DD})\text{RRR}}_{\text{日流水段 (CI 自动)}}$$

字段含义生成方式示例值规范与取值范围
MAJOR主版本号手动维护(配置文件)3重大架构重构、不兼容的破坏性更新 (Breaking Changes) 时递增。
MINOR次版本号手动维护(配置文件)6周期性功能迭代、向下兼容的新特性发布时递增。
YYMM构建年月CI 流水线自动计算26102 位年份 + 2 位月份(如 2026 年 10 月 $\to 2610$,1 月 $\to 2601$)。
(10+DD)RRR日期与当日流水CI 流水线自动计算14002高位偏移编码:前 2 位为 $(10 + \text{DD})$,后 3 位为当日流水序号 $\text{RRR}$。

2. 深度剖析:为什么必须使用 (10+DD)RRR 偏移编码? ​

在自动化版本号设计中,工程团队常常面临两个极其严重的陷阱:

陷阱 A:数字前导零丢失与非法 SemVer 报错 ​

  • 规范约束:在 SemVer 2.0.0 规范第 2 条 中明文规定:“数值标识符不能包含前导零 (Numeric identifiers MUST NOT include leading zeroes)”;
  • 隐式类型转换:在很多编程语言、数据库和 CI 环境变量中,若版本段被解析为整型,前导零会被自动截断(如把 01 转为 1,把 01001 转为 1001)。

陷阱 B:“111” 二义性歧义崩溃 ​

若采用朴素的动态位数拼接:

  • 1 月第 11 次构建:若月份写作 1、流水写作 11 $\to$ 拼出 111;
  • 11 月第 1 次构建:若月份写作 11、流水写作 1 $\to$ 同样拼出 111!
  • 若在日流水段拼接:1 日第 1 次构建若剥离前导零后为 11 或 101,与 10 日、11 日的构建产生严重重叠,导致历史构件无法唯一定位与按时间递增比对。

解决方案:$(10 + \text{DD})$ 固定位宽基底偏移算法 ​

引入基底偏移 $+10$ 是一套数学上完全可逆单射、且天然免疫前导零的高可靠编码方案:

  1. 彻底消除前导零:
    • 公历日期 $\text{DD} \in [1, 31]$;
    • 经过 $(10 + \text{DD})$ 运算后,取值范围严格为 $[11, 41]$;
    • 最高位永远是 1~4,绝对不会出现 0,即使被强转为数字整型存储,也绝不会发生前导零截断!
  2. 严格 5 位固定宽度与双向无歧义逆向解码:
    • 当日构建流水号 $\text{RRR}$ 固定占 3 位($001 \sim 999$),单日支持 999 次自动构建;
    • 编码公式: $$\text{Part4} = (10 + \text{DD}) \times 1000 + \text{RRR} \quad (\text{范围:} 11001 \sim 41999)$$
    • 无歧义逆向解码公式: $$\text{DD} = \lfloor \text{Part4} / 1000 \rfloor - 10$$ $$\text{RRR} = \text{Part4} \pmod{1000}$$

对比示例验证表: ​

实际日期与构建场景朴素拼接(存在歧义/非法零)(10+DD)RRR 偏移编码解码验证(准确度)
10 月 04 日 第 2 次构建04002(前导零丢失变成 4002)14002$\lfloor 14002/1000 \rfloor - 10 = \mathbf{4}$ 日,第 $\mathbf{2}$ 次(100% 精确)
01 月 01 日 第 1 次构建01001(前导零丢失变成 1001)11001$\lfloor 11001/1000 \rfloor - 10 = \mathbf{1}$ 日,第 $\mathbf{1}$ 次(100% 精确)
01 月 10 日 第 1 次构建1000120001$\lfloor 20001/1000 \rfloor - 10 = \mathbf{10}$ 日,第 $\mathbf{1}$ 次(100% 精确)
01 月 11 日 第 1 次构建11001(与 1日第1次产生二义性)21001$\lfloor 21001/1000 \rfloor - 10 = \mathbf{11}$ 日,第 $\mathbf{1}$ 次(100% 精确)
01 月 31 日 第 15 次构建3101541015$\lfloor 41015/1000 \rfloor - 10 = \mathbf{31}$ 日,第 $\mathbf{15}$ 次(100% 精确)

💡 关于 YYMM 的自说明性:由于当前处于 21 世纪($YY \ge 20$),无论月份为 1 月(01)还是 12 月(12),YYMM 构成的数值始终落在 $[2601, 9912]$,高位始终被年份非零锚定,因此 YYMM 作为独立段同样天然杜绝了前导零丢失!


3. 生态适配性指南 (Cross-Ecosystem Compatibility) ​

针对“YYMM 与四段式版本能否适用于常见生态(如插件、各平台应用)”的技术解答与落地映射策略:

(1) 四段原生宿主体系(Windows / macOS / Android / 容器镜像) ​

  • Windows PE 二进制 (DLL / EXE):
    • Windows 原生 AssemblyVersion 与 FileVersion 由四个 16-bit 无符号整数(UINT16,上限 65535)构成;
    • YYMM(最大 9912)$< 65535$;
    • (10+DD)RRR(最大 41999)$< 65535$;
    • 结论:完美 100% 符合 Windows PE 底层数据结构,无需任何妥协。
  • macOS / iOS (Xcode):
    • CFBundleShortVersionString:填入 MAJOR.MINOR(如 3.6);
    • CFBundleVersion:直接填入四段式 3.6.2610.14002 或纯流水号 261014002,均符合 Apple 商店提审规范。
  • Android (Gradle):
    • versionName:直接使用 3.6.2610.14002;
    • versionCode:使用纯递增整数 261014002(远小于 Java Integer.MAX_VALUE = 2147483647)。

(2) 三段式 SemVer 宿主体系(VS Code 插件、npm、Cargo、NuGet) ​

  • VS Code 扩展 (Plugins):
    • VS Code 插件商店(vsce)强制执行严格的三段式 SemVer 2.0.0(X.Y.Z),直接包含 4 个点会被打包工具拒收报错。
  • 针对插件生态的标准适配映射模式:
    • 推荐方案 A(Patch 段打平为 9 位递增整数): $$\text{Plugin Version} = \text{MAJOR} ,., \text{MINOR} ,., \underbrace{\text{YYMM}(10+\text{DD})\text{RRR}}_{\text{9位整型 Patch}}$$ 例:3.6.261014002。
      • 合规性:标准三段式,无前导零,符合 SemVer 2.0;
      • 递增性:随日期与当日流水绝对单调递增,VS Code 市场能准确识别为新版本并触发自动更新。
    • 方案 B(月度正式版 + CI 预发布 Tag):
      • 正式月度插件版:MAJOR.MINOR.YYMM(如 3.6.2610);
      • 每日测试预览版:MAJOR.MINOR.YYMM-(10+DD)RRR(如 3.6.2610-14002 或 3.6.2610-dev.14002)。

4. CI/CD 流水线实现代码参考 ​

powershell
# PowerShell (Azure DevOps / GitHub Actions / 本地构建脚本)
$Major = 3
$Minor = 6

$Now = Get-Date
$YYMM = $Now.ToString("yyMM")                          # 例: 2610
$DD = [int]$Now.ToString("dd")                          # 例: 4
$Rev = 2                                               # 流水号(自流水线 $(Build.BuildId) 提取或计数)
$OffsetRev = (10 + $DD) * 1000 + $Rev                  # 例: 14002

# 1. 四段式原生版本(Windows / iOS / Android / 内部发布)
$FullVersion = "$Major.$Minor.$YYMM.$OffsetRev"        # 3.6.2610.14002

# 2. 插件与 SemVer 三段式版本(VS Code 插件 / npm)
$SemVerPlugin = "$Major.$Minor.${YYMM}${OffsetRev}"     # 3.6.261014002

三、 移动端与桌面端 App 专属发布文档规范 (App-Specific Extensions) ​

当工程目标为客户端应用(如 iOS / iPadOS / macOS / Android / Windows / Flutter / React Native 等 App)时,发布流程需深度对接各应用商店(Apple App Store, Google Play, 华为应用市场, 微软应用商店等)的人工审核与上架流程。需在 docs/ 目录下拓展以下标准文档:

text
docs/
├── app-store/                               # 移动与客户端 App 专有发布文档目录
│   ├── StoreListing.md                      # 应用商店元数据与文案资产清单
│   ├── AppStoreReleaseNote.md               # 针对应用商店字符限制的多语言版本更新文案
│   ├── ReviewChecklist.md                   # 提审查重清单与审核员专用指引 (Reviewer Notes)
│   ├── Privacy-Compliance.md                # 隐私清单、权限声明与数据合规自检
│   └── Phased-Release-Plan.md               # 灰度发布、阶段放量与监控回滚门禁

1. StoreListing.md (商店基础元数据与素材清单) ​

  • 核心内容:
    • 应用名称 (App Name) 与 副标题 (Subtitle);
    • 宣传文本 (Promotional Text) 与 完整描述 (Description);
    • 搜索关键词 (Keywords - 逗号分隔,精准控制在商店上限内);
    • 官方支持网址 (Support URL)、营销网址 (Marketing URL) 与 隐私政策网址 (Privacy Policy URL);
    • 各尺寸截图与预览视频的存放索引与设计规范。

2. AppStoreReleaseNote.md (应用商店专用更新日志) ​

  • 核心特征:
    • 字符数严格受控:针对各主流平台做长度约束(例如 Apple App Store "What's New" 限 4,000 字符;Google Play 简要说明限 500 字符;国内部分应用市场限 200~500 字符);
    • 多语言本地化 (i18n):为主要目标市场提供对应语言的精炼文案(如 zh-Hans, en-US, ja-JP);
    • 规避审核雷区:严禁出现“修复了若干已知 Bug”、“测试包”、“性能优化”等假大空敷衍词汇,明确阐述具体改动以降低拒审 (Rejection) 概率。

3. ReviewChecklist.md (提审查重与审核员指引) ​

  • 审核凭证与通道:
    • 专供 Apple App Review 或 Google Play Review 使用的测试账号与密码;
    • 双重认证 (2FA) 绕过通道或固定验证码说明;
    • 演示视频 (Demo Video) 链接(用于需要特殊硬件配合或内购审核场景);
  • 提审自检项:
    • IPv6-only 网络连通性测试确认;
    • 登录注销流程、注销账户功能完整性;
    • 虚拟商品内购 (IAP) 与第三方支付边界合规。

4. Privacy-Compliance.md (隐私清单与合规档案) ​

  • 敏感权限声明:定位、相机、麦克风、相册、剪贴板读取的用途文案 (Usage Description);
  • 隐私清单 (Privacy Manifest):iOS PrivacyInfo.xcprivacy 所声明的 API 类型与数据收集项 1:1 对照说明;
  • SDK 依赖审计:第三方广告、统计、崩溃上报 SDK 的隐私合规与无越权调用声明。

5. Phased-Release-Plan.md (阶段性灰度与监控回滚预案) ​

  • 放量阶段:定义 7 天自动分阶段放量或手动阶梯放量策略(如 Day 1: 1%, Day 2: 2%, Day 3: 5%, Day 4: 10%, Day 5: 20%, Day 6: 50%, Day 7: 100%);
  • 监控熔断指标:崩溃率 (Crash Rate > 0.1%)、首屏渲染耗时恶化、关键业务转化率下跌;
  • 回滚与热修预案:暂停灰度、紧急热修复 (Hotfix) 或提审紧急加急 (Expedited Review) 流程。

四、 CI/CD 执行生命周期的深度集成 (Pipeline Lifecycle) ​

文档不应是静态躺在代码库中的死文字,而应深度贯穿于 CI/CD 自动化的全生命周期:

                ┌────────────────────────────────────────────────────────┐
                │                  CI/CD 执行全生命周期                  │
                └────────────────────────────────────────────────────────┘
                                             │
               ┌─────────────────────────────┴────────────────────────────┐
               ▼                                                          ▼
    ┌──────────────────────┐                                   ┌──────────────────────┐
    │  CI 执行期深度感知   │                                   │  CI 执行后报告与归档 │
    │  (In-Pipeline)       │                                   │  (Post-Pipeline)     │
    └──────────────────────┘                                   └──────────────────────┘
               │                                                          │
       ┌───────┴───────┐                                          ┌───────┴───────┐
       ▼               ▼                                          ▼               ▼
┌──────────────┐┌──────────────┐                           ┌──────────────┐┌──────────────┐
│ 动态标题注入 ││ 即时看板汇总 │                           │ 文档站点发布 ││ 构件产物归集 │
│ (Set Title)  ││ (Dashboard)  │                           │ (Reports Tab)││ (Drop Staging│
└──────────────┘└──────────────┘                           └──────────────┘└──────────────┘

1. 执行期深度感知 (In-Pipeline Execution) ​

(1) CI 构建标题标准与两阶段演进规范 (Pipeline Name Standards) ​

为了保证流水线在排队、构建以及历史追溯中均具备极高的可读性与准确度,CI 实例标题执行**“触发期默认标题 $\to$ 运行期动态注入版本”**的两阶段演化标准:

  • 阶段一:触发期默认 CI 标题 (Initial / Default Pipeline Title)

    • 命名公式: $$\text{Default CI Name} = \text{AppDirName 或 ProjectName} \ - \ \text{$(Date:yy.MM.dd).$(Rev:r)}$$
    • 范围边界:
      • Monorepo / 多应用仓库:使用当前触发构建的目标 App 目录名称(如 blog.aicro.net_vitepress);
      • 单体工程 / 独立代码库:针对整个项目仅有这一个全局 CI 的场景,使用整个项目的名称(如 AicrosoftCore)。
    • Azure DevOps 顶级 name: 可用参数与限制 (Compile-Time Parameters):

      ⚠️ 重要规则:顶级 name: 仅支持服务器编译期已确定的有限宏与变量,严禁直接使用 $(Build.SourceVersionMessage):

      1. $(Build.SourceVersionMessage) 在排队时尚未拉取解析,直接写入会被当作普通字符串或被置空;
      2. Git Commit 信息通常包含多行换行符、引号或冒号等非法特殊字符,直接写入会被 Azure DevOps 判定为非法 BuildNumber 导致流水线触发失败。

      顶级 name: 官方支持的安全参数列表:

      • $(Date:yy.MM.dd) / $(Date:yyyyMMdd):当前构建日期;
      • $(Rev:r) / $(Rev:rr):基于前缀模式自增的当日流水编号(每天自动重置为 1);
      • $(SourceBranchName):当前触发分支的短名称(如 dev、main);
      • $(Build.BuildId):全局单调自增的唯一构建 ID。
    • YAML 配置声明示例 (Azure DevOps):
      yaml
      # ci/blog.aicro.net.yml 顶级声明(纯净、合法且绝对安全)
      name: blog.aicro.net_vitepress-$(Date:yy.MM.dd).$(Rev:r)
  • 阶段二:运行期动态更新 CI 标题 (In-Pipeline Dynamic Version & Commit Injection)

    • 更新机制:流水线进入 Agent 执行编译脚本时(如 build.ps1),源代码已完全检出,此时系统已安全挂载完整的 $env:BUILD_SOURCEVERSIONMESSAGE:
      1. 字符安全过滤 (避让 TF209010 错误):Azure DevOps 严禁在 BuildNumber 中包含 ", /, :, <, >, \, |, ?, @, * 以及末尾句点 .,且限制最大长度 255。常规 Commit 中的冒号(如 feat:, refactor:)必须通过正则自动替换为空格或连字符;
      2. 读取项目元数据(package.json、pubspec.yaml 等)中的当前应用版本 $version;
      3. 通过 ##vso[build.updatebuildnumber] 指令,在原时间流水号前方插入应用版本,并在尾部优雅追加经过安全净化的单行提交信息。
    • 动态标题公式: $$\text{Dynamic CI Name} = \text{AppDirName 或 ProjectName} \ - \ \mathbf{AppVersion} \ - \ \text{YY.MM.DD.Rev} \ \ \mathbf{$safeCommitMessage}$$
    • 脚本执行指令 (Azure DevOps):
      powershell
      # 在 build.ps1 运行期安全执行:严格过滤特殊字符与控制最大长度
      $dynamicBuildNumber = "$appDirName-$version-$timeVersion"
      if ($safeMsg) {
          $cleanMsg = $safeMsg -replace '["/:<>\\|?@*]', ' '
          $cleanMsg = ($cleanMsg -replace '\s+', ' ').Trim().TrimEnd('.')
          if ($cleanMsg.Length -gt 60) {
              $cleanMsg = $cleanMsg.Substring(0, 60).Trim().TrimEnd('.')
          }
          if ($cleanMsg) {
              $dynamicBuildNumber = "$appDirName-$version-$timeVersion $cleanMsg"
          }
      }
      Write-Host "##vso[build.updatebuildnumber]$dynamicBuildNumber"
    • 两阶段标题演化示例对比:
流水线生命周期标题规范格式实际呈现示例说明
触发与排队期 (Default){AppDir}-{YY.MM.DD.Rev}blog.aicro.net_vitepress-26.10.04.1纯净稳定,杜绝特殊字符与排队期解析异常
执行与归档期 (Dynamic){AppDir}-{Version}-{YY.MM.DD.Rev} {Commit}blog.aicro.net_vitepress-3.11.0-26.10.04.1 feat: update docs注入真实版本与清洗后的单行 Commit 信息
  • App 二进制配置版本联动:
    • 若为移动端/桌面端 App 项目,脚本在更新流水线标题的同时,将该实际版本与流水号同步回写至宿主配置(如 iOS 的 CFBundleShortVersionString + CFBundleVersion、Android 的 versionCode),保证 CI 标题、Git 记录与安装包二进制版本 100% 对齐。

(2) 即时摘要看板呈现 (Dashboard / Summary Notification) ​

  • 各 CI 平台提供了即时卡片汇报机制(如 Azure DevOps 的 ##vso[task.uploadsummary]、GitHub Actions 的 $GITHUB_STEP_SUMMARY、GitLab 的 Pipeline Reports);
  • CI 脚本自动解析 ReleaseNote.md 中的“核心亮点”,并提取关键测试指标(测试通过率、覆盖率、静态扫描结果),直接渲染在流水线摘要首页,评审人员无需翻阅日志即可一目了然。

2. 执行后报告与文档站点呈现 (Post-Pipeline Reports) ​

  • 多级交互式技术站点一键发布:
    • 现代 CI/CD 均支持将报告与文档直接发布为可浏览的 HTML / Markdown 站点(如 Azure DevOps 的 PublishMarkdownReports@1、GitHub Pages、GitLab Pages);
    • 构建脚本将 index.md、Release.md、ReleaseNote.md、changeLog.md 以及 changes/ 目录归集为站点源;
    • 收益:全团队(开发、测试、运维、产品经理)在浏览器中即可直接阅读最新版本的交互式技术文档、架构全景与发布说明,无需本地拉取代码。

五、 产物归集 (Drop) 与发布隔离规范 (Artifacts & Isolation Guard) ​

为保证交付包的纯净度、安全性与职责单一,文档内容与对外分发的生产包必须执行严格的物理隔离。

text
drop/ (构建产物总输出目录)
├── Production-Artifacts/               # 生产级分发包 (严禁包含内部技术文档)
│   ├── myapp-macos-cli.zip             # CLI 工具包
│   ├── myapp-ios-framework.zip         # SDK 二进制框架包
│   ├── myapp-v1.2.0.ipa / .aab         # App 生产安装包
│   └── symbols.zip                     # dSYM / ProGuard 符号表归档 (隔离保存)
├── pipeline_reports/                   # CI 阶段执行诊断、代码覆盖率与测试报告
└── docs/                               # 独立的工程文档归档目录
    ├── index.md                        # 文档总索引
    ├── Release.md                      # 最新版本变更
    ├── ReleaseNote.md                  # 用户友好发布说明
    ├── changeLog.md                    # 变更汇总索引
    ├── changes/                        # 历史完整版本归档 (v1.2.md ...)
    └── app-store/                      # [App 专有] 商店元数据、提审清单与灰度计划

1. 核心隔离准则 (Isolation Principles) ​

  1. 绝对禁止侵入生产包:
    • 生产级交付包(如 CLI 可执行文件压缩包、移动端 IPA/AAB 安装包、SDK 框架包、npm/Maven 构件包)内部仅允许携带最基础的对外 LICENSE 与使用引导;
    • 严禁将内部架构文档、设计规划、测试详报、历史变更档案(changes/)打包进生产分发文件,避免资产体积膨胀与内部技术信息泄漏。
  2. 独立目录归集发布:
    • 在 CI 构件暂存区(如 $(Build.ArtifactStagingDirectory)/drop)中,docs/ 必须作为顶级同级目录独立存在;
    • 供合规审计、历史追溯、离线查看与运维归档使用。
  3. 分发管道分流管控:
    • 私有包管理源 (Feed / Registry):仅上传对应的核心类库或工具包;
    • 应用商店上传通道 (Transporter / Fastlane):仅上传签名后的 App 二进制文件与符号表,结合 app-store/ 中的文本自动调用 API 提交审核;
    • 内部归档通道:全量保留 drop/docs/ 与 pipeline_reports/。

六、 自动化实施检查清单 (Automation Checklist) ​

在落地本规范时,建议在工程 CI 脚本中植入以下轻量自动化校验:

  • [ ] 版本标识与流水号合规断言:断言版本号四段各字段无前导零,日流水段严格符合 $(10 + \text{DD})\text{RRR}$ 范围($11001 \sim 41999$),杜绝“111”等二义性。
  • [ ] 版本文件格式校验:检查 changes/ 下的文件名是否严格遵守 v<Major>.<Minor>.md(杜绝三段式散落小文件)。
  • [ ] 镜像一致性校验:自动化对比 Release.md 与 changes/ 中最新版本文件的内容哈希,若不一致则中断流水线。
  • [ ] 相对路径有效性检查:扫描 Markdown 文档中的链接,禁止出现 file:///Users/... 等绝对路径或失效相对引用。
  • [ ] 生产包纯净度断言 (Contamination Guard):在打出发布压缩包或 IPA/AAB 后,校验其解压清单,断言不存在 changes/、internal-docs/ 等调试与文档目录。
  • [ ] App 商店字符限制扫描:若包含 AppStoreReleaseNote.md,预先通过脚本计算各语言字符长度,超限时给出告警或阻断提交。