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 054f37640..3cc2400ca 100644
--- a/src/app_runner/ts_core_main.zig
+++ b/src/app_runner/ts_core_main.zig
@@ -134,7 +134,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";