From 06a55246967268215c2407a88d3d1cc49b407581 Mon Sep 17 00:00:00 2001 From: Lan_zhijiang Date: Wed, 21 Oct 2026 17:35:05 +0800 Subject: [PATCH 1/5] =?UTF-8?q?docs(topology):=20=E7=BA=B3=E5=85=A5=20macO?= =?UTF-8?q?S=20=E9=87=87=E9=9B=86=20Peer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 定义 Mac 系统采集与持久待办的能力边界 - 明确通过共享公告调用采集能力,收入后由其他 Peer 独立读取 --- 20-product-tdd/unit-topology.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/20-product-tdd/unit-topology.md b/20-product-tdd/unit-topology.md index 2f17fae..6437e96 100644 --- a/20-product-tdd/unit-topology.md +++ b/20-product-tdd/unit-topology.md @@ -11,7 +11,7 @@ Define cross-unit technical boundaries and ownership so changes do not leak resp ## Database Peer Topology -- `impl-py`, `impl-ts`, and future units are peer nodes; frontend/backend hierarchy is not +- `impl-py`, `impl-ts`, `impl-swift`, and future units are peer nodes; frontend/backend hierarchy is not part of the durable topology. - Native PostgreSQL and PostgREST are transports over one admitted database protocol, not separate semantic authorities. @@ -22,6 +22,8 @@ Define cross-unit technical boundaries and ownership so changes do not leak resp - Peer equality does not imply identical execution ability. A business facade may execute locally on a capable Peer or delegate one exact synchronous capability to another live Peer without turning the deployment into a fixed frontend/backend hierarchy. +- `impl-swift` 的首个 macOS 分发提供系统采集和持久待办。它通过共享 Peer 公告调用精确采集能力, + 不承载通用扩展宿主;已收入的材料属于共享 info-base,其他具备解释能力的 Peer 可以独立读取。 - Shared actors,assets,trust boundaries and proportional security classification use the [Security Boundary Model](security-boundary-model.md)。Each Unit still owns its executable admission,rendering,runtime and deployment mechanics。 From 397d0a2b74da60f5e2dead62284ce7a035ae1f91 Mon Sep 17 00:00:00 2001 From: Lan_zhijiang Date: Wed, 21 Oct 2026 20:29:41 +0800 Subject: [PATCH 2/5] =?UTF-8?q?fix(capture):=20=E6=98=8E=E7=A1=AE=20Mac=20?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E5=86=99=E5=85=A5=E5=85=B1=E4=BA=AB=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将采集构图与校验归还 Mac Peer,读取分发可选。 - 定义图、原始字节和幂等回执的原子提交合同。 --- 20-product-tdd/capture-contract.md | 58 ++++++++++++++++++++++++++++++ 20-product-tdd/unit-topology.md | 5 +-- docs/index.md | 1 + 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 20-product-tdd/capture-contract.md diff --git a/20-product-tdd/capture-contract.md b/20-product-tdd/capture-contract.md new file mode 100644 index 0000000..dec229c --- /dev/null +++ b/20-product-tdd/capture-contract.md @@ -0,0 +1,58 @@ +# 主动采集持久化契约 + +原生 Mac Peer 自己校验采集材料、构造共享图并写入 info-base。它通过既有认证数据库协议访问 PostgreSQL/PostgREST,无需 Python Peer、执行者公告或通用扩展宿主。Python 仓库拥有数据库 schema 和迁移,这不构成运行时写入依赖。 + +本契约拥有跨 Peer 的 Capture 图、提交身份与原子持久化语义。`impl-swift` 拥有本机采集、待办和构图实现;`impl-py` 拥有数据库事务函数及可选 Python 读取分发;`impl-ts` 拥有可选 Web 读取分发。读取分发的存在、启用与否不影响写入。收入后的信息属于共享 info-base,不依赖原采集者或任何特定执行 Peer 存活。 + +## 冻结材料与图 + +本机冻结载荷包含 UUID `submission_id`、带时区的 `captured_at`、入口 `selection | paste | screenshot | manual`、可缺失的 `origin`、有序 `materials` 和可缺失的 `annotation`。出处的 `application_id`、`title`、`url` 都允许缺失;显式粘贴不能推断原始来源。文本材料使用 `kind: text` 和 `text`,图片使用 `kind: image`、`mime_type`、`data_base64` 和可缺失的 `filename`。材料与附注不能同时为空。采集 Peer 将该载荷转换为下述图命令,数据库不接收载荷后代为构图。 + +单次最多 128 份材料,文本和附注的 UTF-8 字节数加解码图片累计不得超过 32 MiB,HTTP JSON 请求不得超过 48 MiB。支持 PNG、JPEG、GIF、WebP;采集 Peer 验证实际图片格式与声明的 MIME,并拒绝文件损坏或解码尺寸过大的图片。原始字节不经过缩放或重新编码。代理也必须允许相同请求体上限;这两个上限是协议边界,不是所有设备与代理都已完成性能校准的承诺。 + +调用方先冻结提交 UUID、材料和目标信息库,再发送。网络超时不证明提交失败。恢复先查询同一信息库的 `capture_receipts`,核对指纹,再确认本机结果;没有回执时只可使用原 UUID 和原材料重试。切换当前连接不能重定向已有待办。再次主动采集相同内容使用新 UUID,不进行内容去重。 + +指纹为规范 JSON 的 SHA-256:对象键排序、紧凑分隔符、UTF-8、缺失的可选字段显式为 `null`,时间转 UTC 并保留六位小数,图片的 `data_base64` 替换为原始字节的 `data_sha256`。UUID 使用标准小写形式;数组顺序、文本换行及 Unicode 组合形式保持原样。Swift 对冻结载荷的网络时间表示再规范化,避免本机亚毫秒时间参与指纹却未被发送。 + +相同 UUID、相同材料与图返回原回执;相同 UUID、不同材料摘要或不同实际图返回 409,客户端保留材料并要求处理。成功结果包含 `submission_id`、`root_block_id`、`committed_at` 和 `availability: available | deleted`。根 Block 删除后回执仍保留,重试返回 `deleted`,不能复活内容。 + +## 持久图 + +| 对象或关系 | 合同 | +| --- | --- | +| 根 Block | `extensions.capture.capture.v1`,内容为时间、入口、出处的 JSON | +| 根 → 材料 | `material:0` 起连续递增的关系,序号不可重复 | +| 文本材料 | 标准 `core.text.v1`,原文保持不变 | +| 图片材料 | `extensions.capture.attachment.v1`,内容为 MIME 与可选文件名 | +| 图片材料 → 原始内容 | 唯一 `content` 关系,目标为 `core.image.v1` | +| 原始图片 | 标准 PostgreSQL binary storage(`storage = -4`)保存原始字节 | +| 根 → 用户附注 | 至多一条 `annotation` 关系,目标为 `core.text.v1` | + +Resolver 按关系解释材料顺序,不把附注混入原文;缺失或畸形关系显式报错。Web 来源链接仅允许 HTTP(S) 点击,其他来源位置仍可作为文本查看。图片通过标准 storage/resolver 读取,不依赖 Mac 本地文件、Python 内存或派生 OCR。OCR、通用文件、整页抓取和知识查询不属于此版采集范围。 + +## 数据库原子提交 + +认证 Peer 调用 `inkcre.commit_capture(submission_id uuid, payload_digest text, graph jsonb)`,PostgREST 对应 `POST /rpc/commit_capture`。JSON 请求键与参数同名;函数返回一个成功结果对象。它使用既有部署 Peer JWT/数据库角色,没有匿名入口,不派发 Job,不查找其他 Peer。 + +`graph` 是采集 Peer 已构造的图,不是待处理的材料请求。其字段为: + +| 字段 | 结构与约束 | +| --- | --- | +| `root_local_id` | 根 Block 的负数局部 ID | +| `blocks` | 1–258 项,每项为 `id`、`resolver`、`content`;ID 为互不重复的负整数,content 为字符串 | +| `relations` | 至多 257 项,每项为 `from_`、`to_`、`content`,两端只引用本命令的局部 Block | +| `blobs` | 至多 128 项,每项为 `block_id`、`data_base64`;只关联本命令中不同的 Block | + +函数分配共享 Block ID,将附带 bytes 写入标准 PostgreSQL binary storage,为对应 Block 填入标准 `{"blob_id":"…"}` 指针,并按局部 ID 映射写入关系。它只校验提交结构、引用和限额,不决定 resolver、材料顺序、来源或附注语义,不解码图片或执行采集业务。图 JSON 的 UTF-8 表示至多 48 MiB,解码后 bytes 累计至多 32 MiB;采集 Peer 仍负责前述材料总量和图片格式校验。 + +图、bytes 和 `capture_receipts` 必须在同一个事务中提交。任何引用、编码或持久化错误都回滚整个命令。UUID 的事务 advisory lock 串行化并发重试,回执主键提供唯一性约束;通用图写入原有的新建语义不变。 + +回执保留 `payload_digest`,用于核对已有本机冻结材料,并由数据库从收到的 `graph` JSONB 计算 `graph_digest`(JSONB 文本的 UTF-8 SHA-256),将提交身份绑定实际图与 bytes。新调用不能沿用同一材料摘要而替换图。函数只为新提交写回执;回执中的根 ID 没有删除级联外键,因此根被删除后重试返回 `deleted`,不会重建图。 + +早期开发合同的回执没有 `graph_digest`,迁移保留其 NULL 值并沿用材料摘要恢复,既有待办的 UUID、目标和材料摘要不迁移。新协议写出的回执总有图摘要;不能通过删除旧回执或重新分配待办身份来升级。 + +## 验收边界 + +决定写入是否独立的关键观察是在 Python Peer 停止、其他执行者不可用时,Mac 仍能通过 PostgreSQL/PostgREST 写入包含文字、原图与附注的图。成功提交后丢失响应、重开本机待办并重试只产生一份图;原始 bytes 读回一致。另需覆盖同 UUID 的实际图冲突、事务回滚、根删除后的重放,以及停止 Mac 后其他已具备读取能力的 Peer 冷读共享图。 + +这些数据库与跨 Peer 观察不替代 macOS 系统权限、真实选区、输入法、物理快捷键和多屏像素的原生验收。 diff --git a/20-product-tdd/unit-topology.md b/20-product-tdd/unit-topology.md index 6437e96..ea2272d 100644 --- a/20-product-tdd/unit-topology.md +++ b/20-product-tdd/unit-topology.md @@ -22,8 +22,9 @@ Define cross-unit technical boundaries and ownership so changes do not leak resp - Peer equality does not imply identical execution ability. A business facade may execute locally on a capable Peer or delegate one exact synchronous capability to another live Peer without turning the deployment into a fixed frontend/backend hierarchy. -- `impl-swift` 的首个 macOS 分发提供系统采集和持久待办。它通过共享 Peer 公告调用精确采集能力, - 不承载通用扩展宿主;已收入的材料属于共享 info-base,其他具备解释能力的 Peer 可以独立读取。 +- `impl-swift` 的首个 macOS 分发提供系统采集和持久待办。它自行构图,通过共享数据库协议原子写入, + 不依赖 Python Peer 或通用扩展宿主;已收入的材料属于共享 info-base,其他具备解释能力的 Peer 可以独立读取。具体跨 Peer + 语义见[主动采集持久化契约](capture-contract.md)。 - Shared actors,assets,trust boundaries and proportional security classification use the [Security Boundary Model](security-boundary-model.md)。Each Unit still owns its executable admission,rendering,runtime and deployment mechanics。 diff --git a/docs/index.md b/docs/index.md index 3a4733f..6f500c4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -9,6 +9,7 @@ - [Cross-unit contracts](../20-product-tdd/cross-unit-contracts.md) - [跨 Peer 可观测性契约](../20-product-tdd/observability-contract.md) - [Twitter 归档信息与接入契约](../20-product-tdd/twitter-archive-contract.md) +- [主动采集持久化契约](../20-product-tdd/capture-contract.md) - [Knowledge capability contract](../20-product-tdd/knowledge-capability-contract.md) - [Semantic retrieval and Peer capabilities](../20-product-tdd/semantic-retrieval-and-peer-capabilities.md) - [Feature retrieval and media interpretation](../20-product-tdd/feature-retrieval-and-media-interpretation.md) From ae12fcffd358453ef3be2cf95a4c9a3e0cd59375 Mon Sep 17 00:00:00 2001 From: Lan_zhijiang Date: Wed, 21 Oct 2026 22:55:33 +0800 Subject: [PATCH 3/5] =?UTF-8?q?docs(capture):=20=E6=98=8E=E7=A1=AE?= =?UTF-8?q?=E5=8E=9F=E7=94=9F=E5=88=86=E5=8F=91=E4=B8=8E=20Host=20?= =?UTF-8?q?=E7=9A=84=E8=81=8C=E8=B4=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 Capture 业务事务归属扩展,Mac 原生直连共享 PostgreSQL - 定义随签名应用交付的精确分发及启停参与语义 --- 20-product-tdd/capture-contract.md | 61 +++++++------------ .../extension-release-and-installation.md | 6 ++ 20-product-tdd/unit-topology.md | 5 +- 3 files changed, 31 insertions(+), 41 deletions(-) diff --git a/20-product-tdd/capture-contract.md b/20-product-tdd/capture-contract.md index dec229c..9a410fb 100644 --- a/20-product-tdd/capture-contract.md +++ b/20-product-tdd/capture-contract.md @@ -1,58 +1,43 @@ -# 主动采集持久化契约 +# Capture Extension 合同 -原生 Mac Peer 自己校验采集材料、构造共享图并写入 info-base。它通过既有认证数据库协议访问 PostgreSQL/PostgREST,无需 Python Peer、执行者公告或通用扩展宿主。Python 仓库拥有数据库 schema 和迁移,这不构成运行时写入依赖。 +`inkcre/capture` 是 first-party extension,拥有材料、来源、采集图、收入身份、回执和恢复语义。各平台 Distribution 为所在 Peer 提供这些能力;语言和仓库不决定业务中心。声明支持采集的分发在本 Peer 内完成采集、编辑、本机保存、构图和共享写入,不依赖另一个分发补齐收入流程。 -本契约拥有跨 Peer 的 Capture 图、提交身份与原子持久化语义。`impl-swift` 拥有本机采集、待办和构图实现;`impl-py` 拥有数据库事务函数及可选 Python 读取分发;`impl-ts` 拥有可选 Web 读取分发。读取分发的存在、启用与否不影响写入。收入后的信息属于共享 info-base,不依赖原采集者或任何特定执行 Peer 存活。 +原生 Mac 分发通过 PostgreSQL 原生协议操作共享 info-base。Host 提供连接、同连接事务与标准 Block/Relation/Storage 基础操作;Capture 编排业务事务。Python 仓库拥有权威 schema/迁移的交付,不因此成为运行时采集执行者。其他 Peer 按自身能力读取或提供采集分发。 -## 冻结材料与图 +## 材料与持久图 -本机冻结载荷包含 UUID `submission_id`、带时区的 `captured_at`、入口 `selection | paste | screenshot | manual`、可缺失的 `origin`、有序 `materials` 和可缺失的 `annotation`。出处的 `application_id`、`title`、`url` 都允许缺失;显式粘贴不能推断原始来源。文本材料使用 `kind: text` 和 `text`,图片使用 `kind: image`、`mime_type`、`data_base64` 和可缺失的 `filename`。材料与附注不能同时为空。采集 Peer 将该载荷转换为下述图命令,数据库不接收载荷后代为构图。 +材料包含提交 UUID `submission_id`、采集时间 `captured_at`、入口 `selection | paste | screenshot | manual`、可缺失的 `origin`、有序 `materials` 和可缺失的 `annotation`。出处的应用 ID、标题和 URL 允许缺失;显式粘贴不推断来源。材料和附注不能同时为空。单次至多 128 份材料,文字与附注 UTF-8 加原图 bytes 累计不超过 32 MiB。 -单次最多 128 份材料,文本和附注的 UTF-8 字节数加解码图片累计不得超过 32 MiB,HTTP JSON 请求不得超过 48 MiB。支持 PNG、JPEG、GIF、WebP;采集 Peer 验证实际图片格式与声明的 MIME,并拒绝文件损坏或解码尺寸过大的图片。原始字节不经过缩放或重新编码。代理也必须允许相同请求体上限;这两个上限是协议边界,不是所有设备与代理都已完成性能校准的承诺。 - -调用方先冻结提交 UUID、材料和目标信息库,再发送。网络超时不证明提交失败。恢复先查询同一信息库的 `capture_receipts`,核对指纹,再确认本机结果;没有回执时只可使用原 UUID 和原材料重试。切换当前连接不能重定向已有待办。再次主动采集相同内容使用新 UUID,不进行内容去重。 - -指纹为规范 JSON 的 SHA-256:对象键排序、紧凑分隔符、UTF-8、缺失的可选字段显式为 `null`,时间转 UTC 并保留六位小数,图片的 `data_base64` 替换为原始字节的 `data_sha256`。UUID 使用标准小写形式;数组顺序、文本换行及 Unicode 组合形式保持原样。Swift 对冻结载荷的网络时间表示再规范化,避免本机亚毫秒时间参与指纹却未被发送。 - -相同 UUID、相同材料与图返回原回执;相同 UUID、不同材料摘要或不同实际图返回 409,客户端保留材料并要求处理。成功结果包含 `submission_id`、`root_block_id`、`committed_at` 和 `availability: available | deleted`。根 Block 删除后回执仍保留,重试返回 `deleted`,不能复活内容。 - -## 持久图 +支持 PNG、JPEG、GIF、WebP,验证 MIME、实际格式与解码尺寸。已有支持编码保留原 bytes;系统仅提供原生位图时,由平台分发生成 PNG 后作为本次原图。原文和自己的补充保持可区分,OCR、模型处理不阻塞收入。 | 对象或关系 | 合同 | | --- | --- | -| 根 Block | `extensions.capture.capture.v1`,内容为时间、入口、出处的 JSON | -| 根 → 材料 | `material:0` 起连续递增的关系,序号不可重复 | -| 文本材料 | 标准 `core.text.v1`,原文保持不变 | -| 图片材料 | `extensions.capture.attachment.v1`,内容为 MIME 与可选文件名 | -| 图片材料 → 原始内容 | 唯一 `content` 关系,目标为 `core.image.v1` | -| 原始图片 | 标准 PostgreSQL binary storage(`storage = -4`)保存原始字节 | +| 根 Block | `extensions.capture.capture.v1`,JSON 内容包含采集时间、入口、出处 | +| 根 → 材料 | 从 `material:0` 连续递增,无重复序号 | +| 文字 | `core.text.v1`,保持原文 | +| 图片附件 | `extensions.capture.attachment.v1`,JSON 内容包含 MIME、可选文件名 | +| 图片附件 → 内容 | 唯一 `content` 关系,目标为 `core.image.v1` | +| 原图 | 标准 PostgreSQL binary storage `-4`,使用标准 `{"blob_id":"…"}` 指针 | | 根 → 用户附注 | 至多一条 `annotation` 关系,目标为 `core.text.v1` | -Resolver 按关系解释材料顺序,不把附注混入原文;缺失或畸形关系显式报错。Web 来源链接仅允许 HTTP(S) 点击,其他来源位置仍可作为文本查看。图片通过标准 storage/resolver 读取,不依赖 Mac 本地文件、Python 内存或派生 OCR。OCR、通用文件、整页抓取和知识查询不属于此版采集范围。 - -## 数据库原子提交 +读取分发按关系解释顺序和附注,畸形关系显式报错。Web 来源只允许 HTTP(S) 点击。信息属于共享 info-base,读取不依赖采集设备本地路径或原分发存活。 -认证 Peer 调用 `inkcre.commit_capture(submission_id uuid, payload_digest text, graph jsonb)`,PostgREST 对应 `POST /rpc/commit_capture`。JSON 请求键与参数同名;函数返回一个成功结果对象。它使用既有部署 Peer JWT/数据库角色,没有匿名入口,不派发 Job,不查找其他 Peer。 +## 收入、事务与恢复 -`graph` 是采集 Peer 已构造的图,不是待处理的材料请求。其字段为: +用户确认后在本机冻结 UUID、材料和目标。Capture 在事务外完成校验和构图,再于同一数据库连接、同一事务内锁定提交身份、检查回执、写图与原图 bytes、写回执。任何写入错误整体回滚。并发请求以 UUID 字符串的 `hashtextextended(value,0)` 取得事务 advisory lock;回执主键再约束唯一性。 -| 字段 | 结构与约束 | -| --- | --- | -| `root_local_id` | 根 Block 的负数局部 ID | -| `blocks` | 1–258 项,每项为 `id`、`resolver`、`content`;ID 为互不重复的负整数,content 为字符串 | -| `relations` | 至多 257 项,每项为 `from_`、`to_`、`content`,两端只引用本命令的局部 Block | -| `blobs` | 至多 128 项,每项为 `block_id`、`data_base64`;只关联本命令中不同的 Block | +共享 `capture_receipts` 保存 `submission_id`、`payload_digest`、`graph_digest`、`root_block_id`、`committed_at`。摘要必填,根 ID 保留历史引用而不级联删除。相同身份和相同摘要重试恢复原结果;摘要冲突保留材料并要求处理。根删除后返回 `deleted`,不得重建图。 -函数分配共享 Block ID,将附带 bytes 写入标准 PostgreSQL binary storage,为对应 Block 填入标准 `{"blob_id":"…"}` 指针,并按局部 ID 映射写入关系。它只校验提交结构、引用和限额,不决定 resolver、材料顺序、来源或附注语义,不解码图片或执行采集业务。图 JSON 的 UTF-8 表示至多 48 MiB,解码后 bytes 累计至多 32 MiB;采集 Peer 仍负责前述材料总量和图片格式校验。 +材料指纹为规范 JSON 的 SHA-256:键排序、紧凑 UTF-8、缺失可选值为 null、时间 UTC 六位小数、图片数据替换为 bytes SHA-256。文本换行及 Unicode 组合形式不变,材料顺序不变。本机时间冻结为毫秒精度,再规范化为上述时间文本。 -图、bytes 和 `capture_receipts` 必须在同一个事务中提交。任何引用、编码或持久化错误都回滚整个命令。UUID 的事务 advisory lock 串行化并发重试,回执主键提供唯一性约束;通用图写入原有的新建语义不变。 +实际图指纹使用 Capture v1 的确定性构图投影:`root_local_id`、有序 `blocks`、`relations`、`blobs`;根局部 ID 为 -1,后续 Block 按材料顺序递减分配,图片附件后紧接内容 Block,附注最后。Block 字段为 id/resolver/content,关系为 from_/to_/content,图片附带项为 block_id/data_base64。对这一投影排序键、紧凑 UTF-8 编码后计算 SHA-256;base64 仅参与摘要投影,原生写入 bytes 使用 bytea 参数。 -回执保留 `payload_digest`,用于核对已有本机冻结材料,并由数据库从收到的 `graph` JSONB 计算 `graph_digest`(JSONB 文本的 UTF-8 SHA-256),将提交身份绑定实际图与 bytes。新调用不能沿用同一材料摘要而替换图。函数只为新提交写回执;回执中的根 ID 没有删除级联外键,因此根被删除后重试返回 `deleted`,不会重建图。 +网络超时不证明提交失败。本机先查询同目标回执,核对材料指纹后确认;没有回执时以原身份重试。共享回执确认前保留本机材料。更改当前连接不重定向待办;用户再次采集同内容使用新 UUID,不按内容去重。对用户展示和本机保存的回执时间统一为毫秒精度,数据库保留原时间精度。 -早期开发合同的回执没有 `graph_digest`,迁移保留其 NULL 值并沿用材料摘要恢复,既有待办的 UUID、目标和材料摘要不迁移。新协议写出的回执总有图摘要;不能通过删除旧回执或重新分配待办身份来升级。 +## 平台分发与启停 -## 验收边界 +Capture 的本机草稿格式、待办状态机、系统采集策略和界面属于其平台分发。Host 提供应用、窗口/命令挂载、凭据、持久目录和扩展生命周期。停用某个 Peer 的 Capture 不删除材料或改变共享 schema。 -决定写入是否独立的关键观察是在 Python Peer 停止、其他执行者不可用时,Mac 仍能通过 PostgreSQL/PostgREST 写入包含文字、原图与附注的图。成功提交后丢失响应、重开本机待办并重试只产生一份图;原始 bytes 读回一致。另需覆盖同 UUID 的实际图冲突、事务回滚、根删除后的重放,以及停止 Mac 后其他已具备读取能力的 Peer 冷读共享图。 +Swift 原生分发以 `swift_bundled` 标识,随签名应用携带精确 producer manifest;扩展版本独立于应用版本。未配置数据库时可本机运行。首次加入创建缺失的参与记录,已有选择必须读取且不得覆盖;加入或明确启用成功后,重连不重建已移除的参与,不用缓存启用值覆盖共享意图。用户在线明确启用可以重新创建本 Peer 的缺失参与。离线开关只改变本机运行并说明共享意图未更新;重连读取共享选择,共享写入前复核其精确版本与启用意图。 -这些数据库与跨 Peer 观察不替代 macOS 系统权限、真实选区、输入法、物理快捷键和多屏像素的原生验收。 +此 Capture 合同尚未发布,采用一个原生收入协议,不提供旧 HTTP 提交 API、旧回执空摘要或历史本机格式迁移。平台通用数据库协议仍保持原生与 HTTP 的权限对等;未来 HTTP 收入实现须明确自己的事务入口。 diff --git a/20-product-tdd/extension-release-and-installation.md b/20-product-tdd/extension-release-and-installation.md index 6f535bc..49fb045 100644 --- a/20-product-tdd/extension-release-and-installation.md +++ b/20-product-tdd/extension-release-and-installation.md @@ -12,6 +12,12 @@ Extension 发布者、Registry、开发工具和宿主共同消费本契约。Re prepare、upload、publish 一次针对一个 Native Release。只有它自己的全部原生对象齐备时才可公开,检查与提交之间改变产物身份或关联必须重新验证。发布 Python 不等待 MF,发布 MF 不等待 Python。已发布的坐标及产物身份不可覆盖;相同请求可幂等重试,冲突需要新版本。文档不使缺少可执行产物的分发成为可安装版本。 +## 随签名应用交付的原生分发 + +`swift_bundled` 表示宿主签名应用携带的原生分发。producer manifest 定义 Extension Name、分发格式和精确版本,由模块资源与签名应用一起交付。宿主只运行实际携带的模块,不下载动态代码、不替换精确选择;需要其他版本时明确要求更新应用。其产物供应链是签名应用,不把不存在的 Registry 发布或原生热加载能力作为已完成事实。 + +此分发仍有真实启停生命周期和 Peer 参与记录;应用关闭只停止实际运行,不撤回共享启用意图。未配置数据库时可离线使用扩展。首次加入与重连须区分:首次事务内创建缺失的参与,冲突则读已有值;加入或明确启用成功后,重连不重建已移除记录、不重放离线开关。用户在线明确启用可以重新创建本 Peer 的缺失参与;离线操作只改变本机运行并显示共享意图尚未更新。共享写入前复核参与选择和启用意图。Python/MF 原生产物继续按各自 Registry 发布流程交付。 + ## 部署共享状态与 Peer 参与 部署中一个插件只有一个逻辑身份及其共享配置、业务状态。安装选择属于 `Peer × Extension`:该 Peer 选择一种宿主支持的 Distribution 及精确版本,并保存自己的启用意图。数据库保存这些持久事实;运行端报告实际加载的分发、版本和运行结果。 diff --git a/20-product-tdd/unit-topology.md b/20-product-tdd/unit-topology.md index ea2272d..82a2460 100644 --- a/20-product-tdd/unit-topology.md +++ b/20-product-tdd/unit-topology.md @@ -22,9 +22,8 @@ Define cross-unit technical boundaries and ownership so changes do not leak resp - Peer equality does not imply identical execution ability. A business facade may execute locally on a capable Peer or delegate one exact synchronous capability to another live Peer without turning the deployment into a fixed frontend/backend hierarchy. -- `impl-swift` 的首个 macOS 分发提供系统采集和持久待办。它自行构图,通过共享数据库协议原子写入, - 不依赖 Python Peer 或通用扩展宿主;已收入的材料属于共享 info-base,其他具备解释能力的 Peer 可以独立读取。具体跨 Peer - 语义见[主动采集持久化契约](capture-contract.md)。 +- `inkcre/capture` 是 first-party extension,拥有跨平台的材料、采集图与收入语义。Mac 原生分发在本 Peer 内完成采集、持久待办、构图与共享写入;Host/Core 提供通用运行和数据库能力。 +- Mac 使用 PostgreSQL 原生协议,Web 按浏览器运行能力使用 PostgREST;传输选择不划分 Peer 业务权威。仓库维护位置不构成运行时流水线。具体语义见[Capture Extension 合同](capture-contract.md)。 - Shared actors,assets,trust boundaries and proportional security classification use the [Security Boundary Model](security-boundary-model.md)。Each Unit still owns its executable admission,rendering,runtime and deployment mechanics。 From 3b7a31d85135356cc887da11c4bde18b9a2f3e37 Mon Sep 17 00:00:00 2001 From: Lan_zhijiang Date: Fri, 23 Oct 2026 18:24:18 +0800 Subject: [PATCH 4/5] =?UTF-8?q?docs(local-files):=20=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=8C=81=E7=BB=AD=E6=94=B6=E5=85=A5=E4=B8=8E=E8=B7=A8=E7=AB=AF?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E5=90=88=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 明确 Peer 文件位置、更新、删除保留及提取范围 - 区分原生本地停用与共享参与同步 --- .../extension-release-and-installation.md | 2 +- 20-product-tdd/local-files-contract.md | 37 +++++++++++++++++++ 20-product-tdd/unit-topology.md | 1 + docs/index.md | 1 + 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 20-product-tdd/local-files-contract.md diff --git a/20-product-tdd/extension-release-and-installation.md b/20-product-tdd/extension-release-and-installation.md index 49fb045..810ef21 100644 --- a/20-product-tdd/extension-release-and-installation.md +++ b/20-product-tdd/extension-release-and-installation.md @@ -49,7 +49,7 @@ prepare、upload、publish 一次针对一个 Native Release。只有它自己 宿主在改变运行状态前校验目标坐标、发布状态、元数据、原生产物和 SDK 条件。启用成功须包含完成启动和相应副作用;持久化失败需要按宿主生命周期清理或报告真实未收敛状态。保存目标版本不等于升级完成。 -显式启用和停用命令先保存参与意图,再应用运行变化;运行失败保留意图并报告实际错误,不以运行成功回调重新写入意图。自动恢复只消费已有意图,不能将用户已撤回的启用写回。宿主串行处理同一参与记录的生命周期,并在异步初始化或激活后复核精确选择与启用意图;若意图已撤回或版本已变,清理迟到实例,不将它报告为当前运行结果。该串行边界只协调当前宿主,不能排除其他已准入客户端的数据库写入,也不保证持久意图与进程状态瞬时原子切换。 +针对共享参与的显式启用和停用命令先保存参与意图,再应用运行变化;运行失败保留意图并报告实际错误,不以运行成功回调重新写入意图。原生宿主的本地停用先保存本机停用状态并停止运行,再尝试更新共享意图;连接、凭据或授权错误不能阻止本机停止,也不能将共享更新报告为成功。自动恢复只消费已有意图,不能将用户已撤回的启用写回。宿主串行处理同一参与记录的生命周期,并在异步初始化或激活后复核精确选择与启用意图;若意图已撤回或版本已变,清理迟到实例,不将它报告为当前运行结果。该串行边界只协调当前宿主,不能排除其他已准入客户端的数据库写入,也不保证持久意图与进程状态瞬时原子切换。 离线 Peer 只能接收待应用选择,不能被宣称已停止旧实例或已运行新版。租约过期不证明进程停止。Python 等宿主若安装会修改共享原生依赖环境,应暂停该 Peer 的执行,安装后从新进程启动;只停目标插件不足以证明其他已加载依赖安全。应用失败应报告失败或待处理,不能假定自动恢复旧环境或撤销插件已经执行的业务迁移。具体进程、打包和恢复操作留在宿主本地文档。 diff --git a/20-product-tdd/local-files-contract.md b/20-product-tdd/local-files-contract.md new file mode 100644 index 0000000..304eac0 --- /dev/null +++ b/20-product-tdd/local-files-contract.md @@ -0,0 +1,37 @@ +# 本地文件扩展合同(候选 v1) + +`inkcre/local-files` 将指定 Peer 可访问的文件持续收入同一 info-base。执行分发拥有目录访问、监视、提取与对账;读取分发解释同一份图。原文件留在原 Peer 的文件系统,数据库保存已提取正文和位置引用。其他 Peer 阅读正文无需原 Peer 在线。首版不提供原件传输、备份、OCR 或历史版本。 + +## 位置与来源 + +原件位置为 `inkcre-peer-file:///<机器绝对路径>`。例如 `inkcre-peer-file://a143b185-f43d-47d1-8ef7-1d3857284b01/Users/alice/note.md`。authority 是 Peer UUID,path 是绝对路径;空格、中文、`#`、`?` 按 URI 编码。禁止凭据、端口、query、fragment 和 NUL。URI 不授权文件访问,也不注册系统 URL handler。只有匹配 Peer 的执行分发可以按现有文件权限打开原件;其他读取端显示位置,不把它当作可远程下载的 URL。 + +目录 Source 类型是 `extensions.local_files.directory.v1`,config 包含 `peer`(UUID)、`path`(绝对目录路径)、`enabled`(布尔值),不接受其他字段。其普通采集参数为空对象。Source 的 `core.source.v1` 锚点通过 `manages` 关系指向本来源管理的文件资料。只领取 `config.peer` 等于当前 Peer 且已获得目录访问能力的 `core.source.collect.v1` Job。读取分发只注册 Resolver,不注册无法执行的 Source 类;catalog 中存在类型不代表本 Peer 具有执行能力。 + +FSEvents 等平台通知触发被动核对;手动扫描使用普通 Source Job。两者执行相同对账逻辑。同一 Source 串行运行。Source 与原信息库及 Peer 绑定,切换当前连接不迁移来源。暂停停止监视及后续提交;移除经确认后删除 Source,已经收入的图保留。 + +## 文件资料与正文 + +文件根 Block 使用 `extensions.local_files.file.v1`,content 为以下 JSON。成功提取后恰有一条 `body` 关系指向 `core.text.v1`;首次提取失败时可没有正文。用户批注或其他组织关系不属于本扩展更新范围。 + +| 字段 | 合同 | +| --- | --- | +| `location` | 上述位置 URI。位置可以随文件重命名改变,Block ID 保持稳定。 | +| `format` | `pdf`、`docx`、`markdown`、`org`、`html`、`text`。 | +| `identity` | 可省略;含 `volume` 字符串、`number` 非负整数、`created` UTC 时间,用于证明同一文件在原 Peer 的移动。它不是内容摘要或跨 Peer 身份。 | +| `available` | 最近完整核对时原件是否存在;无法访问目录不等于不存在。 | +| `observed_at` | 此状态的 UTC 观察时间。 | +| `revision` | 可省略;最后成功正文对应的 `sha256`(原始文件字节)、`extractor`(提取实现版本)、`extracted_at`(UTC)、`scope`(`text`、`text_layer`、`main_document`)。 | +| `issue` | 可省略;当前提取失败的可读原因。失败不能清空旧正文或替换成功修订。 | + +更新先按本来源中的当前路径匹配,以支持编辑器原子保存。旧位置消失且系统身份唯一证明重命名时更新原资料;否则创建新资料,不能依据内容相同合并两个文件。身份需持久保存,重启后仍可核对。摘要只判断修订。 + +单份文件元数据、正文和关系在一个事务中写入。提交回包丢失后重新读取共享图,避免重复创建。删除原件保留最后成功正文,将 `available` 改为 false;这不是软删除或回收站。只有完整枚举成功且目录仍可访问,才可认定原件缺失。目录离线、权限失败、取消扫描不得批量标记缺失。断网后重连核对当前文件,不承诺保存离线期间出现又消失的文件。 + +Source state 包含最近完整扫描时间 `scanned_at`、失败文件数 `errors`、可选 `issue`。部分提取失败仍完成目录核对,但主动 Job 以 failed 关闭并呈现失败数量;取消、超时按普通 Job 终态处理。 + +## 文字提取范围 + +PDF 提取文字层并分隔页面;无文字层、加密和损坏分别报告。DOCX 首版提取主文档文字与表格单元格,不含脚注、批注等附属内容;读取界面须呈现 `main_document` 范围。Markdown、Org、纯文本保留原语法和换行,不执行代码或 include。HTML 只解析本地 DOM,剔除脚本、样式与模板,保留基本段落,不执行脚本或下载外链。 + +首个 Swift 分发的 extractor 为 `mac-native-text.v1`。输入上限 64 MiB,输出 UTF-8 正文上限 8 MiB;超限报错,不截断后标成功。空白文本允许为空正文,但 PDF/DOCX 没有可提取文字是失败。文本支持 UTF-8、带 BOM 的 UTF-16;不能可靠解码时报告失败。 diff --git a/20-product-tdd/unit-topology.md b/20-product-tdd/unit-topology.md index 82a2460..f6f5981 100644 --- a/20-product-tdd/unit-topology.md +++ b/20-product-tdd/unit-topology.md @@ -23,6 +23,7 @@ Define cross-unit technical boundaries and ownership so changes do not leak resp locally on a capable Peer or delegate one exact synchronous capability to another live Peer without turning the deployment into a fixed frontend/backend hierarchy. - `inkcre/capture` 是 first-party extension,拥有跨平台的材料、采集图与收入语义。Mac 原生分发在本 Peer 内完成采集、持久待办、构图与共享写入;Host/Core 提供通用运行和数据库能力。 +- `inkcre/local-files` 拥有目录来源、文件位置引用、正文与持续更新合同。具备文件访问能力的分发直接收入,读取分发解释已存正文,不要求执行 Peer 在线;见[本地文件合同](local-files-contract.md)。 - Mac 使用 PostgreSQL 原生协议,Web 按浏览器运行能力使用 PostgREST;传输选择不划分 Peer 业务权威。仓库维护位置不构成运行时流水线。具体语义见[Capture Extension 合同](capture-contract.md)。 - Shared actors,assets,trust boundaries and proportional security classification use the [Security Boundary Model](security-boundary-model.md)。Each Unit still owns its executable diff --git a/docs/index.md b/docs/index.md index 6f500c4..0d00e4e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -10,6 +10,7 @@ - [跨 Peer 可观测性契约](../20-product-tdd/observability-contract.md) - [Twitter 归档信息与接入契约](../20-product-tdd/twitter-archive-contract.md) - [主动采集持久化契约](../20-product-tdd/capture-contract.md) +- [本地文件位置与持续收入合同](../20-product-tdd/local-files-contract.md) - [Knowledge capability contract](../20-product-tdd/knowledge-capability-contract.md) - [Semantic retrieval and Peer capabilities](../20-product-tdd/semantic-retrieval-and-peer-capabilities.md) - [Feature retrieval and media interpretation](../20-product-tdd/feature-retrieval-and-media-interpretation.md) From 5777f1db22d3a18b3957dac88c9366e36991a647 Mon Sep 17 00:00:00 2001 From: Lan_zhijiang Date: Mon, 26 Oct 2026 22:28:40 +0800 Subject: [PATCH 5/5] =?UTF-8?q?docs(extensions):=20=E6=98=8E=E7=A1=AE?= =?UTF-8?q?=E5=BC=80=E6=94=BE=E5=88=86=E5=8F=91=E4=B8=8E=E6=9C=AC=E6=9C=BA?= =?UTF-8?q?=E9=87=87=E9=9B=86=E7=8A=B6=E6=80=81=E8=BE=B9=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除独立 Capture 共享回执表合同,保留原身份恢复语义。 - 区分本机运行开关与指定信息库的内置版本选择。 --- 20-product-tdd/capture-contract.md | 16 +++++++--------- .../extension-release-and-installation.md | 4 ++++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/20-product-tdd/capture-contract.md b/20-product-tdd/capture-contract.md index 9a410fb..7ed3a13 100644 --- a/20-product-tdd/capture-contract.md +++ b/20-product-tdd/capture-contract.md @@ -1,6 +1,6 @@ # Capture Extension 合同 -`inkcre/capture` 是 first-party extension,拥有材料、来源、采集图、收入身份、回执和恢复语义。各平台 Distribution 为所在 Peer 提供这些能力;语言和仓库不决定业务中心。声明支持采集的分发在本 Peer 内完成采集、编辑、本机保存、构图和共享写入,不依赖另一个分发补齐收入流程。 +`inkcre/capture` 是 first-party extension,拥有材料、来源、采集图、收入身份和恢复语义。各平台 Distribution 为所在 Peer 提供这些能力;语言和仓库不决定业务中心。声明支持采集的分发在本 Peer 内完成采集、编辑、本机保存、构图和共享写入,不依赖另一个分发补齐收入流程。 原生 Mac 分发通过 PostgreSQL 原生协议操作共享 info-base。Host 提供连接、同连接事务与标准 Block/Relation/Storage 基础操作;Capture 编排业务事务。Python 仓库拥有权威 schema/迁移的交付,不因此成为运行时采集执行者。其他 Peer 按自身能力读取或提供采集分发。 @@ -12,7 +12,7 @@ | 对象或关系 | 合同 | | --- | --- | -| 根 Block | `extensions.capture.capture.v1`,JSON 内容包含采集时间、入口、出处 | +| 根 Block | `extensions.capture.capture.v1`,JSON 内容包含提交身份 `submission_id`、材料摘要 `payload_digest`、采集时间、入口、出处 | | 根 → 材料 | 从 `material:0` 连续递增,无重复序号 | | 文字 | `core.text.v1`,保持原文 | | 图片附件 | `extensions.capture.attachment.v1`,JSON 内容包含 MIME、可选文件名 | @@ -24,20 +24,18 @@ ## 收入、事务与恢复 -用户确认后在本机冻结 UUID、材料和目标。Capture 在事务外完成校验和构图,再于同一数据库连接、同一事务内锁定提交身份、检查回执、写图与原图 bytes、写回执。任何写入错误整体回滚。并发请求以 UUID 字符串的 `hashtextextended(value,0)` 取得事务 advisory lock;回执主键再约束唯一性。 +用户确认后在本机冻结 UUID、材料和目标;草稿、待办与确认结果由本机持久化保存。Capture 在事务外完成校验和构图,再于同一数据库连接、同一事务内锁定提交身份、查找现有 Capture 根、写图与原图 bytes。任何写入错误整体回滚。并发重试以 UUID 字符串的 `hashtextextended(value,0)` 取得事务 advisory lock。 -共享 `capture_receipts` 保存 `submission_id`、`payload_digest`、`graph_digest`、`root_block_id`、`committed_at`。摘要必填,根 ID 保留历史引用而不级联删除。相同身份和相同摘要重试恢复原结果;摘要冲突保留材料并要求处理。根删除后返回 `deleted`,不得重建图。 +Capture 根的 `submission_id` 与 `payload_digest` 用于提交恢复。相同身份和摘要返回现有根;摘要冲突保留本机材料并要求处理。Extension 不拥有独立共享表,也不在 Extension state 中累积提交回执。图和原图使用既有 Block/Relation/Storage;本机确认后保存根 ID 和时间,再清理本机材料。 材料指纹为规范 JSON 的 SHA-256:键排序、紧凑 UTF-8、缺失可选值为 null、时间 UTC 六位小数、图片数据替换为 bytes SHA-256。文本换行及 Unicode 组合形式不变,材料顺序不变。本机时间冻结为毫秒精度,再规范化为上述时间文本。 -实际图指纹使用 Capture v1 的确定性构图投影:`root_local_id`、有序 `blocks`、`relations`、`blobs`;根局部 ID 为 -1,后续 Block 按材料顺序递减分配,图片附件后紧接内容 Block,附注最后。Block 字段为 id/resolver/content,关系为 from_/to_/content,图片附带项为 block_id/data_base64。对这一投影排序键、紧凑 UTF-8 编码后计算 SHA-256;base64 仅参与摘要投影,原生写入 bytes 使用 bytea 参数。 - -网络超时不证明提交失败。本机先查询同目标回执,核对材料指纹后确认;没有回执时以原身份重试。共享回执确认前保留本机材料。更改当前连接不重定向待办;用户再次采集同内容使用新 UUID,不按内容去重。对用户展示和本机保存的回执时间统一为毫秒精度,数据库保留原时间精度。 +网络超时不证明提交失败。恢复查询原目标中的 Capture 根并核对材料摘要;没有根时以原身份重试。明确提交成功或恢复核对成功前保留本机材料。更改当前连接不重定向待办;用户再次采集同内容使用新 UUID,不按内容去重。已经在本机确认的记录不再发送。提交响应丢失后、恢复前又由其他 Peer 删除根的窄窗口不提供防重建保证;不为此保留永久回执或墓碑。 ## 平台分发与启停 Capture 的本机草稿格式、待办状态机、系统采集策略和界面属于其平台分发。Host 提供应用、窗口/命令挂载、凭据、持久目录和扩展生命周期。停用某个 Peer 的 Capture 不删除材料或改变共享 schema。 -Swift 原生分发以 `swift_bundled` 标识,随签名应用携带精确 producer manifest;扩展版本独立于应用版本。未配置数据库时可本机运行。首次加入创建缺失的参与记录,已有选择必须读取且不得覆盖;加入或明确启用成功后,重连不重建已移除的参与,不用缓存启用值覆盖共享意图。用户在线明确启用可以重新创建本 Peer 的缺失参与。离线开关只改变本机运行并说明共享意图未更新;重连读取共享选择,共享写入前复核其精确版本与启用意图。 +Swift 原生分发以 `swift_bundled` 标识,随签名应用携带精确 producer manifest;扩展版本独立于应用版本。未配置数据库时可本机运行。本机运行开关只控制本机入口与任务,不隐式修改当前或其他信息库的共享参与。首次加入创建缺失的参与记录,已有选择必须读取且不得覆盖;加入成功后,重连不重建已移除的参与,不用缓存启用值覆盖共享意图。用户可以明确指定信息库,选择并启用当前应用携带的版本;该操作允许更新旧版本选择或重新创建缺失的参与,无需动态下载。共享写入前仍复核精确版本与启用意图,本机启动不覆盖其他 Peer 的停用决定。 -此 Capture 合同尚未发布,采用一个原生收入协议,不提供旧 HTTP 提交 API、旧回执空摘要或历史本机格式迁移。平台通用数据库协议仍保持原生与 HTTP 的权限对等;未来 HTTP 收入实现须明确自己的事务入口。 +此 Capture 合同尚未发布,采用一个原生收入协议,不提供旧 HTTP 提交 API、历史本机格式迁移。平台通用数据库协议仍保持原生与 HTTP 的权限对等;未来 HTTP 收入实现须明确自己的事务入口。 diff --git a/20-product-tdd/extension-release-and-installation.md b/20-product-tdd/extension-release-and-installation.md index 810ef21..86d83b6 100644 --- a/20-product-tdd/extension-release-and-installation.md +++ b/20-product-tdd/extension-release-and-installation.md @@ -12,6 +12,10 @@ Extension 发布者、Registry、开发工具和宿主共同消费本契约。Re prepare、upload、publish 一次针对一个 Native Release。只有它自己的全部原生对象齐备时才可公开,检查与提交之间改变产物身份或关联必须重新验证。发布 Python 不等待 MF,发布 MF 不等待 Python。已发布的坐标及产物身份不可覆盖;相同请求可幂等重试,冲突需要新版本。文档不使缺少可执行产物的分发成为可安装版本。 +共享参与协议中的 Distribution 是开放的非空字符串,不枚举语言、打包方式或现有宿主。各宿主报告自己支持的格式,并在实际加载边界校验;一个新宿主不需要修改共享数据库的格式白名单。Registry 只对自己能交付的产物提供安装能力。 + +Extension 不拥有独立共享数据表。资料使用 Block/Relation/Storage,共享配置与业务状态使用已有 Extension config/state;仅本机需要的草稿、队列和运行状态保存在本机。 + ## 随签名应用交付的原生分发 `swift_bundled` 表示宿主签名应用携带的原生分发。producer manifest 定义 Extension Name、分发格式和精确版本,由模块资源与签名应用一起交付。宿主只运行实际携带的模块,不下载动态代码、不替换精确选择;需要其他版本时明确要求更新应用。其产物供应链是签名应用,不把不存在的 Registry 发布或原生热加载能力作为已完成事实。