Repository navigation
fix(tools): build GenesisTools.app with the Command Line Tools' 26.5 SDK instead of refusing without Xcode - #569
Conversation
|
🐉 eve review — ✅ APPROVE · 0 findings
run Previous runs (10)
|
|
Warning Review limit reachedThis review ran on the open-source allowance, not this organization's plan, because the pull request author doesn't have an assigned seat. Waiting won't change this — ask an organization admin to assign them a seat, or add seats in Billing if every seat is already assigned, then retry. Next included review available in 47 minutes. View limit details
Comment |
There was a problem hiding this comment.
🐉 eve review — 🟡 Review comments
5406754· 2 actionable findings · reviewed by find codex/gpt-6.1-sol + codex/gpt-6-luna, verify codex/gpt-6-luna · view run ↗
| Severity | Count |
|---|---|
| 🟡 Medium | 2 |
ℹ️ Claims vs diff — Claim c5 'The automatic app-build offer still requires full Xcode, and
genesisAppBuildHint()stil…' is not supported:src/utils/macos/xcode.tsandsrc/update/index.tschange, contradicting the claim that the hint and automatic-offer areas are unchanged.
7 claims could not be checked from the diff (c1, c2, c3, c4, c6, c7, c8).
ec2ecdb to
e5d88c0
Compare
5406754 to
65180da
Compare
There was a problem hiding this comment.
🐉 eve review — ✅ Approved
65180da· 0 actionable findings · reviewed by find codex/gpt-6.1-sol + codex/gpt-6-luna, verify codex/gpt-6-luna · view run ↗
…d retried after a timeout, and its cache reads and writes are optional
Review fixes 2026-10-26 02:23 from GPT-6.1 Sol judged by Claude Opus 5.5 (fable-judge)Round 1. 2 open threads (eve 2, CodeRabbit 0). Full PR diff and affected callers reviewed; no additional defect found. Fixed in 32c574c; the lead ran the tests and committed. Bound the Swift SDK probe and allow retry after timeout (eve-bot-lovinka)
Make SDK probe cache reads and writes optional (eve-bot-lovinka)
Threads: t1 accepted · t2 accepted |
There was a problem hiding this comment.
🐉 eve review — ✅ Approved
32c574c· 0 actionable findings · reviewed by codex/gpt-6.1-sol · view run ↗
Blast radius
resolveAppBuildSdk(+) → 4 dependent(s) outside this PR: src/update/index.ts, src/macos/lib/permissions/app.tsAppBuildSdk(+) → 2 dependent(s) outside this PR: src/macos/lib/permissions/app.ts
e5d88c0 to
2a2b98a
Compare
…d retried after a timeout, and its cache reads and writes are optional
32c574c to
0af7157
Compare
2a2b98a to
17940bc
Compare
…d retried after a timeout, and its cache reads and writes are optional
0af7157 to
5436633
Compare
…d retried after a timeout, and its cache reads and writes are optional
5436633 to
0a05bff
Compare
17940bc to
e2627ab
Compare
There was a problem hiding this comment.
🐉 eve review — 🟡 Review comments
0a05bff· 2 actionable findings ·⚠️ degraded pass · reviewed by find codex/gpt-6.1-sol + codex/gpt-6-luna, verify codex/gpt-6-luna · view run ↗
| Severity | Count |
|---|---|
| 🟡 Medium | 2 |
⚠️ Degraded pass — this review did not run at full strength; treat the verdict as partial.
- 277 changed patch(es) were omitted by the diff budget.
ℹ️ This pass reviewed the full PR diff: the incremental delta since
32c574ccwas unusable after a base-branch merge saturated GitHub's compare API (300+ files, 0 of them merge noise, list truncated).
Blast radius
AgentSessionRow(Δsig) → 10 dependent(s) outside this PR: src/question/lib/inbox/load.ts, src/hub/lib/agents/index.ts, src/hub/lib/widget/roster-index.ts, +2 morehas(+) → 10 dependent(s) outside this PR: native/ax-tool/Fixtures/ControlFixture.swift, native/ax-tool/Tests/PermissionRefusalTests.swift, native/ax-tool/Tests/SnapshotSupportTests.swift, +7 moreapply(+) → 9 dependent(s) outside this PR: native/ax-tool/Sources/SnapshotWorkflow.swift, native/ax-tool/SnapshotSupport/ContextMenu.swift, native/ax-tool/SnapshotSupport/VisualCapture.swift, +6 moreplay(+) → 9 dependent(s) outside this PR: src/macos/GenesisTools/Sources/Parts/Hub/Hub/HubTimeline.swift, src/macos/GenesisTools/Sources/Host/App/Views.swift, src/macos/GenesisKit/Tests/GenesisKitTests/NativeSettingsRowsTests.swift, +6 moreRequest(+) → 9 dependent(s) outside this PR: src/macos/GenesisTools/Tests/HubLogicTests.swift, src/macos/GenesisTools/Sources/Parts/Hub/Hub/HubWindow.swift, src/macos/GenesisTools/Sources/Parts/Hub/Hub/HubMainMenu.swift, +6 morescrollOverflowContent(−) → 8 dependent(s) outside this PR: src/macos/GenesisTools/Sources/Parts/Hub/Hub/HubDigest.swift, src/macos/GenesisTools/Sources/Parts/Hub/Hub/HubWorktrees.swift, src/macos/GenesisKit/Sources/GenesisKit/Media/ImageViewerView.swift, +5 moreChartJs(~) → 7 dependent(s) outside this PR: src/artifact/runtime/kit/chartjs.test.tsx, src/artifact/runtime/kit/index.ts, src/artifact/gallery/charts.tsx, +1 morecmux(+) → 7 dependent(s) outside this PR: native/ax-tool/Tests/SnapshotSupportTests.swift, native/ax-tool/Sources/CursorOverlay.swift, native/ax-tool/SnapshotSupport/CursorFeedback.swift, +4 morecodexDriver(~) → 7 dependent(s) outside this PR: src/codex/lib/message-delivery.ts, src/codex/commands/queue.ts, src/codex/lib/spec.ts- +30 more changed symbol(s) with outside dependents
- 82 compiler diagnostic(s) on the PR head touch this diff (graph truncated)
ℹ️ Claims vs diff — 8 claims could not be checked from the diff (c1, c2, c3, c4, c5, c6, c7, c8).
The following findings could not be anchored inline (the diff line was not resolvable):
- src/control/commands/capture-session.ts:221 — 🧹 Quality | 🟡 Medium · confidence 98/100
End the headless session when its final save attempt fails
EOF and host loss enqueue stop, then this command waits on active.finished. However, RecordingSession.finish() handles a save failure by returning to paused without settling finished, to allow an interactive retry. After EOF there can be no further stdin commands, and after host loss there is no UI to retry or discard. For example, --output pointing into a nonexistent directory leaves the CLI alive indefinitely after its host exits (with its ticker still installed). Preserve the segments, but provide an explicit terminal failed outcome for a headless save failure, rather than waiting forever for an impossible retry. This also violates the project rule requiring every wait to have a deadline and expiry outcome.
🧩 Analysis
Grep evidence: onEnd: \(\) => void active.command|await active.finished|The recording could not be saved|setState\("paused", "recorder"\)
Bound the synchronous volume identity subprocesses
Both df and diskutil are invoked synchronously without a timeout. volumeUuidAt() now runs during every index build and during moved-fsid updates; diskutil can wait on an unresponsive disk-management service, and df can wait on an unavailable mount. Either case blocks the Bun event loop indefinitely, including cancellation handling. The project review rule says every wait must have a deadline and expiry outcome. Give both subprocesses bounded execution and return the existing unknown-UUID fallback with a diagnostic on timeout.
🧩 Analysis
Grep evidence: Bun.spawnSync\(\["/bin/df"|Bun.spawnSync\(\["/usr/sbin/diskutil"
e2627ab to
7a59d99
Compare
…d retried after a timeout, and its cache reads and writes are optional
0a05bff to
fcbf37c
Compare
There was a problem hiding this comment.
🐉 eve review — 🟡 Review comments
fcbf37c· 2 actionable findings · reviewed by find codex/gpt-6.1-sol + codex/gpt-6-luna, verify codex/gpt-6-luna · view run ↗
| Severity | Count |
|---|---|
| 🟡 Medium | 1 |
| 🔵 Low | 1 |
ℹ️ This pass reviewed the full PR diff: the incremental delta since
32c574ccwas unusable after a base-branch merge saturated GitHub's compare API (300+ files, 300 of them merge noise, list truncated).
ℹ️ Claims vs diff — Claim c5 'The automatic app-build offer still requires full Xcode, and
genesisAppBuildHint()stil…' is not supported: The no-change claim concerns app-build offers and hints, while src/macos/lib/permissions/app.ts and src/utils/macos/xcode.ts changed.
7 claims could not be checked from the diff (c1, c2, c3, c4, c6, c7, c8).
…d retried after a timeout, and its cache reads and writes are optional
…ptional app rebuild skip instead of aborting the update, and the build runner takes named options
fcbf37c to
452be55
Compare
Review fixes 2026-10-26 04:28 from GPT-6.1 Sol judged by Claude Opus 5.5 (fable-judge)Round 2 at fcbf37c. Historical review-body findings on older heads were not reopened. Checks and the commit are left to the lead at integration. Fixed in 452be55; the lead ran the tests and committed. Contain SDK discovery exceptions before they abort optional update rebuilds (eve-bot-lovinka)
Use named subprocess execution options (eve-bot-lovinka)
Threads: t1 accepted · t2 accepted |
There was a problem hiding this comment.
🐉 eve review — ✅ Approved
452be55· 1 actionable finding · reviewed by find codex/gpt-6.1-sol + codex/gpt-6-luna, verify codex/gpt-6-luna · view run ↗
| Severity | Count |
|---|---|
| 🔵 Low | 1 |
…d retried after a timeout, and its cache reads and writes are optional
…ptional app rebuild skip instead of aborting the update, and the build runner takes named options
…rsion first, aliases and symlinked versions left out
452be55 to
91ff377
Compare
Review fixes 2026-10-26 04:49 from GPT-6.1 Sol judged by Claude Opus 5.5 (fable-judge)Round 3 at 452be55. 1 unresolved Eve thread, fixed as a cheap test-only change under the round policy. Fixed in 91ff377; the lead ran the tests and committed. Exercise filesystem SDK discovery ordering and symlink exclusion (eve-bot-lovinka)
Threads: t1 accepted |
There was a problem hiding this comment.
🐉 eve review — ✅ Approved
91ff377· 0 actionable findings · reviewed by codex/gpt-6.1-sol + codex/gpt-6-luna · view run ↗
ℹ️ Claims vs diff — Claim c5 'The automatic app-build offer still requires full Xcode, and genesisAppBuildHint() still …' is not supported: src/utils/macos/xcode.ts changes genesisAppBuildHint, contradicting the claim that this area is unchanged.
7 claims could not be checked from the diff (c1, c2, c3, c4, c6, c7, c8).
683236a to
a81ee92
Compare
…d retried after a timeout, and its cache reads and writes are optional
…ptional app rebuild skip instead of aborting the update, and the build runner takes named options
…rsion first, aliases and symlinked versions left out
91ff377 to
d9f371f
Compare
…ools SDK whose @State needs no macro plugin, instead of refusing without Xcode Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d retried after a timeout, and its cache reads and writes are optional
…ptional app rebuild skip instead of aborting the update, and the build runner takes named options
…rsion first, aliases and symlinked versions left out
There was a problem hiding this comment.
🐉 eve review — ✅ Approved
d9f371f· 0 actionable findings · reviewed by codex/gpt-6.1-sol + codex/gpt-6-luna · view run ↗
a81ee92 to
0fa28de
Compare
d9f371f to
c4513cc
Compare
There was a problem hiding this comment.
🐉 eve review — ✅ Approved
c4513cc· 0 actionable findings · reviewed by codex/gpt-6.1-sol + codex/gpt-6-luna · view run ↗
ℹ️ Claims vs diff — Claim c5 'The automatic app-build offer still requires full Xcode, and
genesisAppBuildHint()stil…' is not supported: src/utils/macos/xcode.ts adds genesisAppBuildHint(), contradicting the claim that this area is unchanged.
7 claims could not be checked from the diff (c1, c2, c3, c4, c6, c7, c8).
Part of #564, step 2 of 2. Stacked on #568 (the
@Entryremoval); this PR's base is that branch.Why
In the macOS 27 SDK, SwiftUI's
@Stateis a macro whose plugin ships only with Xcode, so the build refused every Mac without Xcode (assertFullXcodeToolchain). The Command Line Tools also ship the 26.5 SDK, where@Stateis still a property wrapper. With #568, the whole app builds against it.What
src/utils/macos/xcode.ts:resolveAppBuildSdk()returns one of:{ kind: "xcode" }: Xcode's own SDK, as before.{ kind: "command-line-tools", sdkRoot }: the newest versioned CLT SDK whose SwiftUI type-checks a one-view@Stateprobe (xcrun swiftc -typecheck -sdk … -target <arch>-apple-macos14.0, ~1.2 s once).{ kind: "unsupported", toolchain }.The probe answer is cached per SDK in
~/.genesis-tools/app/sdk-probe.json, keyed by the SDK'sSDKSettings.jsontime (3 ms after that). Symlinked (MacOSX27.sdk) and unversioned (MacOSX.sdk) names are skipped.app.ts:assertFullXcodeToolchain→requireAppBuildSdk(resolveAppBuildSdk()). It passesSDKROOTtoswift build, and to the icon generator when it runs, and keeps the same Xcode hint when nothing can build.src/update/index.ts: an already-installed app is rebuilt on the CLT too, and skipped only when no SDK can build it.Tests:
requireAppBuildSdkreplaces theassertFullXcodeToolchaincases. NewresolveAppBuildSdkandsdkVersioncases cover newest-first choice, all failing, no toolchain, and the symlink names.Not changed on purpose (decisions for #564, see the issue)
build-offer.ts(the automatic "build GenesisTools.app?" offer) still offers only with full Xcode.genesisAppBuildHint()still tells CLT users to install Xcode.Both depend on the signing decision: without an Apple certificate a CLT build is ad-hoc, so macOS forgets the grants on every rebuild.
Verified (CLT only, Swift 6.4, no Xcode)
{"kind":"command-line-tools","sdkRoot":".../MacOSX26.5.sdk"}in 1159 ms (27.0 →ok: false, 26.5 →ok: true), then 3 ms from the cache../tools macos permissions buildfrom this branch (no env tricks,GENESIS_TOOLS_HOME= a scratch home): exit 0 in 37 s. Every step ran (swift build33.1 s, bundle, ad-hoc codesign, install, Launch Services).codesign --verify --deep --strictpasses, and--version→1.0. The scratch app was unregistered and removed.bun run test src/utils/macos/xcode.test.ts src/macos/lib/permissions/app.test.ts: 110 pass.lint-rulesOK, Biome clean, and the pre-committscpasses.sdkRootis unset forkind: "xcode".🤖 Generated with Claude Code