Skip to content

Phase 3-A: Native macOS Spike 実機検証3項目 - #154

Merged
tukuyomil032 merged 7 commits into
mainfrom
feat/native-macos-phase3a-spikes
Jul 8, 2026
Merged

Phase 3-A: Native macOS Spike 実機検証3項目#154
tukuyomil032 merged 7 commits into
mainfrom
feat/native-macos-phase3a-spikes

Conversation

@tukuyomil032

@tukuyomil032 tukuyomil032 commented Jul 8, 2026

Copy link
Copy Markdown
Owner

Summary

  • Phase 3-A (spec/phase-tasks.md) の実機検証3項目に着手。3-2(Hardened Runtime下のJava起動)はこのセッション内で検証完了、3-1(NSPanel glass劣化)・3-3(高頻度ログ描画パフォーマンス)は実装・自動テストまで完了し、実機でのみ可能な操作(スクリーンショット撮影・Instrumentsトレース記録)をユーザーに依頼する形で保留
  • spec/phase3a-spike-results.md を新規作成し検証結果・保留事項を記録、spec/native-macos-requirements.md §6のリスク表を更新

Test plan

  • swift build / swift test が全コミットで通ることを確認済み(8テスト green)
  • hardened-runtime-spike.sh を実行し、baseline/allow-jit/allow-unsigned-executable-memoryの3パターン全てexit 0を確認
  • ユーザー実機で3-1のスクリーンショット4枚(apps/native-macos/spec-assets/3-1/)を撮影
  • ユーザー実機で3-3のInstrumentsトレースをrecord_trace.pyで取得
  • CI (native.yml) のlint/build/testジョブがgreenになることを確認

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

https://claude.ai/code/session_01W6ZTictDPbmypEwnXQn8Zg

Summary by CodeRabbit

  • New Features

    • macOS版で、JITや未署名メモリを許可する起動構成が追加され、複数の実行パターンを切り替えて確認できるようになりました。
    • パネル表示やログストリーミングの新しいスパイク画面が追加され、表示形式の切り替えにも対応しました。
    • 外部プロセスの起動結果やログの収集・集計を行う仕組みが追加されました。
  • Tests

    • Java起動、ログの分割、パネル設定の検証テストを追加しました。
  • Documentation

    • macOS向けの検証結果と制約事項を更新しました。

tukuyomil032 and others added 5 commits July 8, 2026 22:59
Phase 3-A (3-2): validate whether a Java subprocess can launch under
Hardened Runtime with ad-hoc code signing before committing to a
process-management design for the native macOS spike.

Adds JavaLaunchHarness (actor-based Process wrapper), a script that
builds/bundles/signs the app with three entitlements variants
(baseline, allow-jit, allow-unsigned-executable-memory), and runs
`java -version` under each.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Phase 3-A (3-1): scaffold two candidate implementations for a
Floating Console Panel so the non-active glass degradation can be
compared on real hardware before committing to one design.

Pattern A: NonactivatingGlassPanel, an NSPanel bridge
(.nonactivatingPanel + NSHostingView). Pattern B:
SwiftUIWindowLevelSpike, a pure SwiftUI Window scene with
.windowLevel(.floating). Both render the same GlassSpikeContent view
and are reachable via `MCV_SPIKE=panel-nspanel` /
`MCV_SPIKE=panel-window` on the App executable.

This session has no WindowServer connection to capture screenshots,
so the active/inactive glass comparison itself is deferred to the
user running these on real hardware; results will be recorded in a
follow-up commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Phase 3-A (3-3): scaffold a dummy high-frequency log generator plus
List/ScrollView rendering variants so real-hardware Instruments
traces can determine which batching/virtualization strategy the
production log stream view should use.

DummyLogGenerator emits LogLine values via AsyncStream at a
configurable rate. LogBatcher groups lines into fixed-size time
windows as a candidate batching strategy, with unit tests covering
same-window grouping, cross-window splitting, and empty input.
LogStreamSpikeApp exposes both view variants via
`MCV_SPIKE=log-stream` (`MCV_LOG_SPIKE_VARIANT=list|scroll`).

