GitHub Actionsのワークフローにおいて、チェックアウトアクションのバージョンを指定し、fetch-depthを0に設定。これに… - #5
Merged
Conversation
ayutaz
added a commit
that referenced
this pull request
Jul 13, 2025
- Mark Phase 1.1 tasks as completed - Update Core API test details (74 tests implemented) - Add next tasks section for Phase 1.2 - Update progress tracking with PR #5 completion 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
ayutaz
added a commit
that referenced
this pull request
Mar 18, 2026
- Fix all_passed never set to False when validation marginal (#1) - Remove unused cast_output_map, use unique name generator to avoid name collisions in ONNX graph (#2, #3) - Use temporary file + atomic replace for in-place FP16 conversion to prevent data corruption on interruption (#4) - Specify CPUExecutionProvider explicitly in test sessions (#5) - Add lid input support to validate_model dummy inputs
ayutaz
added a commit
that referenced
this pull request
Mar 18, 2026
- Fix all_passed never set to False when validation marginal (#1) - Remove unused cast_output_map, use unique name generator to avoid name collisions in ONNX graph (#2, #3) - Use temporary file + atomic replace for in-place FP16 conversion to prevent data corruption on interruption (#4) - Specify CPUExecutionProvider explicitly in test sessions (#5) - Add lid input support to validate_model dummy inputs
ayutaz
added a commit
that referenced
this pull request
Mar 18, 2026
* feat: ONNXエクスポートFP16デフォルト化 + FP16変換ツール + 既存モデル変換 - export_onnxでFP16変換をデフォルト適用(--no-fp16で無効化可能) - スタンドアロンFP16変換ツール piper_train.tools.convert_fp16 を追加 - 既存ONNXモデル6ファイルをFP16変換し合計約128MB削減 * docs: FP16デフォルト化に伴うドキュメント更新 CHANGELOG, CLAUDE.md, README, README_training_japanese に --no-fp16 フラグとFP16デフォルト出力の説明を追加 * fix: address Copilot review comments on FP16 conversion - Fix all_passed never set to False when validation marginal (#1) - Remove unused cast_output_map, use unique name generator to avoid name collisions in ONNX graph (#2, #3) - Use temporary file + atomic replace for in-place FP16 conversion to prevent data corruption on interruption (#4) - Specify CPUExecutionProvider explicitly in test sessions (#5) - Add lid input support to validate_model dummy inputs * fix: CI lint and test collection errors - Fix I001 import sorting in convert_fp16.py and test file - Add strict=True to zip() call (B905) - Add check=False to subprocess.run() calls (PLW1510) - Guard `import onnx` with pytest.importorskip to prevent collection error in CI where onnx is not installed * fix: add onnx to dependencies for FP16 conversion tool * style: fix ruff format on export_onnx.py * feat: replace CSS10 test model with FP16 version (75MB -> 38MB)
ayutaz
added a commit
that referenced
this pull request
Apr 2, 2026
#1 Go モジュールパスを piper-plus-g2p/phonemize → piper-plus/src/go/phonemize に修正 #2 Python publish にタグ vs pyproject.toml バージョン整合チェック追加 #3 Go ゴールデンテスト追加 (phoneme_test_cases.json 共有フィクスチャ) #4 JS ゴールデンテストを g2p-wasm-ci.yml に追加 #5 Python テストマトリクスを 3.11/3.12/3.13 に拡充 #6 Rust Cargo.toml に keywords/categories/documentation/readme 追加 #7 Rust MSRV 1.88 テスト追加 #8 Rust feature flag 組み合わせテスト追加 (no-default, english, japanese) #9 Go publish ワークフローに golangci-lint 追加 #10 Python 個別 extras (ja/en/zh) インストールテスト追加
ayutaz
added a commit
that referenced
this pull request
Apr 3, 2026
* docs: G2P 独立パッケージ化の調査レポートと要求定義を追加
eSpeak-ng 非依存の多言語 G2P を独立パッケージとして切り出す構想の
調査と要求定義をまとめた。
- g2p-standalone-package.md: 需要分析、競合状況、アーキテクチャ現状分析、
依存ライセンス分析、推奨ロードマップ
- g2p-package-requirements.md: 4プラットフォーム (Python/Rust/C#/JS-WASM) の
機能要求・非機能要求、共通要求、統合・マイグレーション要求、リリース戦略
* docs: G2P 独立パッケージ化の技術調査レポートを追加
10エージェントによる並行技術調査の結果をまとめた。
- PUA差分: HEAD では全プラットフォーム 87 エントリで一致確認
- Python: phonemize は piper_train への依存ゼロ、完全独立可能
- Rust: PhonemeIdMap/PiperError の再定義 + phoneme_converter 2分割
- C#: ONNX依存なし、TypeForward で互換維持、22ファイル移動
- JS/WASM: onnxruntime-web 依存なし、OpenJTalk DI化が主要作業
- テストフィクスチャ: 6言語x3文 + 混在テストの JSON スキーマ設計
- CI/CD: 4ワークフロー設計 (uv/cargo/dotnet/node)、既存CIと共存
* docs: C# G2P を対象外に変更 (DotNetG2P が既に独立パッケージとして存在)
DotNetG2P (NuGet) が既にスタンドアロン G2P ライブラリとして
公開済みのため、PiperPlus.Phonemize の新規作成は不要。
- Phase 2 (C# NuGet) を対象外に変更
- 旧 Phase 3 (JS/WASM) を Phase 2 に繰り上げ
- 合計工数を 7-10 週 → 5-7 週に更新
- 要求定義・調査レポート・技術調査の C# セクションに対象外注記を追加
* docs: G2P 要件定義を全面再構成 (技術調査・レビュー結果を統合)
4エージェントチームで要件定義を精査・統合・重複排除した。
主な変更:
- Python: FR-P 14→5件、NFR-P 6→4件に統合
- Rust: FR-R 10→6件、NFR-R 7→5件に統合
- JS/WASM: FR-W 7→5件、NFR-W 7→4件に統合 (Phase 2)
- 共通: FR-G 10→7件、NFR-G 5→4件、FR-I 6→5件に統合
- C# は DotNetG2P が独立パッケージのため対象外
- 技術調査の結果を全要求に反映 (PUA一致、依存分析、CI設計等)
- Python コマンドを uv ベースに統一
- セクション13に旧→新 ID トレーサビリティマップを追加
* docs: G2P 要件定義 v2 — IPA-first + エンコード分離で全面再設計
10人レビュー (CTO/TTS エンジニア/G2P 専門家/日本語・英語・中韓・
ロマンス言語専門家/QA/PM/Rust 専門家) の合意に基づき再設計。
設計方針の変更:
- IPA-first: phonemize() は PUA 変換なしの IPA トークン列を返す
- エンコード分離: PiperEncoder が PUA/ID変換/BOS-EOS を担当
- Phonemizer ABC は phonemize() と phonemize_with_prosody() の 2 メソッドのみ
Phase 再構成:
- Phase 0: Python のみ JA+EN (1週間MVP)
- Phase 1: 残り5言語 + Multilingual + カスタム辞書
- Phase 2: Rust (PyPI月1000DL後)
- Phase 3: JS/WASM (需要に応じて)
レビュー指摘の反映:
- 各言語の既知制限を明文化 (ZH再帰サンドヒ/FRリエゾン/KOフォールバック等)
- カスタム辞書の入力バリデーション追加
- Rust default features 軽量化 (naist-jdic opt-in)
- MAJOR同期廃止、PUA compat バージョンで管理
- 要求数 45→32 に削減
* docs: G2P 独立パッケージのマイルストーン計画を追加
Phase 0 (MVP, 1週) → Phase 1 (全言語, 1-2週) → Phase 2 (Rust, 需要検証後) →
Phase 3 (JS/WASM, 需要に応じて) の段階的ロードマップ。
各 Phase にバージョン (v0.0.1/v0.1.0/v0.2.0/v1.0.0) ごとの具体的タスク・
完了条件・対応要求 ID を定義。需要検証基準 (月間DL数) と
PUA compat バージョニング戦略を含む。
* docs: 全38チケット作成 + マイルストーン相互紐づけ
Phase 0 (9), Phase 1 (11), Phase 2 (10), Phase 3 (8) の個別チケットを
docs/tickets/ に作成。各チケットに目的・実装詳細・エージェントチーム構成・
テスト計画・懸念事項・再設計考察・後続連絡事項を記載。
マイルストーン文書の全テーブルにチケットリンク列を追加し双方向参照を実現。
* feat: piper-g2p Python パッケージ Phase 0 MVP 実装 (P0-002〜P0-009)
JA + EN の IPA-first G2P パッケージを新規作成。
BOS/EOS/PUA エンコードを分離した IPA トークン列を返す設計。
- P0-002: パッケージ構造 (pyproject.toml, hatchling)
- P0-003: Phonemizer ABC + ProsodyInfo + Registry
- P0-004: JapanesePhonemizer (BOS/EOS なし、N 変異 4 種、疑問マーカー 4 種)
- P0-005: EnglishPhonemizer (g2p-en ベース、機能語ストレス除去)
- P0-006: PiperEncoder (PUA 87 エントリ、BOS/EOS/padding 挿入)
- P0-007: piper_train 互換性検証テスト
- P0-008: テストスイート 45 テスト
- P0-009: GitHub Actions CI ワークフロー (3 OS x 2 Python)
* feat: piper-g2p Phase 1 全言語展開 (P1-001〜P1-011)
7言語対応 + MultilingualPhonemizer + カスタム辞書を追加。v0.1.0。
- P1-001: ChinesePhonemizer (pypinyin ベース、声調マーカー)
- P1-002: KoreanPhonemizer (g2pk2 ベース)
- P1-003: SpanishPhonemizer (ルールベース、seseo/yeismo)
- P1-004: FrenchPhonemizer (ルールベース、鼻母音)
- P1-005: PortuguesePhonemizer (ルールベース)
- P1-006: MultilingualPhonemizer + UnicodeLanguageDetector
- 複合言語コード ("ja-en-zh") で自動生成
- CJK 曖昧性解消 (かな有無で JA/ZH 判定)
- キャノニカルキーでキャッシュ
- P1-007: CustomDictionary (JSON v1.0/v2.0)
- P1-008: pyproject.toml extras (zh, ko, es, fr, pt, all)
- P1-010: テスト 87 テスト (4 skipped: g2pk2 未インストール)
- P1-011: v0.1.0 バージョン更新
* refactor: 10人レビュー指摘事項の全面対応 (15エージェント並列実装)
## アーキテクチャ改善
- R-01: Registry をクラス化 (PhonemizerRegistry) + テーブル駆動 auto_register + entry_points プラグイン対応
- R-02: Phonemizer ABC に入力サニタイズ (_sanitize_input) + phonemize() デフォルト実装 + ProsodyInfo frozen=True
- R-03: PUA マッピングを pua.json 正典ファイルに外出し (Python/Rust/JS 共通)
- R-04: encode_with_prosody 返り値を dict → ProsodyInfo に統一
## 言語品質改善
- R-05: JA N ルールを O(n) 化 + 正規表現 4→2 統合
- R-06: EN _get_g2p() 例外を ImportError のみに絞込
- R-07: ZH 3連続三声サンドヒー対応
- R-08: FR 基本リエゾン/エリジョン対応 (50+ liaison words)
- R-09: ES dict ルックアップ化 + ES/PT 既知制限ドキュメント
## セキュリティ
- R-10: CustomDict にファイルサイズ上限 (10MB) + パストラバーサル警告 + JSON エラーハンドリング
## テスト (170 テスト, +83)
- R-11: エッジケーステスト (空文字列, 絵文字, 超長テキスト, 制御文字)
- R-12: スナップショットテスト (6言語固定期待値) + session-scoped fixture
## ドキュメント・CI
- R-13: README 全面改善 (競合比較表, 差別化メッセージ)
- R-14: CONTRIBUTING.md (新言語追加 5 ステップ) + CHANGELOG.md
- R-15: CI に Trusted Publisher 準備 + 依存バージョン上限ピン + entry_points 設定
* feat: piper-g2p Rust crate Phase 2 実装 (P2-001〜P2-007)
piper-core から G2P ロジックを独立クレートとして分離。
- P2-001: piper-g2p crate 構造作成 (workspace 統合)
- P2-002: G2pError (7 variants) + PhonemeIdMap type alias
- P2-003: Phonemizer trait (IPA-first, encode 分離)
- P2-004: 7 言語 + multilingual + token_map + custom_dict + encode を移動
- P2-007: piper-core re-export (後方互換, feature flag 連動)
テスト: piper-g2p 319 passed, piper-core 785 passed
* refactor: Phase 2 レビュー指摘事項の全面対応 (15エージェント並列実装)
10人専門家レビュー (CTO/Rust/Python/Security/DevOps/API/DX/Perf/PM/QA) で
発見された Critical 6件 + Major 14件 + Minor 12件を15エージェントで並列修正。
主な修正:
- 入力検証統一: base.py phonemize() で _sanitize_input() 自動呼出
- エラー型変換: impl From<G2pError> for PiperError (全7バリアント)
- CI改善: Rust check ジョブ + Python 3.12 + crate publish WF
- テスト拡充: encoder prosody 13件 + 多言語混在 10件 = +23テスト
- セキュリティ: custom_dict logging化, Rust 10MB制限, スレッドセーフ化
- パフォーマンス: id_maps lru_cache, multilingual ord()最適化
- ドキュメント: Rust doc comments, CHANGELOG 構造化, pyproject.toml URL修正
テスト結果: Python 188 passed / Rust 321+785 passed / 0 failures
* feat: @piper-plus/g2p JS/WASM パッケージ Phase 3 実装 (P3-001〜P3-011)
SimpleUnifiedPhonemizer から G2P 機能を分離し、@piper-plus/g2p として
独立利用可能な npm パッケージを新規作成。onnxruntime-web 依存ゼロ。
実装内容:
- G2P 統合クラス: create/phonemize/phonemizeWithProsody/encode/dispose
- 6言語 G2P: JA (OpenJTalk WASM DI), EN (辞書+ルール), ZH/ES/FR/PT
- DictLoader: IndexedDB キャッシュ + SHA-256 検証 + 進捗コールバック
- Encoder: BOS/PAD/EOS 挿入 + PUA マッピング (87エントリ)
- UnicodeLanguageDetector: 言語自動検出 + segmentText()
- CustomDictionary: JSON v1.0/v2.0 対応
- TypeScript 型定義 (750行)
- CI ワークフロー (3 OS x Node 18/20/22 + サイズ検証 + npm publish)
- 既存 piper-plus パッケージとの後方互換維持
テスト結果: JS/WASM 174 passed / Python 188 passed / Rust 1,321 passed
* refactor: 最終レビュー指摘事項の全面対応 (15エージェント並列実装)
10人専門家最終レビューで発見された Critical 2件 + Major 7件 + Minor 6件を
15エージェントで並列修正。
主な修正:
- Python 全8サブクラスに language_code property 追加 (Rust/JS と統一)
- PyPI OIDC Trusted Publisher 移行 (PYPI_TOKEN 依存排除)
- Rust multilingual.rs 実装確認 (849行、36テスト — 既に完備)
- registry.py: 言語スキップ時の INFO ログ追加
- JS types/index.d.ts: DictLoader.destroy() + @throws + applyToText()
- JS encode.js: PUA マッピング事前インデックス化で二重検索排除
- Rust CI: Cargo.toml/tag バージョン検証追加
- Python multilingual.py: has_kana() キャッシュで重複走査排除
- テストフィクスチャ拡充: PUA 5→15件、detect 5→10件、test_cases 13→20件
- クロスプラットフォーム一貫性テスト 24件 + language_code テスト 7件追加
- WASM CI npm キャッシュ追加
- lib.rs doctest ignore→no_run (コンパイル検証有効化)
- README 改善: Python 複合コード、JS DictLoader.destroy()
テスト結果: Python 218 passed / JS 192 passed / Rust 1,321 passed / 0 failures
* fix: Copilot PR レビュー 15件の指摘対応
- pyproject.toml: license を PEP 621 準拠テーブル形式に修正
- encoder.py: 未知トークンの warning ログ追加(サイレントドロップ排除)
- japanese.py: phonemize() で _sanitize_input() を呼出
- pua.py: importlib.resources 使用 + encoding="utf-8"
- registry.py: ImportError → ModuleNotFoundError に限定、内部バグは WARNING
- テスト7ファイル: 未使用 import pytest 削除 (F401)
- test_edge_cases.py: 未使用 available_languages 削除
- test_registry.py: 未使用 ProsodyInfo 削除
- README.md: 出力例をスナップショットテストと整合
* chore: 完了済みチケットドキュメント削除 + 設計ドキュメント更新
Phase 0-3 全実装完了に伴い、作業指示書としてのチケットファイル39件を削除。
実装はコードとコミット履歴に記録済み。
削除: docs/tickets/ (39ファイル)
- phase-0/P0-001〜009, phase-1/P1-001〜011
- phase-2/P2-001〜010, phase-3/P3-001〜008
更新: 設計ドキュメントに完了ステータス追記 (ADR として保持)
- docs/design/g2p-standalone-package.md
- docs/design/g2p-package-requirements.md
* chore: 完了済み G2P 設計ドキュメント4件を削除
* docs: multilingual-testing.md で7言語G2Pと6言語モデルの違いを明確化
* feat(sv): piper-g2p 全3プラットフォームにスウェーデン語 G2P 追加
Go/C#/piper-core に既存の SV 実装を piper-g2p 独立パッケージに移植。
PUA マッピング 87→96 エントリに拡張(SV 長母音 9 エントリ追加)。
Python (piper-g2p PyPI):
- swedish.py: SwedishPhonemizer (ルールベース、外部依存なし)
- 長母音/短母音、軟k/g、レトロフレックス、ストレス検出
- pua.json に SV 9 エントリ追加
- テスト 88 件追加 (306 passed)
Rust (piper-g2p crates.io):
- swedish.rs: Phonemizer trait 実装
- feature flag swedish を default + all-languages に追加
- token_map.rs に SV PUA 9 エントリ追加
- テスト 30 件追加 (285 passed)
JS/WASM (@piper-plus/g2p npm):
- sv/index.js: SwedishG2P クラス
- detect.js に SV 検出 (å/ä/ö)
- pua-map.js に SV 9 エントリ追加
- subpath export ./sv 追加
- テスト 55 件追加 (247 passed)
* feat(g2p): 15エージェントレビュー全指摘事項の対応
P0: Rust CI追加、3PFのEncoder strictモード、PUA compat versionチェック
P1: クロスPF整合性CI、デフォルトIDマップ、segment_text API、README改善、JA整合性テスト強化
P2: ベンチマークスイート、piper-plus npm→@piper-plus/g2p統合
P3: Rust FFI層、Third-partyライセンス文書
* fix(ci): Cross-Platform CI のテスト失敗を修正
- test_all_languages_covered: SV追加で言語数 7→8 に更新
- NLTK averaged_perceptron_tagger_eng ダウンロードステップ追加
* fix: CI 全失敗を修正 (ruff lint, cargo fmt/clippy, WASM test glob, NLTK data)
- ruff: SIM102/E501/SIM108/B904 全31件修正
- cargo fmt: 全ファイルフォーマット適用
- clippy: derive Default, redundant guard 修正
- WASM CI: node --test glob パターン修正
- Python CI: NLTK averaged_perceptron_tagger_eng DL ステップ追加
* style: ruff format 適用 (25ファイル)
* chore(ci): dev ブランチの規約に合わせて CI ワークフローを統一
- actions/checkout v4→v6, upload-artifact v4→v7
- Python テストマトリクス 3.11/3.12/3.13→3.13 のみ (9→3 ジョブ)
- Node.js テストマトリクス 18/20/22→20 のみ (9→3 ジョブ)
- Rust ubuntu-latest→ubuntu-24.04
* fix(ci): WASM glob展開 + Korean skip判定を修正
- WASM CI: シングルクォートglobがmacOS/Windowsで展開されないため明示的ファイルリストに変更
- Python CI: g2pk2のmecabバックエンド不在をskip判定で検出するよう改善
* fix(ci): Windows での UTF-8 フィクスチャ読み込みエラーを修正
test_cross_platform.py の open() に encoding="utf-8" を追加。
Windows のデフォルトエンコーディング (cp1252) で日本語を含む
JSON フィクスチャが読めない問題を解消。
* fix: mypy 型エラー修正 (encoder.py prosody_features リスト型)
* feat(ko): JS/WASM 韓国語 G2P 追加 + 全プラットフォーム 8言語対応完了
- src/wasm/g2p/src/ko/index.js: KoreanG2P クラス新規作成
(Hangul分解、IPA変換、連音法則、PUA対応、65テスト)
- Python id_maps.py: 韓国語・スウェーデン語 phoneme ID map 追加
- 全3プラットフォーム (Python/Rust/JS) のドキュメント・CI を8言語に更新
- テストフィクスチャに韓国語4件追加、検出テストにko/sv 14件追加
* test(ko/sv): 全プラットフォームのテストカバレッジ大幅拡充
Python:
- test_korean.py: 6→66テスト (API/エッジケース/音韻規則/Prosody/PUA検証)
- test_cross_platform.py: TestSVPhonemeFixtures 追加 (SV フィクスチャ検証)
- test_e2e.py: ko/sv E2E エンコーディングパイプラインテスト追加
- test_custom_dict.py: ko/sv カスタム辞書統合テスト追加
Rust:
- ffi.rs: FFI テスト7件追加 (ko/sv create/phonemize/available_languages)
- test_ko_sv_integration.rs: 統合テスト22件新規
(エンコーディング、PUA検証、カスタム辞書、マルチリンガル)
JS/WASM:
- test-korean.js: 65→91テスト (母音7件/複合終声10件/NFD 3件/エラー6件)
- test-swedish.js: 55→67テスト (languageCode/token形式/エラー処理)
- test-g2p.js: ko/sv factory + detectLanguage テスト7件追加
- test-encode.js: ko/sv エンコーディングテスト14件追加
- test-custom-dict.js: ko/sv カスタム辞書テスト9件追加
CI:
- g2p-cross-platform-ci.yml: JS ko/sv テスト実行 + PUA クロスプラットフォーム検証
* fix(ci): G2P WASM/Python CI 失敗修正
- g2p-wasm-ci.yml: 存在しない test/test-e2e.js をテストリストから除去
- __init__.py: PiperEncoder を __all__ に追加 (F401 unused import)
- test_korean.py: import後の空行を1行に修正 (I001 isort)
* fix(lint): ruff UP038 + format 修正
- test_korean.py: isinstance(x, (int, float)) → isinstance(x, int | float)
- test_e2e.py: ruff format 適用 (リスト要素の改行)
* style(rust): cargo fmt 適用 (ffi.rs, test_ko_sv_integration.rs)
* fix(g2p): mypy 型エラー9件修正
- korean.py: g2pk2 の Any 戻り値を str() でラップ
- english.py: phonemize_with_prosody 戻り型を ProsodyInfo | None に統一
- custom_dict.py: dict 型アノテーション・int() キャスト・str() キャスト追加
* docs: G2P 統一マイルストーン + 全30チケット作成
piper-plus 本体の重複 phonemizer を standalone piper-g2p に統一する
移行計画を策定。5マイルストーン・30チケットで構成。
- M0: piper-g2p API ギャップ修正 (4チケット)
- M1: Python 移行 — piper_train → piper_g2p (8チケット)
- M2: Rust 移行 — piper-core → piper-g2p crate (8チケット)
- M3: JS/WASM 移行 — SimpleUnifiedPhonemizer → @piper-plus/g2p (6チケット)
- M4: 検証・クリーンアップ (4チケット)
完了時に42ファイル (~8,800行) の重複コード削除を見込む。
* feat(g2p): M0 API ギャップ修正 + M1-6 dead code 削除
M0-1: _get_question_type() が非疑問文で "$" を返すように修正
M0-2: JapanesePhonemizer に custom_dict パラメータ追加
M0-3: 互換テスト 8件追加 (ZH/ES/FR/PT/SV/multilingual ID map/JA prosody)
M0-4: Rust PiperEncoder に動的 EOS トークン対応
- encode_with_eos() / encode_with_prosody_and_eos() 追加
- 既存メソッドは新メソッドに委譲 (コード重複なし)
M1-6: 未使用の inference_utils.py 削除 (190行、存在しないモジュール参照)
* feat(g2p): M1-1 依存追加 + M1-2 drop-in import 置換 + チケット状態更新
M1-1: piper-g2p を piper_train の依存に追加
- pyproject.toml: dependencies に piper-g2p, train extras に piper-g2p[all]
- root pyproject.toml: uv workspace に src/python/g2p 追加
M1-2: 4ファイルの import を piper_train.phonemize → piper_g2p に置換
- infer_onnx.py: UnicodeLanguageDetector, get_phonemizer
- vits/lightning.py: get_phonemizer
- update_model_config.py: FIXED_PUA_MAPPING, TOKEN2CHAR
チケット状態: M0 全4件 + M1-6 を完了に更新
* refactor(g2p): M1-3 ID マップ API 統一 + M1-5 tools/ 移行
M1-3: 言語別 ID マップ関数を piper_g2p.encode.id_maps.get_phoneme_id_map() に統一
- preprocess.py: get_japanese_id_map/get_bilingual_id_map/get_multilingual_id_map 置換
- tools/prepare_bilingual_dataset.py, add_prosody_features.py, prepare_multilingual_dataset.py
M1-5: tools/ の phonemize import を piper_g2p に移行
- BilingualPhonemizer → MultilingualPhonemizer(["ja", "en"])
- phonemize_japanese_with_prosody() → JapanesePhonemizer().phonemize_with_prosody()
- phonemize_from_pinyin_syllables → piper_g2p.chinese から import
- PUA マッピング追加 (piper_g2p は clean トークンを返すため)
* refactor(g2p): M1-4 preprocess.py 音素化パイプラインを piper_g2p に移行
全ての piper_train.phonemize import を piper_g2p に置換:
- JA モノリンガル: JapanesePhonemizer + BOS 手動追加 + PUA マッピング
- マルチリンガル: MultilingualPhonemizer + PiperEncoder で BOS/EOS/padding
- バイリンガル: BilingualPhonemizer → MultilingualPhonemizer(["ja", "en"])
- CustomDictionary → piper_g2p.custom_dict
- post_process_ids() → PiperEncoder.encode_with_prosody()
piper_train.phonemize の残存 import: 0件
* refactor(g2p): M1-4 残存 import 修正 + M1-7 旧 phonemize ディレクトリ削除
infer_onnx.py: _refine_latin_segments_for_swedish の dead code を削除
(piper_g2p の UnicodeLanguageDetector では到達しないコードパス)
piper_train/phonemize/ ディレクトリ全削除 (24ファイル):
- 8言語 phonemizer (japanese, english, chinese, korean, spanish, portuguese, french, swedish)
- 9 ID マップ (jp, zh, ko, es, pt, fr, sv, bilingual, multilingual)
- 基盤 (base, registry, token_mapper, custom_dict, bilingual, multilingual)
- accent_processor (未実装モジュール)
全ての phonemize 機能は piper_g2p パッケージに移行済み。
* feat(g2p): M1-8 テスト・CI 移行 + M2-1/M2-2/M2-3 Rust adapter 導入
M1-8: 20+テストファイルの import を piper_g2p に移行
- python-tests.yml: piper-g2p[all] をインストールに追加
- test_compat.py: piper_train 比較テスト → standalone 正当性テストに再構成
- 14テストファイルの piper_train.phonemize import を piper_g2p に置換
- infer_onnx.py: PiperEncoder 経由の phoneme_ids 生成に統一
- 400テスト PASS (新規失敗ゼロ)
M2-1: piper-core Cargo.toml で piper-g2p features=["all-languages"] に変更
M2-2: G2pAdapter 作成 (piper_g2p::Phonemizer → piper_core::Phonemizer ブリッジ)
- get_phoneme_id_map: 全言語 None (config.json 使用)
- post_process_ids: JA は no-op、他言語は default_post_process_ids
M2-3: voice.rs ファクトリを piper-g2p コンストラクタ + G2pAdapter に書き換え
- 8言語すべて piper-g2p 経由に移行、PassthroughPhonemizer フォールバック維持
- cargo check PASS
* refactor(g2p): M2-4 phoneme_converter.rs 削除、piper_g2p::encode に統合
piper-core/phonemize/phoneme_converter.rs の tokens_to_ids() と
prosody_to_features() は piper_g2p::encode に同一実装が存在するため削除。
build_synthesis_request() は voice.rs でインラインに構築済みのため不使用。
* refactor(g2p): M2-5 MultilingualPhonemizer を piper-g2p に統合
piper-core/phonemize/multilingual.rs (~1000行) を削除し、
piper_g2p::multilingual を re-export に切り替え。
- adapter.rs: default_post_process_ids の import を
super::multilingual → piper_g2p::multilingual に変更
- voice.rs: create_language_phonemizer を
create_language_g2p_phonemizer (→ Box<dyn piper_g2p::Phonemizer>) に変更し
MultilingualPhonemizer を G2pAdapter でラップ
- mod.rs: pub mod multilingual → pub use piper_g2p::multilingual に変更
* refactor(g2p): M2-6 custom_dict.rs 削除、piper_g2p::custom_dict に統合
piper-core/phonemize/custom_dict.rs は piper_g2p::custom_dict と
ほぼ同一実装 (差異は 10MB ファイルサイズ上限のみ)。
- mod.rs: pub mod custom_dict → pub use piper_g2p::custom_dict に変更
- japanese.rs: super::custom_dict → piper_g2p::custom_dict に import 変更
- CLI/テストの piper_plus::phonemize::custom_dict パスは re-export で維持
* chore(rust): M2-7 旧 phonemize ファイル削除 (swedish.rs, token_map.rs)
piper-g2p に同等機能があるため削除。mod.rs の re-export は M2-5 で対応済み。
* test(rust): M2-8 テスト・CI 対応 (phoneme_converter, voice_api)
piper_g2p::encode を直接使用するようテストを更新。
エラー型を G2pError に対応。
* feat(wasm): M3-1~M3-5 PiperPlus を @piper-plus/g2p に統一
M3-1: G2P.create() で PiperPlus 初期化を切り替え
M3-2: _textToPhonemeIds() を G2P.encode() に統一 (prosodyFlat→nested変換)
M3-3: _extractProsodyFromLabels()/_phonemesToIds() を削除
M3-5: SimpleUnifiedPhonemizer 等の旧実装 5ファイルを削除
phonemizer-compat.js shim を追加 (後方互換)
SimpleUnifiedPhonemizer を型定義から削除
* test(wasm): M3-4 テスト更新 (11ファイル → @piper-plus/g2p モック対応)
G2P モックを SimpleUnifiedPhonemizer から @piper-plus/g2p の G2P API に移行。
* ci: M3-6 CI 対応 + M3 完了マーク
ci.yml/npm-publish.yml に npm install ステップ追加。
tickets/README.md の M3-1〜M3-6 を完了に更新。
* test: M4-1/M4-2 クロスプラットフォームゴールデンテスト + 音声回帰テスト
M4-1: tests/fixtures/g2p/phoneme_test_cases.json を使った Rust/JS ゴールデンテスト追加
- src/rust/piper-core/tests/test_g2p_golden.rs (6言語 + JA optional)
- src/wasm/openjtalk-web/test/js/test-g2p-golden.js (5言語、JA skip)
- src/wasm/g2p/src/ja/index.js: extractPhonemesFromLabels を re-export
- src/wasm/openjtalk-web/src/api.js: @piper-plus/g2p/ja からインポートに修正
M4-2: tests/fixtures/g2p/audio-regression-baseline.json + JS 回帰テスト追加
- post-migration ベースライン (ES/FR/PT/SV/KO 5言語)
- src/wasm/openjtalk-web/test/js/test-audio-regression.js
また test-piper-plus-init-success.js の残存 SimpleUnifiedPhonemizer 参照を削除。
* docs: M4-3/M4-4 CLAUDE.md + tickets/README.md 更新
M4-3: CLAUDE.md を G2P 移行完了後の状態に更新
- 多言語 Phonemizer セクションの実装パスを piper_g2p パッケージに変更
- Python/Rust/JS ファイルパステーブルの旧パスを削除・新パス追記
- SimpleUnifiedPhonemizer → @piper-plus/g2p に更新
M4-4: tickets/README.md で全30チケット (M0〜M4) の完了を記録
削除実績: 36 ファイル、~13,700 行 (目標 42 ファイル / ~8,700 行)
残存参照: なし (test_config_fallback.py の docstring コメントのみ)
* fix(lint): ruff F401/I001 修正 (未使用 import 削除 + import sort 整理)
- src/python/g2p/tests/test_compat.py: 未使用 pytest import 削除 (F401)
- src/python/piper_train/preprocess.py: import ブロック順序修正 (I001)
- src/python/piper_train/tools/add_prosody_features.py: import 順序修正 (I001)
- src/python/piper_train/tools/prepare_bilingual_dataset.py: import 順序修正 (I001)
- src/python/prepare_css10_japanese.py: piper_g2p import 順序修正 (I001)
* fix(ci): HF Space ワークフローの piper_train/phonemize 参照を piper_g2p に更新
piper_train/phonemize/ は M1-7 で削除済みのため下記を修正:
- test-hf-space.yml: phonemize/*.py コピーを削除、pip install piper-g2p に変更
import 検証対象を piper_g2p.* モジュールに更新
- deploy-huggingface.yml: 個別 phonemize ファイルコピー (~22ファイル) を
cp -r piper_g2p に置き換え
paths トリガーを src/python/g2p/** に更新
* fix: ruff format & cargo fmt CI フォーマット違反を修正
ruff format: test_compat.py, infer_onnx.py, preprocess.py
cargo fmt: piper-g2p/src/encode.rs (メソッドチェーン改行スタイル)
* fix: CI 根本原因 5件を修正
- pyproject.toml: mypy==1.7.1 → mypy>=1.13 (piper-g2p との競合解消)
- japanese.py: 非疑問文に $ が付加されるバグを修正
- test_g2p_golden.rs: ChinesePhonemizer::new() に辞書パスを追加、
JapanesePhonemizer::new(None) → new()、型注釈追加
- docker/python-inference: piper_train.phonemize → piper_g2p インポート更新、
Dockerfile に piper_g2p インストール追加
- ci.yml python-tests: piper_g2p をインストールするステップを追加
- cargo fmt --all: Rust コード全体のフォーマット適用
* fix: inference.py インポート順を ruff I001 に合わせて修正
* fix: CI失敗の根本原因5件を一括修正
- encode.rs: nested if let → and_then() でcollapsible_if clippy警告を解消
- test_g2p_golden.rs: expected_contains でPUAエンコード済みトークンに対応
(token_to_pua()でfixture文字列名→PUA形式に変換してから比較)
- piper-g2p/pyproject.toml: pytest>=8.0→>=7.4, pytest-cov>=5.0→>=4.1
(ルートのpytest==7.4.3との競合を解消)
- docker/python-train/Dockerfile: piper-g2p を piper_train より先にインストール
(PyPI未公開のローカルパッケージを明示的に先行インストール)
- docker/python-inference/inference.py: 削除済みpost_process_ids()呼び出しを除去
* fix: test_zh_golden PUA対応 + preprocess.py StrEnum修正
- test_g2p_golden.rs: test_zh_golden の tone marker チェックを PUA 形式に変換
(tone1〜tone5 → \u{E046}〜\u{E04A} に変換してから比較)
- preprocess.py: UP042 対応 — (str, Enum) → StrEnum (Python 3.11+)
* refactor: Python G2P パッケージ名を piper-g2p → piper-plus-g2p に変更
PyPI への公開名を piper-plus エコシステムに合わせて統一する。
インポート名 (piper_g2p) は変更なし。
pip install "piper-plus-g2p[ja]" # 日本語のみ
pip install "piper-plus-g2p[all]" # 全8言語
変更ファイル:
- src/python/g2p/pyproject.toml: name = "piper-plus-g2p"
- pyproject.toml: workspace sources キーを piper-plus-g2p に更新
- src/python/pyproject.toml: dependencies の参照を更新
- .github/workflows/test-hf-space.yml: ステップ名のコメントを更新
* refactor: Python モジュール名を piper_g2p → piper_plus_g2p に変更
PyPI 配布名 (piper-plus-g2p) と Python インポート名を統一する。
Rust クレート名 (piper-g2p / use piper_g2p::) は変更なし。
変更範囲:
- src/python/g2p/piper_g2p/ → piper_plus_g2p/ (git mv)
- Python ソース全体: from piper_g2p → from piper_plus_g2p
- pyproject.toml: packages / entry-points を更新
- CI workflows: ruff/mypy/pytest パス、import 検証を更新
- CLAUDE.md / docs: ドキュメント参照を更新
使用方法:
pip install "piper-plus-g2p[ja]"
from piper_plus_g2p import get_phonemizer
* refactor: Rust クレート名を piper-g2p → piper-plus-g2p に変更
Python (piper_plus_g2p) と命名を統一する。
Go / C++ は G2P クレートへの参照がないため変更なし。
変更内容:
- src/rust/piper-g2p/ → piper-plus-g2p/ (git mv)
- Cargo.toml (workspace / piper-plus-g2p / piper-core):
name, members, dependencies, feature flags を更新
- Rust ソース全体: use piper_g2p:: → use piper_plus_g2p::
- FFI 関数名: piper_g2p_create/phonemize/free → piper_plus_g2p_*
- CI workflows: -p piper-g2p, src/rust/piper-g2p/** パスを更新
使用方法 (Rust):
piper-plus-g2p = { version = "0.1" }
use piper_plus_g2p::get_phonemizer;
* refactor(go): phonemize を独立モジュール piper-plus-g2p/phonemize に分離
- src/go/phonemize/go.mod 新規作成 (github.com/ayutaz/piper-plus-g2p/phonemize)
- src/go/go.work 新規作成 (Go workspaces)
- src/go/go.mod: replace + require 追加
- piperplus/synthesize.go, voice.go: import パス更新
- CI: phonemize モジュールのテスト対象に追加
- CLAUDE.md / docs: Go モジュール情報を更新
使用方法:
go get github.com/ayutaz/piper-plus-g2p/phonemize
import "github.com/ayutaz/piper-plus-g2p/phonemize"
* docs: G2P スタンドアロン利用ドキュメント整備 (Python/Rust/Go)
- Python README: piper-g2p → piper-plus-g2p に統一、スタンドアロン記載追加
- Rust README: コード例の use piper_g2p → piper_plus_g2p、8言語+SV追加
- Go phonemize: README.md 新規作成、doc.go を8言語+openjtalk説明に更新
- Go README: スタンドアロン go get コマンド追記
* fix: CI lint/fmt エラー修正 (Python E501 + Rust rustfmt)
- Python: test_compat.py, test_encode.py の docstring を88文字以内に短縮
- Rust: voice.rs, test_ko_sv_integration.rs に cargo fmt 適用
* ci: Go G2P パッケージの publish ワークフロー追加
go-g2p-v* タグ push 時に:
1. 3 OS でテスト実行
2. src/go/phonemize/vX.Y.Z モジュールタグを作成・push
3. pkg.go.dev にインデックス登録をリクエスト
* ci: G2P CI/CD 改善 (全10項目)
#1 Go モジュールパスを piper-plus-g2p/phonemize → piper-plus/src/go/phonemize に修正
#2 Python publish にタグ vs pyproject.toml バージョン整合チェック追加
#3 Go ゴールデンテスト追加 (phoneme_test_cases.json 共有フィクスチャ)
#4 JS ゴールデンテストを g2p-wasm-ci.yml に追加
#5 Python テストマトリクスを 3.11/3.12/3.13 に拡充
#6 Rust Cargo.toml に keywords/categories/documentation/readme 追加
#7 Rust MSRV 1.88 テスト追加
#8 Rust feature flag 組み合わせテスト追加 (no-default, english, japanese)
#9 Go publish ワークフローに golangci-lint 追加
#10 Python 個別 extras (ja/en/zh) インストールテスト追加
* test: G2P テストカバレッジ大幅拡充 (全プラットフォーム)
A: Rust ゴールデンテストに encode_test_cases + PUA 全96件個別一致チェック追加
B: Go golden_test に encode/PUA チェック追加、raw_phonemes (4→12), inline_phonemes (5→16) 拡充
C: JS ゴールデンテストに expected_contains/encode 検証追加、EN不規則単語・ZH多文字テスト追加
D: Python PUA 全96件境界値テスト + multilingual プロソディ句読点テスト8件追加
E: Rust FFI エッジケーステスト12件追加 (NULL, 無効言語, メモリ安全)
F: Docker/JS コメント旧名 piper_g2p → piper_plus_g2p 修正
共有フィクスチャに pua_map 96エントリ追加 (クロスプラットフォーム検証用)
* fix: CI 失敗修正 (E501, rustfmt, doc-test, PEP 668)
- Python: test_encode.py, test_multilingual.py の行長を88文字以内に修正
- Rust: ffi.rs, test_g2p_golden.rs に cargo fmt 適用
- Rust: lib.rs doc-test を ignore に変更 (english feature gate 問題回避)
- Python CI: test-extras を --system から venv 方式に変更 (PEP 668 対応)
- Rust: lib.rs heading を piper-g2p → piper-plus-g2p に修正
* fix: ruff format 適用 (test_multilingual.py)
* fix: G2P Python CI extras テストに nltk データ DL 追加
EN の g2p-en は nltk averaged_perceptron_tagger_eng が必要
ayutaz
added a commit
that referenced
this pull request
May 4, 2026
* docs(spec): iOS shared-lib 配布方針 (Plan A) を策定 (#377) Issue #377 (iOS shared-lib ビルド失敗) の根本対応として、 ハイブリッド方針 (Microsoft 公式 CDN + xcframework 化) の仕様を `docs/spec/ios-shared-lib.md` に記録。 - ORT 取得経路: download.onnxruntime.ai/pod-archive-onnxruntime-c-X.Y.Z.zip (CocoaPods/SPM 共用 zip、1.17.0/1.20.0/1.22.0 で 200 OK 検証済み) - 配布形式: ios-arm64 + ios-arm64_x86_64-simulator の xcframework - 採用しなかった案 (CocoaPods/SPM/ソースビルド/skip 等) の不採用理由を併記 - リスク・移行可能性・実装チェックリストを整理 * docs(spec): iOS shared-lib 仕様にマイルストーン (M1-M4) を追加 (#377) 旧「8. 実装チェックリスト」(10 項目フラット) を「8. マイルストーン」(M1-M4 フェーズ別) に再編成。 - M1: 取得経路の修復 (release ジョブ解凍) — 表層問題の最短解消、PR 小 - M2: xcframework 化 (配布形式の実用化) — 根本問題の解消、PR 中 - M3: ドキュメント・移行ガイド整備 — 利用者向け統合手順、PR 小〜中 - M4: SPM パッケージ併設 (将来、別 issue) — Swift Package Manager 対応 各 M に目的・スコープ・DoD (完了条件)・依存関係・リスク・PR 単位・想定所要を記載。 全体タイムラインと進捗トラッキング規約 (状態行・Status フィールド更新) も併記。 * docs(tickets): チケット管理フォルダ整備、仕様書と相互リンク (#377) iOS shared-lib マイルストーン (M1-M4) を実装単位のチケットで追跡するため、 docs/tickets/ ディレクトリを新設。 - docs/tickets/README.md: チケット一覧、命名規約、標準セクション、進捗トラッキング規約 - docs/spec/ios-shared-lib.md: 各 M セクションに対応チケットへのリンクを追加 チケット標準セクションに「一から作り直すとしたら」を含め、 マイルストーン依存の積み上げに引きずられない批判的視点を確保する。 * docs(tickets): M1 チケット作成、CDN zip 構造の事実誤認を修正 (#377) エージェントチームのレビューで「CDN zip 内に static .a が存在せず .framework (Mach-O dylib) のみ」という重大な事実が判明。仕様書 §2.1 の zip 構造記述を実情 (.framework バンドル) に修正、§2.3 互換性維持の 前提も観測実態 (v1.11/v1.12 で iOS artifact が一度も配布されていない) に あわせて改訂。 M1 チケット (377-M1-ort-fetch-fix.md) は以下を含む: - §3.2 配布形態の前提変更 (案 A: .framework 同梱 tar.gz 採用) - §3.3 .framework ベースの extraction ロジック差分案 - §3.4 ローカル CMake 連携検証 (PR 起票前必須) - sha256 実値 (1623e115...db871) を pin - csukuangfj URL を実在する .tar.bz2 形式に訂正 - §11 一から作り直すとしたら: 案 X/Y/Z の定量採用条件、競合サイズ比較、 他 Apple プラットフォーム射程、App Extension 制約、ライセンス・SBOM * docs(tickets): M2 xcframework 化チケット作成、レビュー指摘 5 件反映 (#377) エージェントチームによる軽量レビューで以下 5 件を修正: - §3.2 表: -library で生成される xcframework の構造を libpiper_plus.a + Headers/ に訂正 (.framework バンドルは生成しない) - §3.4 / §10.3: ios.toolchain.cmake 既存 CACHE STRING (FORCE なし) で CLI 上書き可能、変更行数 5 行以内に縮小 - §3.5: piper_plus は iOS で STATIC archive、未解決シンボルは利用者リンカが解決する構造を明記 - §11.2 案 X: sherpa-onnx-spm 構造の伝聞ベース記述を再検証注記付きに緩和 - §10.10 (新規): artifact upload-v7 / download-v8 のバージョン整合性チェックを追加 ORT 同梱は案 A (含めない) を採用。M3 で利用者ガイド整備を担う。 * docs(tickets): M3 ドキュメント・移行ガイド整備チケット作成、レビュー指摘 4 件反映 (#377) エージェントによる軽量レビューで以下 4 件を修正: - §3.4: examples/godot/README.md の編集対象を Feature Comparison 表のセル更新と Platform Notes への iOS セクション新設に分離 (Platforms 表は実在しない) - §3.3 Note + §3.11: Privacy Manifest を「iOS 17+ 必須」から「Required Reason API 使用時のみ必須」に修正、M2 §11.7 と整合 - §11.6 + §3.11: M2.5 / M3.5 の混乱を解消、M2 §11.7 の「M2 スコープへの繰り上げ」表現に統一 - §3.6 CHANGELOG: Linux/Windows/macOS/Android/iOS の修正が M1 で完了し v1.13.0 で初公開される旨を明示 §11 では「M3 解体・各 PR 分散」案 X、TTHW 30 分目標、つまづきポイント TOP 5 等を批判的に検討。 * docs(tickets): M4 SPM パッケージ併設チケット作成、レビュー指摘 3 件反映 (#377) エージェントによる軽量レビューで以下を修正: - 冒頭 + §2 + §5: 案 X / 案 Y のトグル表現を整理、§1〜§10 は案 Y を主仕様、§11 で案 X 推奨を別記する設計記録として位置づけ明示 - §3 冒頭: 別 repo (案 Y) または本体 repo (案 X) で実装、本ブランチではドキュメントのみ追加と明記 - §3.2: swift-tools-version のスペース表記を Apple 公式推奨形式に修正 §11 では現仕様 (別 repo + 自動連携) を批判し、案 X (本体 repo に Package.swift) を強く推奨。M4 着手前に iOS 利用者観測 (3 ヶ月で ≥ 5 件) を行い、需要が 確認できなければ永久延期する判断を持つべきとの結論。 * docs(tickets): 見積もりを Claude Code 実行ベースに更新、道 A 確定 + 案 X 採用 (#377) - 「人間 14 日 / 5-6 名チーム」を「実装数時間 + CI サイクル / Agent 並列レビュー観点」に置換 - spec §8 全体タイムラインを Claude Code 実行ベースに刷新 (総 5-10 時間 + CI) - M1-M4 各チケット §1 メタ情報に「環境制約: Apple Silicon Mac 不使用、CI 完結フロー」を明示 - M1-M4 各チケット §4 を「Agent ツールによる並列レビュー観点」に再構成 - M2: module map / Privacy Manifest を §11.7 繰り上げ採用 (PR +30 行込み ~180-230 行) - M4: 道 A 確定により本ブランチ着手、§11 推奨どおり案 X (本体 repo 直下 Package.swift) を主仕様化 - spec §M3: 想定 PR を仕様 80 行 → チケット側実態 440 行に修正 - spec §M1: 「device-only .a 維持」古文情報を「.framework ベース extraction 書換」に修正 - 「進捗トラッキング」セクションで Single Source of Truth = README 表に統一明示 * docs(tickets): 仕様書ヘッダ更新 + §11 案指示子のスコープ注記を 4 チケットに追加 (#377) - spec ヘッダを Version 1.1 / 道 A 確定 / SoT = README 表 に更新 - 各チケット §11 冒頭に「案 X/Y/Z は本マイルストーン文脈に閉じた指示子」の警告を追加 - M1 §11.2: 案 X = ORT ソースビルド、案 Y = 自前 ORT ミラー、案 Z = iOS 廃止 - M2 §11.2: 案 X = ORT 同梱 xcframework、案 Y = ORT 別配布 (採用)、案 Z = M2+M4 統合 - M3 §11.2: 案 X = M3 廃止 PR 統合、案 Y = Documentation as Code、案 Z = 動画 - M4 §11.2: 案 X = 本体 repo Package.swift (採用)、案 Y = SPM 別 repo、案 Z = CocoaPods - M2 §11 / M4 §11 に「採用済み判断」マーカーを追加 (道 A による §11.7 提案の確定反映) * docs(tickets): M2 §11.7 繰り上げ採用 (modulemap + PrivacyInfo) を全関連箇所に反映 (#377) M2: - §3.1 編集ファイル一覧に cmake/PiperPlusShared.cmake の modulemap 自動生成 + cmake/PrivacyInfo.xcprivacy 新規追加を追記 (合計 +27 行) - §3.6 触らないファイルから modulemap / PrivacyInfo を除外 - §5 Included に modulemap 自動生成 + 空 Privacy Manifest を追加、 Excluded から両方を除外 - §6 テスト項目 T13/T14/T15 を追加 (modulemap 同梱 / PrivacyInfo plist / Swift import 構文) - §10.6.1 / §10.6.2 のレビュー項目を追加 - §11.7 末尾に「採用済」マーカー - 「ORT 同梱方針 (案 A)」を「案 Y (ORT 別配布)」に修正 (M2 §11.2 命名と整合) M3: - §3.11 module map / Privacy Manifest を「M2 で同梱済」に書換 - §9 C5 module map 不在懸念を「解消」に - §11.6 繰り上げ提案を「採用済」に - §11.7 推奨案 #5 と永遠負債リストの「M2.5」を「M2 で対応済」に統一 - §12.1 module map の M4 着手時再判断を「M2 で対応済」に - §12.4 M3 §11.7 繰り上げ提案再評価を完了マーク M4: - §3.2 Package.swift サンプルの .iOS(.v14) を .iOS(.v15) に修正 (M2 と整合)、 ORT 公式 SPM パッケージへの dependencies / exact ピンを追加 - §3.3 リリース連携を案 X (本体 repo 単一管理) に書換、 案 Y/Z (別 repo + dispatch / cron) を不採用として記録 - §3.4 module map 組込みを「M2 で対応済」に - §9 C1 module map 未組込み懸念を「解消」に - §11.4 SPM 制約表で modulemap / Privacy Manifest を「M2 で対応済」に - §11.6 ギャップ表を「道 A 確定後の更新」に書換、別 repo メンテ負荷を「解消」に - §12 M2/M3 遡及対応を「対応済」に * docs(tickets): SoT を README 表に統一、6 ヶ月起点を M3 完了 PR マージ日に統一 (#377) - README 冒頭に「Single Source of Truth (SoT)」明示を追加 - README 表に「想定 PR / 実装時間 (Claude Code)」カラム追加 (M1 60-80 行 / M2 180-230 行 / M3 440 行 / M4 50-80 行) - 道 A 確定の注記を表下に追加 (総 5-10 時間 + CI、案 X 採用、Apple Silicon Mac 不使用) - 進捗トラッキング規約を「README が SoT、他文書は参照のみ」に簡素化 - 新セクション「利用者観測タイムライン」追加: GitHub Releases download_count 週次収集 / 判断ゲート / 6 ヶ月起点 = M3 完了 PR マージ日 を統一規約として明記 - M1 §11.9 / §12.4 / M2 §12.3 / M3 §12.4 の「6 ヶ月以内」表現を README 規約への参照に統一 - M1 §11.9 で「案 X / 案 Z」に M1 内文脈の括弧書き (ORT ソースビルド / iOS 廃止) を補足 * docs(tickets): 技術検討追記 (シンボル検証 / SHARED 化評価 / ORT bump 経路) (#377) M1: - §3.4 を「ローカル必須検証」から「CI 内完結 + ローカル参考」に再構成 - CI 内 シンボル解決検証ステップ (nm -u libpiper_plus.a / nm -gU onnxruntime framework / ORT 関連シンボル抽出 / 未解決検出) を追加 - §9 C8 を新規追加: ORT 1.17.0 固定の正当性 (iOS 単独 bump 不可、 release-shared-lib.yml が iOS/Android 共有、1.17.0/1.20.0/1.22.0 とも CDN HTTP 200 を実機検証 2026-05-04) M2: - §11.3 末尾に「STATIC vs SHARED」検討表を追加 - 比較項目: 利用者 Xcode 操作対称性 / 起動 overhead / アプリサイズ / App Store 適合性 / CMake 修正 / 誤操作リスク / 配布物変更 - 判断: M2 では STATIC 維持、M3 完了から 6 ヶ月の Embed 関連 Issue ≥ 3 件 で SHARED 化を別 issue 起票 M3: - §12.2 別 issue 候補に「ORT バージョン全 OS 横断 bump (1.17.0 → 1.22.0)」 を追加 (release-shared-lib.yml の env.ONNXRUNTIME_VERSION 単一変更で iOS/Android/C++ 連動、全ランタイム整合確認も必要) * fix(ci): iOS shared-lib の取得経路を Microsoft CDN に切替、.framework ベース extraction (M1, #377) ONNX Runtime の旧 GitHub Releases zip は Microsoft が CocoaPods/SPM/CDN 配布に一本化したため削除されており、v1.11.0 以降 Build iOS arm64 ジョブが unzip 失敗で連続停止していた。release ジョブの巻き添えで全 OS shared-lib artifact が Releases に上がっていなかった問題を解消する。 変更: - curl URL を https://download.onnxruntime.ai/pod-archive-onnxruntime-c-${VERSION}.zip に切替 - sha256 検証ステップ追加 (1.17.0 = 1623e1150507d9e5...db871、再現性 + 供給チェーン最低限) - 配布物が .framework (Mach-O dylib) のみで .a 不在となる CDN zip 構造変更に対応 - ort-ios/lib/onnxruntime.framework を保持しつつ libonnxruntime.dylib シンボリックリンクで CMake link - 新規ステップ Verify symbol resolution: nm -u libpiper_plus.a の ORT 関連未解決シンボルが nm -gU onnxruntime framework export に含まれることを CI 内検証 - Package ステップで onnxruntime.framework を tar.gz に同梱 (利用者は Embed & Sign) 仕様: docs/spec/ios-shared-lib.md §2.1 チケット: docs/tickets/377-M1-ort-fetch-fix.md * feat(ci): iOS xcframework 配布 (matrix slice + modulemap + PrivacyInfo) (M2, #377) M1 で device-only .framework 同梱 tar.gz 配布まで復旧したが、Apple ecosystem の標準 (Dart FFI / Godot / Swift / SPM) は xcframework を前提に収束しており、 device-only では Apple Silicon Mac での simulator 実行や Xcode 標準フローに不整合。 本変更で xcframework.zip 配布を成立させる。 CI 変更: - build-ios を matrix で 2 分割 - ios-arm64 (sdk=iphoneos, archs=arm64) - ios-arm64_x86_64-simulator (sdk=iphonesimulator, archs="arm64;x86_64") - 各 slice で sysroot/archs を CLI 渡し、CMAKE_OSX_SYSROOT と CMAKE_OSX_ARCHITECTURES を明示化 - 各 slice ごとに piper-plus-slice-<slice> として upload (xcframework 組立用) - M1 互換 tar.gz は device slice のみで継続生成 (v1.13.0 移行期間、v1.14.0 廃止予定) - 新規 assemble-xcframework ジョブ: - 両 slice を download - xcodebuild -create-xcframework で統合 - Headers/module.modulemap が各 slice に配置されたまま統合 - cmake/PrivacyInfo.xcprivacy を xcframework ルートに配置 - zip -ry で zip 化、libpiper_plus-ios-xcframework として upload - release.needs に assemble-xcframework 追加 - Rename ステップで libpiper_plus-ios-${TAG}.xcframework.zip 命名 CMake 変更 (M2 §11.7 繰り上げ採用): - cmake/PiperPlusShared.cmake iOS 分岐に modulemap 自動生成 (file WRITE) - module PiperPlus { umbrella header "piper_plus.h"; export *; module * { export * } } - Swift `import PiperPlus` 経路 (M4 SPM の前提) を成立させる - cmake/ios.toolchain.cmake のコメントを simulator slice 対応の規約説明に拡張 - CMAKE_OSX_SYSROOT は iphoneos/iphonesimulator を CLI 上書きで切替可能 - CMAKE_OSX_ARCHITECTURES は arm64 / "arm64;x86_64" を CLI 上書き 新規ファイル: - cmake/PrivacyInfo.xcprivacy: 空 Privacy Manifest テンプレート - NSPrivacyTracking=false / NSPrivacyTrackingDomains[] / NSPrivacyCollectedDataTypes[] / NSPrivacyAccessedAPITypes[] - iOS 17+ App Store の Privacy Manifest 要件に対応 (Required Reason API 不使用宣言) - ORT 側 Privacy Manifest は Microsoft 公式が未提供のため、利用者は自前で追加要 仕様: docs/spec/ios-shared-lib.md §M2 チケット: docs/tickets/377-M2-xcframework.md * docs: iOS 統合ガイド整備、xcframework / tar.gz 過渡期の利用者導線整備 (M3, #377) M2 で xcframework.zip 配布が成立したが、利用者が Xcode に組み込む手順 + 配布物 2 種 (tar.gz / xcframework.zip) の使い分けが未提供だった。本変更で Dart / Flutter / Godot / Swift 全利用者の Time-To-Hello-World 30 分化を狙う。 更新: - CHANGELOG.md Unreleased に v1.13.0 iOS 配布エントリ追加 - Added: xcframework.zip 配布開始 + Microsoft CDN 取得経路 - Deprecated: tar.gz の v1.14.0 廃止予告 - Fixed: release パイプライン全体の復旧 (Issue #377) - docs/spec/ort-versions.md iOS 行を「Microsoft CDN + sha256 + 検証日」に更新 - docs/spec/ios-shared-lib.md ヘッダ Status を「Implemented (v1.13.0)」に - examples/dart/README.md iOS 統合章を新設 - 配布物選択ガイド (xcframework.zip 推奨、tar.gz 廃止予告) - Step 1-4: xcframework 取得 → ORT 取得 3 案 → Embed & Sign → Dart FFI 呼出 - Troubleshooting (Image Not Found / Privacy Manifest / App Extension 制約) - examples/godot/README.md Feature Comparison 表に iOS 追加 + Platform Notes に iOS セクション - GDExtension の ios.dependencies で ORT を自動 Embed する記述例 - App Extension / App Clip 非対応の制約注記 新規: - docs/guides/ios-integration.md (Dart / Godot / Swift 横断統合ガイド) - 配布物選択 (Hick's Law 回避の単一推奨) - Step 1-4 の TTHW 30 分タイムライン - 互換性ステータス表 (modulemap ✓ / PrivacyInfo ✓ / dSYM ✗ / visionOS ✗ / App Extension ✗) - tar.gz からの移行手順 - examples/swift/README.md (Swift 統合例) - SPM Quick Start (Package.swift dependency 追加で完結、推奨パス) - 手動 drag-and-drop (フォールバック手順) - module.modulemap 経由の `import PiperPlus` 動作 仕様: docs/spec/ios-shared-lib.md §M3 チケット: docs/tickets/377-M3-docs-migration.md * feat(spm): Swift Package Manager パッケージを本体 repo 直下に配置 (M4 案 X, #377) iOS Swift / SwiftUI 利用者が Package.swift dependency 経由で import PiperPlus を成立できるよう、本体 repo (ayutaz/piper-plus) 直下に Package.swift を配置。M4 §11.7 推奨の案 X (本体 repo 単一管理) を採用、 別 repo (ayousanz/piper-plus-swift-package-manager) は不要。 新規 Package.swift: - swift-tools-version: 5.9 - platforms: iOS 15+ / macOS 12+ - binaryTarget で GitHub Releases の libpiper_plus-ios-${VERSION}.xcframework.zip を参照 - ORT 公式 SPM パッケージ (microsoft/onnxruntime-swift-package-manager) を exact: 1.17.0 でピン (M2 でリンクした ORT バージョンと一致) - 初版時の checksum はプレースホルダー (初回 v1.13.0 リリース時の workflow が更新) CI: release ジョブに 4 ステップ追加 (release 公開後の dev ブランチ向け PR): - Compute new Package.swift checksum: shasum -a 256 で xcframework.zip の checksum 計算 - Checkout dev for Package.swift bump: dev ブランチを piper-plus-dev/ に別途取得 (release ジョブは tag commit を checkout 中、Package.swift 更新は dev に対して行う) - Update Package.swift in dev checkout: sed で version + checksum を実値に更新 - Open PR for Package.swift bump: peter-evans/create-pull-request@v6 で chore/spm-bump-v${VERSION} ブランチを base: dev で PR 作成。 メンテナがマージ判断、tag commit 自体は immutable のまま保持 permissions: pull-requests: write を workflow level で追加 (PR 作成のため) 利用者導線: - Quick start: Package.swift dependency に `.package(url: "https://github.com/ayutaz/piper-plus", from: "1.13.0")` 追加 - 詳細: examples/swift/README.md (M3 で新規作成済) 仕様: docs/spec/ios-shared-lib.md §M4 チケット: docs/tickets/377-M4-spm-package.md * chore(ci): macOS runner を macos-14 → macos-15 (Xcode 16.4) に bump (#377) GitHub Actions の macOS runner で macos-15 (= macos-latest、macOS 15.7.4 Sequoia、Apple Silicon、Xcode 16.4 デフォルト + Xcode 26 系も installed) が GA、macos-26 (Tahoe、Xcode 26 デフォルト、iOS 26 SDK のみ) も GA。 macos-15 を採用する理由: - Xcode 16.4 デフォルト (Xcode 14 系で deprecated だった bitcode 関連は完全消滅) - iOS 18 + iOS 26 SDK 両方利用可能 (将来の visionOS / Mac Catalyst 拡張に備え) - macos-latest と一致 (将来の GitHub 側変更にも追従しやすい) - piper-plus iOS Deployment Target 15.0+ で問題なくサポート macos-26 を直接採らない理由: - iOS 18 SDK が無く、旧 iOS デプロイメント検証で制約の可能性 - xcodebuild -create-xcframework の Xcode 26 互換性 (Xcode マイナー更新で xcframework Info.plist 形式が変わる事例あり、M2 §C2) - GA 直後でエコシステム追従が不完全な可能性 - 速度差は piper-plus 規模 (3MB static archive) では計測誤差レベル 変更 (実コード 3 箇所): - release-shared-lib.yml の build-shared matrix の macos-arm64 → macos-15 - release-shared-lib.yml の build-ios runs-on → macos-15 - release-shared-lib.yml の assemble-xcframework runs-on → macos-15 ドキュメント整合更新: - spec/ios-shared-lib.md §3.1 YAML 例 + §5 リスク表 - 377-M1 §10.3 (shasum 注釈) + §11.4 (CI ホスト戦略表) - 377-M2 §3.3 YAML 例 (3 箇所) + §6 T15 + §C2 + §11.4 (2 箇所) - 377-M4 §1 環境制約 次の昇格候補は macos-26 (Tahoe) だが iOS 18 SDK 取り扱いの再評価が前提。 * fix(cmake): iOS で install/EXPORT/CMake config をスキップ (#377) M1/M2 で iOS のビルドが進めるようになった結果、Configure CMake 段階で 以下のエラーが両 slice (device + simulator) で発生: CMake Error in CMakeLists.txt: install(EXPORT "PiperPlusTargets" ...) includes target "piper_plus" which requires target "hts_engine_stub" that is not in any export set. 原因: piper_plus が target_link_libraries(... PRIVATE hts_engine_stub) で 依存しているが、hts_engine_stub は install(EXPORT PiperPlusTargets) に 含まれていないため、CMake 4.x の厳格チェックで Generate 失敗。 Linux/Win/macOS shared / Android では同条件でも PASS している (CMake バージョン 依存と推測) が、iOS の macos-15 runner CMake 4.1.2 でのみ顕在化。 修正: - cmake/PiperPlusShared.cmake の install/EXPORT/pkg-config/CMakeConfig ロジック全体 (L154-259) を `if(NOT CMAKE_SYSTEM_NAME STREQUAL "iOS")` でガード - 影響なし: iOS では xcframework build flow (release-shared-lib.yml の Stage slice for xcframework assembly ステップ) が build-ios/libpiper_plus.a を直接 cp、SPM 消費者 (M4 Package.swift) は xcframework 内の Headers/ + module.modulemap 経由でヘッダ解決。CMake find_package は使わない 検証: M1/M2 で確立した CDN URL + sha256 + .framework extraction + matrix slice + assemble-xcframework のフローは無変更。iOS Configure CMake のエラーのみ解消。 * fix(cpp): downloadFile を iOS で stub 化、std::system 不可エラーを解消 (#377) M2 で iOS Configure CMake が通った結果、Build (iOS slice) ステップで src/cpp/model_manager.cpp の 3 箇所が以下のエラーで失敗: error: 'system' is unavailable: not available on iOS src/cpp/model_manager.cpp:264:14 src/cpp/model_manager.cpp:266:21 src/cpp/model_manager.cpp:275:19 Apple は iOS SDK で std::system() を unavailable 化している (App Sandbox ポリシーで子プロセス起動禁止)。downloadFile() は curl/wget をシェル経由で 呼ぶため、iOS では機能要件として実現不可能。 修正: - TargetConditionals.h を include して TARGET_OS_IPHONE を判定可能に - downloadFile() を iOS / iPadOS / tvOS / watchOS で stub 化: spdlog::error で「auto-download 非対応、URLSession 経由で事前 DL を」と 案内、return false で失敗させる - 既存の Windows (PowerShell) / Unix (curl/wget) パスは無変更 - model_manager.cpp の他関数 (getDefaultModelDir 等) は std::system を 使わないため修正不要 Embed 利用者への影響: piper-plus iOS xcframework の利用者はモデルを URLSession 等で事前 DL してローカルパスを渡す運用になる。これは iOS App Sandbox の制約上、本来やるべき形であり制限ではなく仕様。M3 ガイド docs/guides/ios-integration.md にも記載済 (Step 1 でモデル DL 例示)。 * fix(cmake): iOS で std::system / popen / fork を含む 4 ファイルを piper_common から除外 (#377) 根本原因の分析: - M1/M2 で iOS Configure/Build まで進めたところ、複数のソースで iOS App Sandbox が禁じている system call (std::system / popen / fork) のコンパイルエラーが 連鎖的に発生 - これらは「子プロセスを生成して curl/wget/sha256sum/openjtalk binary を呼ぶ」 デスクトップ環境専用のユーティリティであり、機能要件として iOS では実現不可 - 場当たり的に各箇所を TARGET_OS_IPHONE ガードする方針 (前 2 コミット) は、 「次の system 呼出箇所が見つかると同じループ」になることが本 CI 周回で実証された (1: install/EXPORT エラー → 2: model_manager.cpp std::system → 3: openjtalk_wrapper.c std::system) 根本対応 (戦略 A: ファイル単位除外): - piper_common のソースリストを「全プラットフォーム共通」と「デスクトップ専用」に分割 - 以下 4 ファイルを iOS では除外: - model_manager.cpp (std::system → HF auto-download) - openjtalk_wrapper.c (popen + system → openjtalk binary 検出/起動) - openjtalk_optimized.c (fork + execvp + popen → openjtalk binary spawn) - openjtalk_dictionary_manager.c (popen + system → 辞書 DL/sha256/tar) 依存関係の検証 (除外しても他コードに影響しないか): - piper-plus C API (piper_plus_c_api.cpp) からの参照: なし (Grep で確認済) - 合成パイプライン (piper.cpp) からの参照: なし (loadVoice は piper.cpp 内の別関数) - main.cpp (CLI) からの参照: あり、ただし iOS では既に PiperExecutable.cmake で add_executable をスキップ済 - tests からの参照: あり、ただし iOS では既に CMakeLists.txt L64 で除外済 - openjtalk_api.c が openjtalk_dictionary_manager.h を include しているが 関数呼出はゼロ (dead include、別 issue で整理対象) 副次効果: - 前コミット (15cabad) の model_manager.cpp 内 TARGET_OS_IPHONE ガードは iOS でファイル自体がビルドされなくなるため無効コード化するが、害はなく将来の 再採用時の保険として残置 - iOS ビルド時間が短縮 (コンパイル対象縮小) - iOS xcframework サイズが微減 (CLI/tests 専用機能のシンボル排除) * fix: Copilot review #381 指摘 13 件を全件反映 (#377) Package.swift (致命的 4 件): - L18 ORT dependency 削除: binaryTarget は dependencies を transitively 解決できないため、宣言しても無効。consumer が両 package を別途宣言する 運用に統一 (examples/swift/README.md にテンプレート記載) - L32 .macOS(.v12) を platforms から削除: xcframework に macOS slice が 無いため宣言すると macOS ビルドで解決失敗 - L52 binaryTarget URL の v 付与: workflow Rename ステップは libpiper_plus-ios-v${VERSION}.xcframework.zip を生成、URL を一致 - L8 タイミング根本見直し (sherpa-onnx 方式): SwiftPM は tag commit 内の Package.swift を見るため tag push 後の auto-PR では遅すぎる。メンテナが tag push 前に手動更新する運用に 変更 (Package.swift 冒頭コメントに手順記載) release-shared-lib.yml: - pull-requests: write permission を撤去 - Package.swift checksum 自動更新 PR ステップ 4 つ削除 (Compute checksum / Checkout dev / Update Package.swift / Open PR) - 旧設計の意図を明示する NOTE コメントを Create GitHub Release ステップ後に追加 ドキュメント Embed 説明 (5 件): - docs/guides/ios-integration.md Step 3 + Troubleshooting: 「両方 Embed & Sign」を「PiperPlus = Do Not Embed (static archive、リンクのみ) / ORT = Embed & Sign (dynamic framework 必須)」に正す。_OrtCreateEnv 帰属を ORT 側に修正 (旧記述は誤り) - examples/dart/README.md Step 3 + Troubleshooting: 同上の修正 examples/swift/README.md (macOS 削除 + SPM 手順): - 冒頭の「iOS / macOS」表記を「iOS のみ (device + simulator)」に - consumer Package.swift テンプレートで platforms を [.iOS(.v15)] のみに、 ORT package を「REQUIRED」と明記 - 互換性表で macOS / Mac Catalyst を ✗ に修正 - リリースサイクル注意 (tag commit に正しい checksum が無いと resolve 失敗) を追加 src/cpp/model_manager.cpp (1 件): - TARGET_OS_IPHONE のコメントを「Apple non-macOS platforms」と総称的に修正 - 4 ファイル除外戦略 (PiperCommon.cmake) との関係を注記し、本ファイルが iOS でビルド対象外であることを明示 spec / M4 チケット: - spec §M4 のスコープと DoD を「メンテナ手動更新フロー」に書換 - 377-M4 §3.3 を sherpa-onnx 方式の手順 (workflow_dispatch → DL → swift package compute-checksum → Package.swift 更新 → tag push) に置換、 旧設計 (release ジョブ内 auto-PR) の不採用理由を明記 CHANGELOG: - xcframework アセット名に v 接頭辞を追加 - Embed 区別 (Do Not Embed / Embed & Sign) を明記 - ORT が SPM transitive dependency にならない制約を consumer 視点で明記 - SPM 運用フロー (sherpa-onnx 方式) を新規エントリで追加 * fix(ios): 厳格レビュー指摘 13 件 + Critical/Major/Minor を一括反映 (#377) 複数エージェントによる厳格レビューで判明した出荷ブロッカーと負債を解消。 Critical: - C1: openjtalk_ios_stub.c で desktop 専用関数の iOS スタブを実装、 release-shared-lib.yml の symbol resolution check を blocklist (Ort* のみ) から allowlist 形式に強化 (project-internal symbol も検出) - C2: docs/guides/ios-integration.md に iOS で OpenJTalk 辞書を app bundle に同梱する手順を追加 (App Sandbox で auto-DL 不可のため必須) - C3: release ジョブに Package.swift checksum 2 段ガードを追加 (placeholder 検出 + xcframework zip と SHA-256 一致確認) - C4: xcframework.zip ファイル名表記を全 docs で v 接頭辞付き (libpiper_plus-ios-v\${VERSION}.xcframework.zip) に統一 Major: - M1: Package.swift を wrapper target 構造に書換、onnxruntime を transitive 解決させて consumer 側 Package.swift の二重宣言を解消 - M2: C++ symbol leak (ODR) 対策として -load_hidden / -exported_symbols_list の利用方法を docs で案内 - M3: PrivacyInfo.xcprivacy が xcframework root では Apple スキャナの読取り 対象外であることを docs に明記、consumer-side の App Store 提出チェック リスト (Required Reason API テンプレート + Encryption Compliance) 追加 - M4: workflow-level permissions を contents:read に縮小、release ジョブ だけ contents:write を opt-in - M5: ORT version pin を exact:"1.17.0" から from:"1.17.0" に緩和、 docs/spec/ort-versions.md への直リンク追加 - M6: Apple-embedded プラットフォーム検出を PIPER_APPLE_EMBEDDED 変数に 集約 (CMakeLists.txt + cmake/* 全体)、tvOS/watchOS/visionOS も網羅 - M7: 377-M4-spm-package.md ticket の §3.1 (案 Y: 別 repo) を削除、 §3.2 サンプルコードを wrapper target + v 接頭辞付き URL に整合 - M8: CHANGELOG に Limitations サブセクション新設、module.modulemap / PrivacyInfo / macOS slice 未提供 / ORT 必須 / OpenJTalk 辞書手順 / Symbol leak 注意点を網羅 - M9: model_manager.cpp の TARGET_OS_IPHONE 分岐は CMake 除外で dead code のため削除 Minor: - cp -R "\${ORT_FW_DIR}" → ditto (Apple-aware copy) - lipo -info → lipo -archs + arch token grep (空 archive 検出) - Compress-Archive (Windows) → tar -a (forward-slash POSIX paths) - tag validator regex を fully anchored 化 (\$ 末尾追加) - M1-compat tar.gz の deprecation ::warning:: ステップ追加 - CLAUDE.md ランタイム別表に iOS xcframework + SPM 行追加 - examples/dart/README.md に Mach-O dead-code stripping 対策 (-force_load) 注記追加 - examples/godot/README.md に demo .gdextension が iOS 未対応である 旨注記、テンプレート用途と区別を明記 検証: 各エージェントから「C1 は確実なリンクエラー」と確認済 (PiperCommon で iOS 除外した openjtalk_wrapper.c / openjtalk_dictionary_manager.c の symbol を openjtalk_phonemize.cpp:41-78 と openjtalk_api.c:249 が呼ぶため、 consumer Xcode が "Undefined symbol" で落ちる)。stub 追加 + CI 強化で 今後同種漏れも検出可能。 * fix(cmake): iOS STATIC archive で piper_common OBJECT lib を target_link_libraries で統合 (#377) 3 エージェント並列調査で確定した根本原因: $<TARGET_OBJECTS:piper_common> を add_library() の sources 引数に渡す パターンは CMake 3.11 以前の歴史的手法。3.12+ では target_link_libraries で OBJECT library を link するのが正規 API。 - SHARED build (Linux/macOS-arm64/Windows/Android): linker (ld) が generator expression 展開された .o を直接 binary に焼くので偶然動いて いた - STATIC archive (iOS): Apple xcrun libtool -static が generator expression 経路の .o を consume しない既知挙動 (CMake issue #17457, #22415) → archive に piper_common の object files が一切含まれず、 consumer の Xcode リンク時に "Undefined symbol: __ZN5piper11loadVoice ... " 等 311 個の symbol が解決失敗 Tier 1 修正: A. add_library(piper_plus ...) sources から $<TARGET_OBJECTS:piper_common> を削除 → target_link_libraries(piper_plus PRIVATE piper_common) で 統一。SHARED/STATIC 両方で .o file membership が保証される CMake 3.12+ 公式パターン。Linux/macOS/Windows/Android 既存挙動も保持 B. C_VISIBILITY_PRESET hidden を if(NOT PIPER_APPLE_EMBEDDED) で囲み、 iOS STATIC archive では visibility 制御を skip。STATIC archive の symbol table は visibility を honor しないため、libtool 結合時に cross-TU 参照が静かに消える事象を回避 参考: sherpa-onnx / whisper.cpp / onnxruntime は元々 OBJECT library を 使わず STATIC + post-build merge で iOS を扱っている。本 fix で同等の 信頼性を OBJECT library 構造を保ったまま得る。 * fix(cmake): piper_common を STATIC 化し iOS で archive 統合 (#377) Tier 1 修正 (target_link_libraries) では効果なし — CMake の OBJECT library + iOS `xcrun libtool` の interplay は target_link_libraries 経由でも piper_common の object files を統合してくれない (CI で同じ 311 個の undefined symbol 再現)。 エージェント 2 が指摘した sherpa-onnx / whisper.cpp 方式に切替: 1. piper_common を OBJECT → STATIC library に変更 (PiperCommon.cmake) - 物理的な libpiper_common.a が生成される 2. piper executable / test_piper / test_c_api* も TARGET_OBJECTS から target_link_libraries(... piper_common) に統一 3. iOS branch に POST_BUILD ステップ追加 (PiperPlusShared.cmake): xcrun libtool -static -o libpiper_plus.a \ libpiper_plus_partial.a # piper_plus_c_api.o 単体 libpiper_common.a # piper:: 名前空間 + library_path 等 libhts_engine_stub.a # OpenJTalk header 互換 stub libopenjtalk.a # OpenJTalk 本体 (MeCab 込み) これで consumer Xcode は piper_plus.xcframework 内の libpiper_plus.a 1 つを Do Not Embed で link するだけで全 symbol 解決 依存: - PIPER_APPLE_EMBEDDED が iOS で正しく評価される (CMakeLists.txt 既設定) - $<TARGET_FILE:piper_common> $<TARGET_FILE:hts_engine_stub> は CMake STATIC target なので generate 時に絶対 path に展開される - ${OPENJTALK_DIR}/lib/libopenjtalk.a は ExternalProject のため add_dependencies(piper_plus openjtalk_external) で順序保証済み Linux/macOS-arm64/Windows/Android (SHARED build) は target_link_libraries で piper_common を link するだけで動作 (linker が直接 archive 内容を 吸い上げる)。 * fix(ci): symbol resolution check が archive 内 cross-TU を誤判定する問題を修正 (#377) Tier 3 修正後の CI で symbol が依然 undefined と出ていたのは、Tier 3 の archive merge が失敗したのではなく、CI のチェックロジックそのものに 誤りがあった: - nm -u libpiper_plus.a は archive 内の各 object file の undefined references を出力する (per-object granularity) - piper_plus_c_api.o → piper::loadVoice 参照、 piper.o (piper_common 由来、archive merge 後に含まれている) → loadVoice 定義、これらは archive 内 cross-TU で consumer link 時に resolve される - しかし nm -u では「object 単位の undefined」として出力されるため、 同 archive 内で defined な symbol も undefined としてレポート 修正: 1. nm -gU libpiper_plus.a で archive 内 defined external symbols を取得 2. comm -23 で undefined - defined-internal = 「真の外部依存」を抽出 3. その「真の外部依存」を ORT framework / project pattern と照合 加えて Show libpiper_plus.a archive contents diagnostic step を追加: - ar -t でメンバー数表示 - nm -gU + grep '^__ZN[0-9]+piper' で piper:: 名前空間 symbol の有無確認 これで Tier 3 archive merge 結果を正しく検証可能。 * fix(ci): diagnostic step を fat archive 対応に (#377) simulator slice (arm64+x86_64) の libpiper_plus.a は lipo で結合された fat archive で、ar -t が読めず "Inappropriate file type or format" で exit 1 を返していた (set -euo pipefail でステップ失敗)。 device slice (arm64 のみ) は thin archive で ar が読めるため正常 PASS、 よって今回の問題は diagnostic step の表示ロジックの不備で archive merge 自体は両 slice で成功している。 修正: - ar -t (thin archive 専用) を削除 - file / lipo -archs で archive 種別を表示 - nm -gU (thin/fat 両対応) で piper:: および C シンボル定義の有無を確認 これで両 slice の symbol resolution check が走り、Tier 3 archive merge の効果が検証可能になる。 * fix(cmake): EXTERNAL_CMAKE_ARGS に CMAKE_OSX_SYSROOT を追加 (#377) simulator slice (arm64+x86_64) で xcodebuild -create-xcframework が "binaries with multiple platforms are not supported" で失敗していた。 原因: - main project は CLI 経由で CMAKE_OSX_SYSROOT=iphonesimulator で build - ExternalProject (OpenJTalk 等) には CMAKE_OSX_SYSROOT が伝わっておらず、 デフォルトの iphoneos (device SDK) で build される - simulator main + iphoneos OpenJTalk を libtool merge → 単一 archive 内 に異なる platform の object file が混在 → xcframework 拒否 device slice では main も ExternalProject も iphoneos なので問題なし (symptom が simulator slice に限定されていたのもこのため)。 修正: 1. EXTERNAL_CMAKE_ARGS に CMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} を追加 2. CMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY も予防的に追加 (iOS cross-compile で try_compile の executable link 失敗を回避し、 ExternalProject 内 CMake feature detection の silent regression 防止) これで simulator / device 両 slice で main + ExternalProject の SDK が 揃い、libtool merge 結果も単一 platform で構成される。
ayutaz
added a commit
that referenced
this pull request
May 13, 2026
* test(training): time.sleep() 依存の race を polling に置換
test_training_manager_lifecycle と test_training_error_handling の
3 箇所 (L113 / L118 / L166 相当) で ``time.sleep(0.3)`` /
``time.sleep(0.2)`` に依存していた状態待ちを、polling helper
``_wait_until(predicate, timeout, interval=0.02)`` に置き換え。
これにより:
- CI runner が遅い時の偽陽性 failure を防止。
- 状態遷移が早ければ即座に次の assertion へ進むため、本ローカル
実行では 2 テストが 1.01 秒で完了 (旧来は 0.3+0.3+0.2 = 0.8 秒
の固定待ち)。
- 失敗時のメッセージが明示化 ("monitor thread did not mark
training as running within 3s" など)。
L308 (real_piper_train_invocation) の time.sleep(2) は subprocess が
実在する環境でしか走らない (skipif 適用) ため今回は触らない。
quality-assurance.md §10 改善 Top 10 #5 / §9.3 (timing-sensitive
テストの race condition リスク) に対応。
* test(training): _wait_until の deadline 後 True 漏れと不要 polling を撤廃
レビュー対応 (Copilot, PR #455):
- L34: _wait_until が最後に return predicate() を返していたため、
deadline 超過後でも True に転じれば True を返してしまい 'within Ns'
保証が破られていた (docstring 不整合)。タイムアウト時は無条件で
False を返すよう修正。
- L138: start_training() は status.is_running を *同期的に* True に
した後で monitor thread を起動するため、is_running の polling は
monitor thread の起動確認にならない (即座に通過する)。同期 assert
に戻し、monitor thread が data lines を実際に処理したことは後段の
final_status.best_loss == 0.3 で間接確認する。
gate.set() 後の is_running=False を待つ polling は monitor thread が
EOF を観測するまでの非同期遷移を待つ正当な用途なのでそのまま維持。
ローカル: 2 passed (3 skipped) in 0.50s (不要な polling 撤廃で 1.01s → 0.50s)。
6 tasks
ayutaz
added a commit
that referenced
this pull request
May 16, 2026
…t 解消) cmake/ExternalDeps.cmake の URL pin (post7) と src/python_run/requirements.txt の制約 (>=0.4.1.post8) の drift を解消。Python/C++ で同じ OpenJTalk 辞書 / behavior を共有する設計意図 (file header コメント参照) を踏まえ、 PyPI 最新 (post8) に揃える方向で bump。 変更: - URL: pyopenjtalk_plus-0.4.1.post7.tar.gz → pyopenjtalk_plus-0.4.1.post8.tar.gz - SHA256: 555fdf86... → f4dfbfbe... (2 箇所、 同一 tarball 参照) 検証: scripts/check_openjtalk_version_sync.py で WARN (range constraint violation) が消え、 OK ステータス。 PR #496 の review 対応 (Copilot 指摘 #2, #5) で本 drift が露呈、 本 commit で解消。
ayutaz
added a commit
that referenced
this pull request
May 16, 2026
…sh gate (#496) * feat(workflow): /watch-pr skill, /reply-review --stale-check, 言語parity hook PR 後の手動 CI polling、Copilot の stale review 検出、WebUI/CLI/FastAPI テストの 3-way 言語リスト drift を fail-fast 化するワークフロー自動化 3 点: - `.claude/skills/watch-pr/SKILL.md`: PR の CI checks を `gh pr checks` で 1 回ポーリングし失敗 job を分類 (format drift / test fail / flake / contract drift)。`/loop /watch-pr <PR>` で継続監視。 - `.claude/skills/reply-review/SKILL.md`: `--stale-check` 追加。コメントの originalCommit と HEAD を `git log -- <path>` で比較し、コメント以降に 該当ファイルが更新済なら stale 候補として flag (memory `feedback_copilot_stale_review` の二重対応防止)。 - `scripts/check_language_parity.py` + pre-commit hook: WebUI SAMPLE_TEXTS / CLI --language choices / FastAPI test assertion の 3 個を AST で抽出して set 比較。PR #2f4efaf9 で起きた WebUI 7 言語 vs CLI 6 言語 drift の再発防止。 * feat(skills): A 級ワークフロー強化 (Copilot ノイズ skip + version-drift agent) A 級施策 2 件を反映。A5 (未統合 contract script の gate 化) は再調査の結果、 候補 3 スクリプトはすべて既に gate 化済みだったため不要 (Agent 5 調査が 古かった)。 - `.claude/skills/reply-review/SKILL.md`: `--skip-copilot-style` オプション 追加。Copilot bot (`copilot-pull-request-reviewer` または `*[bot]`) の 定型ノイズ (Consider using / Optional: / nit: / style: prefer 等) を regex で検出し、対応対象から除外。誤検出防止のため human レビュアーの コメントは除外しない。 - `.claude/skills/sync-docs/SKILL.md`: Agent 7 (Version Drift 監査) 追加。 `docs/spec/release-versions.toml` を canonical truth として、CLAUDE.md ランタイム別パッケージ表 / docs/spec/*.toml 内 version comment / CHANGELOG.md `[Unreleased]` 残留 / README Feature Matrix の 4 観点を cross-check。memory `feedback_data_asset_distribution` を補強。 * feat(workflow): B 級ワークフロー自動化 3 件 (backlog skill + CHANGELOG gate + pre-push) - `.claude/skills/check-review-backlog/SKILL.md`: 全 open PR の未解決 review thread を gh api graphql で集計、N 日 (デフォルト 7) 以上未対応の thread を backlog として表示する read-only skill。`/loop` で週次監視可能。 - `scripts/check_changelog_unreleased.py` + pre-commit hook `changelog-unreleased-cleanup`: `[Unreleased]` 内の release-style sub-heading (`### [X.Y.Z]`) が release-versions.toml::expected_prefix と major.minor 一致した場合に検出。release 後の section 移動漏れを fail-fast。 conservative 設計で prose cross-reference は flag しない。 - `.pre-commit-config.yaml` pre-push stage: opt-in (`pre-commit install --hook-type pre-push` で有効化) で full-repo の contract gate 4 個 (loanword / PUA / language parity / changelog unreleased) を ~20-30s 並列実行。`SKIP=...` で commit gate を bypass しても push 前に drift 検出可能。CLAUDE.md に install 手順を追記。 A5 (未統合 contract script の gate 化) は再調査の結果すべて gate 化済み だったため不要。 * feat(workflow): Phase 2 pre-commit hooks (15 エージェント調査の高 ROI 項目) 15 エージェント並列調査で浮上した recurring drift パターンを commit 時点で fail-fast 化する 4 hook を新規追加。各々 conservative 設計 (既存コードは allowlist or 検出ロジック緩和で通過、新規発生のみ block): - secret-path-reference: ホスト固有 secret env パスが executable code (sources / workflows / configs) に漏洩していないか検出。CLAUDE.md と docs/ 等のドキュメントは exempt、guard-bash.sh と prepare_*.py の docstring example は ALLOWLIST で legacy 許容 - openjtalk-version-sync: cmake/ExternalDeps.cmake の pyopenjtalk-plus tarball URL pin (現 0.4.1.post7) と全 pyproject.toml の version constraint の同期を tomllib で検証、 == / ~= の明示的 mismatch のみ error (bare name は warn-only) - pytest-skip-reason: tests/ 配下の skip / skipif で AST 経由 reason 存在検証、f-string / 式 / kwarg すべて accept (既存 reason 付きは通過) - gofmt: Go 第 7 ランタイムの format drift を commit 時点で検出 (scripts/run_gofmt_check.sh で exit code を整形) rustfmt は既存 Rust source に pre-existing format drift があり別 PR が 必要なため deferral (config コメントで明示)。15 エージェントが指摘した 他の中インパクト項目 (WASM RTF baseline 初期化、JA phoneme rules contract gate、auto-label workflow 等) も別 PR で個別検討予定。 * feat(skills): /release-prep — 7 manifest version 一覧 + CHANGELOG 移行支援 リリース作業の forensic check と CHANGELOG [Unreleased] 昇格を 1 skill に 集約。docs/spec/release-versions.toml を canonical source として 6 phase: 1. 9 manifest (VERSION / Cargo.toml / 2 csproj / 2 package.json / Package.swift / gradle.properties) の現 version 一覧 2. expected_prefix との照合 (warn → fail flip 判定材料) 3. CHANGELOG.md [Unreleased] → [X.Y.Z] 移行 markdown 生成 (承認後 Edit) 4. PyPI / crates.io / NuGet / npm / Maven Central の最新公開 version 取得 5. ローカル vs 公開 vs canonical の 3-way 差分表 (verdict 付き) 6. verdict 別の推奨 next action 15 エージェント調査 (Agent 5: Release ritual gap) で「manifest version 分散の多重化チェック欠落」を Critical と判定したのを踏まえ実装。 /sync-docs Agent 7 (version drift 監査) と相補的: drift 検出 + 解消支援。 変更は markdown diff として提示、Edit 適用は明示確認後 (memory feedback_merge_caution.md 準拠)。 * feat(skills): /create-pr 新規 + watch-pr / reply-review の auto-invocation 化 LLM が「PR を作って」「review に返信」「CI 監視」の文脈で skill を 自動発動できるよう disable-model-invocation を false 化、description に トリガキーワード (push 直後 / merge 前確認 / review thread resolve 等) を 追加。 /create-pr は PR 本文の標準フォーマットを強制: - 機能カテゴリ別の表 (PR レビュー支援 / リリース整合性 / Commit drift gate / Push 前確認 等) - 時系列フェーズ表現 (Phase 1/S 級 等) 禁止 — 後から読んで意味が薄い - マイルストーン非付与 (memory feedback_pr_no_milestones) - auto-merge 禁止 (memory feedback_merge_caution) - 既存 PR は body 書き換え (memory feedback_pr_body_over_comments) - guard hook が誤検出する文字列は body-file 経由で渡す release-prep / check-review-backlog は明示呼び出し維持 (誤起動リスク / 周期実行向け)。 * fix(workflow): Copilot レビュー指摘 5 件に対応 (PR #496) - run_gofmt_check.sh: set -euo pipefail を set -uo pipefail に変更し rc=$? で gofmt の exit code を明示捕捉、parse error (exit 2) を command substitution で silent abort せず propagate するよう変更 - check_openjtalk_version_sync.py: packaging.SpecifierSet で全制約形式 (== ~= >= <= > < !=) を判定、requirements*.txt も scan 対象に追加。 既存 drift (requirements.txt の pyopenjtalk-plus>=0.4.1.post8 vs cmake 0.4.1.post7) を range violation として WARN 報告で露呈。 明示 pin 違反のみ error、range 違反は warn (意図的 bound を尊重) - .pre-commit-config.yaml: secret-path-reference の files filter で CMakeLists.txt / Dockerfile / Makefile を (^|/) prefix で path 任意 位置の basename match に対応。openjtalk-version-sync の files filter に .*requirements.*\.txt を追加し dynamic deps 経路もカバー * fix(cmake): pyopenjtalk-plus を 0.4.1.post7 → 0.4.1.post8 に bump (drift 解消) cmake/ExternalDeps.cmake の URL pin (post7) と src/python_run/requirements.txt の制約 (>=0.4.1.post8) の drift を解消。Python/C++ で同じ OpenJTalk 辞書 / behavior を共有する設計意図 (file header コメント参照) を踏まえ、 PyPI 最新 (post8) に揃える方向で bump。 変更: - URL: pyopenjtalk_plus-0.4.1.post7.tar.gz → pyopenjtalk_plus-0.4.1.post8.tar.gz - SHA256: 555fdf86... → f4dfbfbe... (2 箇所、 同一 tarball 参照) 検証: scripts/check_openjtalk_version_sync.py で WARN (range constraint violation) が消え、 OK ステータス。 PR #496 の review 対応 (Copilot 指摘 #2, #5) で本 drift が露呈、 本 commit で解消。 * feat(skills): PR 作成直後の review チェック auto-chain (3 skill 連携) PR #496 で「PR 作成後にレビュー確認 skill を発動しなかった結果、 5 件の 未対応 Copilot review に気づくのが遅れた」事例を踏まえ、 /create-pr 完了 時に review + CI 確認を自動連鎖させる chain を組み込む。 変更内容: - /check-review-backlog: 引数に `--pr <N>` 単発モード追加。 既存の全 PR backlog 監視 (週次運用) と並列で、 PR 作成直後の単一 PR review 即時 確認を可能化。 disable-model-invocation: false 化、 description に 「PR 作成直後の review チェック」文脈を明記 - /create-pr: フェーズ 6 を「自動 follow-up 提案」から「auto chain 自動 実行」に強化。 Step 6.1 (Skill check-review-backlog --pr <N>) → 5秒 待ち → Step 6.2 (Skill watch-pr <N>) → Step 6.3 (集約報告) の 3 段。 feature → feature PR や dry-run は chain skip - /watch-pr: description に「PR 作成後の auto chain (/create-pr の フェーズ 6.2 から発動)」を明記、 LLM auto-invocation の文脈強化 これで「PR 作って」要求 → /create-pr 発動 → push + PR 作成 → 自動で review チェック + CI 監視 が 1 ユーザ要求で完結する。
ayutaz
added a commit
that referenced
this pull request
May 19, 2026
… runtime CLI help (#513) * docs(proposals): deferred-items を現状コードベースと突き合わせて整理 PR #511 から意図的に外された (0d690dc) deferred-items.md を本ブランチで初 commit。 HEAD 4f2ff86 の実コードと突き合わせて全体カウント (workflow 93→108 / spec 25→31 / docker 5→6 / check script 62) を更新し、 8 項目それぞれに「現状」 サブセクション を追加して既着手部分の境界を可視化 (#3 action-pin-gate 形式のみ / #4 Python 1 runtime のみ / #5 穴 12→5 / #7 grep のみで実行は別 / #8 coverage のみ)。 #2 SLSA L3 で 親調査の想定 release workflow 名と実態の不一致 (PyPI/NuGet dedicated workflow 不在) を明示。 これにより「何が技術的不可能 / 何が単に未着手か」 の境界が PR #511 マージ 後の HEAD 基準で再確定する。 * docs(proposals): deferred-items の要求定義 (v0.1 draft) を追加 proposal (ci-expansion-deferred-items.md) を実装可能 PR scope に分解するため 8 項目それぞれを FR/NFR/AC/CON/DEP の ID 付き要件として整理。 「Claude Code が実装する部分」 と「user の明示判断が必要な部分」 を要件ごとに分離し、 受け 入れ基準を自動検証可能な形に落とした。 Tier 1 (即着手) / Tier 2 (個別 PR) / Tier 3 (別 milestone) の優先度マトリクスと、 PR #511 informational tier silent-zero pattern 再発防止を NFR-3.2 / NFR-5.2 / NFR-5.3 で構造化。 codespell ignore に in-toto attestation framework の "intoto" を追加 (SLSA L3 provenance file 拡張子 .intoto.jsonl のため正式表記)。 * docs(proposals): deferred-items の要件定義書 (v0.1 draft) を追加 要求定義 v0.1 (FR/NFR/AC の ID 付き列挙) を受けて、 Tier 1 (#3 Rekor + SHA drift / #4 CLI help auto-extract) を I/O 仕様・データ構造・処理シーケンス・ トリガー条件・エラーケース・既存資産との接続まで詳細化。 Tier 2 / Tier 3 は overview レベル (後続要件定義 PR で詳細化)。 sticky comment / Issue auto-create / baseline JSON / CLI help txt の汎用 interface format を §6 で集約、 silent-zero 対策を NFR-6.3 / AC-3.3 / fixture test で 3 重に構造化 し PR #511 phase 2 教訓を実装レベルに織り込む。 既存 31 spec / 62 check script / 108 workflow との具体的 wiring を §2.2 / 各機能 §X.9 で明示。 * docs(tickets): deferred-items を 4 milestone × 23 ticket に分解 PR #511 で defer された 8 項目を実装可能な PR scope に分解。 proposal / 要求定義 / 要件定義書 (3 ドキュメント chain) の下流として、 docs/tickets/ に milestone + ticket 集約を新設。 ## 構造 - docs/tickets/README.md — milestone × ticket 対応表 - docs/tickets/_template.md — 9 セクション ticket テンプレート - docs/tickets/milestones/ — M1〜M4 (Tier 1 / Spec & Docs / Supply Chain / Docs Infra) - docs/tickets/tickets/ — T-001〜T-023 (proposal #1〜#8 を PR 単位に展開) ## マイルストーン - M1 Foundations (Tier 1): T-001 Rekor verify / T-002 SHA drift / T-003 CLI help - M2 Spec & Docs Gates: T-004〜T-008 (5 spec gate) + T-009〜T-011 (doc examples 3 phase) - M3 Supply Chain: T-012〜T-016 (Distroless 5 image) + T-017〜T-021 (SLSA L3 5 registry) - M4 Docs Infra: T-022 mkdocs / T-023 test aggregation ## 各 ticket の内容 (9 セクション) タスク目的とゴール / 実装内容詳細 / agent team / unit & e2e test / 懸念事項とレビュー項目 / 一から作り直すとしたら / 後続への申し送り / 参照 / 変更履歴。 各 milestone にもフェーズごとの「一から作り直すとしたら」 設計思考を 2-3 案記載。 ## 上流 docs への back-link proposal / 要求定義 / 要件定義書 の 3 docs 末尾に「下流ドキュメント」 セクションを追加し、 双方向参照を確立。 ## 検証 - markdownlint-cli2: 0 error (29 file) - codespell: pass (re-usable / patten タイポ 2 件修正) - pre-commit (full set): pass * docs(tickets): T-001/T-002/T-003 Status → レビュー待ち + 実装完了履歴 * feat(ci): T-002 action SHA drift detector T-002 implementation per docs/tickets/tickets/T-002-action-sha-drift.md. - scripts/check_action_sha_drift.py: GitHub API resolve + silent-zero defence - scripts/action_sha_baseline.json: schema_version=1 initial baseline (2 entry) - .github/workflows/action-sha-drift.yml: weekly + PR base, informational tier - tests/scripts/test_check_action_sha_drift.py: 14 tests, all passing - tests/scripts/fixtures/action-sha-drift/*: silent-zero fixtures * feat(ci): T-001 Rekor verify workflow (informational tier) PR #511 introduced cosign-release-artifacts.yml as the *signing* side of release artifact provenance. This PR adds the *verifying* side: weekly, walks the N most recent releases and runs cosign verify-blob against Rekor (T-001 / proposal #3a). certificate-identity-regexp / certificate-oidc-issuer are mirrored byte- for-byte from PR #511 (M1-R3) and a unit test asserts they still appear in cosign-release-artifacts.yml — drift is caught at PR review. - scripts/verify_rekor_releases.py: gh release list -> per-release asset pairing -> cosign verify-blob, silent-zero defence, --fixture mode for offline tests, --report path for sticky/Issue body - .github/workflows/rekor-verify.yml: weekly schedule (Mon 03:00 UTC, 1h before T-002), cosign-installer v3.8.1 / cosign-release v2.4.1 (mirror of PR #511), Issue auto-create on fail (label rekor-verify-failure) - tests/scripts/test_verify_rekor_releases.py: 15 tests (PR #511 mirror assert / skip vs fail / cosign argv shape / silent-zero / golden + legacy fixtures) - tests/scripts/fixtures/rekor-verify/{golden,legacy}_release.json: golden (sig+pem present), legacy (cosign-predating release) Tier: informational. CI green even on verify failure (continue-on-error). 4 consecutive green weekly runs gate blocker promotion (CON-3.1). Ticket: docs/tickets/tickets/T-001-rekor-verify.md * feat(ci): T-003 cli-help-extract phase A (python only) T-003 phase A per docs/tickets/tickets/T-003-cli-help-extract.md. Only python runtime active in matrix; rust/csharp/go/wasm/cpp are scaffolded as TODO and will be added in subsequent PRs to keep wall clock under NFR-1.4 (10 min) and review tractable. - scripts/sanitize_cli_help.py: runtime-aware sanitize entry point - scripts/sanitize_cli_help_rules.toml: 11 rules - docs/reference/cli-help/python.txt: canonical w/ <TIMESTAMP>/<VERSION> - .github/workflows/cli-help-extract.yml: matrix scaffold + sticky - tests/scripts/test_sanitize_cli_help.py: 14 tests - tests/scripts/fixtures/cli-help/{raw,expected}/python.txt - .pre-commit-config.yaml: exclude docs/reference/cli-help/*.txt + tests/scripts/fixtures/cli-help/{raw,expected}/*.txt from editorconfig (argparse continuation indent != multiple of 4) * feat(ci): T-003 expand to 6 runtime matrix (python/go/rust/wasm real + csharp/cpp placeholder) User 要求 (「全部同じブランチ」、 「rust/csharp/go/wasm/cpp も全て同じブランチで対応」) を受けて T-003 を phase A (python のみ) から 6 runtime full に拡張。 - python/go/rust/wasm: ローカル build に成功し実 --help を sanitize して docs/reference/cli-help/<runtime>.txt に canonical 化 - csharp: .NET SDK 10.0.100 不在 (ローカル 9.0.115) のため PLACEHOLDER canonical を commit。 workflow drift-check は # PLACEHOLDER: marker を 含む canonical を SKIPPED として扱い、 別 PR で workflow_dispatch 経由で 本番 canonical を commit する運用とする - cpp: CMake / ONNX Runtime setup 不在のため同様 PLACEHOLDER - workflow: matrix を 6 runtime に拡張、 Rust binary 名 piper-plus-cli を source 文字列に反映、 dtolnay/rust-toolchain@stable は既存 baseline 経由で action-pin-gate を pass - test: 6 runtime parametrize で header + placeholder marker を 25 assert * fix(docs): lychee link errors in tickets/_template.md (inline-code placeholders) lychee は file existence を check するため、 _template.md 内の placeholder link 3 件 (M?-slug.md / proposals/... 相対パス誤り) で fail していた (PR #513 lychee job exit 2)。 これらは「template の例示」 であり実 link として resolve させない 意図のため、 inline code 形式 (backtick wrap) に書き換えて lychee の include_verbatim=false 設定で skip 対象とする。 - line 4 (Milestone placeholder) - line 177-178 (proposals/... example linkの 2 件、 ticket 配下用 path だが template は 1 階層浅いため lychee が confused) 3 link errors を inline code 化で skip、 lychee がそのまま green になる想定。 * fix(ci): address Copilot review on PR #513 (10 logic + silent-failure issues) T-001 (Rekor verify): - find_assets_for_release: pair artifact with .cosign.bundle (PR #511 actual output) instead of legacy .sig/.pem; legacy releases now classify SKIPPED via empty bundle field, not via missing sig/pem - verify_blob: use cosign --bundle flag (matches PR #511 sign-blob --bundle) - run_verify: thread cosign_cmd through to verify_blob (--cosign-cmd was parsed but unused — dead flag) - main: treat status='error' as failure (was silently green) - rekor-verify.yml: fail flag uses script exit code, not report grep; explicit fail when report.md is missing - test: lock bundle convention with mirror assert against PR #511 yaml; 20 tests (up from 15) T-002 (action SHA drift): - baseline.json: add _note field clarifying use-site vs unique-pair shape (expected_total_pins=3 use-sites / allowlist=2 unique action+sha pairs) - check_action_sha_drift.py: docstring no longer claims live-mode dangling detection (it does not); explicit note that dangling status is offline- mode only against baseline allowlist T-003 (CLI help extract): - cli-help-extract.yml drift-check: - run on schedule (was excluded — weekly drift signal was lost) - walk full 6-runtime set instead of artifact list (so cpp + csharp show as SKIPPED via PLACEHOLDER marker even when build step produces no artifact) - always write report.md (even 0-artifact case) so sticky/Issue steps do not reference missing file - new CAPTURE_FAILED status for builds that produced no artifact - Issue auto-create gated on diff_count output (was based on undefined steps.diff.outputs.exit_code) 59 unit tests pass (up from 54). * fix(ci): sanitize onnxruntime PCI warning so python --help is reproducible across runners PR #513 first run revealed python DRIFT: GitHub Linux runner's `python -m piper --help 2>&1` captures an onnxruntime PCI bus scan warning to stderr that local macOS dev env (no ACPI device path) never emits. Add 2 sanitize rules: - main rule: timestamped `\[W:onnxruntime:\...\]` lines (whole-line strip) - fallback: same warning shape without leading timestamp Unit test additions (27 / 25 pass): - test_apply_rules_strips_onnxruntime_pci_warning - test_apply_rules_strips_onnxruntime_warning_without_timestamp * fix(ci): reorder sanitize rules — ANSI strip must precede caret-anchored rules PR #513 第 2 CI run の sticky で python が DRIFT 検出され続けたため、 sanitize step に一時 debug 出力を追加して確認した結果、 Linux GitHub runner の `python -m piper --help 2>&1` が onnxruntime PCI warning を先頭 \x1b[0;93m で prefix した状態で stderr に出力していた (NO_COLOR=1 inject は onnxruntime に 無効)。 既存 rule 順序は ANSI escape strip を timestamp / onnxruntime rule の 後に置いていたため、 ^-anchored の onnxruntime rule は文字列先頭が ESC byte で あり digit ではないため match せず、 warning がそのまま canonical に流入していた。 Fix: - scripts/sanitize_cli_help_rules.toml の ANSI rule を位置 1 (timestamp 前) に 移動。 順序不変条件 (ANSI MUST run before ^-anchored rules) を冒頭 docstring と ANSI rule note に明記 - tests/scripts/test_sanitize_cli_help.py に regression test を追加 (test_apply_rules_strips_ansi_prefixed_onnxruntime_warning)。 実 CI sticky から取得した byte sequence (\x1b[0;93m prefix + warning + \x1b[m\n suffix) を入力に、 ANSI と warning の両方が削除されることを assert 28 sanitize tests pass (was 27)。 Note: この commit は元々 debug + revert の 2 commit (前 286aba9 + e62529d) として push されたが、 commitlint type-enum で 'debug' 不可のため soft reset で 1 commit に統合 + force-with-lease push し直した。
ayutaz
added a commit
that referenced
this pull request
May 19, 2026
8 項目のうち 3 件 (Sigstore Rekor + Action SHA drift / 6 runtime CLI help canonical / spec sync gate × 5 件) が PR #513 と #517 で実装完了したため、 proposal / 要求定義 / 要件定義書の 3 doc を最新化。 - proposal (ci-expansion-deferred-items.md): - 進捗状況セクション新設 (8 項目 status table: 完了 3 / 部分着手 1 / 未着手 4) - 全体カウント更新 (workflow 108→111、 spec 31→32、 check 62→66) - #3 / #4 / #5 各 section 冒頭に「実装完了 (PR #N、 commit)」 marker を追記 - 基準点を 4f2ff86 → eee9d5f に更新 - 要求定義 (requirements.md): v0.2、 4.3 / 4.4 / 4.5 に完了 marker、 §6 優先度マトリクスに Status 列を追加 - 要件定義書 (system-requirements.md): v0.2、 §3 と §4.1 に完了 marker、 §4.1 の表を「実装結果」 表現に書き換え (5 spec それぞれの実装方式) 実装変更なし、 docs のみ。
27 tasks
ayutaz
added a commit
that referenced
this pull request
May 19, 2026
…us (#518) * docs(tickets): reflect spec sync gates merge in milestone/ticket Status PR #517 (commit f3ef12c) で完了した spec sync 関連 5 件の作業計画 entry を、 内部の docs/tickets/ ディレクトリ側にも反映する admin-only 更新。 - docs/tickets/README.md: 該当 milestone 行を「着手中 (...新規実装中)」 → 「一部完了 (spec sync 5 件 = PR #517 merged、 doc examples 3 phase 計画中)」 - docs/tickets/milestones/M2-spec-and-docs.md: Status を 計画中 → 一部完了、 配下 ticket table の 5 entry を 完了 / PR #517 に更新、 変更履歴に追記 - T-005/T-006/T-008 ticket header: Status / PR field を merged 状態に更新 (T-004/T-007 は PR #517 内で既に更新済み) 実装変更なし、 docs のみ。 * docs(proposals): reflect PR #513 / #517 merge in 3 proposal docs 8 項目のうち 3 件 (Sigstore Rekor + Action SHA drift / 6 runtime CLI help canonical / spec sync gate × 5 件) が PR #513 と #517 で実装完了したため、 proposal / 要求定義 / 要件定義書の 3 doc を最新化。 - proposal (ci-expansion-deferred-items.md): - 進捗状況セクション新設 (8 項目 status table: 完了 3 / 部分着手 1 / 未着手 4) - 全体カウント更新 (workflow 108→111、 spec 31→32、 check 62→66) - #3 / #4 / #5 各 section 冒頭に「実装完了 (PR #N、 commit)」 marker を追記 - 基準点を 4f2ff86 → eee9d5f に更新 - 要求定義 (requirements.md): v0.2、 4.3 / 4.4 / 4.5 に完了 marker、 §6 優先度マトリクスに Status 列を追加 - 要件定義書 (system-requirements.md): v0.2、 §3 と §4.1 に完了 marker、 §4.1 の表を「実装結果」 表現に書き換え (5 spec それぞれの実装方式) 実装変更なし、 docs のみ。 * docs(tickets): clarify scope-narrowing in T-005/T-006/T-008 ticket bodies (PR #518 review) Copilot review 3 件指摘: header の Status を merged 状態に更新したが、 本文の original 提案記述 (Done definition / 許容値域 / 対象 runtime) が 実装 scope と整合していなかった。 各 ticket の header 直後に 「Note (PR #517 merge 後の scope 補足)」 section を追加し、 実装 scope と 未実装分を明示する形で対応 (本文の original 提案は historical record として保持、 reword せず scope 補足 only)。 - T-005: 8 runtime loader 突合 → 構造健全性 scope に絞った理由 (spec の sha256 が <computed-on-publish> placeholder のまま) を明記、 未実施分は publish パイプライン整備後の別 PR - T-006: 365 日含む例示 → 実 spec の {1, 7, 30, 90} 4 category に整合、 baseline 違反 1 件 (365 日 typosquatting-watch) を 90 日に migrate 済み - T-008: 8 runtime 提案 → 実装は spec の applies_to = [python, rust, go, csharp] 4 runtime に揃え、 WASM/C++/Kotlin/Swift 拡張は別 spec で別 PR
ayutaz
added a commit
that referenced
this pull request
May 20, 2026
… + require baseline build PR #523 review (Copilot) 5 件のうち、 現 commit chain で実態が変化した 1 件を除く 4 件に根本対応。 表面取り繕いはせず、 distroless 実態と canonical 経路の signal 整合性を取り直す。 - python alias 問題 (Copilot指摘 #2/#3/#4 同根): gcr.io/distroless/python3-debian12 ships /usr/bin/python3 のみ。 `python` symlink は debian / distroless どちらでも default では 存在しない (debian の python-is-python3 package がないと作られ ない)。 - Dockerfile ENTRYPOINT/HEALTHCHECK CMD の `python` を `/usr/bin/python3` 絶対パスに変更 (PATH 経由の name resolution に依存しない設計)。 - workflow smoke step の `--entrypoint python` を `--entrypoint /usr/bin/python3` に変更。 - /usr/local/bin/uvicorn の COPY を撤回 (Copilot指摘 #3): pip-generated console script の shebang は builder の `#!/usr/local/bin/python` を hardcode。 final stage には /usr/local/bin/python が存在しない (interpreter は /usr/bin/python3 のみ) ため、 uvicorn を直接 exec すると shebang 解決 fail。 ただし inference.py が `import uvicorn; uvicorn.run(...)` で起動する programmatic invocation のみ使うため、 console script はそもそも 不要。 「壊れた状態の uvicorn 実行ファイルを置いておく」 のは reviewer 混乱の元になるため削除。 site-packages 内の uvicorn module は import 経由で動作する。 - baseline build の continue-on-error: true を削除 (Copilot指摘 #5): canonical Dockerfile.cpu は HF Space deploy 経路。 build が壊れて いれば trial の size 比較は意味を失う + canonical 自体が silently red になる二重リスク。 required (default) に戻して、 canonical 破損 は即 fail で見えるようにする。 未対応の指摘 1 件 (Copilot #1 = chainguard:latest 固定 reproducibility) は commit 00b6ed3 で chainguard 自体を gcr.io/distroless に置き換え 済みのため stale。 review thread に reply で経緯を返答する。
ayutaz
added a commit
that referenced
this pull request
May 20, 2026
* feat(docker): trial distroless variant for python-inference (CPU) M3 distroless 化を derisk する trial PR。 既存 Dockerfile.cpu と docker-compose / HF Space deploy 経路は不変更で残し、 並行 Dockerfile.cpu.distroless を新設して build / size / smoke test を CI で実証する scope。 - 新規 Dockerfile (Dockerfile.cpu.distroless): multi-stage build (builder = python:3.13-slim-trixie、 final = cgr.dev/chainguard/ python:latest)。 builder で piper_plus_g2p[all] + piper_train [inference] + Gradio WebUI requirements + NLTK data を install、 final へ Python site-packages + /usr/local/bin/uvicorn + 必要な shared libs (libsndfile / libgomp / libFLAC / libvorbis / libogg / libopus / libmpg123) を COPY - 新規 CI workflow (python-inference-distroless-trial.yml): PR base + workflow_dispatch、 canonical Dockerfile.cpu を baseline として build、 distroless trial を build、 image size 比較、 import smoke test 2 種を実行、 PR コメントに sticky report 投稿 - scope 限定: linux/amd64 single-arch CI build のみ、 multi-arch (arm64) は別 PR、 /v1/audio/speech E2E は別 PR、 CVE 比較 (Trivy) は canonical 置換 PR 側、 HF Space staging deploy 検証は user 手動 step (Claude Code は実行不可) - promotion path: trial PR で build 成立 + size 削減効果が確認 できた後、 別 PR で Dockerfile.cpu 自体を置換 (HF Space staging で cold start 検証後) * fix(ci): regenerate doc-examples audit snapshot after ticket header edit scripts/check_doc_examples.py audit が docs/tickets/tickets/T-012-* に 追記した scope note の line shift を検出したため snapshot を再生成。 line_start/line_end が +10 ずれただけで block の hash_sha1 と category は 不変。 doc-examples-gate が PR base trigger でこの drift を fail として 拾ったので、 trial PR scope に含めて修正。 * fix(ci): split distroless trial smoke into pure-python (required) + known-risk dlopens CI run on PR #523 revealed that onnxruntime's C extension (linked against builder's libc) fails to load inside chainguard/python's runtime. soundfile's dlopen of libsndfile carries the same class of risk. Promotion-blocking, but exactly the gap the trial PR is meant to MEASURE — not to crash on. Split the smoke step: - pure-Python imports (piper_train / FastAPI / uvicorn) stay required. These prove the multi-stage site-packages COPY landed correctly. - onnxruntime + soundfile become `continue-on-error: true` known-risk probes. The report.md surfaces PASS/FAIL/SKIPPED per probe so the promotion PR has clear signal on which base image to switch to (likely gcr.io/distroless/python3-debian12 — Debian-glibc baseline matches the debian-slim builder, with the trade-off of pinning Python 3.11). Also: - Make report.md generation `if: always()` so a failed smoke still produces the sticky comment. - Gate sticky-comment post on hashFiles('...report.md') != '' so a truly missing file doesn't escalate to a hard CI failure. * fix(docker): switch distroless base from chainguard/python to distroless/python3-debian12 (ABI root cause) Previous trial used cgr.dev/chainguard/python:latest as the final stage and python:3.13-slim-trixie as the builder. CI run on PR #523 failed with ModuleNotFoundError on onnxruntime.capi.onnxruntime_pybind11_state — the root cause is that chainguard/python is Wolfi-based with its own glibc/Python ABI, distinct from debian-slim. Pre-built onnxruntime wheels cannot resolve symbols across that boundary. The previous follow-up commit (b04583d) wrapped the failing smoke steps with `continue-on-error: true`, which masked the symptom without fixing the cause. That commit is effectively reverted here: smoke tests are back to required + executed in a single docker run. Root fix: - builder: keep python:3.11-slim-trixie (Debian, glibc-2.36+ via bookworm) - final: switch to gcr.io/distroless/python3-debian12 Both stages share Debian-glibc ABI, so onnxruntime's pre-built C extension and soundfile's libsndfile dlopen succeed by construction. Python version aligns at 3.11 with the canonical Dockerfile.cpu (no Python version drift). distroless/python3-debian12 ships UID 65532 nonroot by default and has no shell / package manager, meeting the trial's distroless goals. Trade-off vs. Wolfi: Debian baseline carries slightly more inherited package state than Wolfi, but it's already the SBOM surface of Dockerfile.cpu, so there's no new attack surface relative to canonical. * ci(docker): wire Dockerfile.cpu.distroless into hadolint / trivy / docker-build PR #523 で新設した Dockerfile.cpu.distroless は専用 workflow (python-inference-distroless-trial.yml) でしか build されておらず、 既存 docker workflow chain (hadolint lint / trivy CVE scan / docker-build multi-arch build) が pickup していなかった。 関連する docker ビルドが全部走って動くことを保証するため、 3 workflow に trial Dockerfile を追加。 - hadolint.yml: matrix.dockerfile list に docker/python-inference/Dockerfile.cpu.distroless を追加。 PR base trigger で Dockerfile lint が走り、 構文 / best-practice 違反を 既存と同じ gate で catch - trivy-container-scan.yml: target matrix に python-inference-cpu-distroless を追加。 専用 trial workflow の size 比較とは別軸で CVE 数値の SARIF を生成し GitHub Security tab に upload (CRITICAL のみ PR fail、 既存 conservative policy 継続) - docker-build.yml: 新 job build-python-inference-cpu-distroless-trial を追加。 既存 build-python-inference-cpu と同じ multi-arch (linux/arm64 + linux/amd64) で buildx build、 PR では push しない (canonical 経路ゼロ影響)。 trial 専用 workflow が amd64-only (A/B size 比較のため) で cover できない arm64 build 互換性を 保証する これで PR #523 が触る trial Dockerfile は専用 workflow + 3 既存 docker workflow の合計 4 経路で build + lint + scan が走る形に なり、 「関連 docker build がすべて動く」 状態を CI で実証できる。 * fix(docker): arch-neutral lib staging + hadolint registry allow-list PR #523 CI で 2 件の関連 docker workflow が fail。 いずれも表面取り繕い ではなく根本対応: 1. hadolint DL3026 (use only an allowed registry in FROM): gcr.io が .hadolint.yaml の trustedRegistries に未登録だったため、 gcr.io/distroless/python3-debian12 を base にした Dockerfile が lint で reject されていた。 gcr.io を allow-list に追加 (理由 コメント付き)。 vendor registry の policy 拡張で、 base image 切替 のたびに lint 設定を後追い修正する状況を解消。 2. docker-build multi-arch build fail (linux/arm64 で `lstat /usr/lib/x86_64-linux-gnu: no such file or directory`): Debian multiarch layout で arch 別 triplet ディレクトリは x86_64 → /usr/lib/x86_64-linux-gnu/ aarch64 → /usr/lib/aarch64-linux-gnu/ と分かれており、 hardcoded x86_64 path での COPY は arm64 build で必ず破綻する。 設計を変更して builder stage で必要な lib を /opt/runtime-libs/ にまとめてから final stage が arch 不問で COPY する形に変更。 bash wildcard ('*-linux-gnu/') を builder 側で 1 回 resolve させ、 final stage は単一 deterministic path のみを参照。 両 fix を統合的に testing できるよう、 既存 4 workflow chain (専用 trial workflow + hadolint + trivy + docker-build) で build / lint / scan / multi-arch build をすべて走らせる。 * fix(docker): use /usr/bin/python3 absolute path + drop uvicorn binary + require baseline build PR #523 review (Copilot) 5 件のうち、 現 commit chain で実態が変化した 1 件を除く 4 件に根本対応。 表面取り繕いはせず、 distroless 実態と canonical 経路の signal 整合性を取り直す。 - python alias 問題 (Copilot指摘 #2/#3/#4 同根): gcr.io/distroless/python3-debian12 ships /usr/bin/python3 のみ。 `python` symlink は debian / distroless どちらでも default では 存在しない (debian の python-is-python3 package がないと作られ ない)。 - Dockerfile ENTRYPOINT/HEALTHCHECK CMD の `python` を `/usr/bin/python3` 絶対パスに変更 (PATH 経由の name resolution に依存しない設計)。 - workflow smoke step の `--entrypoint python` を `--entrypoint /usr/bin/python3` に変更。 - /usr/local/bin/uvicorn の COPY を撤回 (Copilot指摘 #3): pip-generated console script の shebang は builder の `#!/usr/local/bin/python` を hardcode。 final stage には /usr/local/bin/python が存在しない (interpreter は /usr/bin/python3 のみ) ため、 uvicorn を直接 exec すると shebang 解決 fail。 ただし inference.py が `import uvicorn; uvicorn.run(...)` で起動する programmatic invocation のみ使うため、 console script はそもそも 不要。 「壊れた状態の uvicorn 実行ファイルを置いておく」 のは reviewer 混乱の元になるため削除。 site-packages 内の uvicorn module は import 経由で動作する。 - baseline build の continue-on-error: true を削除 (Copilot指摘 #5): canonical Dockerfile.cpu は HF Space deploy 経路。 build が壊れて いれば trial の size 比較は意味を失う + canonical 自体が silently red になる二重リスク。 required (default) に戻して、 canonical 破損 は即 fail で見えるようにする。 未対応の指摘 1 件 (Copilot #1 = chainguard:latest 固定 reproducibility) は commit 00b6ed3 で chainguard 自体を gcr.io/distroless に置き換え 済みのため stale。 review thread に reply で経緯を返答する。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
…より、全ての履歴を取得できるように変更。