diff --git a/README.ja.md b/README.ja.md index 7ab9219..fb6b56e 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.3.2**。2026-10-28の準備時点で、最後に確認した公開済み安定版は**1.3.1**でした。macOSのファイアウォール案内とDirectリスナー・TLSの診断については、[メンテナンスリリースの案内](docs/ja/releases/v1.3.2.md)を参照してください。ControlのBetter Authセキュリティ更新はリポジトリのソースにあり、Python wheel/sdistには含まれないため、別途承認された配備が必要です。 +ソースバージョン:**1.3.2**。公開の根拠、macOSのファイアウォール案内、Directリスナー・TLS診断については、[メンテナンスリリースの案内](docs/ja/releases/v1.3.2.md)を参照してください。ControlのBetter Authセキュリティ更新はリポジトリのソースにあり、Python wheel/sdistには含まれないため、別途承認された配備が必要です。 任意の[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 09902ec..d3c7cbf 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.3.2**. 2026-10-28 준비 시점의 마지막 확인 공개 안정판은 **1.3.1**이었습니다. macOS 방화벽 안내와 Direct 리스너·TLS 진단은 [유지보수 릴리스 안내](docs/ko/releases/v1.3.2.md)를 참고하십시오. Control의 Better Auth 보안 갱신은 저장소 소스에 있으며 Python wheel/sdist에는 포함되지 않으므로 별도로 승인된 배포가 필요합니다. +소스 버전: **1.3.2**. 공개 근거, macOS 방화벽 안내와 Direct 리스너·TLS 진단은 [유지보수 릴리스 안내](docs/ko/releases/v1.3.2.md)를 참고하십시오. Control의 Better Auth 보안 갱신은 저장소 소스에 있으며 Python wheel/sdist에는 포함되지 않으므로 별도로 승인된 배포가 필요합니다. 선택형 [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 f002736..21fda3d 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.3.2**. At the 2026-10-28 preparation checkpoint, the last verified published stable release was **1.3.1**. See the [maintenance release notes](docs/releases/v1.3.2.md) for macOS firewall guidance and Direct listener/TLS diagnostics. Control's Better Auth security update is in repository source, outside Python wheel/sdist, and requires a separately authorized rollout. +Source version: **1.3.2**. For publication evidence, macOS firewall guidance and Direct listener/TLS diagnostics, see the [maintenance release notes](docs/releases/v1.3.2.md). Control's Better Auth security update is in repository source, outside Python wheel/sdist, and requires a separately authorized rollout. 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 d6477a4..dd18ade 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -33,7 +33,7 @@ session-peer使用各智能体自身的收件箱和队列;接收方智能体 ### 安装 需要Python 3.9或更高版本。核心本地与SSH CLI没有第三方Python依赖。 -源码版本:**1.3.2**。在2026-10-28的准备检查时,最后确认的已发布稳定版本为**1.3.1**。macOS防火墙说明和Direct监听器/TLS诊断请参阅[维护版本说明](docs/zh-CN/releases/v1.3.2.md)。Control的Better Auth安全更新位于仓库源码中,不包含在Python wheel/sdist内,需另行批准部署。 +源码版本:**1.3.2**。发布依据、macOS防火墙说明和Direct监听器/TLS诊断请参阅[维护版本说明](docs/zh-CN/releases/v1.3.2.md)。Control的Better Auth安全更新位于仓库源码中,不包含在Python wheel/sdist内,需另行批准部署。 可选的[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 975fa72..3ed2179 100644 --- a/RELEASING.ja.md +++ b/RELEASING.ja.md @@ -1,5 +1,20 @@ # session-peerのリリース +## 公開記録 — v1.3.2(2026-10-29確認) + +2026-10-29の読み取り専用の再確認で、[GitHub v1.3.2リリース](https://github.com/abruption/session-peer/releases/tag/v1.3.2)がソース`f5e7c49554ff02771990a151e00b52f2abf3df0a`から正式な変更不能のリリースとして2026-10-28T01:52:40Zに公開されたことを確認しました。別途確認した[PyPIのバージョン記録](https://pypi.org/pypi/session-peer/1.3.2/json)では、wheelとsdistのアップロード時刻はそれぞれ2026-10-28T01:55:11.612762Zと2026-10-28T01:55:13.659910Zで、どちらも取り下げられていません。正確なファイルハッシュと根拠は[保守リリースの公開記録](docs/ja/releases/v1.3.2.md#v132-publication-record)にあります。 + +以下の準備節は過去の時点の記録であり、現在の公開状況や古いタグを再利用する指示ではありません。Pythonの公開、Node Controlの配備、受信機環境の更新・再起動、別途管理するスキルの更新は別の作業です。 + + + +## 今後のリリースで行う公開後の文書確認 + +1. 正確なGitHubタグ・コミット、リリース状態と公開時刻を確認し、PyPIのファイル一覧・取り下げ状態・ハッシュを、ロックされた署名検証済み候補と別途照合します。GitHubでの公開だけではPyPIでの提供を証明しません。 +2. ソースコミット、UTC時刻、根拠リンク、成果物ハッシュを含む、日付付きの公開記録を別途追加します。準備時点の記録を受け入れ完了として書き換えずに保存します。 +3. 現在のインストール・状態案内をREADMEの4言語版と該当バージョンの現行ガイドに反映します。提供状況はリリース・PyPIへのリンクを優先し、特定の最新版に固定せず案内します。歴史的なバージョン参照は維持します。 +4. 文書・翻訳・リンク・アンカー・生成機・リリース整合性を検査し、通常の文書PR手順を使います。公開を先に宣言せず、文言の修正のために公開済みタグ・資産を再作成・置換せず、サービス・スキルの自動配備を示唆しません。 + ## v1.3.2 準備 PR #345のゲート修正ソース基準は`a68c6cf16c234cd3fe72926e519e4178c093081a`です。マージ済みPR #347後の統合準備基準は、バージョン準備コミットより前の`ef7748a78e6b466f67074708f5c14decf37f31d7`です。最終公開記録でリリースコミットを別途特定します。 diff --git a/RELEASING.ko.md b/RELEASING.ko.md index d29b553..f034ca7 100644 --- a/RELEASING.ko.md +++ b/RELEASING.ko.md @@ -1,5 +1,20 @@ # session-peer 릴리스 +## 공개 기록 — v1.3.2(2026-10-29 확인) + +2026-10-29 읽기 전용 재확인에서 [GitHub v1.3.2 릴리스](https://github.com/abruption/session-peer/releases/tag/v1.3.2)가 소스 `f5e7c49554ff02771990a151e00b52f2abf3df0a`의 정식 불변 릴리스로 2026-10-28T01:52:40Z에 공개됐음을 확인했습니다. 별도로 확인한 [PyPI 버전 기록](https://pypi.org/pypi/session-peer/1.3.2/json)의 wheel과 sdist 업로드 시각은 각각 2026-10-28T01:55:11.612762Z와 2026-10-28T01:55:13.659910Z이며 둘 다 철회되지 않았습니다. 정확한 파일 해시와 근거는 [유지보수 공개 기록](docs/ko/releases/v1.3.2.md#v132-publication-record)에 있습니다. + +아래 준비 절은 과거 시점의 기록이며 현재 공개 상태나 이전 태그를 재사용하라는 지시가 아닙니다. Python 공개, Node Control 배포, 수신기 환경 갱신·재시작, 별도 관리 스킬 갱신은 서로 다른 작업입니다. + + + +## 향후 릴리스의 공개 후 문서 확인 + +1. 정확한 GitHub 태그·커밋, 릴리스 상태와 공개 시각을 확인하고, PyPI의 파일 목록·철회 여부·해시를 잠금·서명 검증을 마친 후보 파일과 별도로 대조합니다. GitHub 공개만으로 PyPI 제공 여부가 입증되지는 않습니다. +2. 소스 커밋, UTC 시각, 근거 링크와 산출물 해시를 담은 별도의 날짜별 공개 기록을 추가합니다. 준비 시점 기록을 완료된 수락으로 바꾸지 않고 보존합니다. +3. 현재 설치·상태 안내를 README 네 언어판과 해당 버전의 현행 가이드에 반영합니다. 제공 여부는 릴리스·PyPI 링크를 우선해 특정 최신 버전에 고정하지 않고 안내하며, 역사적 버전 참조는 유지합니다. +4. 문서·다국어·링크·앵커·생성기·릴리스 정합 검사를 실행한 뒤 정상 문서 PR 절차를 따릅니다. 공개를 미리 선언하거나 문구를 고치기 위해 공개 태그·자산을 다시 만들거나 교체하지 말고, 서비스·스킬의 자동 배포를 암시하지 않습니다. + ## v1.3.2 준비 PR #345의 게이트 수정 소스 기준은 `a68c6cf16c234cd3fe72926e519e4178c093081a`입니다. 병합된 PR #347 이후 통합 준비 기준은 버전 준비 커밋 이전의 `ef7748a78e6b466f67074708f5c14decf37f31d7`입니다. 최종 발행 증거에서 릴리스 커밋을 별도로 식별합니다. diff --git a/RELEASING.md b/RELEASING.md index 30a9f42..63c0f00 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -1,5 +1,20 @@ # Releasing session-peer +## Publication record — v1.3.2 (verified 2026-10-29) + +On 2026-10-29, a read-only recheck verified the [GitHub v1.3.2 release](https://github.com/abruption/session-peer/releases/tag/v1.3.2) as published, stable and immutable at 2026-10-28T01:52:40Z, from `f5e7c49554ff02771990a151e00b52f2abf3df0a`. The separately checked [PyPI version record](https://pypi.org/pypi/session-peer/1.3.2/json) has the wheel and sdist uploaded at 2026-10-28T01:55:11.612762Z and 2026-10-28T01:55:13.659910Z, both non-yanked. Exact file hashes and evidence are in the [maintenance publication record](docs/releases/v1.3.2.md#v132-publication-record). + +The preparation sections below preserve historical checkpoints, not the current publication status or instructions to reuse old tags. Python publication, Node Control deployment, receiver environment updates/restarts and independently managed skill updates are separate. + + + +## Post-publication documentation check for future releases + +1. Verify the exact GitHub tag/commit, release status and publication time; independently verify the PyPI file set, non-yanked status and hashes against the locked, attested candidates. A GitHub release alone does not prove PyPI availability. +2. Add a separate dated publication record with source commit, UTC timestamps, evidence links and artifact hashes. Preserve the dated preparation snapshot instead of rewriting it as completed acceptance. +3. Refresh current installation/status guidance in all four README editions and current version-specific guides. Prefer release/PyPI links for version-neutral availability guidance; preserve historical version references. +4. Run documentation/i18n, link/anchor, generator and release-consistency checks, then use a normal documentation PR. Do not announce publication in advance, rebuild or replace published tags/assets for wording changes, or imply automatic service/skill deployment. + ## v1.3.2 preparation Gate-fix source base after PR #345: `a68c6cf16c234cd3fe72926e519e4178c093081a`. Integrated preparation base after merged PR #347: `ef7748a78e6b466f67074708f5c14decf37f31d7`, before the version-preparation commit. Final publication evidence identifies the release commit separately. diff --git a/RELEASING.zh-CN.md b/RELEASING.zh-CN.md index adeb657..c925228 100644 --- a/RELEASING.zh-CN.md +++ b/RELEASING.zh-CN.md @@ -1,5 +1,20 @@ # 发布session-peer +## 发布记录 — v1.3.2(2026-10-29核验) + +2026-10-29的只读复核确认,[GitHub v1.3.2版本](https://github.com/abruption/session-peer/releases/tag/v1.3.2)已从源码`f5e7c49554ff02771990a151e00b52f2abf3df0a`于2026-10-28T01:52:40Z正式发布且不可变。单独核验的[PyPI版本记录](https://pypi.org/pypi/session-peer/1.3.2/json)显示,wheel和sdist分别于2026-10-28T01:55:11.612762Z和2026-10-28T01:55:13.659910Z上传,均未被撤回。准确的文件哈希和依据见[维护版本发布记录](docs/zh-CN/releases/v1.3.2.md#v132-publication-record)。 + +下方准备章节保留的是历史时点记录,并非当前发布状态,也不是要求重用旧标签。Python发布、Node Control部署、接收端环境更新与重启、独立管理的技能更新是不同的工作。 + + + +## 后续版本发布后的文档检查 + +1. 确认准确的GitHub标签与提交、版本状态及发布时间;单独核验PyPI文件列表、撤回状态和哈希,并与已锁定且通过签名验证的候选文件对照。仅凭GitHub发布不能证明PyPI已提供软件包。 +2. 另行添加带日期的发布记录,包含源码提交、UTC时间、依据链接和制品哈希。保留准备时点记录,不将其改写为已完成验收。 +3. 更新四种语言README和对应版本现行指南中的安装与状态说明。优先通过版本发布页与PyPI链接说明可用状态,避免固定指向某个最新版本;保留历史版本引用。 +4. 运行文档、多语言、链接、锚点、生成器及发布一致性检查,并采用正常的文档PR流程。不要提前宣称已发布,不要为修正文案重建或替换已发布的标签与资产,也不要暗示自动部署服务或技能。 + ## v1.3.2 准备 PR #345的门禁修复源码基准为`a68c6cf16c234cd3fe72926e519e4178c093081a`。已合并PR #347后的集成准备基准为版本准备提交前的`ef7748a78e6b466f67074708f5c14decf37f31d7`;最终发布证据会另行标明发布提交。 diff --git a/docs/i18n-manifest.json b/docs/i18n-manifest.json index bb185d0..560874e 100644 --- a/docs/i18n-manifest.json +++ b/docs/i18n-manifest.json @@ -7,8 +7,8 @@ "zh-CN" ], "sources": { - "README.md": "bbab4acce7d5bbb1b4a03bd22c48fc71feacc98e231e42d23468309f80be30d1", - "RELEASING.md": "521f2c857e034714f63118eff5a9fcf8a0a4763b1e6c55b1797eee2a00aab424", + "README.md": "20c893a35b81123c5fd9e37244227407de24f0b309e16101a838ca329ad7dfaa", + "RELEASING.md": "e3e202dd769ad47e0d22bfb5a2d48b3708fbf5f9f185b09262ba735417bdf46d", "SECURITY.md": "8f018f6f98002312e143609b9734aeb971ca5217e146597c06b57b5645031046", "docs/README.md": "b2113e46b366055cab95b77ab5940236bc8c18217144b9a6dbd08264773968c6", "docs/agent-adapters.md": "bf185d3121c94829bb412071a25c4d943302e10a6b2e713111e653b8f8c3ea91", @@ -23,7 +23,7 @@ "docs/handoff-runtime.md": "a236e48392c91eca0f7c3734a6008a991955ae66d16fd71f97691aac5bf0091f", "docs/mcp.md": "48c761666abc09540fdbdb39b6974b0002e5cc89dda774ac6c24376190fa2c7b", "docs/multi-home-list.md": "f8d8e3adf727e4842ea7c4d45e8f6523b11d0513bf2509d4d1204645875e6489", - "docs/paired-devices.md": "03619867241a2db20d0b2281f17fdef2020ba159b7d565a0f5bc32de3152228d", + "docs/paired-devices.md": "1c6cf45187fdbac5a21e43968bc0cc39aee05af19904b4d176f1dd2a70065303", "docs/relay-auth.md": "e6da5291ce6a9da31e79e66ceeff7e9fef7e95046359acbf04d708c96ffab62f", "docs/relay-development-plan.md": "0abf750b36275ea4e467a0020e560277f08689f2d574aed7674133705383b1ff", "docs/relay-edge-policy.md": "c1c7f7a1c4303943c78ca334dab4034f66c0c272e40c007d07c3da2a496155eb", @@ -54,7 +54,7 @@ "docs/releases/v1.2.1.md": "70a3026c2d874a6fd7addcaef840ecfa84bf4f33a0165605217379acffa4fddb", "docs/releases/v1.3.0.md": "a422901b83c85cfb48ac0ad2f99dbc82dca46c4929a3016acd15010e4a18188b", "docs/releases/v1.3.1.md": "1600b3f6e708ded1cd5d0cad7b5f2d78244e0e4b01d122d727f2a692fccaf652", - "docs/releases/v1.3.2.md": "fe97d1feec0c3a5ebe04d3b573d2c9872a95b110b9ed57a2ce4989f376e1b96f", + "docs/releases/v1.3.2.md": "980437303a02644814116b12279d14bf83e6b50c87eab2e0c88e433808f372e3", "docs/validation/69-rc.md": "e490c6a9ad0fec9108b91c74922cedac7ddf214ed405f8f5523da22f48a4b222", "docs/validation/85-antigravity.md": "f89b175191cd98ab03d4029b487065133814b3c8dd8de8cd0a5cc367e2579e4f", "docs/wake.md": "cde135da2ea7be21c815bb265e694f737dbe467d8e76bb82eb118e3b86e29d22", diff --git a/docs/ja/paired-devices.md b/docs/ja/paired-devices.md index bb75cf5..b225b49 100644 --- a/docs/ja/paired-devices.md +++ b/docs/ja/paired-devices.md @@ -122,7 +122,7 @@ WebSocket 切断の `closeSource` はコードの受信・送信方向を区別 ### macOS Directリスナーの確認(#341) -この節はv1.3.1以降の未公開の変更を説明します。`device serve`起動時の`ready:true`はローカルリスナーの設定だけを確認します。今回の変更は`directReadyConfirmed:false`を追加します。以前のレシーバーではフィールドがない場合があります。TCP接続、起動準備、ピアTLS成功は別々の観測です。TLSハンドシェイクは未認証のペアリング初期接続の場合もあるため、それだけでペアリング、ネイティブ対象へのアクセス、ACKを証明しません。既存のペアリング設定の準備確認は認証済みprobe/list要求を使います。 +この節はv1.3.2で公開されたDirectリスナー診断を説明します。`device serve`起動時の`ready:true`はローカルリスナーの設定だけを確認します。今回の変更は`directReadyConfirmed:false`を追加します。以前のレシーバーではフィールドがない場合があります。TCP接続、起動準備、ピアTLS成功は別々の観測です。TLSハンドシェイクは未認証のペアリング初期接続の場合もあるため、それだけでペアリング、ネイティブ対象へのアクセス、ACKを証明しません。既存のペアリング設定の準備確認は認証済みprobe/list要求を使います。 `--diagnostic-events`を指定すると、今回の変更は`direct_transport`ライフサイクル記録を出力します。`phase`はTCPコールバックへの進入時が`accepted`、ハンドシェイクの成功・失敗時が`peer_tls`です。上限のあるレシーバーごとの累積カウンターは`accepted`、`tlsCompleted`、`tlsFailed`です。単調時計で各段階につき60秒に最大1件、合計で1分に最大2件に制限し、TLS成功と失敗は同じ段階の制限を共有します。正常終了時には0件も含む`summary`スナップショットの出力を追加で1件試み、終了処理を繰り返しても再出力しません。これは終了時のスナップショットであり、定期通知や欠落のないイベント履歴ではありません。接続受け入れの拒否、未完了・キャンセルされたハンドシェイク、カウンターの上限により数値は一致しない場合があります。ベストエフォートのDirect記録にエンドポイントアドレス、ピアID、メッセージデータ、例外原文は含めません。記録がないだけで接続が受け付けられなかったとは断定できません。 diff --git a/docs/ja/releases/v1.3.2.md b/docs/ja/releases/v1.3.2.md index 92b2120..5e22333 100644 --- a/docs/ja/releases/v1.3.2.md +++ b/docs/ja/releases/v1.3.2.md @@ -1,5 +1,29 @@ # v1.3.2 メンテナンスリリース + + +## 公開記録 — 2026-10-29確認 + +2026-10-29の読み取り専用の再確認で、[GitHub v1.3.2リリース](https://github.com/abruption/session-peer/releases/tag/v1.3.2)がソース`f5e7c49554ff02771990a151e00b52f2abf3df0a`から正式な変更不能のリリースとして公開されていることを確認しました。公開時刻は2026-10-28T01:52:40Zです。別途確認した[PyPIのバージョン記録](https://pypi.org/pypi/session-peer/1.3.2/json)には、取り下げられていない以下の2ファイルだけがあります。GitHubでの公開だけではPyPIでの提供を証明しません。 + +- wheel: `session_peer-1.3.2-py3-none-any.whl`, アップロード時刻 2026-10-28T01:55:11.612762Z. +- ソース配布物: `session_peer-1.3.2.tar.gz`, アップロード時刻 2026-10-28T01:55:13.659910Z. + +SHA-256: + +```text +196552714b755c2ff755f3de507bd94a17ebd27b1c474ede83fbcc1301c488de session_peer-1.3.2-py3-none-any.whl +e1824b089d2d3e38e03783f5dfc6e2d5ec54fa9758837deb0ebcbbb567837065 session_peer-1.3.2.tar.gz +``` + +この記録が確認するのはパッケージ公開であり、運用の受け入れではありません。Node ControlはPython配布物の外にあり、受信機環境の更新、サービス再起動、別途管理するスキルの更新は、それぞれ承認された別の作業です。この記録でfleet、実際のOAuth、ネイティブエージェントACKの検証範囲は追加されません。 + +以下の準備内容は、日付のある当時の記録のまま保存します。公開前の表現は過去時点の説明であり、現在の提供状況を示しません。既存のタグとリリース資産は変更していません。 + + + +## 準備時点の記録 — 2026-10-28 + 公開済みv1.3.1を基準に2026-10-28に準備しました。Direct機能のソース基準は`dac1c30b1553136b9379be0c6d94eef34ccbad51`で、最終統合リリースコミットではありません。本書は準備範囲を説明します。実際の公開記録は[GitHub Releases](https://github.com/abruption/session-peer/releases)と[PyPI](https://pypi.org/project/session-peer/)で確認してください。 PR #345のゲート修正ソース基準は`a68c6cf16c234cd3fe72926e519e4178c093081a`です。マージ済みPR #347後の統合準備基準は、バージョン準備コミットより前の`ef7748a78e6b466f67074708f5c14decf37f31d7`です。最終公開記録でリリースコミットを別途特定します。 diff --git a/docs/ko/paired-devices.md b/docs/ko/paired-devices.md index f9b5247..3b492f9 100644 --- a/docs/ko/paired-devices.md +++ b/docs/ko/paired-devices.md @@ -122,7 +122,7 @@ WebSocket 종료의 `closeSource`는 코드가 수신됐는지 송신됐는지 ### macOS Direct 리스너 확인(#341) -이 절은 v1.3.1 이후의 미발행 변경을 설명합니다. `device serve` 시작 시의 `ready:true`는 로컬 리스너 구성만 확인합니다. 이번 변경은 `directReadyConfirmed:false`를 추가하며, 이전 수신기는 이 필드를 생략할 수 있습니다. TCP 연결, 시작 준비 상태, 피어 TLS 성공은 각각 별도의 관측입니다. TLS 핸드셰이크는 아직 인증되지 않은 페어링 초기 연결일 수 있으므로, 그 자체로 페어링·네이티브 대상 접근·ACK를 증명하지 않습니다. 기존 페어링 설정의 준비 확인은 인증된 probe/list 요청을 사용합니다. +이 절은 v1.3.2에 공개된 Direct 리스너 진단을 설명합니다. `device serve` 시작 시의 `ready:true`는 로컬 리스너 구성만 확인합니다. 이번 변경은 `directReadyConfirmed:false`를 추가하며, 이전 수신기는 이 필드를 생략할 수 있습니다. TCP 연결, 시작 준비 상태, 피어 TLS 성공은 각각 별도의 관측입니다. TLS 핸드셰이크는 아직 인증되지 않은 페어링 초기 연결일 수 있으므로, 그 자체로 페어링·네이티브 대상 접근·ACK를 증명하지 않습니다. 기존 페어링 설정의 준비 확인은 인증된 probe/list 요청을 사용합니다. `--diagnostic-events`를 사용하면 이번 변경은 `direct_transport` 수명주기 기록을 출력합니다. `phase`는 TCP 콜백 진입 시 `accepted`, 핸드셰이크 성공·실패 시 `peer_tls`입니다. 상한이 있는 수신기별 누적 카운터는 `accepted`, `tlsCompleted`, `tlsFailed`입니다. 단조 시계를 기준으로 단계마다 60초에 최대 한 번, 분당 최대 두 번 기록하며, TLS 성공과 실패는 같은 단계의 제한을 공유합니다. 정상 종료 시에는 0회도 포함한 `summary` 스냅샷의 기록을 한 번 더 시도하며, 종료를 반복해도 다시 출력하지 않습니다. 이는 종료 시점의 스냅샷이며 주기적인 상태 알림이나 손실 없는 이벤트 이력은 아닙니다. 연결 수락 거부, 미완료·취소된 핸드셰이크, 카운터 상한 때문에 수치가 서로 일치하지 않을 수 있습니다. 최선 노력 방식의 Direct 기록에는 엔드포인트 주소·피어 ID·메시지 데이터·예외 원문을 포함하지 않습니다. 기록이 없다는 사실만으로 연결이 수락되지 않았다고 단정할 수 없습니다. diff --git a/docs/ko/releases/v1.3.2.md b/docs/ko/releases/v1.3.2.md index 3e2cf5e..ccdbcf4 100644 --- a/docs/ko/releases/v1.3.2.md +++ b/docs/ko/releases/v1.3.2.md @@ -1,5 +1,29 @@ # v1.3.2 유지보수 릴리스 + + +## 공개 기록 — 2026-10-29 확인 + +2026-10-29 읽기 전용 확인에서 [GitHub v1.3.2 릴리스](https://github.com/abruption/session-peer/releases/tag/v1.3.2)가 소스 `f5e7c49554ff02771990a151e00b52f2abf3df0a`의 정식 불변 릴리스로 공개됐음을 확인했습니다. 공개 시각은 2026-10-28T01:52:40Z입니다. 별도로 확인한 [PyPI 버전 기록](https://pypi.org/pypi/session-peer/1.3.2/json)에는 아래 두 파일만 있으며 둘 다 철회되지 않았습니다. GitHub 공개만으로 PyPI의 패키지 제공 여부가 입증되지는 않습니다. + +- wheel: `session_peer-1.3.2-py3-none-any.whl`, 업로드 시각 2026-10-28T01:55:11.612762Z. +- 소스 배포본: `session_peer-1.3.2.tar.gz`, 업로드 시각 2026-10-28T01:55:13.659910Z. + +SHA-256: + +```text +196552714b755c2ff755f3de507bd94a17ebd27b1c474ede83fbcc1301c488de session_peer-1.3.2-py3-none-any.whl +e1824b089d2d3e38e03783f5dfc6e2d5ec54fa9758837deb0ebcbbb567837065 session_peer-1.3.2.tar.gz +``` + +이 기록은 패키지 공개를 확인하며 운영 수락을 뜻하지 않습니다. Node Control은 Python 배포물 밖에 있으며, 수신기 환경 갱신·서비스 재시작·별도 관리 스킬 갱신은 각각 승인된 별도 작업입니다. 이 기록으로 fleet·실제 OAuth·네이티브 에이전트 ACK 검증 범위가 추가되지는 않습니다. + +아래 준비 내용은 날짜가 명시된 당시 기록 그대로 보존합니다. 공개 전 표현은 과거 시점의 설명이며 현재 제공 여부를 뜻하지 않습니다. 기존 태그와 릴리스 자산은 변경하지 않았습니다. + + + +## 준비 시점 기록 — 2026-10-28 + 공개된 v1.3.1을 기준으로 2026-10-28에 준비했습니다. Direct 기능 소스 기준은 `dac1c30b1553136b9379be0c6d94eef34ccbad51`이며 최종 통합 릴리스 커밋은 아닙니다. 이 문서는 준비 범위를 설명하며, 실제 공개 기록은 [GitHub Releases](https://github.com/abruption/session-peer/releases)와 [PyPI](https://pypi.org/project/session-peer/)에서 확인하십시오. PR #345의 게이트 수정 소스 기준은 `a68c6cf16c234cd3fe72926e519e4178c093081a`입니다. 병합된 PR #347 이후 통합 준비 기준은 버전 준비 커밋 이전의 `ef7748a78e6b466f67074708f5c14decf37f31d7`입니다. 최종 발행 증거에서 릴리스 커밋을 별도로 식별합니다. diff --git a/docs/paired-devices.md b/docs/paired-devices.md index a2006bf..22a0bb1 100644 --- a/docs/paired-devices.md +++ b/docs/paired-devices.md @@ -205,7 +205,7 @@ network path. ### macOS Direct listener checks (#341) -This section describes an unreleased change after v1.3.1. The `device serve` startup `ready:true` confirms local listener setup only. The change adds `directReadyConfirmed:false`; older receivers may omit the field. TCP connect, startup readiness and successful peer TLS are separate observations. A TLS handshake may be the unauthenticated pairing bootstrap, so it does not itself establish pairing, native-target access or ACK. Existing paired setup readiness uses authenticated probe/list requests. +This section describes the Direct listener diagnostics published in v1.3.2. The `device serve` startup `ready:true` confirms local listener setup only. The change adds `directReadyConfirmed:false`; older receivers may omit the field. TCP connect, startup readiness and successful peer TLS are separate observations. A TLS handshake may be the unauthenticated pairing bootstrap, so it does not itself establish pairing, native-target access or ACK. Existing paired setup readiness uses authenticated probe/list requests. With `--diagnostic-events`, the change emits `direct_transport` lifecycle records. The `phase` is `accepted` for entry into the TCP callback or `peer_tls` for handshake success/failure. Bounded per-receiver counters are `accepted`, `tlsCompleted` and `tlsFailed`. Monotonic throttling allows at most one record per phase per 60 seconds: at most two per minute, with TLS successes and failures sharing the same phase limit. Normal closing attempts one additional `summary` snapshot, including zero counts; repeated closure does not emit it again. This is a shutdown snapshot, not a heartbeat or lossless event history. Counts need not balance because of admission refusals, unfinished/cancelled handshakes and saturation. Best-effort Direct records contain no endpoint addresses, peer IDs, message data or exception text. Missing records alone do not prove that no connection was accepted. diff --git a/docs/releases/v1.3.2.md b/docs/releases/v1.3.2.md index f19635e..99ea9d7 100644 --- a/docs/releases/v1.3.2.md +++ b/docs/releases/v1.3.2.md @@ -1,5 +1,29 @@ # v1.3.2 maintenance release + + +## Publication record — verified 2026-10-29 + +Read-only verification on 2026-10-29 confirms the [GitHub v1.3.2 release](https://github.com/abruption/session-peer/releases/tag/v1.3.2) is published, stable and immutable, from source `f5e7c49554ff02771990a151e00b52f2abf3df0a`, with publication time 2026-10-28T01:52:40Z. The separately checked [PyPI version record](https://pypi.org/pypi/session-peer/1.3.2/json) contains exactly the two non-yanked files below. GitHub publication alone does not establish PyPI availability. + +- Wheel: `session_peer-1.3.2-py3-none-any.whl`, uploaded 2026-10-28T01:55:11.612762Z. +- Source distribution: `session_peer-1.3.2.tar.gz`, uploaded 2026-10-28T01:55:13.659910Z. + +SHA-256: + +```text +196552714b755c2ff755f3de507bd94a17ebd27b1c474ede83fbcc1301c488de session_peer-1.3.2-py3-none-any.whl +e1824b089d2d3e38e03783f5dfc6e2d5ec54fa9758837deb0ebcbbb567837065 session_peer-1.3.2.tar.gz +``` + +These records establish package publication, not operational acceptance. Node Control is outside the Python archives; receiver environment updates, service restarts and independently managed skill updates remain separate authorized work. No fleet, live OAuth or native-agent ACK acceptance is added by this record. + +The preparation text below preserves its dated checkpoint unchanged. Its pre-publication wording is historical, not the current availability statement. Existing tags and release assets are unchanged. + + + +## Preparation snapshot — 2026-10-28 + Prepared on 2026-10-28 against published v1.3.1. Direct-feature source base: `dac1c30b1553136b9379be0c6d94eef34ccbad51`; this is not the final integrated release commit. These notes describe the preparation scope; check [GitHub Releases](https://github.com/abruption/session-peer/releases) and [PyPI](https://pypi.org/project/session-peer/) for publication records. Gate-fix source base after PR #345: `a68c6cf16c234cd3fe72926e519e4178c093081a`. Integrated preparation base after merged PR #347: `ef7748a78e6b466f67074708f5c14decf37f31d7`, before the version-preparation commit. Final publication evidence identifies the release commit separately. diff --git a/docs/zh-CN/paired-devices.md b/docs/zh-CN/paired-devices.md index 8d83c14..49657ea 100644 --- a/docs/zh-CN/paired-devices.md +++ b/docs/zh-CN/paired-devices.md @@ -117,7 +117,7 @@ WebSocket 关闭的 `closeSource` 区分代码来自接收还是发送。Relay ### macOS Direct监听检查(#341) -本节说明v1.3.1之后尚未发布的变更。`device serve`启动时的`ready:true`只确认本地监听器已建立。此次变更增加`directReadyConfirmed:false`;旧接收端可能没有该字段。TCP连接、启动就绪和对端TLS成功是不同的观测。TLS握手可能只是尚未认证的配对初始连接,因此本身不能证明配对完成、原生目标访问或ACK。现有配对设置的就绪检查使用已认证的probe/list请求。 +本节说明v1.3.2中已发布的Direct监听器诊断。`device serve`启动时的`ready:true`只确认本地监听器已建立。此次变更增加`directReadyConfirmed:false`;旧接收端可能没有该字段。TCP连接、启动就绪和对端TLS成功是不同的观测。TLS握手可能只是尚未认证的配对初始连接,因此本身不能证明配对完成、原生目标访问或ACK。现有配对设置的就绪检查使用已认证的probe/list请求。 启用`--diagnostic-events`后,此次变更会输出`direct_transport`生命周期记录。`phase`在进入TCP回调时为`accepted`,在握手成功或失败时为`peer_tls`。有上限的每个接收端的累计计数器为`accepted`、`tlsCompleted`和`tlsFailed`。按单调时钟,每阶段每60秒最多输出一条,合计每分钟最多两条;TLS成功和失败共享同一阶段的限制。正常关闭时额外尝试输出一次包含零计数的`summary`快照,重复关闭不会再次输出。这是关闭时的快照,不是定期通知或无损事件历史。连接受理拒绝、未完成或已取消的握手及计数器上限可能使各项数量不相等。尽力而为的Direct记录不包含端点地址、对端ID、消息数据或异常原文。仅凭缺少记录不能断定未接受连接。 diff --git a/docs/zh-CN/releases/v1.3.2.md b/docs/zh-CN/releases/v1.3.2.md index 28a2ce4..52166e4 100644 --- a/docs/zh-CN/releases/v1.3.2.md +++ b/docs/zh-CN/releases/v1.3.2.md @@ -1,5 +1,29 @@ # v1.3.2 维护版本 + + +## 发布记录 — 2026-10-29核验 + +2026-10-29的只读复核确认,[GitHub v1.3.2版本](https://github.com/abruption/session-peer/releases/tag/v1.3.2)已从源码`f5e7c49554ff02771990a151e00b52f2abf3df0a`正式发布且不可变,发布时间为2026-10-28T01:52:40Z。单独核验的[PyPI版本记录](https://pypi.org/pypi/session-peer/1.3.2/json)仅包含以下两个未被撤回的文件。仅凭GitHub发布不能证明PyPI已提供软件包。 + +- wheel: `session_peer-1.3.2-py3-none-any.whl`, 上传时间 2026-10-28T01:55:11.612762Z. +- 源码分发包: `session_peer-1.3.2.tar.gz`, 上传时间 2026-10-28T01:55:13.659910Z. + +SHA-256: + +```text +196552714b755c2ff755f3de507bd94a17ebd27b1c474ede83fbcc1301c488de session_peer-1.3.2-py3-none-any.whl +e1824b089d2d3e38e03783f5dfc6e2d5ec54fa9758837deb0ebcbbb567837065 session_peer-1.3.2.tar.gz +``` + +这些记录确认软件包已发布,并不代表运营验收。Node Control位于Python分发包之外;接收端环境更新、服务重启及独立管理的技能更新,仍是各自需要授权的单独工作。本记录不增加fleet、实际OAuth或原生代理ACK的验收范围。 + +下方准备内容保留为注明日期的原始记录。发布前的措辞描述的是历史时点,并非当前可用状态。既有标签和发布资产保持不变。 + + + +## 准备时点记录 — 2026-10-28 + 于2026-10-28基于已发布的v1.3.1准备。Direct功能源码基准为`dac1c30b1553136b9379be0c6d94eef34ccbad51`,并非最终集成发布提交。本文说明准备范围;实际发布记录请查看[GitHub Releases](https://github.com/abruption/session-peer/releases)和[PyPI](https://pypi.org/project/session-peer/)。 PR #345的门禁修复源码基准为`a68c6cf16c234cd3fe72926e519e4178c093081a`。已合并PR #347后的集成准备基准为版本准备提交前的`ef7748a78e6b466f67074708f5c14decf37f31d7`;最终发布证据会另行标明发布提交。 diff --git a/tests/docs/test_stable_candidate.py b/tests/docs/test_stable_candidate.py index 6640e89..cbfe007 100644 --- a/tests/docs/test_stable_candidate.py +++ b/tests/docs/test_stable_candidate.py @@ -300,10 +300,11 @@ def test_stable_release_keeps_operational_deployment_separate(self): "在2026-10-28的准备检查时,最后确认的已发布稳定版本为**1.3.1**。", "开发候选版本1.2.1尚未发布"), ) - for suffix, source_version, dated_checkpoint, stale_unpublished in profiles: + for suffix, source_version, obsolete_checkpoint, stale_unpublished in profiles: text = (ROOT / ("README" + suffix + ".md")).read_text(encoding="utf-8") self.assertIn(source_version, text) - self.assertIn(dated_checkpoint, text) + self.assertNotIn(obsolete_checkpoint, text) + self.assertIn("releases/v1.3.2.md", text) for stale_version in ("1.2.0", "1.2.1", "1.3.0"): self.assertNotIn(stale_unpublished.replace("1.2.1", stale_version), text) self.assertIn("https://github.com/abruption/session-peer/releases", text) @@ -325,6 +326,54 @@ def test_stable_release_keeps_operational_deployment_separate(self): self.assertIn("Package publication does not include operational deployment", (ROOT / "docs/releases/v1.0.4.md").read_text(encoding="utf-8")) + def test_v132_publication_record_distinguishes_released_files_from_preparation(self): + source = "f5e7c49554ff02771990a151e00b52f2abf3df0a" + historical_base = "ef7748a78e6b466f67074708f5c14decf37f31d7" + facts = (source, "2026-10-29", "2026-10-28T01:52:40Z", + "2026-10-28T01:55:11.612762Z", "2026-10-28T01:55:13.659910Z", + "https://github.com/abruption/session-peer/releases/tag/v1.3.2", + "https://pypi.org/pypi/session-peer/1.3.2/json") + hashes = ("196552714b755c2ff755f3de507bd94a17ebd27b1c474ede83fbcc1301c488de", + "e1824b089d2d3e38e03783f5dfc6e2d5ec54fa9758837deb0ebcbbb567837065") + direct_status = { + "": ("Direct listener diagnostics published in v1.3.2", "unreleased change after v1.3.1"), + "ko/": ("v1.3.2에 공개된 Direct 리스너 진단", "v1.3.1 이후의 미발행 변경"), + "ja/": ("v1.3.2で公開されたDirectリスナー診断", "v1.3.1以降の未公開の変更"), + "zh-CN/": ("v1.3.2中已发布的Direct监听器诊断", "v1.3.1之后尚未发布的变更"), + } + for locale, suffix in (("", ""), ("ko/", ".ko"), ("ja/", ".ja"), ("zh-CN/", ".zh-CN")): + with self.subTest(locale=locale): + notes = (ROOT / ("docs/" + locale + "releases/v1.3.2.md")).read_text(encoding="utf-8") + publication, preparation = notes.split('', 1) + self.assertIn('', publication) + for fact in facts + hashes: + self.assertIn(fact, publication) + for filename in ("session_peer-1.3.2-py3-none-any.whl", "session_peer-1.3.2.tar.gz"): + self.assertIn(filename, publication) + self.assertNotIn(historical_base, publication) + self.assertIn(historical_base, preparation) + self.assertIn("2026-10-28", preparation) + if not locale: + self.assertIn("against published v1.3.1", preparation) + runbook = (ROOT / ("RELEASING" + suffix + ".md")).read_text(encoding="utf-8") + self.assertIn('', runbook) + record = runbook.split('', 1)[0] + for fact in facts: + self.assertIn(fact, record) + self.assertIn("#v132-publication-record", record) + self.assertIn("prepare-release.yml", runbook) + self.assertIn("publish.yml", runbook) + paired = (ROOT / ("docs/" + locale + "paired-devices.md")).read_text(encoding="utf-8") + published, obsolete = direct_status[locale] + self.assertIn(published, paired) + self.assertNotIn(obsolete, paired) + english = (ROOT / "RELEASING.md").read_text(encoding="utf-8") + checklist = english.split('', 1)[1].split("## v1.3.2 preparation", 1)[0] + for instruction in ("independently verify the PyPI", "dated publication record", + "all four README editions", "normal documentation PR", + "Do not announce publication in advance", "published tags/assets"): + self.assertIn(instruction, checklist) + def test_historical_security_notes_keep_validation_and_limits_visible(self): for locale in ("", "ko/", "ja/", "zh-CN/"): text = (ROOT / ("docs/" + locale + "releases/v1.0.3.md")).read_text(encoding="utf-8")