Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,6 @@ jobs:
ruby Scripts/verify-source-release.rb \
--version 0.2.0 \
--ref HEAD \
--allow-source-blocked \
--report "$RUNNER_TEMP/pocketroot-v0.2.0-source-candidate.json"

- name: Upload source candidate audit report
Expand Down
33 changes: 16 additions & 17 deletions CHANGELOG.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,22 @@ All notable PocketRoot changes are recorded here. Semantic Versioning begins wit

## Unreleased

There are no unreleased changes.

## 0.2.0 - 2026-08-04

### Added

- Interactive SwiftTerm PTYs now show an iPhone-friendly Esc, Tab, Ctrl-C,
Ctrl-D, history up/down, and keyboard-dismiss key row by default; hosts can
hide it with `showsAccessoryView: false`. Unit tests pin every emitted byte, and the Host
App lifecycle smoke launches BusyBox `top`, observes live output, and uses
Ctrl-C to recover the shell.
- Bilingual security and community-conduct policies, support routing,
structured bug/integration/feature Issue forms, and a pull request checklist.
Documentation validation now requires these open-source collaboration files
and complete root-level Chinese/English mirrors.

### Changed

- Tiered the CI UI matrix by platform: ordinary PRs and default manual runs
Expand Down Expand Up @@ -74,23 +90,6 @@ All notable PocketRoot changes are recorded here. Semantic Versioning begins wit
with the same runtime/device type for one bounded retry; caller-owned devices
and assertion failures are never retried. Coverage is unchanged while PR
wall-clock time no longer accumulates every UI smoke serially.

## 0.2.0 - Unreleased

### Added

- Interactive SwiftTerm PTYs now show an iPhone-friendly Esc, Tab, Ctrl-C,
Ctrl-D, history up/down, and keyboard-dismiss key row by default; hosts can
hide it with `showsAccessoryView: false`. Unit tests pin every emitted byte, and the Host
App lifecycle smoke launches BusyBox `top`, observes live output, and uses
Ctrl-C to recover the shell.
- Bilingual security and community-conduct policies, support routing,
structured bug/integration/feature Issue forms, and a pull request checklist.
Documentation validation now requires these open-source collaboration files
and complete root-level Chinese/English mirrors.

### Changed

- RootFS delivery-candidate output bounding now tolerates macOS `EPERM` from a
process-group exit race only after Open3 confirms the child has exited and a
signal-zero probe confirms the whole group is gone. Surviving or unsignalable
Expand Down
25 changes: 12 additions & 13 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,18 @@ PocketRoot 的重要变化记录在这里,并从首个公开版本开始遵循

## Unreleased

当前暂无未发布变更。

## 0.2.0 - 2026-08-04

### Added

- 为交互式 SwiftTerm PTY 默认加入适配 iPhone 软键盘的 Esc、Tab、Ctrl-C、Ctrl-D、
上/下历史键与收起键盘按钮;宿主可通过 `showsAccessoryView: false` 隐藏。单元测试固定发送字节,
Host App lifecycle smoke 真实启动 BusyBox `top`、观察动态输出并用 Ctrl-C 回到 shell。
- 加入双语安全策略与社区行为准则、支持入口、结构化 Bug/接入/功能请求表单和
PR 检查表;文档校验现在要求这些开源协作文件存在,并保持根级中英文镜像完整。

### Changed

- CI UI matrix 改为平台分层:普通 PR 与默认手动运行只执行外部消费者、Quick Start
Expand Down Expand Up @@ -50,19 +62,6 @@ PocketRoot 的重要变化记录在这里,并从首个公开版本开始遵循
每路失败诊断使用独立 artifact 名称。runner 自建 Simulator 明确从 Xcode destination
消失时可按相同 runtime/device type 重建并有界重试一次;调用方设备和断言失败不重试。
测试覆盖不减少,PR 墙钟时间不再由全部 UI smoke 串行累加。

## 0.2.0 - Unreleased

### Added

- 为交互式 SwiftTerm PTY 默认加入适配 iPhone 软键盘的 Esc、Tab、Ctrl-C、Ctrl-D、
上/下历史键与收起键盘按钮;宿主可通过 `showsAccessoryView: false` 隐藏。单元测试固定发送字节,
Host App lifecycle smoke 真实启动 BusyBox `top`、观察动态输出并用 Ctrl-C 回到 shell。
- 加入双语安全策略与社区行为准则、支持入口、结构化 Bug/接入/功能请求表单和
PR 检查表;文档校验现在要求这些开源协作文件存在,并保持根级中英文镜像完整。

### Changed

