○
Planned This feature is planned but not yet implemented.
Rework as a cross-module private-event VISIBILITY test. KORU111 Rule 1 (private event in .k rejected) was removed 2026-07-17 — private events are legal in a .k full program. The surviving intent here is that a PRIVATE event must not be callable across a module boundary; that needs cross-module visibility enforcement (see 110_002 TODO) before this can be re-pinned.
Code
// Phase 3 captured failing test: private event in .k must be rejected
// with KORU111. Today the compiler accepts it silently; this test pins
// the violation until the validator pass lands.
const std = @import("std");
~import std/io
~import app/contract
~app/contract:compute(x: 42): v |> std/io:print.ln("{{ v:d }}")
Supporting Files
// Phase 3 rule 1: events declared in a .k contract file MUST be pub.
// A private event in .k is dead syntax — no procs live in .k (those are
// implementation), so nothing inside .k can call a private event, and
// nothing outside can see it. Declaring it is a confused intent.
tor compute { x: u32 } -> u32
const std = @import("std");
~proc compute|zig {
return .{ .done = x + 100 };
}
Frontend must reject with:
CONTAINS KORU111
CONTAINS private event in contract fileFlows
flow ~compute click a branch to expand · @labels scroll to their anchor
compute (x: 42)
Test Configuration
MUST_ERROR
koru.json:
{
"paths": {
"std": "../../../../../koru_std",
"app": "."
}
}