This session cannot capture an Instruments .trace (no WindowServer
connection), so the actual hitch/CPU measurement is deferred to the
user running these on real hardware with
swiftui-expert-skill/scripts/record_trace.py; results will be
recorded in a follow-up commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Captures the 3-2 hardened runtime findings (Java subprocess launches
successfully under ad-hoc signing with no additional entitlements)
and documents the deferred user-side steps for 3-1 (screenshot
comparison) and 3-3 (Instruments trace capture). Updates the risk
table in native-macos-requirements.md §6 to reflect what Phase 3-A
actually verified.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 8, 2026 14:21
@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@tukuyomil032, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 40 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: caaf6f55-a12f-4331-ac76-c29322c5f26a

📥 Commits

Reviewing files that changed from the base of the PR and between 25d8d42 and de3b2eb.

📒 Files selected for processing (7)
  • apps/native-macos/.swiftformat
  • apps/native-macos/Sources/Core/Spikes/JavaLaunchHarness.swift
  • apps/native-macos/Sources/Core/Spikes/LogSpike/LogLineBuffer.swift
  • apps/native-macos/Sources/Core/Spikes/LogSpike/LogStreamSpikeView.swift
  • apps/native-macos/Tests/CoreTests/LogBatcherTests.swift
  • apps/native-macos/Tests/CoreTests/LogLineBufferTests.swift
  • spec/phase3a-spike-results.md
📝 Walkthrough

Walkthrough

Hardened Runtime下でのJavaプロセス起動検証(JavaLaunchHarness)、NSPanel/SwiftUIによるフローティングパネル表示スパイク、ログストリーム生成・バッチング・表示スパイクを新規実装した。エントリポイントを環境変数分岐でasync化し、entitlements plistと署名スクリプト、対応テスト、仕様書を追加した。

Changes

Native macOSスパイク検証一式

