From 72a71fec04a65e9df9494d08de940a752ba4bdf8 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Fri, 16 Oct 2026 04:08:02 -0500 Subject: [PATCH] Publish compiled-view host facts without the source model - Generated cores publish has_windows and a file-scope virtual extent capability; both model types forward the capability for markup engines that reflect over them. - The compiled TypeScript view and app wiring read those facts instead of naming the source model, and reference harnesses install the view through ViewFor. - Mirror goldens are re-pinned; removing the relocated block reproduces every previous mirror byte for byte. --- src/app_runner/ts_compiled_view.zig | 40 ++++-- src/app_runner/ts_core_main.zig | 2 +- src/app_runner/ts_core_mobile.zig | 2 +- tests/ts-core/canvas_layers_e2e_tests.zig | 3 +- tests/ts-core/canvas_preview_e2e_tests.zig | 5 +- tests/ts-core/channel_monitor_e2e_tests.zig | 7 +- tests/ts-core/chart_app_e2e_tests.zig | 3 +- tests/ts-core/code_app_e2e_tests.zig | 3 +- tests/ts-core/code_editor_e2e_tests.zig | 3 +- tests/ts-core/composition_app_e2e_tests.zig | 3 +- tests/ts-core/deck_e2e_tests.zig | 7 +- tests/ts-core/effects_probe_e2e_tests.zig | 7 +- tests/ts-core/feed_e2e_tests.zig | 9 +- tests/ts-core/gpu_dashboard_e2e_tests.zig | 9 +- tests/ts-core/inbox_e2e_tests.zig | 3 +- tests/ts-core/markdown_app_e2e_tests.zig | 3 +- tests/ts-core/markdown_viewer_e2e_tests.zig | 5 +- tests/ts-core/notes_e2e_tests.zig | 9 +- tests/ts-core/split_collapse_e2e_tests.zig | 3 +- tests/ts-core/typography_e2e_tests.zig | 5 +- tests/ts-core/video_player_e2e_tests.zig | 7 +- tests/ts-core/virtual_fixed_e2e_tests.zig | 12 +- tests/ts-core/workbench_e2e_tests.zig | 7 +- tests/ts-services/feed_reader_e2e_tests.zig | 9 +- tools/corewire/core.test.ts | 28 +++- tools/corewire/core_goldens.json | 150 ++++++++++---------- tools/corewire/core_projection.ts | 4 +- tools/corewire/emit_mirror.ts | 25 ++-- tools/corewire/intake.test.ts | 4 + tools/corewire/intake_goldens.json | 98 ++++++------- tools/corewire/invocation.test.ts | 4 + tools/corewire/invocation_goldens.json | 6 +- tools/corewire/mirror_templates.ts | 3 + 33 files changed, 280 insertions(+), 208 deletions(-) diff --git a/src/app_runner/ts_compiled_view.zig b/src/app_runner/ts_compiled_view.zig index ee1ec4152..17bf1ff62 100644 --- a/src/app_runner/ts_compiled_view.zig +++ b/src/app_runner/ts_compiled_view.zig @@ -231,7 +231,7 @@ fn virtualView(ui: *Ui, label: []const u8, video: []const u8) !Ui.Node { .viewport_fallback = request.viewportFallback, .index_base = request.indexBase, .anchor = if (request.trailing) .trailing else .leading, - .extent_estimate = if (request.estimateHelper >= 0) core.Model.virtualExtentEstimate else null, + .extent_estimate = if (request.estimateHelper >= 0) core.virtualExtentEstimate else null, .extent_context = if (request.estimateHelper >= 0) @ptrFromInt(@as(usize, @intCast(request.estimateHelper)) + 1) else null, }; target.range = ui.virtualWindow(target.options); @@ -245,8 +245,7 @@ fn virtualView(ui: *Ui, label: []const u8, video: []const u8) !Ui.Node { return decodeVirtual(ui, core.nativeVirtualView(label, context, video, ui.arena), resolved); } -/// Concrete callbacks for generated compiled-model apps; the legacy builders -/// retain their full Model signature for independent reference fixtures. +/// Concrete callbacks for generated compiled-model apps. pub fn buildRuntime(ui: *Ui, model: *const core.RuntimeModel) Ui.Node { _ = model; return buildCommitted(ui); @@ -257,9 +256,21 @@ pub fn buildRuntimeWindow(ui: *Ui, model: *const core.RuntimeModel, label: []con return buildCommittedWindow(ui, label); } -pub fn build(ui: *Ui, model: *const core.Model) Ui.Node { - _ = model; - return buildCommitted(ui); +/// Callbacks for any host model representation. The compiled view never +/// reads the model it is handed, so harnesses that keep another host model +/// install the same committed tree source as generated apps. +pub fn ViewFor(comptime HostModel: type) type { + return struct { + pub fn build(ui: *Ui, model: *const HostModel) Ui.Node { + _ = model; + return buildCommitted(ui); + } + + pub fn buildWindow(ui: *Ui, model: *const HostModel, label: []const u8) Ui.Node { + _ = model; + return buildCommittedWindow(ui, label); + } + }; } fn buildCommitted(ui: *Ui) Ui.Node { @@ -269,11 +280,6 @@ fn buildCommitted(ui: *Ui) Ui.Node { return decode(ui, bytes) catch @panic("invalid compiled TypeScript view data"); } -pub fn buildWindow(ui: *Ui, model: *const core.Model, label: []const u8) Ui.Node { - _ = model; - return buildCommittedWindow(ui, label); -} - fn buildCommittedWindow(ui: *Ui, label: []const u8) Ui.Node { var context: [20]u8 = undefined; if (comptime @hasDecl(core, "nativeVirtualRequests")) return virtualView(ui, label, videoContext(ui, &context)) catch @panic("invalid compiled virtual window view data"); @@ -1225,6 +1231,10 @@ test "compiled code diff ordinals preserve every mask word and reject invalid tr } } +/// Reference markup in these checks binds nothing, so it compiles against an +/// empty model rather than the app's source model. +const BindingFreeModel = struct {}; + // The native construction oracle supplies authored data. Compiled views also // attach the appearance owner to every node; compare that callback explicitly // instead of erasing it from the decoded tree. @@ -1246,8 +1256,8 @@ test "compiled tooltip records match native anchored and static primitives" { var actual = try decode(&ui, bytes); @memset(bytes, 0); var reference_ui = Ui.init(arena.allocator()); - const Reference = sdk.canvas.CompiledMarkupView(core.Model, core.Msg, "Run caféStatic hint"); - const model: core.Model = undefined; + const Reference = sdk.canvas.CompiledMarkupView(BindingFreeModel, core.Msg, "Run caféStatic hint"); + const model: BindingFreeModel = .{}; const expected = withCompiledAppearance(Reference.build(&reference_ui, &model)); // The runtime-only callback differs by frontend; every authored // primitive field, child, owned string and anchor must match. @@ -1422,10 +1432,10 @@ pub fn testInlineParagraphRecords() !void { var actual = try decode(&ui, bytes); @memset(bytes, 0); var reference_ui = Ui.init(arena.allocator()); - const Reference = sdk.canvas.CompiledMarkupView(core.Model, core.Msg, + const Reference = sdk.canvas.CompiledMarkupView(BindingFreeModel, core.Msg, \\Value café. ); - const model: core.Model = undefined; + const model: BindingFreeModel = .{}; const expected = withCompiledAppearance(Reference.build(&reference_ui, &model)); actual.widget.interaction_policy = null; const actual_tree = try ui.finalize(actual); diff --git a/src/app_runner/ts_core_main.zig b/src/app_runner/ts_core_main.zig index fc218e2a6..444990cac 100644 --- a/src/app_runner/ts_core_main.zig +++ b/src/app_runner/ts_core_main.zig @@ -137,7 +137,7 @@ fn appOptions(io: ?std.Io) Adapter.Options { .theme_accent = comptime runner.manifestThemeAccent(), }; if (comptime ts_view.enabled) options.view = ts_view.buildRuntime else if (comptime !dev) options.view = CompiledAppView.build; - if (comptime @hasDecl(core.Model, "windows")) { + if (comptime core.has_windows) { if (comptime ts_view.enabled) { options.window_view = ts_view.buildRuntimeWindow; } else { diff --git a/src/app_runner/ts_core_mobile.zig b/src/app_runner/ts_core_mobile.zig index 18530a7c7..86c867918 100644 --- a/src/app_runner/ts_core_mobile.zig +++ b/src/app_runner/ts_core_mobile.zig @@ -101,7 +101,7 @@ pub fn initModel() Model { } pub fn mobileOptions() Adapter.Options { - if (comptime @hasDecl(core.Model, "windows")) { + if (comptime core.has_windows) { @compileError("model-declared secondary windows are a desktop shell capability; omit windows(model) from mobile targets"); } var options: Adapter.Options = .{ diff --git a/tests/ts-core/canvas_layers_e2e_tests.zig b/tests/ts-core/canvas_layers_e2e_tests.zig index 0c38ae448..a450b6ac5 100644 --- a/tests/ts-core/canvas_layers_e2e_tests.zig +++ b/tests/ts-core/canvas_layers_e2e_tests.zig @@ -3,6 +3,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("canvas_layers_core"); const decoder = @import("canvas_layers_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const parity = @import("effects_media_parity.zig"); const canvas = sdk.canvas; const geometry = sdk.geometry; @@ -83,7 +84,7 @@ pub fn nativeSuffix(model: *const NativeModel, builder: *canvas.Builder, _: geom if (model.phase == 1) try builder.strokePath(.{ .id = 7, .elements = &open_elements, .stroke = .{ .width = 6.5, .fill = .{ .color = .rgba(0.75, 0.5, 0.25, 1) } }, .cap = .butt }); } fn options(comptime compiled: bool) Adapter.Options { - return .{ .name = "canvas-layers", .scene = scene, .canvas_label = "layers-canvas", .view = if (compiled) decoder.build else View.build }; + return .{ .name = "canvas-layers", .scene = scene, .canvas_label = "layers-canvas", .view = if (compiled) CompiledView.build else View.build }; } fn pointerClick(runtime: *sdk.Runtime, app: sdk.App, root: *const canvas.Widget, name: []const u8, timestamp: u64) !void { const widget = parity.find(root, name) orelse return error.WidgetNotFound; diff --git a/tests/ts-core/canvas_preview_e2e_tests.zig b/tests/ts-core/canvas_preview_e2e_tests.zig index 6deed68ad..bf500d1ec 100644 --- a/tests/ts-core/canvas_preview_e2e_tests.zig +++ b/tests/ts-core/canvas_preview_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const native_sdk = @import("native_sdk"); const core = @import("canvas_preview_core"); const decoder = @import("canvas_preview_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const main = @import("canvas_preview_reference.zig"); const canvas = native_sdk.canvas; const geometry = native_sdk.geometry; @@ -16,7 +17,7 @@ fn createApp() !*PreviewApp { .name = "canvas-preview", .scene = main.shell_scene, .canvas_label = main.canvas_label, - .view = decoder.build, + .view = CompiledView.build, .on_command = core.commandMsg, }); } @@ -96,7 +97,7 @@ fn viewParity(native: *const main.Model, model: *const core.Model) !void { const View = canvas.CompiledMarkupView(core.Model, core.Msg, @embedFile("app.native")); for (0..2) |backend| { var b = Ui.init(arena.allocator()); - const root = if (backend == 0) View.build(&b, model) else decoder.build(&b, model); + const root = if (backend == 0) View.build(&b, model) else CompiledView.build(&b, model); core.rt.frameReset(); const actual = try b.finalize(root); try equal(expected.root, actual.root); diff --git a/tests/ts-core/channel_monitor_e2e_tests.zig b/tests/ts-core/channel_monitor_e2e_tests.zig index 27dd8b301..24d3a77e5 100644 --- a/tests/ts-core/channel_monitor_e2e_tests.zig +++ b/tests/ts-core/channel_monitor_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("channel_monitor_core"); const decoder = @import("channel_monitor_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const reference = @import("channel-monitor-reference/main.zig"); const parity = @import("effects_media_parity.zig"); const Host = sdk.TsCoreHost(core); @@ -58,7 +59,7 @@ fn viewParity(native: *const reference.Model, model: *const core.Model) !void { const View = canvas.CompiledMarkupView(core.Model, core.Msg, @embedFile("app.native")); for (0..2) |backend| { var b = Ui.init(arena.allocator()); - const actual = try b.finalize(if (backend == 0) View.build(&b, model) else decoder.build(&b, model)); + const actual = try b.finalize(if (backend == 0) View.build(&b, model) else CompiledView.build(&b, model)); core.rt.frameReset(); try parity.equal(expected.root, actual.root); try testing.expectEqual(expected.handlers.len, actual.handlers.len); @@ -346,7 +347,7 @@ fn monitorReplay(comptime compiled_view: bool, failed: bool) !void { defer if (full_model) |bytes| testing.allocator.free(bytes); defer if (persistence) |bytes| testing.allocator.free(bytes); { - const state = try Adapter.create(testing.allocator, .{}, .{ .name = "channel-monitor", .scene = shell_scene, .canvas_label = canvas_label, .view = if (compiled_view) decoder.build else View.build }); + const state = try Adapter.create(testing.allocator, .{}, .{ .name = "channel-monitor", .scene = shell_scene, .canvas_label = canvas_label, .view = if (compiled_view) CompiledView.build else View.build }); defer state.destroy(); state.effects.executor = .fake; state.effects.channel_sources = .{ .context = &source, .start_fn = Source.start }; @@ -386,7 +387,7 @@ fn monitorReplay(comptime compiled_view: bool, failed: bool) !void { try testing.expect(recorder.effect_count >= 38); } const calls = source.calls; - const state = try Adapter.create(testing.allocator, .{}, .{ .name = "channel-monitor", .scene = shell_scene, .canvas_label = canvas_label, .view = if (compiled_view) decoder.build else View.build }); + const state = try Adapter.create(testing.allocator, .{}, .{ .name = "channel-monitor", .scene = shell_scene, .canvas_label = canvas_label, .view = if (compiled_view) CompiledView.build else View.build }); defer state.destroy(); state.effects.channel_sources = .{ .context = &source, .start_fn = Source.start }; const harness = try sdk.TestHarness().create(testing.allocator, .{ .size = .init(560, 420) }); diff --git a/tests/ts-core/chart_app_e2e_tests.zig b/tests/ts-core/chart_app_e2e_tests.zig index 2d649b893..1ec8fc65b 100644 --- a/tests/ts-core/chart_app_e2e_tests.zig +++ b/tests/ts-core/chart_app_e2e_tests.zig @@ -3,6 +3,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("chart_core"); const decoder = @import("chart_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const exact = @import("component_construction_e2e_tests.zig").exact; const canvas = sdk.canvas; const Ui = canvas.Ui(core.Msg); @@ -20,7 +21,7 @@ test "compiled app chart preserves complete trees geometry raw words dispatch ef var before_root = View.build(&reference, &model); stampReference(&before_root); const expected = try reference.finalize(before_root); - const root = decoder.build(&compiled, &model); + const root = CompiledView.build(&compiled, &model); core.rt.frameReset(); const actual = try compiled.finalize(root); try exact(expected.root, actual.root); diff --git a/tests/ts-core/code_app_e2e_tests.zig b/tests/ts-core/code_app_e2e_tests.zig index 1f3171fe0..1e3937954 100644 --- a/tests/ts-core/code_app_e2e_tests.zig +++ b/tests/ts-core/code_app_e2e_tests.zig @@ -3,6 +3,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("code_core"); const decoder = @import("code_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const parity = @import("effects_media_parity.zig"); const canvas = sdk.canvas; const Ui = canvas.Ui(core.Msg); @@ -42,7 +43,7 @@ test "compiled app code preserves complete generated trees geometry input effect var reference = Ui.init(arena.allocator()); var compiled = Ui.init(arena.allocator()); const expected = try reference.finalize(View.build(&reference, &model)); - const root = decoder.build(&compiled, &model); + const root = CompiledView.build(&compiled, &model); core.rt.frameReset(); const actual = try compiled.finalize(root); try parity.equal(expected.root, actual.root); diff --git a/tests/ts-core/code_editor_e2e_tests.zig b/tests/ts-core/code_editor_e2e_tests.zig index d8ae29e00..e04016cf8 100644 --- a/tests/ts-core/code_editor_e2e_tests.zig +++ b/tests/ts-core/code_editor_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("code_editor_core"); const decoder = @import("code_editor_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const reference = @import("code-editor-reference/main.zig"); const Host = sdk.TsCoreHost(core); const testing = std.testing; @@ -442,7 +443,7 @@ fn viewEqual(expected: *const reference.AppModel, actual: *const core.Model) !vo var a = reference.BrowserUi.init(arena.allocator()); const old = try a.finalize(reference.CompiledCodeEditorView.build(&a, &session.browser)); var b = canvas.Ui(core.Msg).init(arena.allocator()); - const new = try b.finalize(if (index == 0) decoder.build(&b, actual) else decoder.buildWindow(&b, actual, labels[index])); + const new = try b.finalize(if (index == 0) CompiledView.build(&b, actual) else CompiledView.buildWindow(&b, actual, labels[index])); core.rt.frameReset(); try widgetEqual(old.root, new.root); try testing.expectEqual(old.handlers.len, new.handlers.len); diff --git a/tests/ts-core/composition_app_e2e_tests.zig b/tests/ts-core/composition_app_e2e_tests.zig index 4c92ed87a..4ffdd99dd 100644 --- a/tests/ts-core/composition_app_e2e_tests.zig +++ b/tests/ts-core/composition_app_e2e_tests.zig @@ -3,6 +3,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("composition_core"); const decoder = @import("composition_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const parity = @import("effects_media_parity.zig"); const canvas = sdk.canvas; const Ui = canvas.Ui(core.Msg); @@ -56,7 +57,7 @@ test "compiled app composition preserves whole generated trees geometry handlers var reference = Ui.init(arena.allocator()); var compiled = Ui.init(arena.allocator()); const expected = try reference.finalize(View.build(&reference, &model)); - const root = decoder.build(&compiled, &model); + const root = CompiledView.build(&compiled, &model); core.rt.frameReset(); const actual = try compiled.finalize(root); try parity.equal(expected.root, actual.root); diff --git a/tests/ts-core/deck_e2e_tests.zig b/tests/ts-core/deck_e2e_tests.zig index 8f40329f6..ccfb80af1 100644 --- a/tests/ts-core/deck_e2e_tests.zig +++ b/tests/ts-core/deck_e2e_tests.zig @@ -5,6 +5,7 @@ const wire = @import("shim_rt.zig"); const ref = @import("deck_reference_access.zig"); const reference = ref.model; const decoder = @import("deck_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const parity = @import("effects_media_parity.zig"); const Host = sdk.TsCoreHost(core); @@ -329,7 +330,7 @@ fn viewParity(native: *const reference.Model, model: *const core.Model, playlist var a = ref.view.Ui.init(alloc); const expected = try a.finalize(if (playlist) ref.view.playlistView(&a, native) else ref.view.rootView(&a, native)); var b = sdk.canvas.Ui(core.Msg).init(alloc); - const actual = try b.finalize(if (playlist) decoder.buildWindow(&b, model, "playlist") else decoder.build(&b, model)); + const actual = try b.finalize(if (playlist) CompiledView.buildWindow(&b, model, "playlist") else CompiledView.build(&b, model)); core.rt.frameReset(); try parity.equal(expected.root, actual.root); try std.testing.expectEqual(expected.handlers.len, actual.handlers.len); @@ -463,8 +464,8 @@ fn wholeOptions(comptime Bridge: type) Bridge.Options { .name = "deck", .scene = comptime sdk.app_manifest.shellConfigFrom(@import("deck_manifest")), .canvas_label = "deck-canvas", .fonts = &ref.main.app_fonts, .on_command = core.commandMsg, - .view = if (Bridge.Model == core.RuntimeModel) decoder.buildRuntime else decoder.build, - .window_view = if (Bridge.Model == core.RuntimeModel) decoder.buildRuntimeWindow else decoder.buildWindow, + .view = if (Bridge.Model == core.RuntimeModel) decoder.buildRuntime else CompiledView.build, + .window_view = if (Bridge.Model == core.RuntimeModel) decoder.buildRuntimeWindow else CompiledView.buildWindow, }; } fn wholeImages(comptime Bridge: type) [8]Bridge.BootImage { diff --git a/tests/ts-core/effects_probe_e2e_tests.zig b/tests/ts-core/effects_probe_e2e_tests.zig index 472945cd6..5ac295da8 100644 --- a/tests/ts-core/effects_probe_e2e_tests.zig +++ b/tests/ts-core/effects_probe_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("effects_probe_core"); const decoder = @import("effects_probe_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const reference = @import("effects_probe_reference.zig"); const parity = @import("effects_media_parity.zig"); const canvas = sdk.canvas; @@ -41,7 +42,7 @@ fn viewParity(native: *const reference.Model, model: *const core.Model) !void { const View = canvas.CompiledMarkupView(core.Model, core.Msg, @embedFile("app.native")); for (0..2) |backend| { var b = Ui.init(arena.allocator()); - const actual = try b.finalize(if (backend == 0) View.build(&b, model) else decoder.build(&b, model)); + const actual = try b.finalize(if (backend == 0) View.build(&b, model) else CompiledView.build(&b, model)); core.rt.frameReset(); try parity.equal(expected.root, actual.root); try testing.expectEqual(expected.handlers.len, actual.handlers.len); @@ -167,7 +168,7 @@ fn probeReplay(comptime compiled_view: bool) !void { var full_model: ?[]u8 = null; defer if (full_model) |bytes| testing.allocator.free(bytes); { - const state = try Adapter.create(testing.allocator, .{}, .{ .name = "effects-probe", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) decoder.build else View.build }); + const state = try Adapter.create(testing.allocator, .{}, .{ .name = "effects-probe", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) CompiledView.build else View.build }); defer state.destroy(); state.effects.executor = .fake; const harness = try sdk.TestHarness().create(testing.allocator, .{ .size = .init(560, 480) }); @@ -195,7 +196,7 @@ fn probeReplay(comptime compiled_view: bool) !void { try testing.expect(!recorder.failed); try testing.expect(recorder.effect_count >= 32); } - const state = try Adapter.create(testing.allocator, .{}, .{ .name = "effects-probe", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) decoder.build else View.build }); + const state = try Adapter.create(testing.allocator, .{}, .{ .name = "effects-probe", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) CompiledView.build else View.build }); defer state.destroy(); const harness = try sdk.TestHarness().create(testing.allocator, .{ .size = .init(560, 480) }); defer harness.destroy(testing.allocator); diff --git a/tests/ts-core/feed_e2e_tests.zig b/tests/ts-core/feed_e2e_tests.zig index 0d8bd8103..80991f0d7 100644 --- a/tests/ts-core/feed_e2e_tests.zig +++ b/tests/ts-core/feed_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("feed_core"); const decoder = @import("feed_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const reference = @import("feed_reference.zig"); const parity = @import("effects_media_parity.zig"); const canvas = sdk.canvas; @@ -40,7 +41,7 @@ fn views(native: *const reference.Model, model: *const core.Model, offset: f32, var right = canvas.Ui(core.Msg).init(alloc); right.virtual_window_context = &source; right.virtual_window_source = Pinned.resolve; - const actual = try right.finalize(if (backend == 0) View.build(&right, model) else if (backend == 1) decoder.build(&right, model) else blk: { + const actual = try right.finalize(if (backend == 0) View.build(&right, model) else if (backend == 1) CompiledView.build(&right, model) else blk: { var interpreted = try canvas.MarkupView(core.Model, core.Msg).init(alloc, @embedFile("app.native")); break :blk try interpreted.build(&right, model); }); @@ -159,7 +160,7 @@ test "Feed compiled row queries preserve deterministic corpus text counters and try testing.expectEqual(@as(i64, post.boosts), rows[0].boosts); try testing.expectEqual(@as(i64, post.replies), rows[0].replies); try testing.expectEqualStrings(try std.fmt.allocPrint(alloc, "Post {d} by {s}", .{ index, post.author }), rows[0].label); - try testing.expectEqual(reference.postExtentEstimate(null, index), core.Model.virtualExtentEstimate(@ptrFromInt(2), index)); + try testing.expectEqual(reference.postExtentEstimate(null, index), core.virtualExtentEstimate(@ptrFromInt(2), index)); core.rt.frameReset(); } } @@ -179,7 +180,7 @@ fn replay(comptime compiled: bool) !void { defer if (full) |bytes| testing.allocator.free(bytes); var fingerprint: u64 = 0; { - const app = try Adapter.create(testing.allocator, .{}, .{ .name = "feed", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled) decoder.build else View.build }); + const app = try Adapter.create(testing.allocator, .{}, .{ .name = "feed", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled) CompiledView.build else View.build }); defer app.destroy(); const harness = try sdk.TestHarness().create(testing.allocator, .{ .size = .init(520, 760) }); defer harness.destroy(testing.allocator); @@ -198,7 +199,7 @@ fn replay(comptime compiled: bool) !void { recorder.finish(); try testing.expect(!recorder.failed); } - const app = try Adapter.create(testing.allocator, .{}, .{ .name = "feed", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled) decoder.build else View.build }); + const app = try Adapter.create(testing.allocator, .{}, .{ .name = "feed", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled) CompiledView.build else View.build }); defer app.destroy(); const harness = try sdk.TestHarness().create(testing.allocator, .{ .size = .init(520, 760) }); defer harness.destroy(testing.allocator); diff --git a/tests/ts-core/gpu_dashboard_e2e_tests.zig b/tests/ts-core/gpu_dashboard_e2e_tests.zig index 6883efc45..dadf978c1 100644 --- a/tests/ts-core/gpu_dashboard_e2e_tests.zig +++ b/tests/ts-core/gpu_dashboard_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("gpu_dashboard_core"); const decoder = @import("gpu_dashboard_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const reference = @import("gpu_dashboard_reference_access.zig"); const manifest = @import("gpu_dashboard_manifest"); const parity = @import("effects_media_parity.zig"); @@ -17,7 +18,7 @@ test "GPU Dashboard shipping shell preserves the complete native scene" { } fn options() Adapter.Options { - return Adapter.mobileOptions(.{}, .{ .name = "gpu-dashboard", .scene = reference.migrationScene, .canvas_label = "dashboard-canvas", .view = decoder.build }); + return Adapter.mobileOptions(.{}, .{ .name = "gpu-dashboard", .scene = reference.migrationScene, .canvas_label = "dashboard-canvas", .view = CompiledView.build }); } fn compare(native: *const reference.Model, model: *const core.Model) !void { inline for (@typeInfo(reference.Model).@"struct".fields) |field| { @@ -50,7 +51,7 @@ fn viewParity(native: *const reference.Model, model: *const core.Model) !void { const expected = try a.finalize(reference.view(&a, native)); for (0..2) |backend| { var b = Ui.init(arena.allocator()); - const actual = try b.finalize(if (backend == 0) View.build(&b, model) else decoder.build(&b, model)); + const actual = try b.finalize(if (backend == 0) View.build(&b, model) else CompiledView.build(&b, model)); core.rt.frameReset(); try parity.equal(expected.root, actual.root); try testing.expectEqual(expected.handlers.len, actual.handlers.len); @@ -137,7 +138,7 @@ test "GPU Dashboard chrome and animation declarations match the independent nati var a = reference.DashboardUi.init(arena.allocator()); var b = Adapter.Ui.init(arena.allocator()); const left = try a.finalize(reference.view(&a, &native)); - const right = try b.finalize(decoder.build(&b, Host.model())); + const right = try b.finalize(CompiledView.build(&b, Host.model())); for ([_]bool{ false, true }) |armed| { try apply(&native, &fx, if (armed) .perf_animation else .perf_animation_stop, if (armed) .perf_animation else .perf_animation_stop); var expected: [16]canvas.CanvasRenderAnimation = undefined; @@ -197,7 +198,7 @@ fn dashboardReplay(comptime compiled_view: bool) !void { var persistence: ?[]u8 = null; defer if (snapshot) |bytes| testing.allocator.free(bytes); defer if (persistence) |bytes| testing.allocator.free(bytes); - const config: Adapter.Options = .{ .name = "gpu-dashboard", .scene = reference.migrationScene, .canvas_label = "dashboard-canvas", .view = if (compiled_view) decoder.build else View.build }; + const config: Adapter.Options = .{ .name = "gpu-dashboard", .scene = reference.migrationScene, .canvas_label = "dashboard-canvas", .view = if (compiled_view) CompiledView.build else View.build }; { const state = try Adapter.create(testing.allocator, .{}, config); defer state.destroy(); diff --git a/tests/ts-core/inbox_e2e_tests.zig b/tests/ts-core/inbox_e2e_tests.zig index 7164e3461..e3c9930ad 100644 --- a/tests/ts-core/inbox_e2e_tests.zig +++ b/tests/ts-core/inbox_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("inbox_core"); const decoder = @import("inbox_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const reference = @import("inbox_reference.zig"); const canvas = sdk.canvas; @@ -80,7 +81,7 @@ fn viewParity(native: *const reference.Model, model: *const core.Model) !void { const View = canvas.CompiledMarkupView(core.Model, core.Msg, @embedFile("app.native")); for (0..2) |backend| { var b = Ui.init(arena.allocator()); - const root = if (backend == 0) View.build(&b, model) else decoder.build(&b, model); + const root = if (backend == 0) View.build(&b, model) else CompiledView.build(&b, model); core.rt.frameReset(); const actual = try b.finalize(root); try equal(expected.root, actual.root); diff --git a/tests/ts-core/markdown_app_e2e_tests.zig b/tests/ts-core/markdown_app_e2e_tests.zig index 85040d9ed..9c3e9f60b 100644 --- a/tests/ts-core/markdown_app_e2e_tests.zig +++ b/tests/ts-core/markdown_app_e2e_tests.zig @@ -3,6 +3,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("markdown_core"); const decoder = @import("markdown_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const wire = @import("corewire_rt"); const parity = @import("effects_media_parity.zig"); const canvas = sdk.canvas; @@ -59,7 +60,7 @@ test "compiled app Markdown preserves complete generated trees geometry handlers var before_ui = Ui.init(arena.allocator()); var after_ui = Ui.init(arena.allocator()); const expected = try before_ui.finalize(reference(&before_ui, model)); - const root = decoder.build(&after_ui, &model); + const root = CompiledView.build(&after_ui, &model); core.rt.frameReset(); const actual = try after_ui.finalize(root); try parity.equal(expected, actual); diff --git a/tests/ts-core/markdown_viewer_e2e_tests.zig b/tests/ts-core/markdown_viewer_e2e_tests.zig index 8839ca859..ba5e50dd9 100644 --- a/tests/ts-core/markdown_viewer_e2e_tests.zig +++ b/tests/ts-core/markdown_viewer_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("markdown_viewer_core"); const decoder = @import("markdown_viewer_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const reference = @import("markdown-viewer-reference/main.zig"); const parity = @import("effects_media_parity.zig"); const testing = std.testing; @@ -88,7 +89,7 @@ fn viewParity(expected: *const reference.Model, actual: *const core.Model) !void const View = canvas.CompiledMarkupView(core.Model, core.Msg, @embedFile("app.native")); for (0..2) |backend| { var b = Ui.init(arena.allocator()); - const new = try b.finalize(if (backend == 0) View.build(&b, actual) else decoder.build(&b, actual)); + const new = try b.finalize(if (backend == 0) View.build(&b, actual) else CompiledView.build(&b, actual)); core.rt.frameReset(); try parity.equal(old.root, new.root); try testing.expectEqual(old.handlers.len, new.handlers.len); @@ -349,7 +350,7 @@ test "Markdown Viewer complete appearance chrome scroll and token register match } fn themeView(ui: *canvas.Ui(core.Msg), model: *const core.Model) canvas.Ui(core.Msg).Node { - return decoder.build(ui, model); + return CompiledView.build(ui, model); } test "Markdown Viewer owns the complete custom register across accessibility and frame expiry" { const Adapter = sdk.TsUiApp(core); diff --git a/tests/ts-core/notes_e2e_tests.zig b/tests/ts-core/notes_e2e_tests.zig index a729b271f..785191bb7 100644 --- a/tests/ts-core/notes_e2e_tests.zig +++ b/tests/ts-core/notes_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("notes_core"); const decoder = @import("notes_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const reference = @import("notes_reference.zig"); const native_model = @import("notes_model_reference.zig"); const parity = @import("effects_media_parity.zig"); @@ -92,7 +93,7 @@ fn viewParity(expected: *const reference.Model, actual: *const core.Model) !void const View = canvas.CompiledMarkupView(core.Model, core.Msg, @embedFile("app.native")); for (0..2) |backend| { var b = Ui.init(arena.allocator()); - const new = try b.finalize(if (backend == 0) View.build(&b, actual) else decoder.build(&b, actual)); + const new = try b.finalize(if (backend == 0) View.build(&b, actual) else CompiledView.build(&b, actual)); core.rt.frameReset(); try parity.equal(old.root, new.root); try testing.expectEqual(old.handlers.len, new.handlers.len); @@ -295,7 +296,7 @@ fn notesReplay(comptime compiled_view: bool) !void { var full_model: ?[]u8 = null; defer if (full_model) |bytes| testing.allocator.free(bytes); { - const state = try Adapter.create(testing.allocator, .{}, .{ .name = "notes", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) decoder.build else View.build, .on_command = notesCommand }); + const state = try Adapter.create(testing.allocator, .{}, .{ .name = "notes", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) CompiledView.build else View.build, .on_command = notesCommand }); defer state.destroy(); state.effects.executor = .fake; const harness = try sdk.TestHarness().create(testing.allocator, .{ .size = .init(1180, 760) }); @@ -329,7 +330,7 @@ fn notesReplay(comptime compiled_view: bool) !void { try testing.expect(!recorder.failed); try testing.expect(recorder.effect_count >= 4); } - const state = try Adapter.create(testing.allocator, .{}, .{ .name = "notes", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) decoder.build else View.build, .on_command = notesCommand }); + const state = try Adapter.create(testing.allocator, .{}, .{ .name = "notes", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) CompiledView.build else View.build, .on_command = notesCommand }); defer state.destroy(); const harness = try sdk.TestHarness().create(testing.allocator, .{ .size = .init(1180, 760) }); defer harness.destroy(testing.allocator); @@ -378,7 +379,7 @@ test "Notes compiled view owns every byte text field" { test "Notes complete theme tokens match both native palettes" { const Adapter = sdk.TsUiApp(core); - const state = try Adapter.create(testing.allocator, .{}, .{ .name = "notes", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = decoder.build }); + const state = try Adapter.create(testing.allocator, .{}, .{ .name = "notes", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = CompiledView.build }); defer state.destroy(); for ([_]canvas.ColorScheme{ .light, .dark }) |scheme| { Host.dispatch(&state.effects, .{ .system_scheme = .{ .colorScheme = switch (scheme) { diff --git a/tests/ts-core/split_collapse_e2e_tests.zig b/tests/ts-core/split_collapse_e2e_tests.zig index bb47e33e8..5bfd1c0e2 100644 --- a/tests/ts-core/split_collapse_e2e_tests.zig +++ b/tests/ts-core/split_collapse_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("split_core"); const decoder = @import("split_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const reference = @import("split-collapse-reference/main.zig"); const parity = @import("effects_media_parity.zig"); const testing = std.testing; @@ -112,7 +113,7 @@ fn viewParity(expected: *const reference.Model, markup: bool) !void { const before = try before_ui.finalize(if (markup) reference.CompiledSplitView.build(&before_ui, expected) else reference.rootView(&before_ui, expected)); const Ui = canvas.Ui(core.Msg); var after_ui = Ui.init(arena.allocator()); - const after = try after_ui.finalize(decoder.build(&after_ui, Host.model())); + const after = try after_ui.finalize(CompiledView.build(&after_ui, Host.model())); core.rt.frameReset(); try parity.equal(before.root, after.root); try testing.expectEqual(before.handlers.len, after.handlers.len); diff --git a/tests/ts-core/typography_e2e_tests.zig b/tests/ts-core/typography_e2e_tests.zig index 1f245bdbd..667863f92 100644 --- a/tests/ts-core/typography_e2e_tests.zig +++ b/tests/ts-core/typography_e2e_tests.zig @@ -2,11 +2,12 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("typography_core"); const decoder = @import("typography_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const canvas = sdk.canvas; const Adapter = sdk.TsUiApp(core); fn view(ui: *canvas.Ui(core.Msg), model: *const core.Model) canvas.Ui(core.Msg).Node { - return decoder.build(ui, model); + return CompiledView.build(ui, model); } fn expected(model: *const core.Model) canvas.DesignTokens { @@ -70,7 +71,7 @@ test "compiled rich text preserves registered face runs and alignment after deco var arena = std.heap.ArenaAllocator.init(std.testing.allocator); defer arena.deinit(); var ui = canvas.Ui(core.Msg).init(arena.allocator()); - const root = decoder.build(&ui, model); + const root = CompiledView.build(&ui, model); core.rt.frameReset(); const tokens = expected(model); const tree = try ui.finalizeWithTokens(root, tokens); diff --git a/tests/ts-core/video_player_e2e_tests.zig b/tests/ts-core/video_player_e2e_tests.zig index a1e244e50..1343bfbbf 100644 --- a/tests/ts-core/video_player_e2e_tests.zig +++ b/tests/ts-core/video_player_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("video_player_core"); const decoder = @import("video_player_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const reference = @import("video_player_reference.zig"); const parity = @import("effects_media_parity.zig"); const canvas = sdk.canvas; @@ -46,7 +47,7 @@ fn viewParity(native: *const reference.Model, model: *const core.Model) !void { for (0..2) |backend| { var b = Ui.init(arena.allocator()); b.video_state = .{ .active = state.active, .playing = state.playing, .buffering = state.buffering, .completed = state.completed, .position_ms = state.position_ms, .duration_ms = state.duration_ms, .surface = state.surface, .width = state.width, .height = state.height }; - const actual = try b.finalize(if (backend == 0) View.build(&b, model) else decoder.build(&b, model)); + const actual = try b.finalize(if (backend == 0) View.build(&b, model) else CompiledView.build(&b, model)); core.rt.frameReset(); try parity.equal(a.video_declaration, b.video_declaration); try parity.equal(expected.root, actual.root); @@ -120,7 +121,7 @@ fn playerReplay(comptime compiled_view: bool) !void { var full_model: ?[]u8 = null; defer if (full_model) |bytes| testing.allocator.free(bytes); { - const state = try Adapter.create(testing.allocator, .{ .env_values = &env }, .{ .name = "video-player", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) decoder.build else View.build }); + const state = try Adapter.create(testing.allocator, .{ .env_values = &env }, .{ .name = "video-player", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) CompiledView.build else View.build }); const harness = try sdk.TestHarness().create(testing.allocator, .{ .size = .init(760, 560) }); defer harness.destroy(testing.allocator); defer state.destroy(); @@ -152,7 +153,7 @@ fn playerReplay(comptime compiled_view: bool) !void { try testing.expect(!recorder.failed); try testing.expect(recorder.effect_count >= 4); } - const state = try Adapter.create(testing.allocator, .{ .env_values = &env }, .{ .name = "video-player", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) decoder.build else View.build }); + const state = try Adapter.create(testing.allocator, .{ .env_values = &env }, .{ .name = "video-player", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled_view) CompiledView.build else View.build }); const harness = try sdk.TestHarness().create(testing.allocator, .{ .size = .init(760, 560) }); defer harness.destroy(testing.allocator); defer state.destroy(); diff --git a/tests/ts-core/virtual_fixed_e2e_tests.zig b/tests/ts-core/virtual_fixed_e2e_tests.zig index 8f83f42b5..7a293e4a2 100644 --- a/tests/ts-core/virtual_fixed_e2e_tests.zig +++ b/tests/ts-core/virtual_fixed_e2e_tests.zig @@ -2,19 +2,23 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("virtual_fixed_core"); const decoder = @import("virtual_fixed_decoder"); -test "fixed-only compiled virtual view emits usable mirror capabilities without numeric helpers" { +test "fixed-only compiled virtual view emits usable extent capabilities without numeric helpers" { var arena = std.heap.ArenaAllocator.init(std.testing.allocator); defer arena.deinit(); const model = core.initialModel(); defer core.rt.frameReset(); + try std.testing.expectEqual(@as(?u32, null), core.virtualExtentHelper("absent")); try std.testing.expectEqual(@as(?u32, null), core.Model.virtualExtentHelper("absent")); try std.testing.expectEqual(@as(?u32, null), core.RuntimeModel.virtualExtentHelper("absent")); + // Both model types forward the one file-scope capability. + try std.testing.expect(&core.Model.virtualExtentEstimate == &core.virtualExtentEstimate); + try std.testing.expect(&core.RuntimeModel.virtualExtentEstimate == &core.virtualExtentEstimate); + try std.testing.expect(!core.has_windows); // Force Zig to analyze the complete callback, even though fixed lists // never invoke it. It must trap for invalid identities, not fail to compile. - std.mem.doNotOptimizeAway(&core.Model.virtualExtentEstimate); - std.mem.doNotOptimizeAway(&core.RuntimeModel.virtualExtentEstimate); + std.mem.doNotOptimizeAway(&core.virtualExtentEstimate); var ui = sdk.canvas.Ui(core.Msg).init(arena.allocator()); - const tree = try ui.finalize(decoder.build(&ui, model)); + const tree = try ui.finalize(decoder.ViewFor(core.Model).build(&ui, model)); try std.testing.expect(tree.root.children.len > 0); const records = ui.virtualWindows(); try std.testing.expectEqual(@as(usize, 1), records.len); diff --git a/tests/ts-core/workbench_e2e_tests.zig b/tests/ts-core/workbench_e2e_tests.zig index 0fd34261f..6470e5ba1 100644 --- a/tests/ts-core/workbench_e2e_tests.zig +++ b/tests/ts-core/workbench_e2e_tests.zig @@ -2,6 +2,7 @@ const std = @import("std"); const sdk = @import("native_sdk"); const core = @import("workbench_core"); const decoder = @import("workbench_decoder"); +const CompiledView = decoder.ViewFor(core.Model); const reference = @import("workbench_reference.zig"); const parity = @import("effects_media_parity.zig"); const Host = sdk.TsCoreHost(core); @@ -61,7 +62,7 @@ fn viewParity(native: *const reference.Model, model: *const core.Model) !void { for (0..2) |backend| { var b = canvas.Ui(core.Msg).init(arena.allocator()); b.pty_key_resolver = referenceKey; - const actual = try b.finalize(if (backend == 0) View.build(&b, model) else decoder.build(&b, model)); + const actual = try b.finalize(if (backend == 0) View.build(&b, model) else CompiledView.build(&b, model)); core.rt.frameReset(); try parity.equal(expected.root, actual.root); try testing.expectEqual(expected.handlers.len, actual.handlers.len); @@ -196,7 +197,7 @@ fn replay(comptime compiled: bool) !void { defer if (full) |bytes| testing.allocator.free(bytes); var fingerprint: u64 = 0; { - const app = try Adapter.create(testing.allocator, .{ .env_values = &env }, .{ .name = "workbench", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled) decoder.build else View.build }); + const app = try Adapter.create(testing.allocator, .{ .env_values = &env }, .{ .name = "workbench", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled) CompiledView.build else View.build }); defer app.destroy(); const harness = try sdk.TestHarness().create(testing.allocator, .{ .size = .init(1280, 800) }); defer harness.destroy(testing.allocator); @@ -221,7 +222,7 @@ fn replay(comptime compiled: bool) !void { recorder.finish(); try testing.expect(!recorder.failed); } - const app = try Adapter.create(testing.allocator, .{ .env_values = &env }, .{ .name = "workbench", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled) decoder.build else View.build }); + const app = try Adapter.create(testing.allocator, .{ .env_values = &env }, .{ .name = "workbench", .scene = reference.shell_scene, .canvas_label = reference.canvas_label, .view = if (compiled) CompiledView.build else View.build }); defer app.destroy(); const harness = try sdk.TestHarness().create(testing.allocator, .{ .size = .init(1280, 800) }); defer harness.destroy(testing.allocator); diff --git a/tests/ts-services/feed_reader_e2e_tests.zig b/tests/ts-services/feed_reader_e2e_tests.zig index adf8c9569..4e75455e6 100644 --- a/tests/ts-services/feed_reader_e2e_tests.zig +++ b/tests/ts-services/feed_reader_e2e_tests.zig @@ -112,6 +112,7 @@ fn referenceWindowView(ui: *App.Ui, model: *const core.Model, label: []const u8) return CompiledWindowView.build(ui, model); } const TsView = @import("ts_compiled_view.zig"); +const CompiledView = TsView.ViewFor(core.Model); const fixture_feed = @embedFile("fixture_feed.xml"); @@ -131,8 +132,8 @@ fn appOptions(reference: bool) App.Options { .name = "feed-reader-e2e", .scene = app_scene, .canvas_label = canvas_label, - .view = if (reference) CompiledAppView.build else TsView.build, - .window_view = if (reference) referenceWindowView else TsView.buildWindow, + .view = if (reference) CompiledAppView.build else CompiledView.build, + .window_view = if (reference) referenceWindowView else CompiledView.buildWindow, .on_command = core.commandMsg, }; } @@ -716,10 +717,10 @@ test "compiled primary and window view copies survive alternating scriptc arena // The wire may carry exact raw bytes instead of a JSON string. Keep // the full buffer comparisons above and assert text through its consumer. var primary_ui = canvas.Ui(core.Msg).init(allocator); - const primary_tree = try primary_ui.finalize(TsView.build(&primary_ui, Bridge.model())); + const primary_tree = try primary_ui.finalize(CompiledView.build(&primary_ui, Bridge.model())); try std.testing.expect(findTextIn(primary_tree.root, "Service Feed Reader")); var secondary_ui = canvas.Ui(core.Msg).init(allocator); - const secondary_tree = try secondary_ui.finalize(TsView.buildWindow(&secondary_ui, Bridge.model(), "feed")); + const secondary_tree = try secondary_ui.finalize(CompiledView.buildWindow(&secondary_ui, Bridge.model(), "feed")); try std.testing.expect(findTextIn(secondary_tree.root, "Native SDK Notes")); } diff --git a/tools/corewire/core.test.ts b/tools/corewire/core.test.ts index a2a946c5e..a8a9882f2 100644 --- a/tools/corewire/core.test.ts +++ b/tools/corewire/core.test.ts @@ -48,6 +48,10 @@ test("nested unions in helper arguments retain their decoder type imports", () = // Exact diagnostics and complete generated-file hashes captured from the // independent native implementation before replacing its admission rules. // Mirror hashes include the reviewed stateless-runtime API addition. +// Mirror hashes also include file-scope host facts: `has_windows` and the +// virtual extent capability, which the model types forward. Removing that +// block and nesting the capability back in both model types recovers the +// previous mirror pins exactly. // Facade hashes include exact u32 image identities, nonreplacing file // results and exact-range timers. Removing the reviewed timer encoder // addition recovers every previous complete facade pin. The byte-key @@ -110,13 +114,15 @@ test("parameterized arena helpers and retained integer estimators keep the attes assert.match(mirror, /pub fn snapshotModel/); assert.match(mirror, /decoded_model = null/); assert.match(mirror, /const args_tuple = \.\{ p0, p1 \}/); - assert.match(mirror, /pub fn virtualExtentHelper/); - assert.match(mirror, /pub fn virtualExtentEstimate/); + assert.match(mirror, /\npub fn virtualExtentHelper\(name: \[\]const u8\) \?u32 \{/); + assert.match(mirror, /\npub fn virtualExtentEstimate\(context: \?\*const anyopaque, index: u64\) f32 \{/); + assert.equal(mirror.split(" pub const virtualExtentEstimate = shim_root.virtualExtentEstimate;").length, 3, "both model types forward the capability"); + assert.match(mirror, /\npub const has_windows: bool = false;/); assert.match(mirror, /callHelper\(\[\]const Range, 0, args, arena\)/); assert.match(mirror, /@bitCast\(@as\(u64, @intCast\(index\)\)\)/); assert.match(facade, /rows\(nscfCommitted,/); assert.match(facade, /estimate\(nscfCommitted,/); - for (const name of ["virtualExtentHelper", "virtualExtentEstimate", "RuntimeModel", "RuntimeResult", "decoded_model", "restoreCommittedModel"]) { + for (const name of ["virtualExtentHelper", "virtualExtentEstimate", "shim_root", "has_windows", "RuntimeModel", "RuntimeResult", "decoded_model", "restoreCommittedModel"]) { const conflicting = structuredClone(contract); conflicting.model_helpers[1].name = name; conflicting.integer_slots.find(slot => slot.slot === "helpers.estimate.params[0]")!.slot = `helpers.${name}.params[0]`; @@ -138,6 +144,22 @@ test("parameterized arena helpers and retained integer estimators keep the attes } finally { fs.rmSync(dir, { recursive: true, force: true }); } }); +test("the windows helper fact is published at file scope", () => { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), "native-windows-fact-")); + try { + for (const declared of [false, true]) { + const contract = baseContract(); + if (declared) contract.model_helpers.push({ name: "windows", params: [], returns: { kind: "f64" }, arena: false }); + fs.writeFileSync(path.join(dir, "input.json"), JSON.stringify(contract, (key, value) => (key === "origin" || key === "member") && value === null ? undefined : value)); + const result = spawnSync(corewire, ["--sidecar", "input.json", "--out", "mirror"], { cwd: dir, encoding: "utf8" }); + assert.ifError(result.error); assert.equal(result.status, 0, result.stderr); + const mirror = fs.readFileSync(path.join(dir, "mirror"), "utf8"); + assert.equal(mirror.split("\npub const has_windows: bool = " + declared + ";\n").length, 2); + assert.doesNotMatch(mirror, /shim_root/, "no virtual extent capability without numeric helpers or virtual views"); + } + } finally { fs.rmSync(dir, { recursive: true, force: true }); } +}); + test("Markdown recipe wrapper names reserve only when window policy glue is emitted", () => { const dir = fs.mkdtempSync(path.join(os.tmpdir(), "native-markdown-collision-")); try { diff --git a/tools/corewire/core_goldens.json b/tools/corewire/core_goldens.json index 7643513ac..3568277ed 100644 --- a/tools/corewire/core_goldens.json +++ b/tools/corewire/core_goldens.json @@ -3,7 +3,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -447,7 +447,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "de07551c7b0bd2b3555d4f7ab0b762d3894e4f38b3db6aa39d712d870d296612", + "mirror": "0aaaa44c2d017926c8a315ef4802de7ba63eb901321098d6385fa7a5ec976916", "facade": "80c22a1d153daba195914d6af9bc7b6e4b5e881ec14c9b6b849970d18b95421d", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "cbce1e7f26f47a9968155853691234543c395e5633183ec6883b318fb2833c9d" @@ -459,7 +459,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "e4c9623a2dc7755c45eeee41d3731bd1b30b38c1e65abf98e0f7a906a11ca954", + "mirror": "bd31e22635a30788f280933a2216ab76df83e4e25c6e3fa8e2f6879e5ede3047", "facade": "f76af80f9d75079ad85ede514b478c10416818948f5bda57024e38c10ba24f5e", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "8aeefe566269f88ff5f83b38d0dd67d3b9a2025cc0d0814371f69103c6582910" @@ -471,7 +471,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "0291e2943b66ca9f156230520eb058475f5d76fb369279ee18a28b5027814b6a", + "mirror": "5acfc7e6c00142daf9735fd791f010087bf4d4d8d457ec856792a2e5c3da7807", "facade": "01e30e12c2954c324492b48101f28fb7ab0ec167761613e57e7d0e04c1296b68", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "5f6263b74ae1b8c464b548065305b643e49b06d76970b97213fd97f2cd113a2e" @@ -555,7 +555,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "d5a9d1279612bd3ee8a98e9aeeceee400db6c6333de00e37b0d6ca90648e2c0b", + "mirror": "dc27cfaa346c931a1edf0ee8e99614b700d3bbe67a7c3dd646025fdb510b9c47", "facade": "149a11ad8a0ca86bb2ebf9c779bd14b2d32e5cd6f2dbe1cc598d6dd2524257ac", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "3e83b13ceebfbab34f9c4ba0a5446ea655d3a55428c4c40f0e6722e2c9930605" @@ -567,7 +567,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "7eed9fac5899dd112126f52526a32c2bbff0edba825b016dcb98448325e2d145", + "mirror": "ee421fa90ea638732f30d4c2c5ce3038ae15adb9ddcdfb3534c8c991df165524", "facade": "24f685b2935ee23ad893fb5ba0cfc8997451c554b2bd72bae74f31b95345d8f0", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "ab5ee09b1c76f1b2e91f9610356e99750f9ae5ef3e7139d8357784961325e42b" @@ -579,7 +579,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "cb7049c4aeeb19120b207701ecf0f22ac11cc9e610c8c4ebd72a6ff2e15a26d9", + "mirror": "d70cab8e748aeb5f7ac7e14d2d21c6d7bededecec4c90fb93e480114f3877599", "facade": "78e70555e255d3d6ced83b3cbb8f2fe5f2503c32c4a0e63b707964db2c58c210", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "15d5c4be07d5aed7d1f9e9f77c9f504cc1e7df15b1d24ca36a61830c3b237620" @@ -735,7 +735,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "ff0cf716f615b62afd696a2902dcf4dc863ad9a63f0c6489e28a17677d36f499", + "mirror": "9400e76be18376e36f9011b18b24d74614b66587659bbb69fb4aa6d555ba6dfd", "facade": "c3f8e5bd9546f4d4f3d30fc046654dd1288e3c13835a17e57ee1e2917b29945b", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "05da49a73ff3d43d5fe684cb13b02c8ac63d5de91d091c23a5b1fa25d2df14f3" @@ -879,7 +879,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "3eb01cc38ab1a16d06ac8994877addf025cc2fdfae3d53f84d880a3bf421120a", + "mirror": "e939584db04b2db87dbb5673a7fafb6f1b26dfade33eacaac0f3e1c81de1d838", "facade": "1d12fd90225adb4db59b6a2d797bc4c99cebd990b47a4698ee587e93656e8ed7", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "4551f317edc8f7829d487d78ab4556d4a1c563837933cf53eadfaccb20713bb3" @@ -915,7 +915,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "6902afede8ef9ac2566e7c6ff0604ebbb812f1c66ec79e622032fab9922b7c15", + "mirror": "bc3a13e8ab99c24df236be4841ad535ce8daeeea58d2bc64af6571d8972b5e32", "facade": "eb9f30d5e6be59a94371edcbf45f1cc365f647b734d123bb89d7aa21e9dd9c13", "profile": "cee06885f8e5b3ab0f85e10815e3f6735fd54c6da136957ae15a4d1914f9a02e", "effective": "ec7b04dc0ef6b21c62ed1e88554e3573d4ff3791b871410601a61d28a7805ec3" @@ -951,7 +951,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "473c535ee1158241cd634718f71956a63f6648d17f05a954a7541854e6705c57", + "mirror": "bcd86a933f04d65123af741b9e5b44d6ddaca9fea1ada8c9bc07eab211e6c6ce", "facade": "1b5fcf52c78535e200765597bc560142801adf9da8d6b63a226657c227752392", "profile": "9df9f3358a0fddf9e84bf34d9165cc67de104e09e8d79885a4148697345146a1", "effective": "5373d6d58351f51149c15077220d590a490e3d3b97eb8309bbc6d3b2e3659742" @@ -987,7 +987,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "3bb19acb996bcbc708c40d3694928f77169319ba1ad3a9449a8b6400b2767f1b", + "mirror": "dfd491994fa297ee71d07a0a27c87f44011d98252aec86d087198dfe3c0670d6", "facade": "1d7692279bb26cd939a230b1fb8f166be4ab873294084a83eed213bf0ea8a874", "profile": "b63eb52e63ecbb5d7d02c670740254a851ec30a227de934a804d2f1dd574995d", "effective": "61c9690c74a1347a7d20040f35178688f55de9880b888a551f1d18bebf3b8d11" @@ -1023,7 +1023,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "a9e6af3fa8758ec7640861db16df23bd54eef131148be59dbdec1b50e1e77c5d", + "mirror": "d2214a197e080107c7391bcd07af19a8bfa8c68a86d02153731a451cb3930da1", "facade": "df77aac8cc5eb68824c8079c2df08f8ac97fc4e4516c1ab5673643a507050f28", "profile": "72fec682fbd85f548d66452330c605d4557a789c8adeaf4e8ea03fe5d3e8fd53", "effective": "5a7f763004c0c6a06842eac5d0b93b0f5782f138e08f0eb2b91aaacff8bdd3d6" @@ -1059,7 +1059,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "af8984e236071c863d130e09a7c38f399c8c3cdc12740d8cdbfb65e6061b498b", + "mirror": "c3e3e92208945dd9560ed05a2f276c04f956473a377dbdb6378d51e0cc59be52", "facade": "468668d6a9873b4dd7c111fe4374812432b665b9b0a342e4834b4457ff429e73", "profile": "bd5496a05c46eedea490cc5313b381506f8ebe5da6ba1f56568c7bb915bf2c83", "effective": "10c85e2337076ac7e716184e909c0b81a11bd6cdf72a1c07c7e8c2898bbaf8e6" @@ -1119,7 +1119,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "640d32dc7a4575797a7fc97849a3e5377c3c4b97cfb9fe4c863690a1a11c5b2e", + "mirror": "05a624d21a2eba372effb47da00ac635614bb19590fc21b35e9fa2862909d309", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "25ef9b07150dcd22c938bfbb4c3679e36d54ae94fb9679977f9e45235cd2c44f", "effective": "126780b63a8eedb923b96f8a76e3f29d88a6612873cdeb72072bcdc243c78d28" @@ -1263,7 +1263,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "9794c8efeec9f0a08d86d7db94cfb746886a82f670c45311f28032fe81324b75", + "mirror": "6587fc9778647b36886376130cd716eeadcd2a3e9b501a28af8764d9bd22f51f", "facade": "07311b522cd84b0258a2db39cdf8fbab59511ad3fc06b0b1ea123b17eb3c69e9", "profile": "ad364effa3535e364440184820d6960108d3cab98a880f58c0328c116d43b14f", "effective": "95815f3753d9c41791758e4f7b2b4b788d1c57aa119bc31f9a1e9566af5762f3" @@ -1383,7 +1383,7 @@ "status": 0, "diagnostics": "input.json: warning: types.structs[0].fields[2].type.name: unknown field ignored (an emitter newer than this reader may emit additive facts)\ninput.json: warning: types.structs[0].fields[2].type.elem: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "ff46f118355f16090512d6f87b524ed0e2274374e8e67b93eecba3ef5240ed37", + "mirror": "2adab6bce01cc8c174b7e919befc432e68526e112862ecdc58d93e74a6f69bb5", "facade": "9205cef00f6e0c6b7e583b74c4c5589b240b7421d5fc99447126d4c4700cbc71", "profile": "94eeb9fe65ca5cc679aa7328d7e032958fdb5ac37dbfa5abf3cc65bbab1a1b6b", "effective": "923c42ef14e05944f1b903f123d05a1a1a8fd936d9e8eaa293e5f38769e0d5a1" @@ -1395,7 +1395,7 @@ "status": 0, "diagnostics": "input.json: warning: msg.arms[0].payload.number_class: unknown field ignored (an emitter newer than this reader may emit additive facts)\ninput.json: warning: msg.arms[0].payload.number_field: unknown field ignored (an emitter newer than this reader may emit additive facts)\ninput.json: warning: msg.arms[0].payload.bytes_field: unknown field ignored (an emitter newer than this reader may emit additive facts)\ninput.json: warning: msg.arms[0].payload.type: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "5844578f66314634e7c8e4588912821681a1064b3159c46419d08afa8a045d2e", + "mirror": "2d18118bf48a0729b2cb8ac73d651027328ba9217e3a270c8ce2cc050eca3fc7", "facade": "2332279fc3ce04942baec1a6010f0bcce08d29a58372cda404580e2740717073", "profile": "13b1a39de034c54cced257199ea82d8ea284043e12651294d332b50df1eafd73", "effective": "d047907271e3c8927f05610598aa60a50028e5e53cafdc3fb651eda3f5113f4f" @@ -1407,7 +1407,7 @@ "status": 0, "diagnostics": "input.json: warning: msg.arms[0].payload.class: unknown field ignored (an emitter newer than this reader may emit additive facts)\ninput.json: warning: msg.arms[0].payload.type: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "9586d8b8ee5a39e04b49184e4fb8479f61363bbf340ad40b3fe3c898c7c803d9", + "mirror": "9a7a434f2e263d947d04256c05a26af98d71e3a22a7816b9323d6878cc83af03", "facade": "eb818552fa7bca99bab607b4870af44d2f662b0fc873ec292ad1cec705a6204c", "profile": "6428ebc0297c218e7e5a1d054ad2b0d030cb0662438474a63b65648bf6cb321b", "effective": "bf79e9c624031a906485c43ebe283555809ee73675c56843cd7460ff16135943" @@ -1431,7 +1431,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "3d2af70882c9b17457850e84d8042a877a76a2fff3c6f93f207841338cc2c401", + "mirror": "12a1f09145e34b3fb5d32547989ba402ecbb88722560dc98457d7bcf1454bf42", "facade": "7bdf3b6bcae1066f17450360f38bfb988dfe7ae8c99926c796d92408de6dff19", "profile": "45cefda56c42b695704fd99e96088f84e86e7df55caac80b6394ec4022f7bf86", "effective": "36d9ef16ebf51dd31f203bd084871d127a09b6209ea1e2b5bc4214d15acb3280" @@ -1635,7 +1635,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f6a0fa2c048956b8b21864fdfad08576a27e482445d5f18c4021f286d5f2ee22", + "mirror": "2fcf470ca9391c7595496502993e10d82da711dddf0adb1cb90de73b4ff7f126", "facade": "648284b7e7bcfadc39718ccdacae0de61ea9cb454a8b54c2a93d35e84d0eb7d1", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "ddd0071ae7fa1750135f6ba4bbcdb5389a1e4f56c71a441634be415ecacadccb" @@ -1647,7 +1647,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "bc7912d24102361d168deecd35b0174f76851de4a6e96ac3139638a37e8a4ce6", + "mirror": "9c1c517770fe8f238531527aae14b02b1d41dab703ce9c95ea2862d3cdf01196", "facade": "7f0d7b1ee99e43be9585fcca4c56fb015e8b08889b1b4e8a0f1e397ffe16371f", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "51c789c89fd1ac6787b90a7fe93c86c8359cbd72e0173937bd5dfea27fa2ae4c" @@ -1659,7 +1659,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "68cb570b009a3a9020c7448c2348f425c7d1271a1981b47b44381a8fa4bf25f4", + "mirror": "606f820d17d0a268e8855b216576c394cd49673f72c3c95a1ccefb3ac6a19222", "facade": "11cd1e5144de97b2c0164d81dd85beca7d43d6b0c8a96a1409931ec9f872e56a", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "8ff8d6fc2c50d30d94ea153dbd704e7b9d280a94c5046d404d1f1bdf456afc82" @@ -1779,7 +1779,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "ede228f6adbb6ab451f5eefbc2ab4f8a4d545cc113a0a12991571a6af7ad4c7c", + "mirror": "a604e1cdb00aff6fd344d727e911dbd36944ddbd70fcb24442261f0157facbe2", "facade": "88d887d06a56bbf8314bcf60ea229de52cfae7d7b0e1c56485c17a71fdd2b579", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "702aacca7efefd662dbc67675132b6a99dfb46191106578ca2766c9064a79b03" @@ -1791,7 +1791,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "812413060805c49c77fc4a2f15c54af96031d80ca98b6f0031a0af53caecb7d6", + "mirror": "e3e32f7f639c882dd61f34923f770735f3ab4c985379bb7b72245fc3ef85a43b", "facade": "1311dfd4b4ff3d7faf3c401293bb11d12ae079665b7b950391c49f2e89d5e4c8", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "93e66c4effb98c255146418f10f4bbf8062e3d9f5ad359708c2a31e7c591e647" @@ -1803,7 +1803,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "451c828ad530afee747e4facf63376a880f5f2dec51dfbcf97f7b1f163b0ced2", + "mirror": "21cb0f2508dfb0d218a66a5dfbd5ad87fbd0f5a3e5024c0cd3621d57d4d89234", "facade": "fec25e4be38b7cbf0d7c64716a92fa16284d5541c8bfd224079636102bf1b513", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "2cd741a14d1f63be238cc56981d11e490ebf0234d9ed7396c59d89a236792718" @@ -1815,7 +1815,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "e81bb28f6a6d2035c30a37dddeb98425e22dc295e003fcd9b4ab20e225268c92", + "mirror": "bcc92aa57eb2bae67d24e5bdc6834ed22061ae9adb87826f92cd710785382eee", "facade": "fe4b04d887209004437d1aacd08a9d00e874dc7c188dffc1082ea1db72edb548", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "cd07acf9bb503dbc63567e179fd36d7187691edf975eb9967a33042217c52f2b" @@ -1875,7 +1875,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "77bac7d0a578ca382112c864152e8f3b58bfb0e61ccfe999cccbee9e2ee38826", + "mirror": "c0cee657230bfa5b9a8741d73697de341fa5ee378c61db40a53a1ee401f53c7e", "facade": "39a3920c355a70bc2ee05a72709f8cb9d474ec55cdfd96dbcc225a20b9adc067", "profile": "c3ac888389fddb0ba089ebe0e4eb6dbc036ea3b132f64028d123ae2df96615b2", "effective": "3f76424e627dcf4e19b19246db388623cb2a8fb6e430258f4099470c427dc4c2" @@ -1899,7 +1899,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "592f95bce19a9f673e227e3fa42aaabe931ca614318cc64ccfffa8d166f4da7d", + "mirror": "a44a4ef386de640b44a5857ff399e87a3cf331286b1c84d38d5163e70876f47b", "facade": "03373b93452eb4e4ed9567702a582eaa8b92b53f4058dc6be000bd6cd3acc275", "profile": "3192093545a80278208def566482699133fc90ad931e8dda7c1c573794c3691b", "effective": "f1a1252267fade7c81804c2d15bc0aef52c5cc130d318e403800bc4048805f2c" @@ -1923,7 +1923,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f615cc6c34ca58ed5636a7a89338ddf341c0b496787ccf884ea3b2d96bc91ebf", + "mirror": "09d85cf18ed2ae50ca0045b80afefbcc5773f1927a4e30cd541183a3aadf07d7", "facade": "613764647164f547ac32c6d256e28268d2ce0a8642f6b5369b3e816bd994e893", "profile": "90fed4c45a8f3255d0c125913993a346587a051f986ede99693b76e310d7fc31", "effective": "437ebc64aed8817aa55ed158a8783406f1dc32097959110cf098b3170e500368" @@ -1935,7 +1935,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f8bdcd5d089914e2acfe4d405ccfab0785abe376dae8609f58e73cc98f8493c9", + "mirror": "e7410c32ac5af1b98da01dd3416e1526865e9c65b210e8cc723a6781652065bc", "facade": "330079c48fdec47de94303451f20cdd0ba40e1597aa6d94e9f9b89ceb22b692c", "profile": "242ddc4751fd307d8f581482515c42313992f23b7b1d0b53c55336ebe1f6755c", "effective": "2665b712a986ae37192759b4f7b2da957628cff4bc01c9d8ea47f3ec2125426d" @@ -1947,7 +1947,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "dcf78258654f836571189ba52bc2586e3a455c9fbe0f14e376b8de0e33546811", + "mirror": "e7ac341c038c780050f899fb99ab7c41e61c6704d76538bdf4d31e35025fd092", "facade": "19a5fc0e790284f249e0fafd7293dd63f46e0dfb4aa5c1f5dbb06c9660b6f8dd", "profile": "b551e848c906e2c96731f7e806722e57f74c0050ae14fbe0808d727f76497679", "effective": "105da0ab6cc46d2846d7eeea99dcaa5726d86cc5c44509c1ed1fb509ffd60788" @@ -1959,7 +1959,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "9d39b3e5b9336992dd904f8149dfad9b43dc79b0c9d2351ba71389f9ec83f1bf", + "mirror": "52ec4c6bc545119644f49c3a9342984c2e28e970f8863a8717995658a7880f0f", "facade": "63ec7bd311518741ffe1514518bff32fa78a9ed5d9741c4ddbb27e91c8332183", "profile": "e61145c24fd04a7bc10fb3fdbb8726c33689abdda5752278f29152c1e5f23ac6", "effective": "bc667a686189a72e95cd42bca8b2d51bb4295fa216fd282225c1783b9776971f" @@ -2307,7 +2307,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "bdd511b3283b528561a1e0f55220d0ecc521d83612e304ad6065d550f3000e83", + "mirror": "49867f0617a6c90bf9e8639a6eab55c7f015b0b08bff0d4a20b8c3e30ede5ef6", "facade": "8d004dc9f5832145166b8df879cbe11cd284b0df72e4d81426daf61b18318574", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "1336a08783b748dc27a9d28e40db6e852c9f31ba8aa0fdc906c7bc767fd9e126" @@ -2319,7 +2319,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "bad6ca540f6a3a7616875ab6dd163eba70c7d9a4836387a58cd8077ceb6e3b73", + "mirror": "718c97b5db315e24a865590ea0bb68f8d65d553c0d98bdccb80a387acc0e8815", "facade": "09aa4fc2a1c359d3f8e9849dae69945ac2a943fcd7a4bd2e18a4f1eeeb41f187", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "213f29ab9a118336f0e3d3a43c63e4211ff7a2ae758c624ba9a2970501821943" @@ -2331,7 +2331,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "9c9a493077f95e99544c24d29bb618f999c07e7860772cdd6a09ab3a15c39589", + "mirror": "244464747fd6806512cac520de3acb440da7a4d632a04d73867f8c8cc893ccb1", "facade": "98e62e6fc5fb5c8d94a7186105ef12c516db7c7d9c5c5193a7802a37391a741c", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "f5d3334260e466b22f46311c57499d1659c785e8043e2888a84d30962b13d797" @@ -2391,7 +2391,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "5f2a7cddaee62a5489794a3b40804b6b0e2fcb525bb363845f3d284718108404", + "mirror": "e3e6952475b1574369cfffd5441582bfb590d553025b98a5139f08afe663c477", "facade": "543e458893c6c72bf4369185bc27e071320b544516c16efd15436988a653607e", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "c89840cd0949cb43b2232e4343f17094ae7d3ae67e8cc07aa6f8d6956dde5e11" @@ -2403,7 +2403,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "5b3126290bb889f65b79823bae3e97993a88be739b50c573c4060ada7711e890", + "mirror": "e4d378eb324070b46ddfd2530b522d3f44b80509561780a4160af85dc62f5a12", "facade": "09359a71df13950950ec9eb1a44689269e6543b76035f4d62d2c60b07e80dbc6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "5366e9a0b579b2e94448728ecec324bd3977f632d7515f036fea13c4f9402a84" @@ -2451,7 +2451,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "7a68342d65132930dcba0515f6ec6512eade8efa6a3ee56d3484ff9e14aeb8ab", + "mirror": "158500210030d14218952ab11c81ede434e0b9ab6742c5fcb0725f3df446493e", "facade": "2dfe3268155ef0c77aeb137249f6d88c4c021a45981a179c1290bbf032b139bc", "profile": "0b68e80541e07fca168df5ad67d692c70b3abad0be90f777a9e4123f3a24a425", "effective": "45225bc0d7f121b69de0175beb04cf5d26e0ad141da1a571faea9904ce11ef43" @@ -2547,7 +2547,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "1dfa15733bf76b48c863bbce6f1430d49ea8898adf0ecef522073140026e6923", + "mirror": "94e7b2abd0ee472adddf8f99551b50f6783a9a1c617e187de88749abf655740b", "facade": "9b2f6e590578316f3f6a9a5474f49b4e60bb18ad8b7c101e4c2aafaaa7c9675f", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "02016e552b4776d9a0a101877d4162c090ed23c57d8d877b1e0eb190ae202764" @@ -2571,7 +2571,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "bcaadd9a37748a9cd5b086f3c2cee63ccb8c38b1c0a44097b6b5efa287c57841", + "mirror": "b51782aa79a4e5019a34c17b2c31b9d19ebeb5eeab87466a067af70ed9051315", "facade": "48e7841160736db59fddd6f82a9c979a39e0cb9b64a1f689591cc0739735381f", "profile": "10e97998f202b9b79f9d2119c36ae3867c8509cf5b6bd196eafa930a159dd4a7", "effective": "377259a11e907a7cbc675470c16fa9dc66609060a7d51a01c5aa011ea638da5f" @@ -2583,7 +2583,7 @@ "status": 0, "diagnostics": "input.json: warning: future_contract: unknown field ignored (an emitter newer than this reader may emit additive facts)\ninput.json: warning: types.structs[0].future_table: unknown field ignored (an emitter newer than this reader may emit additive facts)\ninput.json: warning: types.structs[0].fields[0].future_field: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "2f08ac054641d4a5551e2e948e83337d50915a1751543aa7dfa3e17fa6b99bbd", + "mirror": "46aab2d8de4e1b2c1e43fe9e97b370cb881fd9667e7dec426b0e9add29a12bc6", "facade": "2a735a9e467456ab7904a3a08e3bd4900b6756a776ce8cd8ef68d766e824e713", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "9c0758b3854d7df64fd0924485b8a77bac016f11e7fc3fbe098b3bac01dfb9f5" @@ -2595,7 +2595,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "2f08ac054641d4a5551e2e948e83337d50915a1751543aa7dfa3e17fa6b99bbd", + "mirror": "46aab2d8de4e1b2c1e43fe9e97b370cb881fd9667e7dec426b0e9add29a12bc6", "facade": "2a735a9e467456ab7904a3a08e3bd4900b6756a776ce8cd8ef68d766e824e713", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "9e064023a1887432651e75d91e3f736c81e986e634412e8dd860419315573cfd" @@ -2631,7 +2631,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27" + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a" }, "check_status": 1, "check_diagnostics": "input.json: error: types: the model declaration carries no authored type-origin fact \u2014 this sidecar predates facade metadata; regenerate it with the current compiler before requesting --facade, --profile, or --check\ninput.json: error: msg.arms: arm \"label_set\" carries one payload but no authored member-name fact \u2014 this sidecar predates facade metadata; regenerate it with the current compiler\n" @@ -2640,7 +2640,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "ab7185eaab19818b8f98340cb284c08ac7ccddbb62ff2bfcc02689addd312c1f", + "mirror": "6a7d18241667281434b23a82c0837fdf3741e57238db1c0b21e3816c34dafa63", "facade": "05ebac9400914b002841af77367889c76c4defd92fb225ec524050ae7d33a2e7", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "4a15a094643f2e3abfaf4dc594dce1f80c865bda4788900ff7ee2f82cf5a26fa" @@ -2652,7 +2652,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "6bea17acaaa0051098b497b29bb0bb80ca729268ae7809257da992d3a6e67bf9", + "mirror": "287ccf0cd091b52bb18d9614cdef3fb47dbd20ff24ddb8badc7e830daad405e1", "facade": "0a6cd9a891d323b2b1380c25d1df7dacf6b8648515cb95e8ad711c6d10a7abe6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "5d261632cd21f03b2b6431ec5c06fe63b4c7c2a044e90208c83a84c253d60f6b" @@ -2664,7 +2664,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "56f7fcec5e7023374f26cc4d87b06cf82b9653e10807ce278ddb271e029a1b87", + "mirror": "8131b42cf398f521a8d7faf54b12f2473f4cdf02e29162590884e135a055b59a", "facade": "e108e2564a56c84d1736ce5c1712278b0b71478d28109260da8318ac813cfb67", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "21cb07a18ded91f29b6af5a0ea71afdf2e87229719fc3f8fd0bf4f413548f7e4" @@ -2688,7 +2688,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f968666916059eab549eb9ba697a71dab3e8802328e2eca80e23a6dd77a21bef", + "mirror": "9001629a217aa71f0dae4d8d7d8b1abe5a9e3d0a17d1d9d4afcbae1718f014f6", "facade": "6988e67ba760bdedcb1b15b61fe4dfcaba0a7c0fcb4ce8361294dcd72133f209", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "c42e1ae6cd4cef22d5ce819e034484c79c734376e759c2fcdb109ded3f1f3f34" @@ -2700,7 +2700,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "783e3dcd326f45425fa82fcbca2dc09476a302dcf52199b1efd364d4f29cffa6", + "mirror": "8ccf3d19ea5cb581d4e58154a84d0cc4ada6cfb9f49e1ff88e816686bfb6a4a5", "facade": "b2f069061547f93ddb7668a6354c3991c2ffd04c9f5083b95f648e1b9b73ba7b", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "91fc682579df0b3165f3e71d37d8dcc3537055fff09277d8a05ee18d1ecbae38" @@ -2712,7 +2712,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "4699765c3fe13ac6707ba31308942e1e2a0f20775b310675cdaadae1005ea2b9", + "mirror": "57efdcc76a08240926b89281f3b72998483fea87542e7618f733da1a86a9a713", "facade": "e0ef35e1aaf3e07ab37697075602c0a583c3210f684ef4ea1cb113305a92cfa4", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "ddb60ea6bd4f48ebec1ecabfbabc666d817b861fbdfb00f275814c1b50287b00" @@ -2724,7 +2724,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "d4054da44fac50687c94fa72962812c0b2faaa3f5c995f2096e40cd8d0190e08", + "mirror": "f83f348ebe2a37cc95e134adf17f0e428912fc45d0a4bed2714b24503355041f", "facade": "96fde014b2139ad3e1da886fbed999daa9d07681fced17d4540dc046df39ebdc", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6f5387791014a32c67a63b5d37b8c8c6ee8f0cfb9d06c81a72814877ae218aed" @@ -2736,7 +2736,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "a8f6a462f1e37707c8f55e94f0f9b9ac5193a45966dc9acffba77a43c48d9f4e", + "mirror": "168950f66aaf2b879bda7cf813bee7933cec82d056f6351115031fbf3a4a2716", "facade": "caa3caf1a816ca3f837a7d93833998aa145d9acaac068b52b64366138176e1d1", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "b7ea59caaf9d0c8d09042d832d6fd7a27c8f6858f341ebfc26162ea174b141ae" @@ -2748,7 +2748,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "60700744c6eba75409fa627de24a5bc171102bb502628d340ebc1053ea01bdc1", + "mirror": "f453522b286a92b78523592b695c392408323248393110748ef6b260e25da23c", "facade": "962b11c03a808106af0d92724376191ede710c9f87362695c8ccaeaec26f596d", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "632416285e98c7c62d5ae3a934e753d3975d75df04e2344f34adf0202df5fc4d" @@ -2772,7 +2772,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "7a8d22e6272d62a18c1135af11b7c3eaf766dd10d0d3b2ff1a74b11b37b4e342" + "mirror": "b8ba7588ee537aba2f9dc1d629f1f6908da5c79385e1ea4bb37e1ca193147687" }, "check_status": 1, "check_diagnostics": "input.json: error: types: field \"error\" is a keyword in the compiled module \u2014 the facade must stay declarable end to end; rename it in the core source\n" @@ -2793,7 +2793,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "7e9bfd8604aa9a9a36cc9177a07aadf5c01c5ba6a1bf754f3f771942b024130f" + "mirror": "3ec58005f1fa2a4aac94dfbd9321855aa620037d593f1f4d7529d77ad03b651e" }, "check_status": 1, "check_diagnostics": "input.json: error: types: field \"_\" is the discard spelling in the compiled module \u2014 the facade must stay declarable end to end; rename it in the core source\n" @@ -2814,7 +2814,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "2565c80c0b53e5dd48d1255d67f20dc5edf963520162a20ae2da3c44a73bf303" + "mirror": "77c663c3c15d46bf5579026ff4aefc762c79b3e31114bf06ab887542d1c25b7e" }, "check_status": 1, "check_diagnostics": "input.json: error: types: field \"with.dot\" uses characters outside the compiled module's identifier set (letters, digits, underscore) \u2014 the facade must stay declarable end to end; rename it in the core source\n" @@ -2835,7 +2835,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "2c9fbce261ea6020c9460a710abbc865ce8df22dd4f3ffe6d77fae00b8a46f95" + "mirror": "f46b108be5331815f1698b4d93ee1830b9d066c827a9e126fa5723ea354422cc" }, "check_status": 1, "check_diagnostics": "input.json: error: types: field \"\u00e9\"\\\t\r\n\" uses characters outside the compiled module's identifier set (letters, digits, underscore) \u2014 the facade must stay declarable end to end; rename it in the core source\n" @@ -2856,7 +2856,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "e5adaacb00e38ccd23cdb4147522f608dbc0f74f8d546d9e61e2f93b09bb357e" + "mirror": "b60102ebbd7d229e41543b9c70270db3ee876d05b5c5a2cd5fa2f3291c9ad889" }, "check_status": 1, "check_diagnostics": "input.json: error: types: field \"\u96ea\ud83d\ude42\" uses characters outside the compiled module's identifier set (letters, digits, underscore) \u2014 the facade must stay declarable end to end; rename it in the core source\n" @@ -2877,7 +2877,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "5bad433ae52aa7fed80a6bec1295bdb33055483b20bb24ceb4b44aa8b4665f4c" + "mirror": "943a77f3858dd9e81155514b2c44330ecf982a9e90432804d4b53b33c9634a72" }, "check_status": 1, "check_diagnostics": "input.json: error: types: field \"$$\" uses characters outside the compiled module's identifier set (letters, digits, underscore) \u2014 the facade must stay declarable end to end; rename it in the core source\n" @@ -2898,7 +2898,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "bc8b0377ca041b6deb68338483f8bf82bd6095344bf80d014238f805aaaeacc7" + "mirror": "0a1d05725132d27083a903346c953b203ac751b2a934977900b77c04f6240627" }, "check_status": 1, "check_diagnostics": "input.json: error: types: field \"\u0000\u007f\" uses characters outside the compiled module's identifier set (letters, digits, underscore) \u2014 the facade must stay declarable end to end; rename it in the core source\n" @@ -2907,7 +2907,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "a078c8f44305184d2f9cfe24285906e72ddd9991727ead852687012a5dee996a", + "mirror": "3604176980c017656014fc055d5b3011dfca873cb5327421776bbaae66e68a77", "facade": "b1df165c48c3f7c2eb2bec77f0dc3197f81746531930a0ed9e80938afc375b56", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "fe3cfebf0ac91d74c0f785cf84f8694e2516510236b081f05da3b78f70837c17" @@ -2919,7 +2919,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "987c076cb204d837d72dc116fce20b8104aaef8ac73ce780b2b9b8d50365443a", + "mirror": "f5f57fe026dac0c3fb4ef9c2d79f448fe165d699d253bc6858154ff928a1fc0c", "facade": "7ab36a2f343fa8eaf3a0396a727685f66c154fd2b558454eb0f06b7054931122", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "c34fec5dd04a8ed9e5397f4f5913d4ed089c18db5b18a2fd1e4d77c3cea56b27" @@ -2931,7 +2931,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "987c076cb204d837d72dc116fce20b8104aaef8ac73ce780b2b9b8d50365443a", + "mirror": "f5f57fe026dac0c3fb4ef9c2d79f448fe165d699d253bc6858154ff928a1fc0c", "facade": "1b60f38001a37297ef9fea3fc7e90084fe64edc2a6bfa699b4bf7f781fdc8101", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "9e63484c40b2932c5dc54b6d18a86b5d7303942a0663a91b103d3beeceb6937e" @@ -2943,7 +2943,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "ff3ff63302d44e91cc4876d4fff7a4b9b0f82e3f8c997a2abbbc6d81031e7b0d", + "mirror": "89059a4526c5edbc313016caf361436109ff98f8f864a4b46696af20ed1c4d58", "facade": "cb669969be57fc917ef0374b61515da42d579958f41d2d96d787f166e8612766", "profile": "d4a5220c1cfd38c6c9232e374ef2a14b5dcd9df218b818502a49ded1b95a39dc", "effective": "877f93f0e308c265019fa69b7768e1a49cb6b3f1edd0313a6cb0a1b337eff342" @@ -2955,7 +2955,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "164150d9c33c75bfa06d032d2e60c713bcaf0ee7fa3e732c4490b794a1f559b3", + "mirror": "cfd8660e8f92d239953fec97eb2c3c20bd3a8fc12f4206c483237fd775895d5e", "facade": "26ae47a2345dc5aa1e1b13955570cdb457362cb19e9d9f73fba09297113a8a3a", "profile": "55041d50511dd065318b070538a952ffcc481d7df8f3c914cfe4c80fc36d861c", "effective": "57fddd2da5cfd9c733f253f6cb0dc4f35c5e7416ecb864dd1d22b3bf7f541d46" @@ -2967,7 +2967,7 @@ "status": 0, "diagnostics": "input.json: warning: future: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "2f08ac054641d4a5551e2e948e83337d50915a1751543aa7dfa3e17fa6b99bbd", + "mirror": "46aab2d8de4e1b2c1e43fe9e97b370cb881fd9667e7dec426b0e9add29a12bc6", "facade": "2a735a9e467456ab7904a3a08e3bd4900b6756a776ce8cd8ef68d766e824e713", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "6f8eb5b67c4adac0c63b4228898d52b32338cd1bf7449a7876bdccdfc77f8b3d" @@ -2979,7 +2979,7 @@ "status": 0, "diagnostics": "input.json: warning: future: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "2f08ac054641d4a5551e2e948e83337d50915a1751543aa7dfa3e17fa6b99bbd", + "mirror": "46aab2d8de4e1b2c1e43fe9e97b370cb881fd9667e7dec426b0e9add29a12bc6", "facade": "2a735a9e467456ab7904a3a08e3bd4900b6756a776ce8cd8ef68d766e824e713", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "86ab65ce72f2e0e72f96168896ad15fd30fbc7b79f290e9300f5f33bf56c5e47" @@ -2991,7 +2991,7 @@ "status": 0, "diagnostics": "input.json: warning: future: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "2f08ac054641d4a5551e2e948e83337d50915a1751543aa7dfa3e17fa6b99bbd", + "mirror": "46aab2d8de4e1b2c1e43fe9e97b370cb881fd9667e7dec426b0e9add29a12bc6", "facade": "2a735a9e467456ab7904a3a08e3bd4900b6756a776ce8cd8ef68d766e824e713", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "e283adceda8fecf8a5d638a5465b2bf15aa1e6429e80591c27946c33f2d8207f" @@ -3003,7 +3003,7 @@ "status": 0, "diagnostics": "input.json: warning: future: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "2f08ac054641d4a5551e2e948e83337d50915a1751543aa7dfa3e17fa6b99bbd", + "mirror": "46aab2d8de4e1b2c1e43fe9e97b370cb881fd9667e7dec426b0e9add29a12bc6", "facade": "2a735a9e467456ab7904a3a08e3bd4900b6756a776ce8cd8ef68d766e824e713", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "3572eb3f4360ed267859e1cb9a045e0ec9f568776bd1ee52d22f416acad81d50" @@ -3015,7 +3015,7 @@ "status": 0, "diagnostics": "input.json: warning: future: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "2f08ac054641d4a5551e2e948e83337d50915a1751543aa7dfa3e17fa6b99bbd", + "mirror": "46aab2d8de4e1b2c1e43fe9e97b370cb881fd9667e7dec426b0e9add29a12bc6", "facade": "2a735a9e467456ab7904a3a08e3bd4900b6756a776ce8cd8ef68d766e824e713", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "42df1c9e3ba990413355b4fe24225a403600320a428ca974e964b17ce3bda6cb" @@ -3027,7 +3027,7 @@ "status": 0, "diagnostics": "input.json: warning: future: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "2f08ac054641d4a5551e2e948e83337d50915a1751543aa7dfa3e17fa6b99bbd", + "mirror": "46aab2d8de4e1b2c1e43fe9e97b370cb881fd9667e7dec426b0e9add29a12bc6", "facade": "2a735a9e467456ab7904a3a08e3bd4900b6756a776ce8cd8ef68d766e824e713", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "618603d20f6dc66bd399baced20ee7fa6886eb0e77ebd0706649c7f38569f446" @@ -3039,7 +3039,7 @@ "status": 0, "diagnostics": "input.json: warning: future: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "2f08ac054641d4a5551e2e948e83337d50915a1751543aa7dfa3e17fa6b99bbd", + "mirror": "46aab2d8de4e1b2c1e43fe9e97b370cb881fd9667e7dec426b0e9add29a12bc6", "facade": "2a735a9e467456ab7904a3a08e3bd4900b6756a776ce8cd8ef68d766e824e713", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "fdef5348b6014b30767499c8519e404a091cfc908993479ba5657bc657b280bb" @@ -3051,7 +3051,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "5e001aab8d80ba7bb22dd5b0ea097409ff6a677cd39416fcd09cedc1124dc9d6", + "mirror": "263387b540104d165b2b42b72061120ab4952043ffa9838a2276dc919a7b84ef", "facade": "360feabe128145add3a6ea505f9b0deefb8d814038331d5b510cedcefee8edd7", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "18ecedf5972d2ad48cee669c2fd0cb9823bd5e78fe349b249ecab2254877fd68" @@ -3063,7 +3063,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "67578511351b9b51ad54e21d5ca2817f777cd956d2f9ce036543a76a465bb200", + "mirror": "5a5285bb627a9d654a17a49011cee8f9d2de65ffc0a85f695461de35eeaa113a", "facade": "543d6f1671444395cecd752c1746171c4bba13dca8982c62ab433a8e7640f1c1", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "effective": "eb4767640174e03569c7f6d9436c601dca2459383bad26f61fe88b61dea4e637" @@ -3099,7 +3099,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "d26cf1990dac9b4799ecb1c384cc080a04a3045b4d1a2ba78c8d1e24a92eb3c6" diff --git a/tools/corewire/core_projection.ts b/tools/corewire/core_projection.ts index 7944b656a..c6e36e3bb 100644 --- a/tools/corewire/core_projection.ts +++ b/tools/corewire/core_projection.ts @@ -102,14 +102,14 @@ function chromeRecord(s: CoreContract, r: RecordType): boolean { return insets && buttons && tabs; } function mirrorNames(s: CoreContract, out: Diagnostic[]): void { - const reserved = ["bootCommand", "decoded_model", "RuntimeModel", "RuntimeResult", "runtime_model", "initialRuntimeModel", "updateRuntimeModel", "commitRuntimeModel", "restoreRuntimeModel", "restoreCommittedModel", "runtimeSubscriptions", "runtimeFrameMsg", "dispatchMessage", "std", "shim_rt", "core_abi", "abi", "rt", "msg_tags", "boot", "initialModel", "update", "commitModelRoot", "sidecar_build_id", "sidecar_model_fingerprint", "sidecar_abi_version", "sidecar_snapshot_format", "deterministic", "async_free", "snapshotModel", "modelSnapshot", "persistenceSnapshot", "restoreModel", "referenceAttestedExports", "T", "n", "model", "msg", "payload", "encoded", "cmd_ptr", "cmd_len", "subs_ptr", "subs_len", "snap_ptr", "snap_len", "out", "out_ptr", "out_len", "tag", "tag_name", "name", "frame", "key", "pinch", "value", "self", "index", "args", "args_tuple", "allocator", "fields", "field", "next", "helper_args", "view_unbound"]; + const reserved = ["bootCommand", "decoded_model", "RuntimeModel", "RuntimeResult", "runtime_model", "initialRuntimeModel", "updateRuntimeModel", "commitRuntimeModel", "restoreRuntimeModel", "restoreCommittedModel", "runtimeSubscriptions", "runtimeFrameMsg", "dispatchMessage", "std", "shim_rt", "core_abi", "abi", "rt", "msg_tags", "boot", "initialModel", "update", "commitModelRoot", "sidecar_build_id", "sidecar_model_fingerprint", "sidecar_abi_version", "sidecar_snapshot_format", "deterministic", "async_free", "snapshotModel", "modelSnapshot", "persistenceSnapshot", "restoreModel", "referenceAttestedExports", "T", "n", "model", "msg", "payload", "encoded", "cmd_ptr", "cmd_len", "subs_ptr", "subs_len", "snap_ptr", "snap_len", "out", "out_ptr", "out_len", "tag", "tag_name", "name", "frame", "key", "pinch", "value", "self", "index", "args", "args_tuple", "allocator", "fields", "field", "next", "helper_args", "view_unbound", "has_windows"]; for (const h of s.model_helpers) for (let i = 0; i < h.params.length; i++) reserved.push(`p${i}`); reserved.push("subscriptions", "commandMsg", "frameMsg", "keyMsg", "pinchMsg", "dropMsg", "appearanceMsg", "chromeMsg", "envMsgs"); if (s.model !== "Model") reserved.push("Model"); if (s.msg.name !== "Msg") reserved.push("Msg"); if (s.abi.exports.includes("native_view")) reserved.push("nativeView", "nativeViewEvent", "ptr", "len", "arena"); if (s.abi.exports.includes("native_virtual_requests")) reserved.push("nativeVirtualRequests", "nativeVirtualView"); - if (usesVirtualExtentHelpers(s)) reserved.push("virtualExtentHelper", "virtualExtentEstimate"); + if (usesVirtualExtentHelpers(s)) reserved.push("virtualExtentHelper", "virtualExtentEstimate", "shim_root"); if (s.abi.exports.includes("native_media_view")) reserved.push("nativeMediaView"); if (s.abi.exports.includes("native_media_window_view")) reserved.push("nativeMediaWindowView"); if (s.abi.exports.includes("native_window_view")) reserved.push("nativeWindowView", "label", "ptr", "len", "arena"); diff --git a/tools/corewire/emit_mirror.ts b/tools/corewire/emit_mirror.ts index ce160ad6c..c7ec800e4 100644 --- a/tools/corewire/emit_mirror.ts +++ b/tools/corewire/emit_mirror.ts @@ -28,7 +28,7 @@ class MirrorEmitter extends CodeWriter { this.inlined = projectionPlan(this.s).inlined; } run(): void { - this.header(); this.mirrorTypes(); this.modelStruct(); this.modelStruct(true); this.msgUnion(); this.wiringAliases(); + this.header(); this.mirrorTypes(); this.modelStruct(); this.modelStruct(true); this.msgUnion(); this.wiringAliases(); this.hostFacts(); this.tagTable(); this.entryPoints(); this.channels(); this.helperPlumbing(); this.snapshotPlumbing(); } header(): void { @@ -126,26 +126,31 @@ class MirrorEmitter extends CodeWriter { [zigIdent(h.name), name, params, returns, tuple, returns, String(i), h.arena ? "arena" : "shim_rt.frameAllocator()"]); } } - // Native markup and its Debug interpreter need the same stable helpers - // even when the compiled TypeScript view ABI is absent. - if (usesVirtualExtentHelpers(this.s)) this.virtualEstimates(); + // Native markup and its Debug interpreter reflect over the model type, so + // it forwards the file-scope virtual extent capability. + if (usesVirtualExtentHelpers(this.s)) this.raw(text.virtualExtentForwarding); this.unboundDecl(this.s.model_unbound); this.raw("\n};\n"); } + hostFacts(): void { + const windows = this.s.model_helpers.some(helper => helper.name === "windows"); + this.print(text.hostFacts, [String(windows)]); + if (usesVirtualExtentHelpers(this.s)) { this.raw(text.virtualExtentRoot); this.virtualEstimates(); } + } virtualEstimates(): void { - this.raw('\n /// Stable compiled helper identities; retained tables hold no model or arena pointer.\n pub fn virtualExtentHelper(name: []const u8) ?u32 {\n'); + this.raw('\n/// Stable compiled helper identities; retained tables hold no model or arena pointer.\npub fn virtualExtentHelper(name: []const u8) ?u32 {\n'); const helpers = this.s.model_helpers.map((helper, index) => ({ helper, index })).filter(({ helper }) => helper.params.length === 1 && ["i64", "f64"].includes(helper.params[0].kind) && ["i64", "f64"].includes(helper.returns.kind)); if (helpers.length === 0) { - this.raw(' _ = name;\n return null;\n }\n\n pub fn virtualExtentEstimate(context: ?*const anyopaque, index: u64) f32 {\n _ = context;\n _ = index;\n @panic("invalid virtual extent helper");\n }\n'); + this.raw(' _ = name;\n return null;\n}\n\npub fn virtualExtentEstimate(context: ?*const anyopaque, index: u64) f32 {\n _ = context;\n _ = index;\n @panic("invalid virtual extent helper");\n}\n'); return; } - for (const { helper, index } of helpers) this.print(' if (std.mem.eql(u8, name, "{f}")) return {d};\n', [zigString(helper.name), String(index)]); - this.raw(' return null;\n }\n\n pub fn virtualExtentEstimate(context: ?*const anyopaque, index: u64) f32 {\n if (index > 9007199254740991) @panic("virtual extent index exceeds safe integers");\n const helper: u32 = @intCast(@intFromPtr(context orelse @panic("missing virtual extent identity")) - 1);\n var args: [8]u8 = undefined;\n defer abi.frame_reset();\n const value: f64 = switch (helper) {\n'); + for (const { helper, index } of helpers) this.print(' if (std.mem.eql(u8, name, "{f}")) return {d};\n', [zigString(helper.name), String(index)]); + this.raw(' return null;\n}\n\npub fn virtualExtentEstimate(context: ?*const anyopaque, index: u64) f32 {\n if (index > 9007199254740991) @panic("virtual extent index exceeds safe integers");\n const helper: u32 = @intCast(@intFromPtr(context orelse @panic("missing virtual extent identity")) - 1);\n var args: [8]u8 = undefined;\n defer abi.frame_reset();\n const value: f64 = switch (helper) {\n'); for (const { helper, index } of helpers) { const parameter = this.spellRef(helper.params[0], "helpers", helper.name, "helpers." + helper.name + ".params[0]"); const encoded = helper.params[0].kind === "i64" ? "@as(" + parameter + ", @intCast(index))" : "@as(f64, @floatFromInt(index))"; - this.print(' {d} => blk: {{\n std.mem.writeInt(u64, &args, @bitCast({s}), .little);\n break :blk {s}callHelper({s}, {d}, &args, shim_rt.frameAllocator()){s};\n }},\n', [String(index), encoded, helper.returns.kind === "i64" ? "@floatFromInt(" : "", this.spellRef(helper.returns, "helpers", helper.name, "helpers." + helper.name + ".return"), String(index), helper.returns.kind === "i64" ? ")" : ""]); + this.print(' {d} => blk: {{\n std.mem.writeInt(u64, &args, @bitCast({s}), .little);\n break :blk {s}callHelper({s}, {d}, &args, shim_rt.frameAllocator()){s};\n }},\n', [String(index), encoded, helper.returns.kind === "i64" ? "@floatFromInt(" : "", this.spellRef(helper.returns, "helpers", helper.name, "helpers." + helper.name + ".return"), String(index), helper.returns.kind === "i64" ? ")" : ""]); } - this.raw(' else => @panic("invalid virtual extent helper"),\n };\n if (!std.math.isFinite(value) or value < 0 or value > std.math.floatMax(f32)) @panic("invalid virtual extent result");\n return @floatCast(value);\n }\n'); + this.raw(' else => @panic("invalid virtual extent helper"),\n };\n if (!std.math.isFinite(value) or value < 0 or value > std.math.floatMax(f32)) @panic("invalid virtual extent result");\n return @floatCast(value);\n}\n'); } unboundDecl(names: string[]): void { if (names.length === 0) return; diff --git a/tools/corewire/intake.test.ts b/tools/corewire/intake.test.ts index cbaf2c486..034a0dbd1 100644 --- a/tools/corewire/intake.test.ts +++ b/tools/corewire/intake.test.ts @@ -10,6 +10,10 @@ import { intakeCases } from "./intake_cases.ts"; assert.ok(process.argv[2], "run with the compiled corewire path"); const corewire = path.resolve(process.argv[2]); // Mirror hashes include the reviewed stateless-runtime API addition. +// Mirror hashes also include file-scope host facts: `has_windows` and the +// virtual extent capability, which the model types forward. Removing that +// block and nesting the capability back in both model types recovers the +// previous mirror pins exactly. // Facade hashes include exact u32 image identities, nonreplacing file // results and exact-range timers. Removing the reviewed timer encoder // addition recovers every previous complete facade pin. The byte-key diff --git a/tools/corewire/intake_goldens.json b/tools/corewire/intake_goldens.json index bcb394c51..1d9ad3167 100644 --- a/tools/corewire/intake_goldens.json +++ b/tools/corewire/intake_goldens.json @@ -93,7 +93,7 @@ "status": 0, "diagnostics": "input.json: warning: additive: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "e3bc23eb92273a9e320c2741fe52b4c102fc5ee150d10c099ee27561d9f5e6aa" @@ -473,7 +473,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "25e424f3c24e3bb2681a174e4a0dc2df3753c0967462dfa2922b1409a055d045", + "mirror": "1492af41f1e08edb802026a60079567509267c6ec95968d950521c7f09bd5d85", "facade": "aeb3fb1bd9d87e5c51c9290650a749ddf9035abe3e169d07262a9e20ed4fb849", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "011d15343e4459b52c340e4d6ce3c6aacb6d7741a62af6134bd950eb55f03812" @@ -573,7 +573,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "9ba9bacdb1b43adac2ec4d065198f22a9c502e6efb2d64cd61c56b7893826566", + "mirror": "fa3e95cd730299828a13529356651c36348e7f59294c118b76c486497e62a4f8", "facade": "dfcf6c01ef111acfb7a66d9233ad8a954a52ec62a7663d3e3533dd0a6e60514c", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "a1457b0173d54b52feec7dade810544e1f47ff9e00b046e470610e1570c3ffd3" @@ -1003,7 +1003,7 @@ "status": 0, "diagnostics": "input.json: warning: types.additive: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "30c9e0116655b0cd4ddd900ed48199898b956f77d6a94a61f9b3b9121d98eded" @@ -1203,7 +1203,7 @@ "status": 0, "diagnostics": "input.json: warning: types.structs[0].additive: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "634450e29449850308454c757467d13fc4f044f783f0b169fec02a03206b619c" @@ -1383,7 +1383,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "d14223528dfa53b684bdd0317beac37cfa71a10fed7536c928a27bd45bdc546a", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "d41e785385e73e809edd150fe471a52f3d11e2e17f568fd962d3af338cdaea2d" @@ -1413,7 +1413,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "43d383b1cbc672bea6e9df1e8e20687e33b20a849b09f67c8cf6a097dfededab" @@ -1433,7 +1433,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -1443,7 +1443,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "67a5ac8e26092d1df6d9d918ed832c3c9bf5d6ba63833446ed7cc08b331bf4d4", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "e2c4b217d2c9b3857e1a839780aed08a21844a079bfa0cf18181c4f6d70c9fed" @@ -1703,7 +1703,7 @@ "status": 0, "diagnostics": "input.json: warning: types.structs[0].fields[0].additive: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "463e4114b1f0aa930a31716f7d4afb659cd4b87a4b415a2b2c3b29ad9dd48631" @@ -1913,7 +1913,7 @@ "status": 0, "diagnostics": "input.json: warning: types.structs[0].fields[0].type.additive: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "8b308da533187e0876d3228cafa83c5a365adcf4d03442481de032ead98dfc54" @@ -2103,7 +2103,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -2203,7 +2203,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -2403,7 +2403,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -2503,7 +2503,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -2623,7 +2623,7 @@ "status": 0, "diagnostics": "input.json: warning: msg.additive: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6e1333386b44e61582c7769b9e4d385cd5d940ef0581b2bb7bcb4713553a9d56" @@ -2703,7 +2703,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f2a7818b6779bfbd900a75a85d3770a2da6c783ea8f8c7eb732ef22d85401dae", + "mirror": "eff62b82404a6f1051d9d6e51b61ce10c1ea0a4815eb315a120761e61facb2b7", "facade": "21fe4f6eb965152a2330e968867bfb645aa365b0a138c8da20dea4d200a79986", "profile": "4dde885542452cd0ed15df1081c51a422aeb93e82ebc73c6b3af641635104a0a", "effective": "29f93cef5f0de0668e5939642defed979e31191eb660d08b1b41313a88313a4e" @@ -2923,7 +2923,7 @@ "status": 0, "diagnostics": "input.json: warning: msg.arms[0].additive: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "a0b350097501f6fd07d37e448d5d5482fb6614de567e423cc7b47a5d014086dc" @@ -3003,7 +3003,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "ce964c6308975eda518bfa131e2b1f834187e191f1cadb60d1c4cfe8e94ff1cc", + "mirror": "45e72749e17362d1404ca2abda88193d4c176aa2da6104eb3e1b16a56e86a4ff", "facade": "2e21357fe83d0dc934948f140b5172ab0be1249143577f4cd7b9c669c5368af6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "041a4ce359e91d7957b2ff3a8c465b21915e9f5eec17534d5202b5d67ded0a4e" @@ -3133,7 +3133,7 @@ "status": 0, "diagnostics": "input.json: warning: msg.arms[0].payload.additive: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "1b3bd1140ab616be4d0012f9f47a2589db2955fdaf152786146200e8a875cb04" @@ -3323,7 +3323,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -3363,7 +3363,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "7bf822c4a664dac61ffb122cf6f65e68d7322c34f6e7195bdf9c9c1de5c0f277", + "mirror": "147f46bac199cf7b7dc7a6ae62c55a34f7e309a52e51c3a68d9eb862b0fbda4e", "facade": "05abb2509c29670a46a0448096f4e69897998b0ea067414e61df424c46613da8", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "01efcce03e446fabb95d2aed3bdd7677bdd2a99c80bd8759c4c9b476d7532380" @@ -3373,7 +3373,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -3463,7 +3463,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -3473,7 +3473,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "ba6eb37c92a8663a1ce60fc1631800a5e5d7088d0cd690b20e1c74c84bfaa8f7", + "mirror": "2ba59154c80ebbcc64bc26e7a820d202b495da971fc04d3d5da54b450ca73ab3", "facade": "e34a901be9fdd77fab6493c3f114e22cf9adf2eca2c15ecece8086321cb60f35", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "31ae7c68b631a0e34ed338ac9a41840db91d7e79c5953b505e7760f856130097" @@ -3563,7 +3563,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "b2d597add6777d07be3742b80d94fd5dab8ec33bbf010aa97a6ad9c7c41ba04c", + "mirror": "7e75245a6a50423ca862066ae3f710f40b03d2ab091354afd293731fa74f3246", "facade": "deee1b1d37872d5190dbe0c23e5aba3acaa0fac55cfc21fbdee941d46bac20e6", "profile": "fb8fb569febb7c1ec564b5c3b47cdc3af3b37be6455af513dcca73f9a881b61f", "effective": "8b61dd2e469c98d8ddbe0b3fff0e71f957526c6fed78a55587c7753f6ec43ad4" @@ -3573,7 +3573,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -3663,7 +3663,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c78687a209b180315d81724a0098ff343bf9868eeeb5257db5a16e2c08646184", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "aca8e64a47cdade9428e1bcecff3741cf4669f42a0c06f4a0d6b59cf9824af3c" @@ -3673,7 +3673,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -3843,7 +3843,7 @@ "status": 0, "diagnostics": "input.json: warning: channels.additive: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "053ec2e32c440e24a88d696f6e5343d0c55cf2f0c95bd0e6c028af93fda8c911" @@ -3883,7 +3883,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -3983,7 +3983,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -4083,7 +4083,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -4183,7 +4183,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -4253,7 +4253,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "552ee03abd7e45a092c9d87e2b60dc7937276da41a2f64672a9f2fa683ce0e2f" @@ -4283,7 +4283,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -4363,7 +4363,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -4463,7 +4463,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -4633,7 +4633,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -4753,7 +4753,7 @@ "status": 0, "diagnostics": "input.json: warning: abi.additive: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "901da1878781333ea611db955368a35c2653dc4a7632a72e1224f45e7f497f77" @@ -4833,7 +4833,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "377bb1df2e205781470a32190df4e034adc250bffd023317eba203f742b9ccb8", + "mirror": "7f20124d111ec9b3b5b5b8c00c2bca7d97ac6eee0ae2dea2750d25ba9bfa84d3", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "bbe20c40bc718d0d2df8731ce22da0a4b33d00311fb080eac5b151850630db6a", "effective": "a61d5bc5e94704c708b340f645e5df4280973ea0d360ea261512aa3f6dd1f064" @@ -5343,7 +5343,7 @@ "status": 0, "diagnostics": "input.json: warning: integer_slots[0].additive: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "9ace12aa1535d739de18f88e8f7efdacdb20256570b01e1808acfe230d906691" @@ -5573,7 +5573,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -5673,7 +5673,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57" @@ -11826,7 +11826,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "ab7185eaab19818b8f98340cb284c08ac7ccddbb62ff2bfcc02689addd312c1f", + "mirror": "6a7d18241667281434b23a82c0837fdf3741e57238db1c0b21e3816c34dafa63", "facade": "05ebac9400914b002841af77367889c76c4defd92fb225ec524050ae7d33a2e7", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "5dfd2995d7c910da7b8d06a2a4cf0b0c690525f758f903cd665e7d912f67cd50" @@ -11836,7 +11836,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "56f7fcec5e7023374f26cc4d87b06cf82b9653e10807ce278ddb271e029a1b87", + "mirror": "8131b42cf398f521a8d7faf54b12f2473f4cdf02e29162590884e135a055b59a", "facade": "e108e2564a56c84d1736ce5c1712278b0b71478d28109260da8318ac813cfb67", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "b4805cd68542706bfde1d1af871ff48a643c7544ca84b0c42c3ebc652069b103" @@ -11846,7 +11846,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "e35629d1d1acd81db04e79ec45786e5b2c93da3152374c8c992900df0e5aa426", + "mirror": "251da77910d2d9bcd91994ac0983318f1ea1ce1e607c8d53b5a3db05c58678a2", "facade": "961fe7d281bbb7f36979977ee966391ebd1cbb368cc2d92473112d2ebb1e8c01", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "a3b4b186c5e556194c1a20058d4d31db14663b080fa6c381d87fd9d8ef22c1fd" @@ -11856,7 +11856,7 @@ "status": 0, "diagnostics": "", "hashes": { - "mirror": "2a51d032f5caaf922b8fb72bbb8c4ea0a00b91bbe09ec2bc7d9174d903388c52", + "mirror": "8ba018346d6cfd531df518357bb23ce9b16fb015c1355fd3c40ba922777d7e7a", "facade": "35449b31a00500ed3affd858fb9ffb726d7806391799a58d06adcbbf22bcb33c", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "f908f189f33bebe6ed88ac296fa6211a05070e563f11edbe686d64ccbdd1f8dc" @@ -11886,7 +11886,7 @@ "status": 0, "diagnostics": "input.json: warning: types.structs[0].fields[0].type.inner: unknown field ignored (an emitter newer than this reader may emit additive facts)\ninput.json: warning: types.structs[0].fields[0].type.elem: unknown field ignored (an emitter newer than this reader may emit additive facts)\ninput.json: warning: types.structs[0].fields[0].type.name: unknown field ignored (an emitter newer than this reader may emit additive facts)\ninput.json: warning: types.structs[0].fields[0].type.extra: unknown field ignored (an emitter newer than this reader may emit additive facts)\n", "hashes": { - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "facade": "c4dfccae18f7cb80c1a80bd3968a47811c6fcfd5697206cdf1a8491505a539b6", "profile": "1eddcb19b3f52ff6fd4a596bbd45dcca49ae3d307dfd3af1a4a033465fae0035", "effective": "c3bbb33e0452a353e5258e8e8582fd158357dfc07831df7ef1388f07b1224d2d" diff --git a/tools/corewire/invocation.test.ts b/tools/corewire/invocation.test.ts index d9295db69..7f7e6fb07 100644 --- a/tools/corewire/invocation.test.ts +++ b/tools/corewire/invocation.test.ts @@ -8,6 +8,10 @@ assert.ok(process.argv[2], "run with the compiled corewire path (zig build test- const corewire = path.resolve(process.argv[2]); // Captured from the independent native coordinator, before this migration. // Mirror hashes include the reviewed stateless-runtime API addition. +// Mirror hashes also include file-scope host facts: `has_windows` and the +// virtual extent capability, which the model types forward. Removing that +// block and nesting the capability back in both model types recovers the +// previous mirror pins exactly. // Facade hashes include exact u32 image identities, nonreplacing file // results and exact-range timers. Removing the reviewed timer encoder // addition recovers every previous complete facade pin. The byte-key diff --git a/tools/corewire/invocation_goldens.json b/tools/corewire/invocation_goldens.json index 718934206..305cb7864 100644 --- a/tools/corewire/invocation_goldens.json +++ b/tools/corewire/invocation_goldens.json @@ -313,7 +313,7 @@ "host": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", "inproc": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", "input.json": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57", - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "old": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", "profile": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", "registry": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", @@ -389,7 +389,7 @@ "host": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", "inproc": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", "input.json": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57", - "mirror": "f9d25504dbcf74919d4208da4bc0b140ebc86590a4c877eb0ce84b3893585d27", + "mirror": "7d9d86e905a7160c77d875d8cbac67ff85a6cc76dbfc6888c254da05cac00c1a", "old": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", "profile": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", "registry": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", @@ -465,7 +465,7 @@ "host": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", "inproc": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", "input.json": "6a66c0857319947fce85caac42f1791e77b9683366ba584339b9841a8b1fee57", - "mirror": "2f08ac054641d4a5551e2e948e83337d50915a1751543aa7dfa3e17fa6b99bbd", + "mirror": "46aab2d8de4e1b2c1e43fe9e97b370cb881fd9667e7dec426b0e9add29a12bc6", "old": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", "profile": "05df55387d2e3293ee8af6d8ed04d64d4c168f4239878f707c16ba7fb1662f1c", "registry": "6b428ace0262db5de1acac5d5e225a117674ede63c6631800103512289d791e6", diff --git a/tools/corewire/mirror_templates.ts b/tools/corewire/mirror_templates.ts index 8adfbd80d..6f3f89ef9 100644 --- a/tools/corewire/mirror_templates.ts +++ b/tools/corewire/mirror_templates.ts @@ -53,3 +53,6 @@ export const runtimeSubscriptions = "\npub fn runtimeSubscriptions(model: *const export const runtimeFrameChannel = "\npub fn runtimeFrameMsg(model: *const RuntimeModel, frame: FrameEvent) ?{f} {{\n _ = model;\n return frameMsg(undefined, frame);\n}}\n"; export const frameChannelNs = "\n/// The presented-frame channel's record: canvas points plus the\n/// frame clock in fractional milliseconds. The adapter builds it\n/// by field name, exactly as for transpiler output.\npub const FrameEvent = struct {{\n width: f64,\n height: f64,\n timestampMs: f64,\n intervalMs: f64,\n timestampNs: []const u8,\n intervalNs: []const u8,\n}};\n\npub fn frameMsg(model: *const {f}, frame: FrameEvent) ?{f} {{\n _ = model;\n var out_ptr: [*]const u8 = &shim_rt.channel_out_guard;\n var out_len: usize = 0;\n abi.frame_msg_ns(frame.width, frame.height, frame.timestampMs, frame.intervalMs, frame.timestampNs.ptr, frame.timestampNs.len, frame.intervalNs.ptr, frame.intervalNs.len, &out_ptr, &out_len);\n return msgFromEnvelope(shim_rt.channelEnvelopeBytes(out_ptr, out_len));\n}}\n"; +export const hostFacts = "\n/// Whether the core exports a `windows(model)` helper. Host wiring reads\n/// this fact instead of reflecting over the source model.\npub const has_windows: bool = {s};\n"; +export const virtualExtentRoot = "\nconst shim_root = @This();\n"; +export const virtualExtentForwarding = "\n /// The file-scope virtual extent capability, for markup engines that reflect over this type.\n pub const virtualExtentHelper = shim_root.virtualExtentHelper;\n pub const virtualExtentEstimate = shim_root.virtualExtentEstimate;\n";