From 14e09ed98e0b690cac9b9961bfce5d3b6c738668 Mon Sep 17 00:00:00 2001 From: kaotei Date: Fri, 9 Oct 2026 14:47:33 +0900 Subject: [PATCH] docs: establish GSRL v1.0 release convention --- GSRL.md | 106 +++++++++++++++++++++++++++++++++++++++ README.md | 41 +++++++++++++++ SOURCE_LOCK.example.json | 22 ++++++++ 3 files changed, 169 insertions(+) create mode 100644 GSRL.md create mode 100644 README.md create mode 100644 SOURCE_LOCK.example.json diff --git a/GSRL.md b/GSRL.md new file mode 100644 index 0000000..689ea14 --- /dev/null +++ b/GSRL.md @@ -0,0 +1,106 @@ +# GSRL 全局源码发行规范 v1.0 + +**Global Source Release Lock(GSRL)** + +状态:正式规范 v1.0 + +适用范围:任何拥有独立 Git 仓库的项目。 + +## 1. 定位 + +GSRL 是**规范,不是工具**。它只统一正式发行和接收的基本证据;不指定语言、开发设备、编译器、打包工具、托管平台或 GPT/Codex/RDC 的具体实现。 + +每个独立 Git 仓库自行负责其发行。一个仓库可以发行多个组件;同一仓库在多台电脑上的 Clone 或 Worktree 不构成不同项目。 + +## 2. 触发条件 + +- **必须执行**:独立成果正式发布、交付给其他项目使用、正式接入外部发行成果,以及交付 APK/IPA 或其他正式构建产物。 +- **建议执行**:重要测试或性能基线开始前,检查实际使用的发行版本及产物。 +- **不强制**:普通编码、实验、临时调试及尚未作为正式成果交付的开发构建。 + +开发工作区允许 Dirty;但**包含未归档源码修改的构建,不得声称已完成可从 Git 恢复的 Source Lock**。 + +## 3. 项目发行入口 + +每个项目维护 `release/README.md`,使不熟悉开发目录的使用者可以独立取得正式成果。该入口至少说明: + +1. 已发行版本系列、当前推荐版本及版本状态; +2. 每个版本的正式文件获取位置; +3. 安装、复制、接入或使用步骤; +4. 必要的依赖、兼容性或环境要求。 + +建议单产品采用 `release/<版本>/`,多组件采用 `release/<组件>/<版本>/`。已有成熟的发布结构可以保留,但必须从 `release/README.md` 明确链接过去。 + +较大产物可存放 Gitea Release 附件、npm/Maven/SwiftPM 仓库或其他受控存储。不要为统一目录强迫大文件进入 Git。 + +## 4. Source Lock 必备内容 + +正式发行版本须提供 `SOURCE_LOCK.json`,至少包含: + +- 项目及发行单元名称(如有多个组件)、**明确的发行版本**; +- Git Remote、**完整源码 Commit SHA**、可持久找到该 Commit 的 Tag 或其他保留引用; +- 每项正式交付文件的名称、位置及 SHA-256; +- 使用所需的依赖版本/发行身份与说明文档位置(无依赖时明确写空); +- 发行状态;未核实的候选版本不得标为正式通过。 + +Source Lock 可以与压缩包同目录放置,也可放在包外作为伴随清单。**不要求包内文件包含自己的哈希**,以免形成循环引用。 + +当 Source Lock 写入同一个源码 Git 仓库时,允许先提交被发行的源码、记录其 Commit,然后在后续提交中加入发行记录;不得以随后发生的 Git HEAD 替代最初被发行的源码 Commit。 + +## 5. 交付方核验 + +正式发行前应逐项确认: + +1. 本次发行实际使用的代码与 `gitCommit` 相符;相关未提交修改已处理,不能静默带入; +2. 源码 Commit 已 Push,且能从记录的 Git Remote/保留引用取得; +3. 交付文件实际存在,SHA-256 为重新计算的结果; +4. 交付包包含全部必需文件,所需依赖与使用方式已说明; +5. `release/README.md` 已登记此次版本及获取位置; +6. 同一发行版本尚未存在另一套已正式发布的文件或源码。 + +检查全部通过才能标记 **PASS / RELEASED**。失败时明确原因,不能用版本号相同代替检查通过。 + +**正式发布不可静默覆盖。** 已发布内容要修正时,使用新版本;允许保留旧版并标注弃用。 + +## 6. 使用方验收 + +其他项目使用一个正式版本时: + +1. 从该项目 `release/README.md` 找到正式版本和下载入口; +2. 取得对应交付文件及 `SOURCE_LOCK.json`; +3. 检查项目、版本、Git 来源、文件清单、兼容性与依赖信息齐全; +4. **重新计算收到文件的 SHA-256**,确认与 Source Lock 相符; +5. 校验通过后才能标记为正式接收并接入;不通过则要求交付方补齐或重新发行。 + +使用方不必重做交付方的全部开发测试,但不得凭文件名或人工口头版本说明认定内容正确。必要时保留本次使用的发行版本与 Source Lock 副本或引用,以便以后复查。 + +## 7. 工具及管理职责 + +- **GPT**:识别正式发行/接收任务,组织核验,并依据实际证据判断是否完成; +- **Codex、RDC 和其他工具**:执行具体 Git、文件、构建、发布、接入操作,报告结果; +- **Git**:提供源码历史与可恢复身份; +- **项目维护者**:决定版本、发行方式以及发布授权。 + +可以使用已有的 Git、SHA-256、Gitea Release、包管理器或脚本。不要求安装 GSRL 专用软件,也不建立中央数据库。 + +任何工具均不得为通过 GSRL 而擅自清理未提交文件、强制 Push、覆盖已发布产物,或未经授权提交无关改动。RDC 多步操作继续按已有严格串行规则执行。 + +## 8. 跨设备、跨语言与私有项目 + +同一个 Git 仓库在 Win11、Linux、Mac 或未来设备上使用同一发行规范;路径和本地分支不是永久发行身份。多个 Worktree 要检查**真正用于发布的那个 Worktree**。 + +GSRL 规范仓库可以公开;业务 Git、二进制制品与依赖不要求公开。对私有发行,只需确保**有访问权限的使用者**能够获得源码或对应已归档制品并验证。 + +对于生成型成果(PBF、天气数据、Docker 等),如恢复需要原始数据、配置或外部二进制,发行方必须明确提供其版本、哈希和获取条件。**只有 Git Commit 而缺少必要输入时,不得声称整个生成结果可恢复。** + +## 9. 完成判定 + +- **PASS**:源码可从指定 Git 来源取得、发行文件可取得且哈希一致、使用说明与必要依赖完整。 +- **INCOMPLETE**:缺少 Git 可恢复依据、文件、哈希、说明或依赖信息,不能作为正式发行。 +- **MISMATCH**:源码、版本或产物校验不一致,禁止将其当作对应的正式发行版本。 + +本规范只负责**源码与交付内容的确定对应**;不默认承诺在任意设备上重新编译出逐字节一致的二进制。 + +--- + +**核心原则:每个独立 Git 项目独立开发、独立发行、独立负责;正式交付有 Source Lock,接收者核实后再使用。** diff --git a/README.md b/README.md new file mode 100644 index 0000000..2e880cc --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# GSRL — Global Source Release Lock + +**全局源码发行规范 v1.0** + +GSRL 是一套适用于**所有独立 Git 项目**的轻量发行约定,不是程序、包管理器或集中管理平台。无论项目使用哪种语言、运行在哪台设备、是否与 NavSea 有关,都遵守相同的正式交付规则。 + +## 核心规则 + +1. **日常开发自由**:普通改代码、调试、实验不强制执行 GSRL。 +2. **交付方负责发行**:正式交付前,确认源码已 Commit / Push、可从 Git 恢复,并发布附有 `SOURCE_LOCK.json` 的固定版本。 +3. **使用方负责验收**:只从项目公布的发行入口选择版本,检查 Source Lock、依赖、使用说明,并重新计算收到文件的 SHA-256。 +4. **版本不得偷换**:同一正式版本不得改为不同的代码或交付文件;内容变化就发布新版本。 + +## 每个项目的发行入口 + +每个独立 Git 项目自行维护 `release/README.md`,列明**版本系列、推荐版本、下载地址、兼容性与使用方法**。发行包可以放在项目 Git、Gitea Releases 或其他稳定文件服务器,不要求大文件进入 Git。 + +示意目录: + +```text +project/ +└── release/ + ├── README.md # 版本目录与取用说明 + ├── 1.0.0/ + │ ├── SOURCE_LOCK.json # 本次发行的来源与校验记录 + │ └── 使用说明.md + └── 1.1.0/ + ├── SOURCE_LOCK.json + └── 使用说明.md +``` + +一个仓库发行多个组件时,可按 `release/<组件名>/<版本>/` 组织。单个 APK、AAR、数据包等产物可以把 `SOURCE_LOCK.json` 作为伴随文件提供。 + +## 规范与示例 + +- [GSRL.md](GSRL.md):正式规则和交付/接收验收标准 +- [SOURCE_LOCK.example.json](SOURCE_LOCK.example.json):最小 Source Lock 格式示例(占位符不是实际发行) + +**本仓库**:https://git.eyaku.jp/tei/GSRL + +本仓库公开可阅读;修改与发布规范必须使用获得授权的 Git/Gitea 账号。采用 GSRL 的其他项目**无需公开其自身代码或发行包**。 diff --git a/SOURCE_LOCK.example.json b/SOURCE_LOCK.example.json new file mode 100644 index 0000000..ad1db72 --- /dev/null +++ b/SOURCE_LOCK.example.json @@ -0,0 +1,22 @@ +{ + "_note": "示例文件。尖括号内均为占位符,不代表真实发行或真实通过的校验结果。", + "schemaVersion": "gsrl/source-lock/v1", + "project": "ExampleProject", + "releaseUnit": "example-component", + "version": "1.0.0", + "source": { + "gitRemote": "https://git.example.org/team/ExampleProject.git", + "gitCommit": "<完整的40或64位Git Commit SHA>", + "gitRef": "refs/tags/v1.0.0" + }, + "files": [ + { + "name": "example-component-1.0.0.zip", + "location": "<正式下载URL或发行目录中的相对路径>", + "sha256": "<文件SHA-256,64位十六进制>" + } + ], + "dependencies": [], + "usage": "release/1.0.0/使用说明.md", + "status": "EXAMPLE_NOT_RELEASED" +}