Layer / File(s) Summary
JavaLaunchHarnessと関連テスト
apps/native-macos/Sources/Core/Spikes/JavaLaunchHarness.swift, apps/native-macos/Tests/CoreTests/JavaLaunchHarnessTests.swift
外部実行ファイルを起動し終了コード・stdout/stderrを返すJavaLaunchHarness/JavaLaunchResult/JavaLaunchErrorを実装し、成功・非0終了・未検出の3ケースをテストで検証。
エントリポイント分岐とHardened Runtimeスパイク配線
apps/native-macos/Sources/App/Main.swift, apps/native-macos/Scripts/hardened-runtime-spike.sh, apps/native-macos/Scripts/entitlements/*.plist, .gitattributes
main()をasync化しMCV_SPIKE環境変数で分岐、runHardenedRuntimeJavaSpike()を追加。ビルド・アプリバンドル生成・各entitlementsでの署名実行を行うシェルスクリプトと3種のentitlements plistを追加。
Panelスパイク(NSPanel/SwiftUI Window)
apps/native-macos/Sources/App/Spikes/PanelSpikeRunner.swift, apps/native-macos/Sources/Core/Spikes/PanelSpike/*.swift, apps/native-macos/Tests/CoreTests/PanelSpikeTests.swift
非アクティブなフローティングパネルNonactivatingGlassPanel、SwiftUIウィンドウSwiftUIWindowLevelSpike、共通コンテンツGlassSpikeContent、実行ラッパーPanelSpikeRunnerを実装し設定値をテストで検証。
ログストリーム生成・バッチング・表示スパイク
apps/native-macos/Sources/Core/Spikes/LogSpike/*.swift, apps/native-macos/Tests/CoreTests/LogBatcherTests.swift
DummyLogGeneratorによるログ生成、LogBatcherによるタイムスタンプ窓ベースのバッチ化、LogStreamListView/LogStreamScrollView/LogStreamSpikeAppによる表示を実装しテストで検証。
仕様書・検証結果の更新
spec/native-macos-requirements.md, spec/phase3a-spike-results.md
リスク表を検証状況・証跡付きで更新し、Phase 3-A の3項目の実施状況・判定をまとめた新規結果ドキュメントを追加。

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Script as hardened-runtime-spike.sh
  participant App
  participant Main
  participant JavaLaunchHarness

  Script->>App: 各entitlementsでcodesign
  Script->>App: MCV_SPIKE=hardened-runtime-java で実行
  App->>Main: main() [async]
  Main->>JavaLaunchHarness: launch(java, "-version")
  JavaLaunchHarness-->>Main: JavaLaunchResult
  Main-->>Script: 終了コード/出力を記録
  Script->>Script: RESULTSのサマリ表示
Loading
sequenceDiagram
  participant DummyLogGenerator
  participant LogBatcher
  participant LogStreamSpikeApp
  participant LogStreamListView

  LogStreamSpikeApp->>DummyLogGenerator: stream(linesPerSecond)
  DummyLogGenerator-->>LogStreamListView: LogLine を yield
  LogStreamListView->>LogStreamListView: 保持件数超過時に先頭削除
  Note over LogBatcher: 別経路でLogLineをinterval窓でバッチ化
Loading

Poem

ぴょんと跳ねて森を抜け、コードの畑を耕したよ🐇
JavaもPanelもログの雨、
entitlementsで守りを固め、
テストの土に根を張って、
Phase 3-A、めでたく実る春! 🌱✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PRの主題であるPhase 3-AのNative macOS Spike実機検証3項目を的確に表しており、変更内容と一致しています。
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/native-macos-phase3a-spikes

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.

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.

Pull request overview

Phase 3-A(native macOS spike)の「実機検証3項目」に向けて、検証用スキャフォールド/ハーネス/自動テストを追加し、結果記録とリスク表を更新するPRです(Core→App 起動経路もスパイク選択対応に拡張)。

Changes:

  • NSPanel×glassEffect 劣化検証用のPanelスパイク実装とテストを追加
  • 高頻度ログ描画の計測用ビュー/ログ生成/バッチャとテストを追加
  • Hardened Runtime 下での Java 起動検証用ハーネス + 署名/実行スクリプト、ならびに結果ドキュメント/要件リスク表を追加更新

Reviewed changes

Copilot reviewed 19 out of 19 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
spec/phase3a-spike-results.md Phase 3-Aの実機検証結果・保留事項の記録を追加
spec/native-macos-requirements.md リスク表をPhase 3-Aの状況に合わせて更新
apps/native-macos/Tests/CoreTests/PanelSpikeTests.swift Panelスパイク構成のユニットテストを追加
apps/native-macos/Tests/CoreTests/LogBatcherTests.swift LogBatcherのユニットテストを追加
apps/native-macos/Tests/CoreTests/JavaLaunchHarnessTests.swift JavaLaunchHarnessのユニットテストを追加
apps/native-macos/Sources/Core/Spikes/PanelSpike/SwiftUIWindowLevelSpike.swift SwiftUIウィンドウレベル検証用スパイクAppを追加
apps/native-macos/Sources/Core/Spikes/PanelSpike/NonactivatingGlassPanel.swift non-activating NSPanel ブリッジ実装を追加
apps/native-macos/Sources/Core/Spikes/PanelSpike/GlassSpikeContent.swift glassEffect表示用の共通SwiftUIビューを追加
apps/native-macos/Sources/Core/Spikes/LogSpike/LogStreamSpikeView.swift List/ScrollView のログ高頻度描画スパイクViewを追加
apps/native-macos/Sources/Core/Spikes/LogSpike/LogBatcher.swift ログ行の時間窓バッチ化ユーティリティを追加
apps/native-macos/Sources/Core/Spikes/LogSpike/DummyLogGenerator.swift ダミーログ生成(AsyncStream)を追加
apps/native-macos/Sources/Core/Spikes/JavaLaunchHarness.swift Java起動(Process)ハーネスを追加
apps/native-macos/Sources/App/Spikes/PanelSpikeRunner.swift スパイク実行のApp側ランナーを追加
apps/native-macos/Sources/App/Main.swift 環境変数でスパイクを選択して起動するエントリに変更
apps/native-macos/Scripts/hardened-runtime-spike.sh Hardened Runtime + entitlements別の署名/実行スクリプトを追加
apps/native-macos/Scripts/entitlements/spike-baseline.plist baseline用entitlementsを追加
apps/native-macos/Scripts/entitlements/spike-allow-unsigned-executable-memory.plist unsigned executable memory等を許可するentitlementsを追加
apps/native-macos/Scripts/entitlements/spike-allow-jit.plist JIT許可entitlementsを追加
.gitattributes Linguist設定に変更を追加

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread .gitattributes
Comment on lines +26 to +27

*.js
Comment on lines +20 to +27
for line in lines {
if line.timestamp - windowStart >= self.interval, !currentBatch.isEmpty {
batches.append(currentBatch)
currentBatch = []
windowStart = line.timestamp
}
currentBatch.append(line)
}
Comment on lines +23 to +25
if self.lines.count > self.retainedLineCount {
self.lines.removeFirst(self.lines.count - self.retainedLineCount)
}
Comment on lines +54 to +56
if self.lines.count > self.retainedLineCount {
self.lines.removeFirst(self.lines.count - self.retainedLineCount)
}
Comment on lines +38 to +42
let stdoutData = try stdoutPipe.fileHandleForReading.readToEndCompat()
let stderrData = try stderrPipe.fileHandleForReading.readToEndCompat()

process.waitUntilExit()

Comment thread spec/phase3a-spike-results.md
| プラグイン解決ロジックの二重実装コスト | 低(現Spike範囲外) | Native版でプラグイン管理を実装する段階で再評価 |
| glass非アクティブ劣化 | 低 | 実機検証→Materialフォールバック(確定済み) |
| `.xcodeproj`なしによるXcode GUI機能の一部制約(Instruments連携等) | 低 | Xcodeは`Package.swift`を直接開けるため多くの機能は利用可能。制約が顕在化したら`.xcodeproj`併用を再検討 |
| glass非アクティブ劣化 | 低 | 実機検証→Materialフォールバック(確定済み)。Phase 3-Aでスキャフォールド実装済み、実機での目視判定は`spec/phase3a-spike-results.md`参照(検証待ち) |
Comment thread spec/native-macos-requirements.md
tukuyomil032 and others added 2 commits July 8, 2026 23:31
Two Important findings from code review:

- JavaLaunchHarness.launch read stdout then stderr sequentially via
  Pipe.readToEnd(), the classic Process/Pipe deadlock pattern: a
  child that fills the OS pipe buffer on stderr before stdout closes
  would hang forever. Didn't manifest for `java -version` (trivial
  stderr-only output), but this harness is the basis for 3-7's real
  server launch. Fixed to read both pipes concurrently via `async let`.

- LogStreamListView/ScrollView trimmed to exactly retainedLineCount
  on every single append, making Array.removeFirst the dominant cost
  at 1000 lines/sec rather than the List vs ScrollView rendering
  cost 3-3 is supposed to measure. Extracted LogLineBuffer, a shared
  hysteresis-based trim (only shifts once overshoot is exceeded),
  used by both view variants.

Also adds the missing LogBatcher edge case tests (single line,
identical timestamps) and LogLineBuffer trim-behavior tests flagged
in review.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
native.yml runs `swiftformat --lint` then `swiftlint --strict`.
SwiftFormat's default trailingCommas rule requires a trailing comma
on the last element of a multi-line collection; SwiftLint's default
trailing_comma rule forbids one. Neither Phase 2's minimal files nor
earlier Phase 3-A files had a multi-line literal to trigger this, so
it went unnoticed locally (lefthook runs swiftformat then
swiftlint --fix, so swiftlint's fix silently wins) until CI's
lint job failed on Tests/CoreTests/LogBatcherTests.swift and
Sources/App/Main.swift.

Disables SwiftFormat's trailingCommas rule so SwiftLint's
no-trailing-comma stance is the sole authority.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 3

🧹 Nitpick comments (2)
apps/native-macos/Tests/CoreTests/PanelSpikeTests.swift (1)

6-12: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

collectionBehavior のアサーション追加を推奨。

NonactivatingGlassPanelcollectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary] を設定していますが、テストで検証されていません。このプロパティはフローティングパネルの期待動作に直結するため、アサーションを追加することを推奨します。

✅ 提案するアサーション追加
     `#expect`(panel.styleMask.contains(.nonactivatingPanel))
     `#expect`(panel.isFloatingPanel)
     `#expect`(panel.level == .floating)
+    `#expect`(panel.collectionBehavior.contains(.canJoinAllSpaces))
+    `#expect`(panel.collectionBehavior.contains(.fullScreenAuxiliary))
+    `#expect`(panel.titleVisibility == .hidden)
+    `#expect`(panel.titlebarAppearsTransparent)
 }
🤖 Prompt for 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.

In `@apps/native-macos/Tests/CoreTests/PanelSpikeTests.swift` around lines 6 - 12,
The NonactivatingGlassPanel test currently verifies styleMask, isFloatingPanel,
and level but misses collectionBehavior validation. Update
nonactivatingGlassPanelConfiguration() in PanelSpikeTests to assert that
NonactivatingGlassPanel.collectionBehavior includes the expected flags
(.canJoinAllSpaces and .fullScreenAuxiliary), alongside the existing assertions,
so the panel’s space and fullscreen behavior is covered by the test.
apps/native-macos/Sources/Core/Spikes/LogSpike/LogStreamSpikeView.swift (1)

20-27: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

removeFirstのO(n)コストが高頻度で発生

デフォルト(linesPerSecond = 1000)の場合、バッファ満了後に1行追加するたびにremoveFirst(1)が呼ばれ、O(n)(n ≈ 5000)の要素シフトが毎秒1000回発生します。さらに、1行ごとのappendがSwiftUIの再描画をトリガーし、描画コストも増大します。同じディレクトリにLogBatcherが定義されテストされていますが、ビューでは未使用です。

時間ベースでUI更新をバッチ化し、配列操作と再描画の頻度を下げることを推奨します。

♻️ 提案するバッチ化の修正(LogStreamListView)
         .task {
-            for await line in await self.generator.stream(linesPerSecond: self.linesPerSecond) {
-                self.lines.append(line)
-                if self.lines.count > self.retainedLineCount {
-                    self.lines.removeFirst(self.lines.count - self.retainedLineCount)
-                }
+            var buffer: [LogLine] = []
+            let clock = ContinuousClock()
+            let flushInterval = Duration.milliseconds(16)
+            var lastFlush = clock.now
+
+            for await line in await self.generator.stream(linesPerSecond: self.linesPerSecond) {
+                buffer.append(line)
+                if clock.now - lastFlush >= flushInterval, !buffer.isEmpty {
+                    self.lines.append(contentsOf: buffer)
+                    buffer.removeAll(keepingCapacity: true)
+                    if self.lines.count > self.retainedLineCount {
+                        self.lines.removeFirst(self.lines.count - self.retainedLineCount)
+                    }
+                    lastFlush = clock.now
+                }
             }
         }

LogStreamScrollView(行51-58)にも同様の修正を適用してください。

Also applies to: 51-58

🤖 Prompt for 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.

In `@apps/native-macos/Sources/Core/Spikes/LogSpike/LogStreamSpikeView.swift`
around lines 20 - 27, The log streaming views are updating per line, causing
frequent O(n) buffer trimming with removeFirst and unnecessary SwiftUI redraws
at high line rates. Update LogStreamSpikeView and LogStreamScrollView to batch
incoming lines over time instead of appending each line immediately, and reuse
the existing LogBatcher in the same directory to coalesce updates and retention
trimming. Keep the retainedLineCount behavior intact, but move the array
mutation and UI state updates into the batch flush path so rendering happens
less often.
🤖 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 @.gitattributes:
- Line 27: The `*.js` entry in `.gitattributes` is a no-op because it has no
attribute assigned, so it does not affect Linguist. Update the `.gitattributes`
rule to either explicitly mark JavaScript as detectable with
`linguist-detectable=true` if you want it visible, or remove the `*.js` entry
entirely if there is no intended behavior change.

In `@apps/native-macos/Sources/Core/Spikes/JavaLaunchHarness.swift`:
- Around line 36-41: The stdout/stderr capture in JavaLaunchHarness.run is
vulnerable to deadlock because the two pipes are read sequentially and
waitUntilExit() is only reached after both reads succeed. Update the process
launch flow to read stdout and stderr concurrently (for example by using
separate asynchronous tasks around stdoutPipe and stderrPipe) and make sure
process.waitUntilExit() is always executed even if readToEndCompat() throws, so
the launched process is not left running or blocked.

In `@spec/phase3a-spike-results.md`:
- Around line 35-39: The markdown fence in this results snippet is missing a
language tag, which triggers MD040. Update the fenced block in the phase3a spike
results section to use the existing code block with a text language hint, or
remove the fence entirely; locate it by the visible spike result entries and
keep the content unchanged otherwise.

---

Nitpick comments:
In `@apps/native-macos/Sources/Core/Spikes/LogSpike/LogStreamSpikeView.swift`:
- Around line 20-27: The log streaming views are updating per line, causing
frequent O(n) buffer trimming with removeFirst and unnecessary SwiftUI redraws
at high line rates. Update LogStreamSpikeView and LogStreamScrollView to batch
incoming lines over time instead of appending each line immediately, and reuse
the existing LogBatcher in the same directory to coalesce updates and retention
trimming. Keep the retainedLineCount behavior intact, but move the array
mutation and UI state updates into the batch flush path so rendering happens
less often.

In `@apps/native-macos/Tests/CoreTests/PanelSpikeTests.swift`:
- Around line 6-12: The NonactivatingGlassPanel test currently verifies
styleMask, isFloatingPanel, and level but misses collectionBehavior validation.
Update nonactivatingGlassPanelConfiguration() in PanelSpikeTests to assert that
NonactivatingGlassPanel.collectionBehavior includes the expected flags
(.canJoinAllSpaces and .fullScreenAuxiliary), alongside the existing assertions,
so the panel’s space and fullscreen behavior is covered by the test.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f0c3ebae-4285-49db-84c9-ca9b867cc28d

📥 Commits

Reviewing files that changed from the base of the PR and between 7a5929d and 25d8d42.

📒 Files selected for processing (19)
  • .gitattributes
  • apps/native-macos/Scripts/entitlements/spike-allow-jit.plist
  • apps/native-macos/Scripts/entitlements/spike-allow-unsigned-executable-memory.plist
  • apps/native-macos/Scripts/entitlements/spike-baseline.plist
  • apps/native-macos/Scripts/hardened-runtime-spike.sh
  • apps/native-macos/Sources/App/Main.swift
  • apps/native-macos/Sources/App/Spikes/PanelSpikeRunner.swift
  • apps/native-macos/Sources/Core/Spikes/JavaLaunchHarness.swift
  • apps/native-macos/Sources/Core/Spikes/LogSpike/DummyLogGenerator.swift
  • apps/native-macos/Sources/Core/Spikes/LogSpike/LogBatcher.swift
  • apps/native-macos/Sources/Core/Spikes/LogSpike/LogStreamSpikeView.swift
  • apps/native-macos/Sources/Core/Spikes/PanelSpike/GlassSpikeContent.swift
  • apps/native-macos/Sources/Core/Spikes/PanelSpike/NonactivatingGlassPanel.swift
  • apps/native-macos/Sources/Core/Spikes/PanelSpike/SwiftUIWindowLevelSpike.swift
  • apps/native-macos/Tests/CoreTests/JavaLaunchHarnessTests.swift
  • apps/native-macos/Tests/CoreTests/LogBatcherTests.swift
  • apps/native-macos/Tests/CoreTests/PanelSpikeTests.swift
  • spec/native-macos-requirements.md
  • spec/phase3a-spike-results.md

Comment thread .gitattributes
Comment thread apps/native-macos/Sources/Core/Spikes/JavaLaunchHarness.swift
Comment thread spec/phase3a-spike-results.md
@tukuyomil032
tukuyomil032 merged commit dbb8786 into main Jul 8, 2026
12 of 13 checks passed
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.

2 participants