Conversation
多観点レビューで検出した不具合を修正する。 - Storage(workspaces.json) にプロセス間ロックを追加し、add/remove/touch の read-modify-write を直列化(更新の取りこぼし=lost update を防止)。 - session create/remove のロック順を是正。reconcile を store ロック内で実行する reconcile_locked に分離し、create→build→record をひとつのロックで保護して、 並行する create がまだ未記録の worktree を stray として誤削除する競合を防ぐ。 - JSON enum の未知値が settings.json / state.json 全体の読み込みを失敗させる 前方互換ギャップを修正。domain::serde_fallback::or_default で該当フィールドを 既定値に縮退させる(AgentCli/Theme/SessionActionUi/Sidebar/BranchSource/ BranchStatus)。frontmatter 側の「未知キーは無視」と挙動を揃える。 - PTY リサイズの順序を修正。parser ロック内で master.resize と set_size を 原子的に行い、reflow 出力が旧サイズのグリッドで解釈される一過性の表示崩れを防ぐ。 - 埋め込みターミナルのマウスホイール判定を pane_cell に統一し、ペインの上下 (タブ列・最終行より下)でも誤スクロールしていた問題を修正。 - MemoryStore::write_locked にも単一コンポーネント検証を適用し、read/remove と 防御を対称化(パストラバーサルの多層防御)。 - TUI の tasks/sessions_refresh のロックを poison 時にクラッシュさせず復帰する 方針(terminal_pool と同一)に統一。 - ドキュメント整合: domain の外部クレート依存(serde/chrono)を実態に合わせて 規約を明確化、モジュール表に agent_feature.rs / serde_fallback.rs / cli feature を 追記、state.json/settings.json の前方互換・workspaces.json のロックを記載。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
📊 Test Coverage
🎉✨ パーフェクト!全ファイル Lines カバレッジ 100% を達成しました 🏆🐰 |
Merged
kkyosuke
added a commit
that referenced
this pull request
Jun 25, 2026
## 目的 `1.2.0` → `1.2.1` のリリース。`Cargo.toml` の version を上げ、マージ時に `auto-release.yml` がタグ `v1.2.1` とリリースを自動生成する。 ## 変更内容 - `Cargo.toml` / `Cargo.lock` の version を `1.2.0` → `1.2.1` に更新。 ### このリリースに含まれる変更(v1.2.0 以降) - fix: コードレビュー指摘の修正(堅牢性・前方互換・セキュリティ) (#333) - feat(tui): 在席で agent を指定して起動できるようにする (#334) - refactor(session): 表示ラベル解決を presentation へ寄せ、new の Mode キーを統合する (#332) - refactor(infra,usecase): version envelope と設定セッターのボイラープレートを削減する (#330) - refactor(mcp): issue/memory の filter Args を flatten で一本化する (#329) - refactor(agent): program 名を AgentCli::command に一本化する (#328) - feat(tui): コマンド引数(サブコマンド・オプション)も Tab 補完する (#331) - refactor(tui): widgets から rabbit アセットを分離する (#323) - fix: コードレビュー指摘の修正(並行性・前方互換・堅牢性) (#327) - feat(error-log): 静かに握りつぶされる本物の失敗をログに記録 (#325) - fix: アップデート告知と更新後メッセージの文言を変更 (#324) ## テスト・確認方法 - version のみの変更。`release-build-check.yml` が 4 プラットフォームのリリースビルドを検証する。 - マージ後、`auto-release.yml` → `release.yml` でタグ `v1.2.1` と GitHub Release が自動生成される。 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.
目的
最新
mainのコードを複数観点(セキュリティ / 並行性・正確性 / アーキテクチャ / TUI / 永続化)でレビューし、検出した不具合をまとめて修正する。変更内容
🔴 HIGH
Storage(workspaces.json) にプロセス間ロックを追加 (storage.rs/usecase/workspace.rs)add/remove/touchは read-modify-write なのにロックが無く、複数 usagi プロセス(複数 TUI+各セッションのusagi mcp)が同時に書くと last-writer-wins で登録やtouchを取りこぼした。WorkspaceStoreと同形のlock()(flock) を追加し、load→変更→save 全体を直列化。🟠 MEDIUM
usecase/session/mod.rs/reconcile.rs)reconcileが store ロックの前にロック無しで走り、未記録の worktree を stray として force 削除する競合があった。reconcile_lockedを分離し、create(reconcile→worktree 構築→record) とremoveをひとつのロックで保護。domain/serde_fallback.rsほか)enum フィールドの未知値が
settings.json/state.json全体の読み込みを失敗させた。or_defaultで該当フィールドのみ既定値に縮退(AgentCli/Theme/SessionActionUi/Sidebar/BranchSource/BranchStatus)。frontmatter の「未知キー無視」と挙動を揃えた。infrastructure/pty.rs)master.resizeをロック外で先行実行していたため reflow 出力が旧サイズのグリッドで解釈され得た。parser ロック内で resize とset_sizeを原子化。tui/home/terminal_pane.rs)列だけで判定していたためペインの上下でも誤スクロールした。
pane_cellによる両軸判定に統一。🟡 LOW
MemoryStore::write_lockedのパス検証 を read/remove と対称化(多層防御)。tasks/sessions_refreshのロックを poison 時にクラッシュさせず復帰する方針(terminal_poolと同一)に統一。📝 ドキュメント
domainの外部クレート依存(永続化のserde・時刻のchrono)を実態に合わせ規約を明確化。agent_feature.rs/serde_fallback.rs/cli featureを追記。state.json/settings.jsonの前方互換とworkspaces.jsonのロックをdata/に記載。検討の上で見送り(理由を明記)
SystemRunner/OllamaBackendの infrastructure への移設は見送り。CommandRunnerトレイトはusecaseにあり、impl だけをinfrastructureに移すとinfrastructure → usecaseの依存逆流になる(本プロジェクトはusecase → infrastructure)。正しく直すにはトレイトを domain port へ抽出する大きめのリファクタが必要で、doctor 専用ユーティリティに対しては過剰。別 issue 化が妥当と判断。テスト・確認方法
cargo fmt/cargo clippy --all-targets -- -D warnings通過。cargo test: 1676 passed, 0 failed。scripts/coverage.shの閾値で EXIT=0)。Storage::lock、未知 enum の縮退(settings/state)、writeのパス検証、ロック poison 復帰(tasks/sessions_refresh)。🤖 Generated with Claude Code