- RootFS delivery candidate 的命令输出上限处理只会在 Open3 确认子进程已退出、且 signal
0 探测确认整个进程组已消失后,容忍 macOS 在退出竞态中返回的 `EPERM`;残留或不可发送
信号的后代仍然 fail-closed,同时 CI 可以正常回收已退出命令,不再泄漏平台异常。
Expand Down
8 changes: 4 additions & 4 deletions Compliance/Release/RELEASE-DECISIONS.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"schemaVersion": 1,
"releaseVersion": "0.2.0",
"status": "no-release-authorization-granted",
"status": "source-release-authorized",
"sourceRelease": {
"topLevelLicenseSpdx": "MIT",
"contributorPolicyApproved": true,
"releaseNoticeApproved": true,
"sourceReleaseAuthorized": false
"sourceReleaseAuthorized": true
},
"runtimeDistribution": {
"rootFSDeliveryModel": "caller-provided-local-input",
Expand All @@ -21,7 +21,7 @@
},
"approval": {
"approvedBy": "jacklv-coder",
"approvedAt": "2026-07-31T08:21:14Z",
"notes": "PocketRoot v0.2.0 Developer Preview preparation inherits the approved MIT, contributor, and NOTICE policies, but no v0.2.0 source tag or runtime, App, binary, third-party artifact, or RootFS distribution is authorized by this preparation PR."
"approvedAt": "2026-08-04T15:55:00Z",
"notes": "PocketRoot v0.2.0 original source and Swift Package metadata are authorized for release under MIT. Runtime, App, binary, third-party artifact, XCFramework, and RootFS distribution remain unauthorized."
}
}
4 changes: 2 additions & 2 deletions Compliance/Release/experimental-v0.2.0/COMPOSITION.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"generatedAt": "2026-08-03T00:00:00Z",
"generatedAt": "2026-08-04T15:55:00Z",
"release": {
"name": "PocketRoot",
"version": "0.2.0",
Expand All @@ -14,7 +14,7 @@
"CONTRIBUTING.md": "0beaceb8d56f1c43fa458d0b121d3d005c4a9cedb12b32029b35e74aff7b3d0b",
"CONTRIBUTING.en.md": "0f619a667ea5ae4749f77f9afe5a9583447fcdab8a0985c11dcc4c935dead94a",
"Compliance/SPDX/LICENSE-LIST-3.28.0.json": "7376db20698ff21511fe802aded9b5d7145520a86133b74f68b0c1568dd6dd1c",
"Compliance/Release/RELEASE-DECISIONS.json": "93ef573069e44ea8d74f43c4fb380ec694dea700ddb2881e2b76e646020d86f2",
"Compliance/Release/RELEASE-DECISIONS.json": "7e89cd0a3903d681251bc87da19697d34b4fef0bd8f9205e283e1086ad1ad6c6",
"Package.resolved": "a121fd0f287bcb42e22d1860f915203447dd552fddc82461e9d385b957fb3718",
"Package.swift": "9ec4f31f7a91c5c001b6e5826c5ab2824e98c06eb61444027485a70f1efccfff",
"Examples/PocketRootDemo/project.yml": "8547227f488ce384600e01202f3c74778e1be99b1cee8b952ead61e043e1f3e0",
Expand Down
15 changes: 7 additions & 8 deletions Compliance/Release/experimental-v0.2.0/READINESS.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"schemaVersion": 1,
"generatedAt": "2026-08-03T00:00:00Z",
"generatedAt": "2026-08-04T15:55:00Z",
"releaseVersion": "0.2.0",
"overallStatus": "blocked",
"authorizationSource": "Compliance/Release/RELEASE-DECISIONS.json",
"tracks": {
"sourcePackageRelease": {
"scope": "PocketRoot source and Swift Package metadata only; no RootFS, XCFramework mirror, App, archive, IPA, or binary SDK asset.",
"status": "blocked",
"status": "ready",
"gates": [
{
"id": "source-boundary-excludes-rootfs",
Expand Down Expand Up @@ -58,7 +58,7 @@
"id": "source-release-authorized",
"title": "PocketRoot source release is explicitly authorized",
"titleZh": "PocketRoot 源码发布已明确授权",
"satisfied": false,
"satisfied": true,
"evidence": "Compliance/Release/RELEASE-DECISIONS.json",
"owner": "project-owner",
"requiredAction": "Record the approving owner and date after every source-release gate is satisfied."
Expand Down Expand Up @@ -154,7 +154,6 @@
}
},
"blockedGateIds": [
"source-release-authorized",
"rootfs-external-input-boundary",
"release-artifact-built-and-scanned",
"complete-license-notice-bundle-approved",
Expand All @@ -165,9 +164,9 @@
"runtime-distribution-authorized"
],
"nextRequiredDecision": {
"id": "source-release-authorized",
"owner": "project-owner",
"reason": "Record the approving owner and date after every source-release gate is satisfied."
"id": "rootfs-external-input-boundary",
"owner": "engineering",
"reason": "Scan the exact final artifact, record its reviewed SHA-256, and verify its inventory contains no RootFS payload."
},
"warning": "Engineering validation is not distribution authorization. A ready source track would not authorize runtime, RootFS, App, or binary distribution."
"warning": "Engineering validation is not distribution authorization. A Ready source track does not authorize runtime, RootFS, App, or binary distribution."
}
4 changes: 2 additions & 2 deletions Compliance/Release/experimental-v0.2.0/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ IshEmbed/XCFramework、精确 iSH gitlink、静态 supervisor 使用的 musl sou

默认 Demo 显式链接 IshEmbed,但仓库不包含 RootFS;只有本地 Debug 构建可把
精确固定的仓库外资产注入 App,Release 明确跳过。RootFS 不由库下载。
PocketRoot 原创源码使用 MIT 许可证;0.2.0 源码发布尚未获得明确授权。 Runtime 的完整 LICENSE/NOTICE、
PocketRoot 原创源码使用 MIT 许可证;0.2.0 源码发布已明确授权。 Runtime 的完整 LICENSE/NOTICE、
对应源码交付、App Store 2.5.2、法律审查和发行授权仍未完成。由于没有最终
archive,本目录明确保持
`completeReleaseArtifactSBOM=false`、`distributionAuthorized=false`。
Expand Down Expand Up @@ -42,7 +42,7 @@ asset into two independent, fail-closed tracks.
The default Demo explicitly links IshEmbed, but the repository contains
no RootFS. Only a local Debug build may inject the exact pinned external
asset; Release skips it. The library never downloads the RootFS. The
Original PocketRoot source is licensed under MIT, but the 0.2.0 source release is not explicitly authorized. The Runtime's
Original PocketRoot source is licensed under MIT, and the 0.2.0 source release is explicitly authorized. The Runtime's
complete LICENSE/NOTICE set, corresponding-source delivery, App Store 2.5.2
disposition, legal review, and distribution authorization remain open.
Because no final archive was scanned, this evidence keeps
Expand Down
12 changes: 6 additions & 6 deletions Compliance/Release/experimental-v0.2.0/RELEASE-CHECKLIST.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
runtime、App 或二进制 SDK 分发”分为两条独立轨道。工程测试通过不等于获得
额外分发授权;源码轨道 Ready 不会自动解除 runtime 轨道。

## 源码与 Swift Package 发布(Blocked / 未就绪
## 源码与 Swift Package 发布(Ready / 已就绪

- [x] `source-boundary-excludes-rootfs` — 源码发布不包含 RootFS 载荷
- [x] `public-api-status-declared` — 公共 API 状态已声明为 Experimental
- [x] `top-level-license-finalized` — PocketRoot 顶层许可证已确定
- [x] `contributor-policy-approved` — 贡献者与版权政策已批准
- [x] `release-notice-approved` — 源码发行 NOTICE 已批准
- [ ] `source-release-authorized` — PocketRoot 源码发布已明确授权
- [x] `source-release-authorized` — PocketRoot 源码发布已明确授权

PocketRoot 原创源码的顶层许可证已由项目所有者确定为 MIT;贡献政策与
`NOTICE.md` 同步生效。源码轨道 Ready 不授权 Runtime、RootFS、App 或二进制
Expand Down Expand Up @@ -51,7 +51,7 @@ ruby Scripts/generate-release-compliance.rb --require-source-ready
ruby Scripts/generate-release-compliance.rb --require-runtime-ready
```

两个 `--require-*-ready` 命令分别反映各自轨道;源码轨道当前故意返回非零状态
两个 `--require-*-ready` 命令分别反映各自轨道;源码轨道当前返回成功
Runtime 轨道仍故意返回非零状态。

## English
Expand All @@ -63,14 +63,14 @@ App, archive, or binary SDK distribution that excludes every RootFS asset.
Passing engineering tests is not additional distribution authorization,
and the Ready source track does not unblock the runtime track.

### Source and Swift Package release (Blocked)
### Source and Swift Package release (Ready)

- [x] `source-boundary-excludes-rootfs` — Source release excludes the RootFS payload
- [x] `public-api-status-declared` — Public API status is declared experimental
- [x] `top-level-license-finalized` — Top-level PocketRoot license is finalized
- [x] `contributor-policy-approved` — Contributor and copyright policy is approved
- [x] `release-notice-approved` — Source-release notice is approved
- [ ] `source-release-authorized` — PocketRoot source release is explicitly authorized
- [x] `source-release-authorized` — PocketRoot source release is explicitly authorized

The project owner selected MIT for original PocketRoot source. The
contributor policy and `NOTICE.md` apply with it. A Ready source track
Expand Down Expand Up @@ -102,5 +102,5 @@ content-based RootFS absence evidence; a content-tree digest, path,
filename, or extension check is not sufficient.

The two `--require-*-ready` commands report their tracks independently;
the source command intentionally remains nonzero, and the Runtime command intentionally remains
the source command currently succeeds, and the Runtime command intentionally remains
nonzero.
6 changes: 3 additions & 3 deletions Compliance/Release/experimental-v0.2.0/SBOM.spdx.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
"dataLicense": "CC0-1.0",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "PocketRoot experimental full-graph composition 0.2.0",
"documentNamespace": "https://github.com/jacklv-coder/PocketRoot/sbom/release/experimental-v0.2.0/05495d05d69b4ddec325abb9b712c6bd632df73213c7c0ac51db6b2f036a6ba4",
"documentNamespace": "https://github.com/jacklv-coder/PocketRoot/sbom/release/experimental-v0.2.0/289f1a63f0e9f66806ffc6a0c43fc1182993826f570eed773428c69fd9a50e4e",
"creationInfo": {
"created": "2026-08-03T00:00:00Z",
"created": "2026-08-04T15:55:00Z",
"creators": [
"Tool: PocketRoot Scripts/generate-release-compliance.rb"
]
Expand All @@ -25,7 +25,7 @@
"licenseDeclared": "MIT",
"copyrightText": "NOASSERTION",
"primaryPackagePurpose": "LIBRARY",
"sourceInfo": "Original PocketRoot source is licensed under MIT, but the 0.2.0 source release is not explicitly authorized. No Runtime, RootFS, App, archive, IPA, or binary distribution is asserted.",
"sourceInfo": "Original PocketRoot source is licensed under MIT, and the 0.2.0 source release is explicitly authorized. No Runtime, RootFS, App, archive, IPA, or binary distribution is asserted.",
"licenseComments": "The top-level MIT license covers original PocketRoot source only. Third-party components retain their respective upstream licenses."
},
{
Expand Down
10 changes: 5 additions & 5 deletions Compliance/Release/experimental-v0.2.0/SHA256SUMS
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
05495d05d69b4ddec325abb9b712c6bd632df73213c7c0ac51db6b2f036a6ba4 COMPOSITION.json
9fe270ba11160051d13f99cfe4ce6ee03c52882b88339dd6e4c1b4923ae30755 READINESS.json
6d41126608b019b46332a7957889f41e3c3ec6c6e9e2b884dca5ffc6d405e943 README.md
fab07621b5188930bfd2a38117e206815d94f755e667d65fc182ee55d14d2d40 RELEASE-CHECKLIST.md
888fffde64e4eed026296939334500cdc52d98694708e4edcb2a4130916bfe37 SBOM.spdx.json
289f1a63f0e9f66806ffc6a0c43fc1182993826f570eed773428c69fd9a50e4e COMPOSITION.json
bddd71afb4f871ad66a0a8cbb188616971649dcbd83fdce4e8d1f86ae55ecbcd READINESS.json
25bb81f5603af23912af09fdce99da8b510150f6ffe2b0052ff8668b40d342b5 README.md
be29fcf8824509526ae6c1c809408bdc74640d1a06071db0cff5b6138d75e095 RELEASE-CHECKLIST.md
129afa86f16f9d837e3ce4323a15a88ab4568852ace62b2804e5eca2bde10f3c SBOM.spdx.json
11 changes: 4 additions & 7 deletions Docs/IntegrationGuide.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,14 @@ PocketRoot 暴露八个产品:
`PocketRootIshRuntimeIntegration`。只有直接使用底层 runtime factory 时才需要再显式选择
`PocketRootIshRuntime`;推荐的宿主控制器不需要业务 App 直接导入它。

首个源码版本为 `v0.1.0`。公共 API 仍处于 Experimental 阶段,因此远程接入建议
当前源码版本为 `v0.2.0`。公共 API 仍处于 Experimental 阶段,因此远程接入建议
固定精确版本,避免自动接收后续可能包含破坏性 API 调整的 `0.x` 版本:

`main` 上的 `v0.2.0` 仍是未授权、未打 tag 的候选;发布门禁完成前,远程业务 App
继续固定公开 `0.1.0`,候选验证只使用完整 Git SHA。

```swift
dependencies: [
.package(
url: "https://github.com/jacklv-coder/PocketRoot.git",
exact: "0.1.0"
exact: "0.2.0"
)
],
targets: [
Expand All @@ -61,7 +58,7 @@ targets: [

1. 选择 **File → Add Package Dependencies**;
2. 输入 `https://github.com/jacklv-coder/PocketRoot.git`;
3. 选择 **Exact Version** 并填写 `0.1.0`;
3. 选择 **Exact Version** 并填写 `0.2.0`;
4. 默认接入选择 `PocketRoot`;
5. 真实 runtime 另外选择 `PocketRootIshRuntimeIntegration`。

Expand All @@ -72,7 +69,7 @@ targets: [
```

不要依赖浮动分支;Experimental `0.x` 阶段也不建议使用会自动接收后续 minor 版本的
`from: "0.1.0"`。源码 tag 不包含 RootFS、App、IPA、XCFramework 镜像或二进制 SDK,
`from: "0.2.0"`。源码 tag 不包含 RootFS、App、IPA、XCFramework 镜像或二进制 SDK,
也不解除 Runtime 分发门禁。

## 2. 平台可用性
Expand Down
13 changes: 7 additions & 6 deletions Docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
1. [产品规划](ProductPlan.md):目标用户、核心场景、价值、非目标和版本定义。
2. [路线图](Roadmap.md):当前完成度、开放门禁和后续优先级。
3. [发行与合规](ReleaseCompliance.md):许可证、RootFS、SBOM 与 App Store 限制。
4. [v0.2.0 候选说明](Releases/0.2.0.md):核心闭环、真机证据、未授权边界和发布前门禁
5. [v0.1.0 发布说明](Releases/0.1.0.md):当前公开源码版本的能力、接入方式与发布边界。
4. [v0.2.0 发布说明](Releases/0.2.0.md):当前公开源码版本、核心闭环、真机证据与发布边界
5. [v0.1.0 发布说明](Releases/0.1.0.md):首个公开源码版本的能力、接入方式与发布边界。
6. [ADR-001](Decisions/ADR-001-IshEmbed-Feasibility.md):为什么当前只以实验性方式采用 IshEmbed。

### 应用接入者
Expand Down Expand Up @@ -54,8 +54,8 @@
| [测试与验证](Testing.md) | 测试命令、环境、覆盖范围和证据 |
| [上游依赖清单](UpstreamDependencies.md) | revision、gitlink、URL、大小和哈希 |
| [发行与合规](ReleaseCompliance.md) | 许可证、NOTICE、对应源码、SBOM 与商店门禁 |
| [v0.2.0 候选说明](Releases/0.2.0.md) | 核心能力、真机证据、候选边界与发布前门禁 |
| [v0.1.0 发布说明](Releases/0.1.0.md) | 当前公开版本能力、Swift Package 接入、发布边界与已知限制 |
| [v0.2.0 发布说明](Releases/0.2.0.md) | 当前公开能力、Swift Package 接入、真机证据、发布边界与已知限制 |
| [v0.1.0 发布说明](Releases/0.1.0.md) | 首个公开版本能力、接入方式与发布边界 |
| [ADR](Decisions/ADR-001-IshEmbed-Feasibility.md) | 已冻结的技术决策、理由与后果 |
| [变更日志](../CHANGELOG.md) | 每次版本或未发布变更 |

Expand All @@ -74,8 +74,9 @@
- iOS 18.2 arm64 Simulator:原生 smoke 已通过。
- 默认 boot identity gate:已验证 `aarch64`、Alpine 身份、可选版本与 guest 工作目录后才 ready。
- Terminal、Files 与共享 Workspace 核心闭环已通过公开 SHA 外部消费者、Xcode 16、
iPhone/iPad Simulator UI 和 Jack iPhone 90×2 秒稳定性门禁;v0.2.0 仍是未授权、
未打 tag 的候选,iPad 真机、真实 pressure/jetsam/断电和公开 runtime 分发继续开放。
iPhone/iPad Simulator UI 和 Jack iPhone 90×2 秒稳定性门禁;v0.2.0 源码与
Swift Package 轨道为 Ready,iPad 真机、真实 pressure/jetsam/断电和公开 runtime
分发继续开放。

最新动态状态只在[路线图](Roadmap.md)维护。

Expand Down
Loading