Skip to content

fix(#265): モニタ抜き差し後のレイアウト崩れとアートワーク消失を修復#266

Merged
GeneralD merged 7 commits into
mainfrom
fix/#265-layout-reconciliation-after-display-change
Jun 12, 2026
Merged

fix(#265): モニタ抜き差し後のレイアウト崩れとアートワーク消失を修復#266
GeneralD merged 7 commits into
mainfrom
fix/#265-layout-reconciliation-after-display-change

Conversation

@GeneralD

@GeneralD GeneralD commented Jun 11, 2026

Copy link
Copy Markdown
Owner

type severity scope diff files tests breaking

Closes #265

根本原因

1. レイアウト崩れ(歌詞の重なり・壁紙の偏り)

ディスプレイ再構成中、window server はアプリの裏でウィンドウを移動・リサイズする(切断ディスプレイからの退避、再接続時の復元など)。一方 lyra がジオメトリを再適用するのは モデル値 (resolveLayout() の結果) が前回と変わったときだけ だった:

  • AppPresenter.onWindowFrameChangeremoveDuplicates { $0.windowFrame == $1.windowFrame } でゲート
  • モデル値が同じままシステム側だけが実ウィンドウを動かすと、そのズレは永遠に修復されない

ズレたウィンドウ内では、AppKit が contentView を自動リサイズする一方:

  • hostingView(autoresizing なし)は古い hostingFrame のまま → SwiftUI の GeometryReader が誤ったサイズで歌詞カラムを組む → 行の重なり・はみ出し
  • AVPlayerLayer は attach 時の frame +比例 autoresizing 頼みで再適用されない → 壁紙が画面の一部に偏る

抜き差しを繰り返すほどズレが固定化し、再起動(全ジオメトリ再構築)でのみ直る — issue の症状と一致します。

2. アートワーク消失

TrackInteractorImpl.artworkmap(\.artworkData) の素通しだったため、同一トラックの artwork なし再ブロードキャスト(ディスプレイ再構成時などに MediaRemote が発する)で表示中のアートワークが nil 上書きされていた。

修正方針 — 照合は履歴とでなく実状態と

変更 内容
AppPresenter.onWindowFrameChange removeDuplicates を撤去。解決レイアウトの emit ごとに毎回再適用
AppWindow.apply 冪等な再適用に変更。surface.frame が一致していれば setFrame をスキップ(通知ループ防止)し、container / hostingView / AVPlayerLayer のジオメトリを毎回再アサート。playerLayer は wallpaper scale の transform を保持するため frame でなく bounds + position で設定
ScreenInteractor.screenChanges NSWindow.didMove / didResize を merge。システムがウィンドウを動かした直後にも再解決が走る(apply 側が冪等なので自己発火はループしない)
TrackInteractorImpl.artwork scan で直前トラックと比較し、同一トラック(sameTrack 判定)の間は最後のアートワークを保持。トラック変更時の nil は従来どおりクリア
ループ安全性の説明

applyLayoutsetFramedidResize 通知 → screenChanges → 再解決 → apply という循環が起きうるが、2 周目では surface.frame == layout.windowFrame が成立して setFrame がスキップされるため、通知が再発火せず 1 バウンドで収束する。vacant モードの 5 秒ポーリングも同様に no-op になる。

テスト

  • AppPresenterTests: 旧仕様テスト(dedup を検証)を新仕様(同一フレームでも毎回発火)に置き換え
  • AppWindowTests: ① frame 一致時の setFrame スキップ、② システムに改変された container / hostingView / playerLayer ジオメトリの修復、③ wallpaper scale transform の保持
  • ScreenInteractorImplTests: NSWindow.didMove / didResize での emit(parameterized)
  • TrackInteractorArtworkTests: 同一トラック nil イベントでの保持+トラック変更時のクリア

swift test 全 924 件パス(2 連続)、make lint クリーン。

検証の限界

実モニタの抜き差しを伴う再現は手元で実施できていないため、根本原因の特定はコード解析とスクリーンショットの幾何(壁紙レイヤが部分領域に固定)に基づきます。マージ前にデバッグビルドでの実機確認(.claude/rules/dev-verification.md のフロー)を推奨します。

TODO

  • 実機でモニタ抜き差し後にレイアウトが自己修復することを確認

Summary by CodeRabbit

  • Bug Fixes

    • Improved window geometry recovery during display reconfiguration, window moves/resizes, and layout reapplication.
    • Prevented artwork from disappearing when repeated track updates omit artwork bytes.
    • Safer, idempotent overlay window/view/layer geometry reconciliation to avoid layout loops.
  • Tests

    • Added regression and async tests covering window-frame reassertion, screen notifications, artwork retention, and overlay geometry fixes.
  • Documentation

    • Edited architecture guidance and layout reconciliation notes.
  • Chores

    • Version bumped to 2.13.8.

GeneralD added 3 commits June 12, 2026 01:47
モニタの抜き差し中は window server がアプリの裏でオーバーレイウィンドウを
移動・リサイズするが、従来は resolveLayout() のモデル値が変化したときしか
applyLayout が走らないため (removeDuplicates によるゲート)、モデル値が
同じままシステム側だけが動かしたズレを永遠に修復できなかった。
hostingView (autoresizing なし) と AVPlayerLayer (比例 autoresizing のみ)
が実ウィンドウと食い違ったまま固定され、歌詞の重なり・壁紙の偏り・
ヘッダ崩れとして現れる。再起動で直るのはこのため。

- AppPresenter.onWindowFrameChange: removeDuplicates を撤去し、
  解決レイアウトの emit ごとに毎回再適用する
- AppWindow.apply: 実状態と照合する冪等な再適用に変更。windowFrame が
  一致していれば setFrame をスキップ (通知ループ防止)、AVPlayerLayer は
  transform を保ったまま bounds + position で幾何を再アサート
- ScreenInteractor.screenChanges: NSWindow.didMove / didResize 通知を
  merge し、システムがウィンドウを動かした直後にも再解決が走るようにする
MediaRemote の再ブロードキャスト (ディスプレイ再構成時などに発生) は
artwork バイトを含まないことがあり、artwork ストリームが artworkData を
素通ししていたため表示中のアートワークが nil で上書きされて消えていた。

scan で直前のトラックと比較し、同一トラック (sameTrack 判定) の間は
最後に得たアートワークを保持する。トラックが変わって新トラックに
アートワークが無い場合は従来どおり nil を流してクリアする。
Copilot AI review requested due to automatic review settings June 11, 2026 16:48
@GeneralD GeneralD self-assigned this Jun 11, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

Pull request was closed or merged during review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6a993387-f99c-483c-8447-093398e856e0

📥 Commits

Reviewing files that changed from the base of the PR and between aa965a0 and 188edab.

📒 Files selected for processing (10)
  • .claude/CLAUDE.md
  • Sources/Presenters/App/AppPresenter.swift
  • Sources/ScreenInteractor/ScreenInteractorImpl.swift
  • Sources/TrackInteractor/TrackInteractorImpl.swift
  • Sources/VersionHandler/Resources/version.txt
  • Sources/Views/Overlay/AppWindow.swift
  • Tests/PresentersTests/AppPresenterTests.swift
  • Tests/ScreenInteractorTests/ScreenInteractorImplTests.swift
  • Tests/TrackInteractorTests/TrackInteractorArtworkTests.swift
  • Tests/ViewsTests/AppWindowTests.swift

📝 Walkthrough

Walkthrough

Idempotent geometry reconciliation introduced for AppWindow.apply; ScreenInteractor emits on window move/resize; AppPresenter invokes layout reassertion for every resolved layout emission (no frame dedup); TrackInteractor preserves artwork across same-track nil updates; docs updated and version bumped to 2.13.8.

Changes

Monitor hot-plug layout recovery

Layer / File(s) Summary
Architecture guidance and version
.claude/CLAUDE.md, Sources/VersionHandler/Resources/version.txt
Added "Layout reconciliation (no dedup on apply)" guidance and formatting tweaks; bumped version from 2.13.72.13.8.
AppWindow idempotent geometry reconciliation
Sources/Views/Overlay/AppWindow.swift, Tests/ViewsTests/AppWindowTests.swift
Refactored apply(layout:to:hostingView:) to conditionally call setFrame, update hosting view frame, early-exit when contentView differs, and reassert AVPlayerLayer bounds/position; added helpers and regression/tests for frame-skip, corruption recovery, and affine-transform preservation.
Screen-change signal expansion
Sources/ScreenInteractor/ScreenInteractorImpl.swift, Tests/ScreenInteractorTests/ScreenInteractorImplTests.swift
screenChanges now merges NSWindow.didMoveNotification and NSWindow.didResizeNotification with NSApplication.didChangeScreenParametersNotification to trigger layout re-resolution during hot-plug scenarios; added test asserting emissions on window move/resize.
AppPresenter non-dedup layout assertion
Sources/Presenters/App/AppPresenter.swift, Tests/PresentersTests/AppPresenterTests.swift
onWindowFrameChange now executes the handler for every resolved layout emission (removed removeDuplicates on windowFrame), ensuring geometry reassertion even when resolved frame appears unchanged; test renamed and expanded to assert multiple invocations.
Track artwork state preservation
Sources/TrackInteractor/TrackInteractorImpl.swift, Tests/TrackInteractorTests/TrackInteractorArtworkTests.swift
artwork publisher changed from direct map to stateful scan that preserves last-known artwork for same-track nil updates and clears only when the track actually changes without artwork; added tests covering preservation and clearing scenarios (regression #265).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • GeneralD/lyra#245: Overlaps on TrackInteractorImpl artwork emission/dedup logic and related tests.
  • GeneralD/lyra#251: Also modifies TrackInteractorImpl.artwork handling and added similar regression coverage.
  • GeneralD/lyra#221: Related AppWindow.apply geometry reconciliation refactor and overlay surface changes.

"I hop through frames when monitors plug and play,
I nudge a layer back where the pixels stray.
If artwork hides with a missing byte,
I keep the last one close until the next light.
Reassert, don't dedup — that’s my rabbit way."

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.63% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title references issue #265 and summarizes the key fixes: layout recovery and artwork preservation after monitor hot-plugging. However, the title is in Japanese while the codebase and all documentation are in English. Consider using an English title like 'fix(#265): Recover layout and artwork after display reconfiguration' to match project documentation standards and improve discoverability.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed All primary coding objectives from #265 are addressed: layout idempotency in AppWindow.apply, geometry re-assertion on every layout signal via onWindowFrameChange, screen change detection with window notifications, and artwork preservation via stateful scan in TrackInteractorImpl.
Out of Scope Changes check ✅ Passed All changes are directly aligned with #265 requirements: layout reconciliation, artwork preservation, and screen change handling. Version bump and documentation updates are standard supporting changes.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/#265-layout-reconciliation-after-display-change

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Tests/TrackInteractorTests/TrackInteractorArtworkTests.swift`:
- Around line 167-168: Replace the fixed Task.sleep by polling with a deadline:
repeatedly check collector.snapshot for equality with [realArt] in a short-loop
(sleeping tiny increments, e.g. Task.sleep for a few milliseconds) until a
deadline (Date()+timeout) is reached, then assert collector.snapshot ==
[realArt] and additionally assert that no further emissions appear after that
deadline; remove the one-off try? await Task.sleep(for: .milliseconds(100)) and
implement the deadline-based loop in TrackInteractorArtworkTests using the
existing collector and realArt symbols to locate the check.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8218b98a-c2d7-48ca-a5f7-db7926b24d3c

📥 Commits

Reviewing files that changed from the base of the PR and between aa965a0 and 3caf486.

📒 Files selected for processing (10)
  • .claude/CLAUDE.md
  • Sources/Presenters/App/AppPresenter.swift
  • Sources/ScreenInteractor/ScreenInteractorImpl.swift
  • Sources/TrackInteractor/TrackInteractorImpl.swift
  • Sources/VersionHandler/Resources/version.txt
  • Sources/Views/Overlay/AppWindow.swift
  • Tests/PresentersTests/AppPresenterTests.swift
  • Tests/ScreenInteractorTests/ScreenInteractorImplTests.swift
  • Tests/TrackInteractorTests/TrackInteractorArtworkTests.swift
  • Tests/ViewsTests/AppWindowTests.swift

Comment thread Tests/TrackInteractorTests/TrackInteractorArtworkTests.swift Outdated
@codecov

codecov Bot commented Jun 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

CodeRabbit 指摘 (no fixed sleep guideline) への対応。同一トラックの
nil イベント後に必ず emit される次トラックのイベントをフェンスとし、
イベントが順序どおり処理される性質を利用して「nil が emit されなかった」
ことを決定的に検証する。
@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

@GeneralD

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Chef's kiss.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

CodeRabbit の Docstring Coverage 警告に対応するため、今回の PR で変更のあった主要クラス・メンバにドキュメントコメントを追加しました。
@GeneralD

Copy link
Copy Markdown
Owner Author

action

CodeRabbit の Docstring Coverage 警告 に対応するため、今回の PR で変更のあった主要なクラスおよびメンバに docstring追加 しました。

これですべての指摘事項が 解決 したはずです。

@GeneralD GeneralD left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

verdict depth findings

ディスプレイ再構成やシステムによるウィンドウ移動に伴うレイアウト崩れ (#265) を、冪等なジオメトリ再アサートと通知イベントの拡充によって的確に修正しています。アートワーク保持ロジックも堅牢です。

public lazy var artwork: AnyPublisher<Data?, Never> =
activeNowPlaying
.map(\.artworkData)
.scan((track: NowPlaying?.none, data: Data?.none)) { state, incoming in

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

severity

同一トラック判定に Self.sameTrack を使用していますが、NowPlayingtitleartist が共に nil の場合(未知のトラック同士)も true を返します。通常、再生中であればタイトルは存在しますが、より安全にするならタイトルが非 nil であることも条件に含めることを検討してください。

Suggested change
.scan((track: NowPlaying?.none, data: Data?.none)) { state, incoming in
let isSameTrack = state.track.map { $0.title != nil && Self.sameTrack($0, incoming) } ?? false

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

action

修正しました。ご提案どおり artwork の同一トラック判定に title 非 nil 条件を追加し、未知トラック同士で artwork が引き継がれないことを検証する回帰テスト (artworkDoesNotStickAcrossNilTitleTracks) も追加しています。740cdae を参照。

}
guard let containerView = surface.contentView, containerView !== hostingView else { return }
containerView.frame = CGRect(origin: .zero, size: layout.windowFrame.size)
guard let playerLayer = playerLayer(in: surface) else { return }

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

severity

containerView.frame を設定する前に、現在のフレームと比較するガードを入れることで、不要な AppKit のレイアウトパスをさらに削減できます(applyWindowFrame と同様のパターン)。

Suggested change
guard let playerLayer = playerLayer(in: surface) else { return }
if containerView.frame != CGRect(origin: .zero, size: layout.windowFrame.size) {
containerView.frame = CGRect(origin: .zero, size: layout.windowFrame.size)
}

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

action

対応しました。提案の if 文形式ではなく、既存の applyWindowFrame と揃えた guard ヘルパー (applyFrame(_:to:)) として実装し、containerView に加えて hostingView の frame 再代入にも同じスキップを適用しています。188edab を参照。

public func onWindowFrameChange(_ handler: @escaping @MainActor (ScreenLayout) -> Void) {
$layout
.removeDuplicates { $0.windowFrame == $1.windowFrame }
.dropFirst()

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

severity

.removeDuplicates() を削除したことで意図通り「自己修復」が可能になりましたが、高頻度な通知が発生した場合に備え、必要であれば applyLayout の直前で throttledebounce を入れることも検討の余地があります。現状の apply が十分に軽量であればこのままで問題ありません。

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

action

現状維持とします。apply は全ジオメトリ書き込みが一致時スキップの冪等実装になっており(188edab で view frame もスキップ対象に追加)、無変化シグナルの実コストはほぼ比較のみです。また didMove/didResize が高頻度になるのはディスプレイ再構成中の短いバーストに限られ、throttle/debounce を挟むとまさに #265 の自己修復が遅延する側に働くため、入れない判断としました。

GeneralD added 2 commits June 12, 2026 03:50
レビュー指摘対応。title が両方 nil の場合 sameTrack は true を返すため、
未知トラック同士で前の artwork が残り続ける可能性があった。artwork の
同一トラック判定に title 非 nil 条件を追加し、回帰テストを追加。
レビュー指摘対応。applyWindowFrame と同じ guard ヘルパー形式で
不要な AppKit レイアウトパスを削減。
@GeneralD

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown
✅ Action performed

Full review finished.

@GeneralD GeneralD merged commit be94a5c into main Jun 12, 2026
3 of 4 checks passed
@GeneralD GeneralD deleted the fix/#265-layout-reconciliation-after-display-change branch June 12, 2026 02:25
GeneralD added a commit that referenced this pull request Jun 12, 2026
![type](https://img.shields.io/badge/type-chore-blue)
![breaking](https://img.shields.io/badge/breaking-no-green)
![scope](https://img.shields.io/badge/scope-ci-blue)
![diff](https://img.shields.io/badge/diff-+11%20--1-green)
![files](https://img.shields.io/badge/files-2%20files-green)
![review](https://img.shields.io/badge/review-quick%20look-green)

Closes #267

## <img
src="https://mojiemoji.jozo.beer/emoji/%E6%A6%82%E8%A6%81?font=toge&amp;color=f43f5e&amp;animation=kage_neon&amp;background=transparent&amp;outline=5ef43f&amp;outline_width=2"
alt="概要" height="24" align="absmiddle">

CodeRabbit の Pre-merge check「Docstring Coverage」を `.coderabbit.yaml`
で<img
src="https://mojiemoji.jozo.beer/emoji/%E7%84%A1%E5%8A%B9?font=zero&amp;color=4ade80&amp;animation=mabataki&amp;background=transparent&amp;outline=4a16a3&amp;outline_width=2"
alt="無効" height="24" align="absmiddle">化する。

## 背景

<img
src="https://mojiemoji.jozo.beer/emoji/%E8%A8%88%E6%B8%AC?font=dela&amp;color=22c55e&amp;animation=kirari&amp;background=transparent&amp;outline=5e22c5&amp;outline_width=2"
alt="計測" height="24" align="absmiddle">エンジンが Swift の `///` doc comment
を認識せず、coverage が常に 0.00% と<img
src="https://mojiemoji.jozo.beer/emoji/%E5%A0%B1%E5%91%8A?font=toge&amp;color=f472b6&amp;animation=yokomoya&amp;background=transparent&amp;outline=77db27&amp;outline_width=2"
alt="報告" height="24" align="absmiddle">される。<img
src="https://mojiemoji.jozo.beer/emoji/PR?font=hachimaru&amp;color=ef4444&amp;animation=bure&amp;background=transparent&amp;outline=44ef44&amp;outline_width=2"
alt="PR" height="24" align="absmiddle"> #266 で実証済み: <img
src="https://mojiemoji.jozo.beer/emoji/%E5%A4%89%E6%9B%B4?font=gothic&amp;color=22d3ee&amp;animation=tate_scroll&amp;background=transparent&amp;outline=b20891&amp;outline_width=2"
alt="変更" height="24" align="absmiddle"><img
src="https://mojiemoji.jozo.beer/emoji/%E5%AF%BE%E8%B1%A1?font=maru-bold&amp;color=8b5cf6&amp;animation=psycho&amp;background=transparent&amp;outline_width=0"
alt="対象" height="24" align="absmiddle">の public シンボルすべてに docstring
が付いた状態で `@coderabbitai full review` により再計算させても `0.00% (required 80.00%)`
のまま変化しなかった。<img
src="https://mojiemoji.jozo.beer/emoji/%E8%A8%88%E6%B8%AC?font=dela&amp;color=22c55e&amp;animation=kirari&amp;background=transparent&amp;outline=5e22c5&amp;outline_width=2"
alt="計測" height="24" align="absmiddle">不能なチェックが全 <img
src="https://mojiemoji.jozo.beer/emoji/PR?font=hachimaru&amp;color=ef4444&amp;animation=bure&amp;background=transparent&amp;outline=44ef44&amp;outline_width=2"
alt="PR" height="24" align="absmiddle"> に<img
src="https://mojiemoji.jozo.beer/emoji/%E8%AD%A6%E5%91%8A?font=noto&amp;color=fb7185&amp;animation=kirari&amp;background=transparent&amp;outline=85fb71&amp;outline_width=2"
alt="警告" height="24" align="absmiddle">を出し続けるのはノイズでしかないため off にする。

## <img
src="https://mojiemoji.jozo.beer/emoji/%E5%A4%89%E6%9B%B4?font=hachimaru&amp;color=eab308&amp;animation=yokomoya&amp;background=transparent&amp;outline=08eab3&amp;outline_width=2"
alt="変更" height="24" align="absmiddle"><img
src="https://mojiemoji.jozo.beer/emoji/%E5%86%85%E5%AE%B9?font=gothic&amp;color=fdba74&amp;animation=kira&amp;background=transparent&amp;outline_width=0"
alt="内容" height="24" align="absmiddle">

- `.coderabbit.yaml` を<img
src="https://mojiemoji.jozo.beer/emoji/%E6%96%B0%E8%A6%8F?font=kurobara&amp;color=f472b6&amp;animation=disco&amp;background=transparent&amp;outline_width=0"
alt="新規" height="24" align="absmiddle">作成し
`reviews.pre_merge_checks.docstrings.mode: "off"` を<img
src="https://mojiemoji.jozo.beer/emoji/%E8%A8%AD%E5%AE%9A?font=maru&amp;color=60a5fa&amp;animation=yurayura&amp;background=transparent&amp;outline=eb2563&amp;outline_width=2"
alt="設定" height="24" align="absmiddle">
- yaml-language-server 向けの `$schema` コメントを先頭に付与(公式 schema.v2.json で
`mode: off | warning | error` を<img
src="https://mojiemoji.jozo.beer/emoji/%E7%A2%BA%E8%AA%8D?font=toge&amp;color=f59e0b&amp;animation=zanzo&amp;background=transparent&amp;outline=0bf59e&amp;outline_width=2"
alt="確認" height="24" align="absmiddle">済み)
- <img
src="https://mojiemoji.jozo.beer/emoji/%E7%84%A1%E5%8A%B9?font=mincho&amp;color=fbbf24&amp;animation=yoko_scroll&amp;background=transparent&amp;outline=06d977&amp;outline_width=2"
alt="無効" height="24" align="absmiddle">化の<img
src="https://mojiemoji.jozo.beer/emoji/%E7%90%86%E7%94%B1?font=rampart&amp;color=f87171&amp;animation=disco&amp;background=transparent&amp;outline_width=0"
alt="理由" height="24" align="absmiddle">をファイル内コメントに記録
- バージョンを 2.13.9 に patch バンプ

## <img
src="https://mojiemoji.jozo.beer/emoji/%E7%A2%BA%E8%AA%8D?font=noto&amp;color=fb7185&amp;animation=mochimochi&amp;background=transparent&amp;outline=85fb71&amp;outline_width=2"
alt="確認" height="24" align="absmiddle">方法

この <img
src="https://mojiemoji.jozo.beer/emoji/PR?font=hachimaru&amp;color=ef4444&amp;animation=bure&amp;background=transparent&amp;outline=44ef44&amp;outline_width=2"
alt="PR" height="24" align="absmiddle"> 自体の CodeRabbit walkthrough の
Pre-merge checks から Docstring Coverage <img
src="https://mojiemoji.jozo.beer/emoji/%E8%AD%A6%E5%91%8A?font=noto&amp;color=fb7185&amp;animation=kirari&amp;background=transparent&amp;outline=85fb71&amp;outline_width=2"
alt="警告" height="24" align="absmiddle">が消えていれば<img
src="https://mojiemoji.jozo.beer/emoji/%E8%A8%AD%E5%AE%9A?font=maru-bold&amp;color=f472b6&amp;animation=mochimochi&amp;background=transparent&amp;outline=b6f472&amp;outline_width=2"
alt="設定" height="24" align="absmiddle">が効いている。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Layout corruption and vertical overlap after monitor hot-plugging

2 participants