diff --git a/README.ja.md b/README.ja.md
index 864a225..a56d0b6 100644
--- a/README.ja.md
+++ b/README.ja.md
@@ -33,7 +33,7 @@ session-peer 1.0.2による実際のローカル通信です。CodexがClaude Co
### インストール
Python 3.9以上が必要です。基本のローカル・SSH CLIに外部Python依存パッケージはありません。
-ソースバージョン:**1.4.0**(2026-11-02の準備時点:未公開の候補、当時の最新公開済みバージョンは1.3.3)。[リリースノート](docs/ja/releases/v1.4.0.md)では、範囲を制限したMCP探索、配信の事前確認と診断、経路プリセット、独立スキルの提案を説明します。Pythonの公開、Node Controlの配備、独立管理するスキルの更新は別々の作業です。
+公開済みランタイム:**1.4.0**。2026-11-03にGitHubとPyPIの公開状況を確認しました。[公開記録](docs/ja/releases/v1.4.0.md#v140-publication-record)に、正確なソース、アップロード時刻、配布ファイルのハッシュを記載しています。[リリースノート](docs/ja/releases/v1.4.0.md)では、範囲を制限したMCP探索、配信の事前確認と診断、経路プリセット、独立スキルとの互換性を説明します。Pythonの公開、Node Controlの配備、独立管理するスキルの更新は別々の作業です。
任意の[MCPエクストラ](docs/ja/mcp.md)は`mcp>=1.30,<2`を必要とします。MCPのPython 3.10+要件と依存関係のないPython 3.9コアは変更しません。既存のMCP環境では明示的なパッケージ更新が必要です。
diff --git a/README.ko.md b/README.ko.md
index 5a16216..e1b4192 100644
--- a/README.ko.md
+++ b/README.ko.md
@@ -33,7 +33,7 @@ session-peer 1.0.2를 사용해 실제 로컬 요청과 회신을 주고받았
### 설치
Python 3.9 이상이 필요합니다. 기본 로컬·SSH CLI는 외부 Python 패키지에 의존하지 않습니다.
-소스 버전: **1.4.0**(2026-11-02 준비 시점 기준: 미공개 후보, 당시 최신 공개 버전 1.3.3). [릴리스 노트](docs/ko/releases/v1.4.0.md)는 범위를 제한한 MCP 탐색, 전달 사전 점검·진단, 경로 프리셋과 독립 스킬 제안을 설명합니다. Python 공개, Node Control 배포, 별도로 관리하는 스킬의 갱신은 서로 구분합니다.
+공개 런타임: **1.4.0**. 2026-11-03에 GitHub와 PyPI의 공개 상태를 확인했습니다. [공개 기록](docs/ko/releases/v1.4.0.md#v140-publication-record)에 정확한 소스, 업로드 시각과 배포 파일 해시를 남겼습니다. [릴리스 노트](docs/ko/releases/v1.4.0.md)는 범위를 제한한 MCP 탐색, 전달 사전 점검·진단, 경로 프리셋과 독립 스킬 호환성을 설명합니다. Python 공개, Node Control 배포, 별도로 관리하는 스킬의 갱신은 서로 구분합니다.
선택형 [MCP extra](docs/ko/mcp.md)는 이제 `mcp>=1.30,<2`를 요구합니다. MCP의 Python 3.10+ 요건과 의존성 없는 Python 3.9 핵심 CLI는 유지됩니다. 기존 MCP 환경에는 명시적인 패키지 업그레이드가 필요합니다.
diff --git a/README.md b/README.md
index 4eec81b..25f9692 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@ in this ~22-second animation, not a screen recording; send success alone is not
### Install
Python 3.9+. The core local/SSH CLI has no third-party Python dependencies.
-Source version: **1.4.0** (at the 2026-11-02 preparation checkpoint: unpublished candidate; latest published version 1.3.3). The [release notes](docs/releases/v1.4.0.md) describe bounded MCP discovery, delivery preflight and diagnostics, route presets, and the independent skill proposal. Python publication, Node Control deployment and independently managed skill updates are separate.
+Published runtime: **1.4.0**, verified on GitHub and PyPI on 2026-11-03. The [publication record](docs/releases/v1.4.0.md#v140-publication-record) identifies the exact source, upload times and artifact hashes. The [release notes](docs/releases/v1.4.0.md) describe bounded MCP discovery, delivery preflight and diagnostics, route presets, and independent skill compatibility. Python publication, Node Control deployment and independently managed skill updates are separate.
The optional [MCP extra](docs/mcp.md) now requires `mcp>=1.30,<2`; its Python 3.10+ requirement and the dependency-free Python 3.9 core remain unchanged. Existing MCP environments need an explicit package upgrade.
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 224f299..79aefd2 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -33,7 +33,7 @@ session-peer使用各智能体自身的收件箱和队列;接收方智能体
### 安装
需要Python 3.9或更高版本。核心本地与SSH CLI没有第三方Python依赖。
-源码版本:**1.4.0**(截至2026-11-02准备检查点:尚未发布的候选版本,当时最新已发布版本为1.3.3)。[发布说明](docs/zh-CN/releases/v1.4.0.md)介绍有限范围的MCP发现、传递预检与诊断、路由预设及独立技能提案。Python发布、Node Control部署及独立管理的技能更新是不同的工作。
+已发布运行时:**1.4.0**。已于2026-11-03确认GitHub和PyPI上的发布状态。[发布记录](docs/zh-CN/releases/v1.4.0.md#v140-publication-record)列出了确切源码、上传时间和分发文件哈希。[发布说明](docs/zh-CN/releases/v1.4.0.md)介绍有限范围的MCP发现、传递预检与诊断、路由预设以及独立技能的兼容性。Python发布、Node Control部署及独立管理的技能更新是不同的工作。
可选的[MCP extra](docs/zh-CN/mcp.md)现在要求`mcp>=1.30,<2`;MCP的Python 3.10+要求和无外部依赖的Python 3.9核心保持不变。现有MCP环境需要显式升级软件包。
diff --git a/RELEASING.ja.md b/RELEASING.ja.md
index 28f9f32..0c1e22e 100644
--- a/RELEASING.ja.md
+++ b/RELEASING.ja.md
@@ -1,5 +1,9 @@
# session-peerのリリース
+## v1.4.0公開記録(2026-11-03確認)
+
+ランタイムv1.4.0は`476c67e636ef02cb93797dd2f42252dfe577625f`からGitHubに`2026-11-02T04:36:59Z`に公開されました。PyPIのwheelとsdistのアップロード時刻は、それぞれ`2026-11-02T04:38:34.686393Z`と`2026-11-02T04:38:36.363777Z`です。[公開記録](docs/ja/releases/v1.4.0.md#v140-publication-record)に正確なハッシュと準備・公開の成功根拠を示しています。ランタイムの不変スキルアセットはv0.4.1のままであり、後に独立して公開されたスキルv0.5.1へリポジトリのスナップショットを同期しても、このアセットやインストール済みスキルは変わりません。以下の日付付き準備セクションは当時の記録として残します。公開した事実だけでは、本番配備や新たなネイティブ・ACK受入を証明しません。
+
## v1.4.0の準備
公開済みv1.3.3を基準に2026-11-02に準備しました。この日付の確認時点では、v1.4.0は未公開の候補です。統合ソース基準はバージョン準備前の`f290973962c63548f24153eeee12a8e3666fd043`であり、最終リリースコミットではありません。[リリースノート](docs/ja/releases/v1.4.0.md)は#356–#359 / #361–#364の範囲を制限したMCP探索、配信の事前確認と診断、承認済み経路プリセットを扱います。統合基準の[CI](https://github.com/abruption/session-peer/actions/runs/41381070618)は37ジョブが成功し、同じ基準の[CodeQL](https://github.com/abruption/session-peer/actions/runs/41381070309)も成功しました。いずれも最終準備コミットや保護されたmainの検査を代替しません。
diff --git a/RELEASING.ko.md b/RELEASING.ko.md
index 45a9a44..823761d 100644
--- a/RELEASING.ko.md
+++ b/RELEASING.ko.md
@@ -1,5 +1,9 @@
# session-peer 릴리스
+## v1.4.0 공개 기록 (2026-11-03 확인)
+
+런타임 v1.4.0은 `476c67e636ef02cb93797dd2f42252dfe577625f`에서 GitHub에 `2026-11-02T04:36:59Z`에 공개됐습니다. PyPI wheel과 sdist 업로드 시각은 각각 `2026-11-02T04:38:34.686393Z`, `2026-11-02T04:38:36.363777Z`입니다. [공개 기록](docs/ko/releases/v1.4.0.md#v140-publication-record)에 정확한 해시와 준비·게시 성공 근거를 연결했습니다. 런타임의 불변 스킬 자산은 v0.4.1을 유지하며, 이후 별도로 공개된 스킬 v0.5.1로 저장소 스냅샷을 동기화해도 이 자산이나 설치된 스킬은 변경하지 않습니다. 아래 날짜별 준비 절은 당시 기록으로 보존합니다. 공개 사실만으로 운영 배포나 새로운 네이티브·ACK 수락이 입증되지는 않습니다.
+
## v1.4.0 준비
공개된 v1.3.3을 기준으로 2026-11-02에 준비했습니다. 이 날짜의 점검 시점에서 v1.4.0은 미공개 후보입니다. 통합 소스 기준은 버전 준비 이전의 `f290973962c63548f24153eeee12a8e3666fd043`이며 최종 릴리스 커밋이 아닙니다. [릴리스 노트](docs/ko/releases/v1.4.0.md)는 #356–#359 / #361–#364의 범위를 제한한 MCP 탐색, 전달 사전 점검·진단과 승인된 경로 프리셋을 다룹니다. 통합 기준의 [CI](https://github.com/abruption/session-peer/actions/runs/41381070618)는 작업 37개가 통과했고 같은 기준의 [CodeQL](https://github.com/abruption/session-peer/actions/runs/41381070309)도 통과했습니다. 어느 쪽도 최종 준비 커밋이나 보호된 main 검사를 대신하지 않습니다.
diff --git a/RELEASING.md b/RELEASING.md
index a93977c..820eeb6 100644
--- a/RELEASING.md
+++ b/RELEASING.md
@@ -1,5 +1,9 @@
# Releasing session-peer
+## Publication record — v1.4.0 (verified 2026-11-03)
+
+Runtime v1.4.0 was published from `476c67e636ef02cb93797dd2f42252dfe577625f` on GitHub at `2026-11-02T04:36:59Z`; PyPI uploaded the wheel and sdist at `2026-11-02T04:38:34.686393Z` and `2026-11-02T04:38:36.363777Z`. The [publication record](docs/releases/v1.4.0.md#v140-publication-record) links exact hashes and successful preparation/publication evidence. The runtime's immutable skill asset remains v0.4.1; subsequent repository snapshot synchronization to the separately published skill v0.5.1 does not replace it or update installed skills. Keep the dated preparation sections below as history; publication does not establish operational rollout or new native/ACK acceptance.
+
## v1.4.0 preparation
Prepared on 2026-11-02 against published v1.3.3. At this dated checkpoint, v1.4.0 is an unpublished candidate. Integrated source base: `f290973962c63548f24153eeee12a8e3666fd043`, before version preparation, not the final release commit. The [release notes](docs/releases/v1.4.0.md) cover #356–#359 / #361–#364: bounded MCP discovery, delivery preflight and diagnostics, and approved route presets. Integrated-base [CI](https://github.com/abruption/session-peer/actions/runs/41381070618) passed 37 jobs and [CodeQL](https://github.com/abruption/session-peer/actions/runs/41381070309) passed at the same base; neither replaces final preparation-head or protected-main checks.
diff --git a/RELEASING.zh-CN.md b/RELEASING.zh-CN.md
index b8c6029..d23c1a1 100644
--- a/RELEASING.zh-CN.md
+++ b/RELEASING.zh-CN.md
@@ -1,5 +1,9 @@
# 发布session-peer
+## v1.4.0发布记录(2026-11-03确认)
+
+运行时v1.4.0已从`476c67e636ef02cb93797dd2f42252dfe577625f`于`2026-11-02T04:36:59Z`在GitHub发布;PyPI的wheel和sdist上传时间分别为`2026-11-02T04:38:34.686393Z`和`2026-11-02T04:38:36.363777Z`。[发布记录](docs/zh-CN/releases/v1.4.0.md#v140-publication-record)列出确切哈希及准备、发布成功的依据。运行时的不可变技能资产仍为v0.4.1;后续将仓库快照同步到独立发布的技能v0.5.1,不会替换该资产或更新已安装的技能。以下按日期记录的准备章节保留为历史。发布本身不证明生产部署或新的原生、ACK验收已完成。
+
## v1.4.0准备
于2026-11-02基于已发布的v1.3.3准备。在这个注明日期的检查点,v1.4.0尚未发布,仅为候选版本。集成源码基准为版本准备前的`f290973962c63548f24153eeee12a8e3666fd043`,并非最终发布提交。[发布说明](docs/zh-CN/releases/v1.4.0.md)涵盖#356–#359 / #361–#364的有限范围MCP发现、传递预检与诊断,以及获准路由预设。集成基准的[CI](https://github.com/abruption/session-peer/actions/runs/41381070618)共37个任务通过,同一基准的[CodeQL](https://github.com/abruption/session-peer/actions/runs/41381070309)也通过。二者都不能替代最终准备提交或受保护main的检查。
diff --git a/docs/i18n-manifest.json b/docs/i18n-manifest.json
index 9fdb421..41cd7d6 100644
--- a/docs/i18n-manifest.json
+++ b/docs/i18n-manifest.json
@@ -7,8 +7,8 @@
"zh-CN"
],
"sources": {
- "README.md": "c0544fa8aed25891574805e6c9098dc8ee824b8669e16c34607cf82ec546a77f",
- "RELEASING.md": "641babb664eb71da2425ec3ae666b843773350017a489076dcae29cd3a320db1",
+ "README.md": "aa7dd29355e264d502101687786bf16272cab0ca507bc932960cde8d9282f493",
+ "RELEASING.md": "b7f0fff21a057eb161af5aab9aafe16d30b4b59597f657b42aa53879f4475209",
"SECURITY.md": "8f018f6f98002312e143609b9734aeb971ca5217e146597c06b57b5645031046",
"docs/README.md": "28c870c47298c52bd7d3d27d7b940d74e7bdd4a9b7a69000ed2bee7ea5d6fd0b",
"docs/agent-adapters.md": "bf185d3121c94829bb412071a25c4d943302e10a6b2e713111e653b8f8c3ea91",
@@ -56,7 +56,7 @@
"docs/releases/v1.3.1.md": "1600b3f6e708ded1cd5d0cad7b5f2d78244e0e4b01d122d727f2a692fccaf652",
"docs/releases/v1.3.2.md": "980437303a02644814116b12279d14bf83e6b50c87eab2e0c88e433808f372e3",
"docs/releases/v1.3.3.md": "bb2707cc5ef4b763ee61a804fd8ce75b762731b16681ac6c322636a35657b892",
- "docs/releases/v1.4.0.md": "6ab3365b9c286f81395cac99bb896e06ee1ee3ea759267b6bbe0e1623c76832f",
+ "docs/releases/v1.4.0.md": "0bab24fe860f537aa668b3b695b692f1772aca6112f8aa116645f5920ac5b8dc",
"docs/validation/69-rc.md": "e490c6a9ad0fec9108b91c74922cedac7ddf214ed405f8f5523da22f48a4b222",
"docs/validation/85-antigravity.md": "f89b175191cd98ab03d4029b487065133814b3c8dd8de8cd0a5cc367e2579e4f",
"docs/wake.md": "cde135da2ea7be21c815bb265e694f737dbe467d8e76bb82eb118e3b86e29d22",
diff --git a/docs/ja/releases/v1.4.0.md b/docs/ja/releases/v1.4.0.md
index 48eaa28..b23a83c 100644
--- a/docs/ja/releases/v1.4.0.md
+++ b/docs/ja/releases/v1.4.0.md
@@ -32,3 +32,20 @@
正確な現行コミットをレビューし、現行コミットの検査と最終的な保護されたmain CIの成功を要求し、公開済みv1.3.3のタグ・資産・過去の記録をすべて保全します。公開を先取りしないこの日付付き案内を固定します。別途承認された公開では、`SHA256SUMS`と`release-provenance.json`を含む固定資産7個を正確なタグ・ソースと認証済みattestationに照合し、依存関係監査と新規インストール検査を行い、必須のPyPI環境の人による承認を維持します。非公開のPyPIログイン・接続再確認の省略は、その承認を免除しません。
提供状況の案内を更新する前に実際のGitHub・PyPI公開の根拠を別途記録し、将来の公開を宣言しません。Python公開、グローバルMCP環境の更新、サービス変更、Node Control配備、独立してインストールしたスキルは、それぞれ別途承認が必要な作業です。
+
+
+
+## v1.4.0公開記録(2026-11-03確認)
+
+2026-11-03の読み取り専用の再確認で、[GitHub v1.4.0リリース](https://github.com/abruption/session-peer/releases/tag/v1.4.0)は`476c67e636ef02cb93797dd2f42252dfe577625f`から`2026-11-02T04:36:59Z`に公開された正式な不変リリースであることを確認しました。[PyPIのバージョン記録](https://pypi.org/pypi/session-peer/1.4.0/json)にあるファイルは以下の2個のみで、いずれも配布を取り下げられていません。各SHA-256は固定済みのGitHubアセットと一致します。
+
+| ファイル | PyPIアップロード時刻(UTC) | SHA-256 |
+| --- | --- | --- |
+| `session_peer-1.4.0-py3-none-any.whl` | `2026-11-02T04:38:34.686393Z` | `b9d931ae9046f081dac15fcbeb5ca886aa437aa8e3bbb4be8296b81b2cec6832` |
+| `session_peer-1.4.0.tar.gz` | `2026-11-02T04:38:36.363777Z` | `cfb06b3a8c4410178ddf0bbdd3f2b1733288d6221174b05309cf2dfaba7930bf` |
+
+この正確なソースで[準備ワークフロー](https://github.com/abruption/session-peer/actions/runs/41389266767)と[公開ワークフロー](https://github.com/abruption/session-peer/actions/runs/41389462046)が成功しました。リリース時の記録には、全7アセットの署名と準備ワークフロー・ソースの照合、マニフェスト・provenance検証、依存関係監査、新しい環境へのwheel/sdistのインストール、必須のPyPI環境の人による承認が含まれます。公開ワークフローはアップロード後のPyPIファイルも検証しました。この日付付き記録は、2026-11-03に新たな署名検証・インストール・ネイティブ受入試験を実施したという主張ではありません。
+
+不変のランタイムv1.4.0の`SKILL.md`アセットは、公開済みスキルv0.4.1のままであり、後のソーススナップショットで置き換えません。[PR #366](https://github.com/abruption/session-peer/pull/366)では、リポジトリのコピーのみをスキルv0.5.0へ別途同期しました。今回の保守変更では、独立して公開された[スキルv0.5.1](https://github.com/abruption/session-peer-skill/releases/tag/v0.5.1)へコピーを同期します。ソースは`95cf5e1dd92654775b2f0ea86c1cb4b6107f49c3`、UTF-8で31688バイト、SHA-256は`922512869577cc3d8b9d305641479e2dd659f0e669298584ca06f1ca15de1d31`です。最小ランタイムは0.9.1、文書の全機能の基準は1.4.0で、受信側`codexBin`の下限は1.0.1を維持します。スキルリリースAPIは`immutable=false`を返すため、スナップショットは正確なソースとハッシュで固定し、GitHubが不変性を強制しているとは記載しません。どちらのスナップショット同期も、既に公開されたランタイムアセットや別途インストールされたスキルを変更しません。
+
+上の準備セクションは当時の確認記録として残します。公開した事実だけでは、全機器への配備、実際のNative/SSH受入、消費・ACK、研究課題の完了を証明しません。この文書・スナップショット保守によるランタイム不具合の修正は主張せず、[#367](https://github.com/abruption/session-peer/issues/367)は別途提案されたペアリング済み機器の探索機能です。
diff --git a/docs/ko/releases/v1.4.0.md b/docs/ko/releases/v1.4.0.md
index 8dc68c4..44f3001 100644
--- a/docs/ko/releases/v1.4.0.md
+++ b/docs/ko/releases/v1.4.0.md
@@ -32,3 +32,20 @@
정확한 현재 커밋을 리뷰하고 현재 커밋 검사와 최종 보호된 main CI의 성공을 요구하며 공개된 v1.3.3 태그·자산·과거 기록을 모두 보존합니다. 공개를 미리 선언하지 않는 이 날짜별 안내를 고정합니다. 별도 승인된 공개에서는 `SHA256SUMS`, `release-provenance.json`을 포함한 고정 자산 7개를 정확한 태그·소스 및 인증된 attestation과 대조하고 의존성 감사와 새 환경 설치 검사를 수행하며 필수 PyPI 환경의 사람 승인을 유지해야 합니다. 비공개 PyPI 로그인·연결 재확인 생략은 이 승인을 면제하지 않습니다.
제공 여부 안내를 갱신하기 전에 실제 GitHub·PyPI 공개 근거를 별도로 기록하고 미래 공개를 선언하지 않습니다. Python 공개, 전역 MCP 환경 갱신, 서비스 변경, Node Control 배포와 별도로 설치된 스킬은 각각 별도 승인이 필요한 작업입니다.
+
+
+
+## v1.4.0 공개 기록 (2026-11-03 확인)
+
+2026-11-03에 읽기 전용으로 다시 확인한 결과, [GitHub v1.4.0 릴리스](https://github.com/abruption/session-peer/releases/tag/v1.4.0)는 `476c67e636ef02cb93797dd2f42252dfe577625f`에서 `2026-11-02T04:36:59Z`에 공개된 정식·불변 릴리스입니다. [PyPI 버전 기록](https://pypi.org/pypi/session-peer/1.4.0/json)에는 아래 두 파일만 있으며 모두 배포 철회되지 않았습니다. 각 SHA-256은 고정된 GitHub 자산과 일치합니다.
+
+| 파일 | PyPI 업로드 시각 (UTC) | SHA-256 |
+| --- | --- | --- |
+| `session_peer-1.4.0-py3-none-any.whl` | `2026-11-02T04:38:34.686393Z` | `b9d931ae9046f081dac15fcbeb5ca886aa437aa8e3bbb4be8296b81b2cec6832` |
+| `session_peer-1.4.0.tar.gz` | `2026-11-02T04:38:36.363777Z` | `cfb06b3a8c4410178ddf0bbdd3f2b1733288d6221174b05309cf2dfaba7930bf` |
+
+정확히 이 소스에서 [준비 워크플로](https://github.com/abruption/session-peer/actions/runs/41389266767)와 [게시 워크플로](https://github.com/abruption/session-peer/actions/runs/41389462046)가 성공했습니다. 릴리스 당시 기록에는 자산 7개의 서명을 준비 워크플로·소스와 대조한 결과, 매니페스트·provenance 검사, 의존성 감사, 새 환경의 wheel/sdist 설치와 필수 PyPI 환경 사람 승인이 포함됩니다. 게시 워크플로는 업로드 후 PyPI 파일도 검증했습니다. 이 날짜별 기록은 2026-11-03에 새로운 서명 검사·설치·네이티브 수락 시험을 수행했다고 주장하지 않습니다.
+
+불변 런타임 v1.4.0의 `SKILL.md` 자산은 공개된 스킬 v0.4.1을 유지하며, 이후 소스 스냅샷으로 교체하지 않습니다. [PR #366](https://github.com/abruption/session-peer/pull/366)에서는 저장소 사본만 스킬 v0.5.0으로 별도 동기화했습니다. 이번 유지보수 변경은 별도로 공개된 [스킬 v0.5.1](https://github.com/abruption/session-peer-skill/releases/tag/v0.5.1)로 사본을 동기화합니다. 소스는 `95cf5e1dd92654775b2f0ea86c1cb4b6107f49c3`, UTF-8 31688바이트, SHA-256은 `922512869577cc3d8b9d305641479e2dd659f0e669298584ca06f1ca15de1d31`입니다. 최소 런타임은 0.9.1, 문서의 전체 기능 기준은 1.4.0이며 수신기 `codexBin` 하한은 1.0.1을 유지합니다. 스킬 릴리스 API는 `immutable=false`를 반환하므로 스냅샷은 정확한 소스·해시로 고정하며 GitHub가 불변성을 강제한다고 표시하지 않습니다. 어느 스냅샷 동기화도 이미 공개된 런타임 자산이나 별도로 설치된 스킬을 변경하지 않습니다.
+
+위 준비 절은 당시 점검 기록으로 보존합니다. 공개 사실만으로 전체 장비 배포, 실제 Native/SSH 수락, 소비·ACK나 연구 과제 완료가 입증되지는 않습니다. 이 문서·스냅샷 유지보수에서 런타임 결함을 수정했다고 주장하지 않으며, [#367](https://github.com/abruption/session-peer/issues/367)은 별도로 제안된 페어링 기기 탐색 기능입니다.
diff --git a/docs/releases/v1.4.0.md b/docs/releases/v1.4.0.md
index ad28912..a0dee27 100644
--- a/docs/releases/v1.4.0.md
+++ b/docs/releases/v1.4.0.md
@@ -32,3 +32,20 @@ These extensions add no new live Native/SSH, Windows 3.14 or free-threaded accep
Review the exact current head, require successful current-head checks and final protected-main CI, and preserve every published v1.3.3 tag, asset and historical record. Freeze these publication-neutral dated notes. A separately authorized publication must verify all 7 frozen assets, including `SHA256SUMS` and `release-provenance.json`, against the exact tag/source and authenticated attestations, run dependency audits and fresh installation checks, and retain required human PyPI environment approval. Skipping the private PyPI login/binding recheck does not waive that approval.
Record actual GitHub and PyPI publication evidence separately before updating availability statements; do not announce a future publication. Python publication, global MCP environment upgrades, service changes, Node Control deployment and independently installed skills remain separately authorized operations.
+
+
+
+## Publication record — v1.4.0 (verified 2026-11-03)
+
+A read-only recheck on 2026-11-03 confirmed the [GitHub v1.4.0 release](https://github.com/abruption/session-peer/releases/tag/v1.4.0) as published, stable and immutable at `2026-11-02T04:36:59Z`, from `476c67e636ef02cb93797dd2f42252dfe577625f`. The [PyPI version record](https://pypi.org/pypi/session-peer/1.4.0/json) contains exactly the following two non-yanked files; their SHA-256 values match the locked GitHub assets.
+
+| File | PyPI upload time (UTC) | SHA-256 |
+| --- | --- | --- |
+| `session_peer-1.4.0-py3-none-any.whl` | `2026-11-02T04:38:34.686393Z` | `b9d931ae9046f081dac15fcbeb5ca886aa437aa8e3bbb4be8296b81b2cec6832` |
+| `session_peer-1.4.0.tar.gz` | `2026-11-02T04:38:36.363777Z` | `cfb06b3a8c4410178ddf0bbdd3f2b1733288d6221174b05309cf2dfaba7930bf` |
+
+The [preparation workflow](https://github.com/abruption/session-peer/actions/runs/41389266767) and [publication workflow](https://github.com/abruption/session-peer/actions/runs/41389462046) succeeded for that exact source. The release-time record includes authentication of all 7 assets against the preparation workflow and source, manifest/provenance checks, dependency audits, fresh wheel/sdist installations and the required human PyPI environment approval. The publication workflow also verified the PyPI files after upload. This dated record does not claim a new signature check, installation or native acceptance test on 2026-11-03.
+
+The immutable runtime v1.4.0 `SKILL.md` asset remains the published skill v0.4.1; it is not replaced by later source snapshots. [PR #366](https://github.com/abruption/session-peer/pull/366) separately synchronized the repository copy to skill v0.5.0. This maintenance change synchronizes it to the independently published [skill v0.5.1](https://github.com/abruption/session-peer-skill/releases/tag/v0.5.1), source `95cf5e1dd92654775b2f0ea86c1cb4b6107f49c3`, 31688 UTF-8 bytes, SHA-256 `922512869577cc3d8b9d305641479e2dd659f0e669298584ca06f1ca15de1d31`. Its minimum runtime is 0.9.1, documented full coverage is 1.4.0 and receiver `codexBin` floor remains 1.0.1. The skill release API reports `immutable=false`; the snapshot is pinned by exact source and hash, not represented as GitHub-enforced immutability. Neither snapshot synchronization changes an already published runtime asset or an independently installed skill.
+
+The preparation sections above remain historical checkpoints. Publication does not establish fleet rollout, live Native/SSH acceptance, consumption/ACK, or completion of research gates. No runtime defect is claimed fixed by this document or snapshot maintenance; [#367](https://github.com/abruption/session-peer/issues/367) remains a separate proposed paired-device discovery feature.
diff --git a/docs/zh-CN/releases/v1.4.0.md b/docs/zh-CN/releases/v1.4.0.md
index 7d3325f..6750625 100644
--- a/docs/zh-CN/releases/v1.4.0.md
+++ b/docs/zh-CN/releases/v1.4.0.md
@@ -32,3 +32,20 @@
审查准确的当前提交,要求当前提交检查与最终受保护main CI成功,并保留所有已发布v1.3.3标签、资产及历史记录。冻结这份不预告发布的日期记录。另行授权的发布必须将包含`SHA256SUMS`和`release-provenance.json`的7个固定资产与准确标签、源码及经过认证的attestation核对,执行依赖审计与全新安装检查,并保留PyPI环境必需的人工批准。省略私有PyPI登录或绑定复查不免除该批准。
更新可用性说明前,须另行记录实际GitHub和PyPI发布依据,不得宣告将来已发布。Python发布、全局MCP环境升级、服务变更、Node Control部署和独立安装的技能均是需要另行授权的操作。
+
+
+
+## v1.4.0发布记录(2026-11-03确认)
+
+2026-11-03的只读复核确认,[GitHub v1.4.0发布](https://github.com/abruption/session-peer/releases/tag/v1.4.0)已于`2026-11-02T04:36:59Z`从`476c67e636ef02cb93797dd2f42252dfe577625f`正式发布,且为不可变发布。[PyPI版本记录](https://pypi.org/pypi/session-peer/1.4.0/json)中只有以下两个文件,均未被撤回分发;各SHA-256与锁定的GitHub资产一致。
+
+| 文件 | PyPI上传时间(UTC) | SHA-256 |
+| --- | --- | --- |
+| `session_peer-1.4.0-py3-none-any.whl` | `2026-11-02T04:38:34.686393Z` | `b9d931ae9046f081dac15fcbeb5ca886aa437aa8e3bbb4be8296b81b2cec6832` |
+| `session_peer-1.4.0.tar.gz` | `2026-11-02T04:38:36.363777Z` | `cfb06b3a8c4410178ddf0bbdd3f2b1733288d6221174b05309cf2dfaba7930bf` |
+
+[准备工作流](https://github.com/abruption/session-peer/actions/runs/41389266767)和[发布工作流](https://github.com/abruption/session-peer/actions/runs/41389462046)均在这一确切源码上成功完成。发布时的记录包括:将全部7项资产的签名与准备工作流及源码核对、清单与provenance检查、依赖审计、在全新环境中安装wheel/sdist,以及必需的PyPI环境人工批准。发布工作流还验证了上传后的PyPI文件。本日期记录并不声称于2026-11-03执行了新的签名检查、安装或原生验收测试。
+
+不可变运行时v1.4.0的`SKILL.md`资产仍为已发布的技能v0.4.1,不会被后续源码快照替换。[PR #366](https://github.com/abruption/session-peer/pull/366)已单独将仓库副本同步到技能v0.5.0。本次维护变更将副本同步到独立发布的[技能v0.5.1](https://github.com/abruption/session-peer-skill/releases/tag/v0.5.1),源码为`95cf5e1dd92654775b2f0ea86c1cb4b6107f49c3`,UTF-8大小为31688字节,SHA-256为`922512869577cc3d8b9d305641479e2dd659f0e669298584ca06f1ca15de1d31`。最低运行时为0.9.1,文档完整功能基准为1.4.0,接收端`codexBin`下限仍为1.0.1。技能发布API返回`immutable=false`;因此快照通过确切源码和哈希固定,而不声称GitHub强制其不可变。两次快照同步均不会修改已经发布的运行时资产或单独安装的技能。
+
+以上准备章节保留为当时的检查记录。发布本身不证明所有设备已部署、实际Native/SSH验收、消费或ACK,也不代表研究条件已全部满足。本文档与快照维护不声称修复运行时缺陷;[#367](https://github.com/abruption/session-peer/issues/367)仍是单独提出的配对设备发现功能。
diff --git a/skills/session-peer/SKILL.md b/skills/session-peer/SKILL.md
index 7ad20c9..a580b02 100644
--- a/skills/session-peer/SKILL.md
+++ b/skills/session-peer/SKILL.md
@@ -3,7 +3,7 @@ name: session-peer
description: Send user-requested messages to Claude Code, Codex, or a live registered Antigravity TUI on this machine, an SSH host, or a paired device using session-peer. Use for cross-session handoffs and notifications when the available native tools do not cover the requested target.
allowed-tools: Bash, Read
metadata:
- version: "0.5.0"
+ version: "0.5.1"
runtime-min-version: "0.9.1"
runtime-full-version: "1.4.0"
---
@@ -15,7 +15,19 @@ Otherwise use `session-peer`, or the standalone script at
`~/.local/share/session-peer/session_peer.py`. The executable can also be installed
with pipx, uv tool, or pip. Do not assume it lives in a Claude configuration directory.
-Before discovery or delivery, run `session-peer --version`. This skill expects
+For paired work, a missing Relay dependency in one CLI does not establish that
+no Relay-capable environment exists. The standalone script and a receiver
+service's package environment are separate installations. Before proposing an
+install, inspect only operator-known launcher/service metadata or explicitly
+supplied environment paths. Do not scan arbitrary private/credential directories,
+dump secrets, run a service command, or automatically execute a discovered
+interpreter. Have the operator review/select the intended existing runtime and
+initialized state; preserve existing manager, extras, identities and settings.
+Resolve ambiguous runtimes/state contexts with the operator before execution.
+
+Before discovery or delivery, check session-peer's version through the selected,
+approved CLI invocation (`session-peer --version` when that is the launcher).
+Check the Python interpreter version separately when needed. This skill expects
session-peer 0.9.1 or newer. `--allow-inactive-codex-home` and `--relay-login`
exist only in 1.0.0 and newer; confirm them with `session-peer send --help`
before use. For security fixes, recommend Python runtime 1.0.3 or newer;
@@ -63,7 +75,9 @@ the same UUID in different homes identifies different saved copies. Explicit
`list --codex-home PATH` lists only that home. Inspect `discovery.codex.homes` and
`errors` for partial failures; `not_installed` is a normal empty automatic result.
MCP destinations remain restricted to their explicitly configured home.
-`list --all` adds stale or inbox-less Claude records and archived Codex threads.
+For ordinary local/SSH discovery, `list --all` adds stale or inbox-less Claude
+records and archived Codex threads. Default listing is local; `--all` does not
+discover all paired devices or widen receiver policy.
In Python runtime 1.1.0 and newer, a nonempty inherited `CODEX_SQLITE_HOME`
or a root `sqlite_home` setting in an inspected home refuses discovery, dry-run,
@@ -161,6 +175,29 @@ credentials; do not print, copy, or attach them. Paired requests reject `--wake`
explicit SSH reply routes, and native home, binary, or SSH options. They also
advertise no automatic `Reply-To`.
+For an already configured paired receiver, use the operator-selected runtime
+and exact existing initialized state for lookup before choosing an alias:
+
+```bash
+ device peers --state
+ list --device \
+ --device-state --device-route direct --json
+```
+
+These are placeholders, not commands to execute literally. Copy the intended
+stored peer/device ID, then the permitted receiver alias; a stored pair does not
+grant access to every native session or prove reachability. `--device` selects
+one receiver. Direct is an explicitly selected, already configured route, not a
+connectivity guarantee; preserve the admission/route rules for other choices.
+These lookup commands can take state locks and maintain the existing store
+schema, so never probe guessed, missing or incomplete state paths. `device routes`
+changes stored routes and is not a connectivity inspection. After discovery, keep the same selected runtime and initialized state for the
+exact peer/alias dry-run and one send within user authorization.
+`receiverAccepted` can describe lookup/dry-run acceptance without native
+submission; it does not establish consumption or ACK. Unknown never permits
+resend. Do not implicitly install, initialize, pair, repair, restart services,
+log in or activate a native target to obtain discovery.
+
For macOS/Linux paired Codex targets, receiver policy `codexBin` requires
session-peer 1.0.1 or newer; the receiver service's `PATH` can also expose the
target Codex executable. Only the receiver operator chooses these settings.
diff --git a/tests/core/test_skill_frontmatter.py b/tests/core/test_skill_frontmatter.py
index 1cf612f..85a8fcd 100644
--- a/tests/core/test_skill_frontmatter.py
+++ b/tests/core/test_skill_frontmatter.py
@@ -27,15 +27,15 @@
class SkillFrontmatter(unittest.TestCase):
- def test_published_v050_snapshot_is_exact_and_metadata_remains_readable(self):
- # session-peer-skill v0.5.0, source ee2d16e954b6a0204f9a085ad3c308f4fba83ccd.
+ def test_published_v051_snapshot_is_exact_and_metadata_remains_readable(self):
+ # session-peer-skill v0.5.1, source 95cf5e1dd92654775b2f0ea86c1cb4b6107f49c3.
path = Path(__file__).resolve().parents[2] / "skills/session-peer/SKILL.md"
content = path.read_bytes()
- self.assertEqual(29326, len(content))
- self.assertEqual("532d370c3acf18f59d2b53213bfa9b08a877fcb3415de2f3fb607219c665ca0d",
+ self.assertEqual(31688, len(content))
+ self.assertEqual("922512869577cc3d8b9d305641479e2dd659f0e669298584ca06f1ca15de1d31",
hashlib.sha256(content).hexdigest())
self.assertGreater(len(content), LIMIT)
- self.assertEqual({"version": "0.5.0", "runtimeMinVersion": "0.9.1"},
+ self.assertEqual({"version": "0.5.1", "runtimeMinVersion": "0.9.1"},
peer.installed_skill_metadata(path))
def setUp(self):
diff --git a/tests/docs/test_stable_candidate.py b/tests/docs/test_stable_candidate.py
index 32f974c..37ebec3 100644
--- a/tests/docs/test_stable_candidate.py
+++ b/tests/docs/test_stable_candidate.py
@@ -11,6 +11,28 @@
class StableCandidate(unittest.TestCase):
+ def test_v140_publication_record_preserves_preparation_and_pinned_skill_history(self):
+ source = "476c67e636ef02cb93797dd2f42252dfe577625f"
+ facts = (source, "2026-11-03", "2026-11-02T04:36:59Z",
+ "2026-11-02T04:38:34.686393Z", "2026-11-02T04:38:36.363777Z",
+ "b9d931ae9046f081dac15fcbeb5ca886aa437aa8e3bbb4be8296b81b2cec6832",
+ "cfb06b3a8c4410178ddf0bbdd3f2b1733288d6221174b05309cf2dfaba7930bf",
+ "41389266767", "41389462046", "0.4.1", "0.5.0", "0.5.1",
+ "95cf5e1dd92654775b2f0ea86c1cb4b6107f49c3", "31688",
+ "922512869577cc3d8b9d305641479e2dd659f0e669298584ca06f1ca15de1d31",
+ "immutable=false", "0.9.1", "1.4.0", "1.0.1")
+ for locale, suffix in (("", ""), ("ko/", ".ko"), ("ja/", ".ja"), ("zh-CN/", ".zh-CN")):
+ with self.subTest(locale=locale):
+ notes = (ROOT / ("docs/" + locale + "releases/v1.4.0.md")).read_text(encoding="utf-8")
+ preparation, publication = notes.split('', 1)
+ for fact in facts:
+ self.assertIn(fact, publication)
+ self.assertIn("f290973962c63548f24153eeee12a8e3666fd043", preparation)
+ self.assertNotIn(source, preparation)
+ for stem in ("README", "RELEASING"):
+ text = (ROOT / (stem + suffix + ".md")).read_text(encoding="utf-8")
+ self.assertIn("releases/v1.4.0.md#v140-publication-record", text)
+
def test_v140_preparation_separates_source_publication_and_skill_contracts(self):
for locale in ('', 'ko/', 'ja/', 'zh-CN/'):
notes = (ROOT / ('docs/' + locale + 'releases/v1.4.0.md')).read_text(encoding='utf-8')
@@ -326,8 +348,8 @@ def test_current_readmes_and_runbooks_match_source_version(self):
with self.subTest(stem=stem, suffix=suffix):
text = (ROOT / (stem + suffix + ".md")).read_text(encoding="utf-8")
if stem == "README":
- prefixes = {"": "Source version: ", ".ko": "소스 버전: ",
- ".ja": "ソースバージョン:", ".zh-CN": "源码版本:"}
+ prefixes = {"": "Published runtime: ", ".ko": "공개 런타임: ",
+ ".ja": "公開済みランタイム:", ".zh-CN": "已发布运行时:"}
line = next(line for line in text.splitlines() if line.startswith(prefixes[suffix]))
self.assertTrue(line.startswith(prefixes[suffix] + "**" + session_peer.__version__ + "**"))
else:
@@ -356,16 +378,16 @@ def test_release_notes_keep_scope_and_limits_visible(self):
def test_stable_release_keeps_operational_deployment_separate(self):
profiles = (
- ("", "Source version: **1.4.0**",
+ ("", "Published runtime: **1.4.0**",
"At the 2026-10-28 preparation checkpoint, the last verified published stable release was **1.3.1**.",
"Development candidate 1.2.1 is unpublished"),
- (".ko", "소스 버전: **1.4.0**",
+ (".ko", "공개 런타임: **1.4.0**",
"2026-10-28 준비 시점의 마지막 확인 공개 안정판은 **1.3.1**이었습니다.",
"개발 후보 1.2.1은 미공개입니다"),
- (".ja", "ソースバージョン:**1.4.0**",
+ (".ja", "公開済みランタイム:**1.4.0**",
"2026-10-28の準備時点で、最後に確認した公開済み安定版は**1.3.1**でした。",
"開発候補1.2.1は未公開です"),
- (".zh-CN", "源码版本:**1.4.0**",
+ (".zh-CN", "已发布运行时:**1.4.0**",
"在2026-10-28的准备检查时,最后确认的已发布稳定版本为**1.3.1**。",
"开发候选版本1.2.1尚未发布"),
)