002 cross session discharge

✗ Failing This test is currently failing.

Failed: backend-exec

Error Details

install

Failure Output

Showing last 10 of 28 lines
error: the following command failed with 1 compilation errors:
/opt/homebrew/Cellar/zig/0.15.2_1/bin/zig build-exe -ODebug --dep koru_parser --dep koru_ast=ast --dep koru_errors=errors --dep ast --dep flow_parser --dep liquid -Mroot=/Users/larsde/src/koru/tests/regression/400_RUNTIME_FEATURES/440_RESOURCE_BRIDGE/440_002_cross_session_discharge/output_emitted.zig -ODebug --dep ast --dep lexer --dep errors --dep type_registry --dep expression_parser --dep union_collector --dep module_resolver -Mkoru_parser=/usr/local/lib/koru/src/parser.zig -ODebug --dep errors -Mast=/usr/local/lib/koru/src/ast.zig -ODebug -Merrors=/usr/local/lib/koru/src/errors.zig -ODebug --dep ast --dep lexer --dep errors --dep expression_parser -Mflow_parser=/usr/local/lib/koru/src/flow_parser.zig -ODebug -Mliquid=/usr/local/lib/koru/src/liquid.zig -ODebug -Mlexer=/usr/local/lib/koru/src/lexer.zig -ODebug --dep ast --dep log -Mtype_registry=/usr/local/lib/koru/src/type_registry.zig -ODebug --dep lexer --dep ast -Mexpression_parser=/usr/local/lib/koru/src/expression_parser.zig -ODebug --dep ast -Munion_collector=/usr/local/lib/koru/src/union_collector.zig -ODebug --dep config --dep log -Mmodule_resolver=/usr/local/lib/koru/src/module_resolver.zig -ODebug -Mlog=/usr/local/lib/koru/src/log.zig -ODebug --dep log -Mconfig=/usr/local/lib/koru/src/config.zig --cache-dir .zig-cache --global-cache-dir /Users/larsde/.cache/zig --name output --zig-lib-dir /opt/homebrew/Cellar/zig/0.15.2_1/lib/zig/ --listen=-

Build Summary: 0/3 steps succeeded; 1 failed
install transitive failure
+- install output transitive failure
   +- compile exe output Debug native 1 errors

error: the following build command failed with exit code 1:
.zig-cache/o/0c41be2c9bc10c1541c45cc00d09a65f/build /opt/homebrew/Cellar/zig/0.15.2_1/bin/zig /opt/homebrew/Cellar/zig/0.15.2_1/lib/zig /Users/larsde/src/koru/tests/regression/400_RUNTIME_FEATURES/440_RESOURCE_BRIDGE/440_002_cross_session_discharge .zig-cache /Users/larsde/.cache/zig --seed 0x5a0233fe -Z32672459fad3909d

Code

// Test: Cross-session handle discharge
// The core bridge scenario: create handle in run 1, discharge in run 2
//
// This is the Hollywood OS pattern - state persists across turns,
// human or AI can act on resources created in previous turns.

~import "$std/runtime"
~import "$std/io"

const std = @import("std");
const HandlePool = @import("root").koru_std.interpreter.HandlePool;

// External pool - the bridge
var bridge_pool = HandlePool.init(std.heap.page_allocator);

// Events with obligations
~pub event open { path: []const u8 }
| opened []const u8[opened!]

~open = opened "file_1"

~pub event close { handle: []const u8[!opened] }
| closed

~proc close {
    std.debug.print("close() called for handle\n", .{});
    return .{ .closed = .{} };
}

~std.runtime:register(scope: "files") {
    open(10)
    close(1)
}

// Session 1: Open a file (creates obligation)
const SESSION_1 = "~open(path: \"test.txt\")\n| opened h |> result { handle: h }";

// Session 2: Close the file (discharges obligation)
const SESSION_2 = "~close(handle: \"file_1\")\n| closed |> result {}";

// Run session 1 - creates handle on bridge
~std.runtime:run(source: SESSION_1, scope: "files", budget: 100, handle_pool: &bridge_pool, auto_discharge: false)
| result r1 |> run_session_2(handles_after_open: r1.handles)
    | done d |> std.io:print.ln("PASS: open={{ d.after_open:d }}, close={{ d.after_close:d }}")
    | fail f |> std.io:print.ln("FAIL: {{ f.reason:s }}")
| exhausted _ |> std.io:println(text: "FAIL: session 1 exhausted")
| parse_error _ |> std.io:println(text: "FAIL: session 1 parse_error")
| validation_error _ |> std.io:println(text: "FAIL: session 1 validation_error")
| shape_error _ |> std.io:println(text: "FAIL: session 1 shape_error")
| event_denied _ |> std.io:println(text: "FAIL: session 1 event_denied")
| dispatch_error _ |> std.io:println(text: "FAIL: session 1 dispatch_error")
| scope_not_found _ |> std.io:println(text: "FAIL: session 1 scope_not_found")

// Helper event to run session 2 and report both counts
~event run_session_2 { handles_after_open: u32 }
| done { after_open: u32, after_close: u32 }
| fail []const u8

~proc run_session_2 {
    std.debug.print("Session 1 left {} handle(s) on bridge\n", .{handles_after_open});

    // Run session 2 to discharge the handle
    const result = @import("root").koru_std.runtime.run_event.handler(.{
        .source = SESSION_2,
        .scope = "files",
        .budget = 100,
        .handle_pool = &bridge_pool,
        .auto_discharge = false,
    });

    switch (result) {
        .result => |r| {
            std.debug.print("Session 2 complete, {} handle(s) remaining\n", .{r.handles});
            return .{ .done = .{ .after_open = handles_after_open, .after_close = r.handles } };
        },
        .exhausted => return .{ .fail = "session 2 exhausted" },
        .parse_error => return .{ .fail = "session 2 parse error" },
        .validation_error => return .{ .fail = "session 2 validation error" },
        .shape_error => return .{ .fail = "session 2 shape error" },
        .event_denied => return .{ .fail = "session 2 event denied" },
        .dispatch_error => return .{ .fail = "session 2 dispatch error" },
        .scope_not_found => return .{ .fail = "session 2 scope not found" },
    }
}
input.kz

Test Configuration

MUST_RUN