You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Imageless JIT-compiled classes get their Bundle(for:) redirected to the
target's built framework wrapper. The hook lives in each agent binary
(BundleRedirect objc_library on macOS, AgentApp.swift mirror on iOS)
because bridge generations can be torn down while the swizzled IMP must
outlive them; the bridge calls previewsmcp_set_resource_wrapper via
dlsym before each render, installing once per process and refreshing
the path. The wrapper rides BuildContext.resourceWrapperPath from
CODESIGNING_FOLDER_PATH on both Xcode capture paths; SwiftPM and Bazel
stay nil so the hook never installs there.
The stage-opening diagnostic (probe preview through the real JIT)
decided the predicate: ORC-materialized classes report
class_getImageName == NULL with Bundle(for:) falling back to the
agent's main bundle, so the hook redirects exactly that combination.
Manual matrix: R03 flips on macOS and iOS (localized title, plist,
Core Data model, generated color); R02 stays Spanish with the hook code
present; B04's real-image framework class keeps its own wrapper. Unit
rows pin the hook decision table (BundleRedirectTests) and the
generator emission (BridgeGeneratorRedirectTests); the iOS agent
builder hash is re-pinned.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: examples/regress/VERIFICATION.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -52,7 +52,7 @@ not a nonzero command exit.
52
52
| F01 | Guard passes | 2026-07-20 (phase/error stage 4): the iOS start returns the classified error `XCFramework 'BadSlice' has no iOS simulator slice (available: ios-arm64).` with a rebuild remediation — the enricher reads the declared binary target's `Info.plist` when a `no such module` names it, and any miss degrades to the plain build failure. Daemon stays responsive. |
53
53
| R01 | Guard passes | 2026-07-20 (phase/error stage 4): the start returns a classified session error — `Rendering the preview failed: JIT link could not resolve 3 symbol(s): _SCNVector3Zero, _OBJC_CLASS_$_SCNScene, _OBJC_CLASS_$_LPLinkMetadata` — naming the autolink closure's actual symbols, with the bounded list and an autolink remediation. The daemon stays responsive; rendering the closure remains named future work (`LC_LINKER_OPTION` scan). |
54
54
| R02 | Guard passes | 2026-07-21: the original blank/partial framebuffer no longer reproduces, and with the fixture's Spanish assertion corrected (see Fixture Corrections) every surface renders `Recursos cargados` — the macOS control, the iOS single-preview control, and iOS index 1 after a live switch — alongside the JSON and text rows. The re-verification first found all surfaces rendering the English title, but a native harness against the healthy built bundle proved that was the fixture's own mechanism: `String(localized:bundle:locale:)` does not select the `.lproj` (its `locale:` parameter affects interpolation formatting only), so the 2026-07-15 fixture variant could never display Spanish even against correct staging. Original 2026-07-14 observation, for history: index 1 and the Spanish control produced a blank or partial framebuffer on iOS while the native build passed with both locale directories staged. |
55
-
| R03 | Reproduced | macOS and iOS rendered the generated color symbol, while the localized key remained `resource.title` and plist/Core Data lookup reported missing. The cold iOS Xcode build also spent about 49 seconds in one progress step. Re-verified 2026-07-15 under Xcode compile capture: the generated-sources half renders identically; the remaining gap is runtime-resource staging (out of the resolver's scope). Re-verified 2026-07-21: macOS unchanged (the generated color renders; `resource.title`, plist, and Core Data model still miss). iOS had regressed to a deterministic agent SIGILL — the generic `iOS Simulator` destination builds every arch and the build-log capture could return the x86_64 swift-frontend invocation — fixed the same day (#438, host-arch capture preference plus the foreign-arch triple strip); after the fix iOS renders the macOS-identical partial baseline again. The remaining gap on both platforms: `Bundle(for:)` on a class compiled into the JIT resolves to the agent process image, and only `Generated*Symbols.swift` files are rewritten to the framework wrapper (`applyResourceBundleRewrites`), so user-code bundle lookups miss resources that are present on disk in the built framework. |
55
+
| R03 | Guard passes | 2026-07-21 (jit-bundle-resolution stage 1): both platforms render `Xcode resources loaded`, `Plist loaded`, `Core Data model loaded`, and the generated color — the agent's `bundleForClass:` hook redirects imageless JIT-class lookups to the target's framework wrapper (`CODESIGNING_FOLDER_PATH` plumbed via `BuildContext.resourceWrapperPath`; hook installed once per agent process, path refreshed per render). Inertness verified in the same pass: R02 (SwiftPM, wrapper nil) still renders Spanish and B04's real-image framework class keeps resolving its own wrapper. History: `Bundle(for:)` on a class compiled into the JIT resolved to the agent image while only `Generated*Symbols.swift` got the #151 wrapper rewrite (why the color always rendered); the 2026-07-14 pass recorded that partial state, 2026-07-15 re-verified it under compile capture, and the same-day iOS SIGILL regression (fat-build x86_64 capture) was fixed in #438. |
56
56
| W01 | Partial guard | Editing a dependency Swift file live changed `source version one` to `source version two` in a stable follow-up snapshot without restarting the session. The add/rename/remove variants are present in the fixture instructions but were not all exercised in this pass. Edit variant re-verified 2026-07-15 with the watcher fed by captured compile inputs; the fixture's Swift 6 language mode also forced two generated-source concurrency fixes (DesignTimeStore, window-state observer). |
57
57
| W02 | Guard passes | 2026-07-16 (state-invalidation stage 4): a resource-only edit to `Resources/payload.json` fired the runtime-input tier — the daemon logged `Evidence change: re-running the native build` — and a stable follow-up snapshot rendered the new value; the revert refreshed back. Regression note on the original observation: on stage-3 code, neither an in-place nor an atomic-rename resource-only edit produces any watcher activity (the resource path cannot pass the exact-path filter), and a snapshot logs only clean MCP lines — the originally recorded "reload transition" therefore came from the operator's editor re-saving an open watched source file in the same burst, not from the resource edit. |
58
58
| W03 | Guard passes | Both editor save styles reloaded on macOS: write-temp-then-rename-over and rename-away-then-recreate each updated the render to the new source value in a stable follow-up snapshot. |
0 commit comments