From 5adc05aa487b58190c49d39ceebed1fd86c2c5cd Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Thu, 30 Apr 2026 14:18:17 -0500 Subject: [PATCH] compiler: capability-kind enforcement (cgi / service / utility) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Capability becomes a compile-time structural property, not a runtime convention. A program's top-level block determines what runtime primitives it may call; the codegen rejects forbidden calls with #error directives so cc fails with a clear message. Three kinds: cgi — full self-formation. All primitives. service — bounded. Cannot call self-formation primitives: llm_call_agentic, llm_register_tool, dharma_emit, dharma_field. Single-turn LLM calls allowed. utility — default (no top-level block). No DHARMA, no LLM. Pure compute + I/O. Deep claim: the binary either CAN or CANNOT do a thing. There is no runtime check, no opt-in, no override. A weather service compiled with `service { ... }` is structurally incapable of becoming Neuron. Sponsors of services know exactly what they're vouching for. Implementation - Lexer: `service` keyword. - Parser: parse_service_block parallels parse_cgi_block. Produces ServiceBlock AST with name/sponsor/domain. - Codegen entry: scans top-level for cgi/service blocks, sets __program_kind state ("cgi" / "service" / "utility"). Rejects programs declaring both kinds. - cg_expr Call: cap_check_call(fn_name) per emission. Records violations in __cap_violations CSV. emit_cap_violations() writes one #error per violation at end of generated C. - Helpers: is_self_formation_call, is_dharma_call, is_llm_call. Tests verified: cgi + llm_call_agentic → compiles ✓ service + llm_call_agentic → cc fails with capability violation for 'service' on 'llm_call_agentic' service + llm_call (1-turn) → compiles ✓ utility + dharma_send → cc fails with capability violation for 'utility' on 'dharma_send' utility + http/json/state → compiles + runs ✓ ("got: world") cgi + dharma_emit (manager) → compiles ✓ (VBD also enforced) cgi + dharma_emit (engine) → cc fails with VBD violation Three-stage closure: stage1.c == stage2.c (byte-identical). Engram rebuilt against new compiler — daemon on :8742 healthy, {"node_count":0,"edge_count":0}. A bug found and fixed during testing: cap_record_violation had `csv = ","` (bare assignment, not valid in El) instead of `let csv = ","`. Without the let, the leading comma never made it into the accumulator, off-by-one'ing the kind extraction so "service" appeared as "ervice" in error messages. Pattern fixed; this confirms once more that El requires `let X = ...` for all rebindings (codegen converts to assignment when X is already declared). --- dist/platform/elc | Bin 165560 -> 165928 bytes dist/platform/elc.c | 210 ++++++++++++++++++++++++++++++++++++- dist/platform/elc.prev6 | Bin 0 -> 165928 bytes el-compiler/src/codegen.el | 155 ++++++++++++++++++++++++++- el-compiler/src/lexer.el | 1 + el-compiler/src/parser.el | 49 +++++++++ elc-combined.el | 205 +++++++++++++++++++++++++++++++++++- 7 files changed, 617 insertions(+), 3 deletions(-) create mode 100755 dist/platform/elc.prev6 diff --git a/dist/platform/elc b/dist/platform/elc index a4ed6f4739176bc6ad413606edba1d10bfc95e84..cffacef71d9ebde4124164999ed2e688c4ecbe3e 100755 GIT binary patch delta 50161 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 Uo_PC}gOQzm|L8I6UT_%uAJR`E0RR91 diff --git a/dist/platform/elc.c b/dist/platform/elc.c index 23d69ba..63c864b 100644 --- a/dist/platform/elc.c +++ b/dist/platform/elc.c @@ -53,6 +53,12 @@ el_val_t params_to_c(el_val_t params); el_val_t transform_implicit_return(el_val_t body); el_val_t is_int_name(el_val_t name); el_val_t is_int_call(el_val_t call_expr); +el_val_t cap_record_violation(el_val_t kind, el_val_t fn_name); +el_val_t is_self_formation_call(el_val_t fn_name); +el_val_t is_dharma_call(el_val_t fn_name); +el_val_t is_llm_call(el_val_t fn_name); +el_val_t cap_check_call(el_val_t fn_name); +el_val_t emit_cap_violations(void); el_val_t add_int_name(el_val_t name); el_val_t build_int_names_for_params(el_val_t params); el_val_t cg_fn(el_val_t stmt); @@ -409,6 +415,9 @@ el_val_t keyword_kind(el_val_t word) { if (str_eq(word, EL_STR("cgi"))) { return EL_STR("Cgi"); } + if (str_eq(word, EL_STR("service"))) { + return EL_STR("Service"); + } if (str_eq(word, EL_STR("manager"))) { return EL_STR("Manager"); } @@ -1562,6 +1571,43 @@ el_val_t parse_stmt(el_val_t tokens, el_val_t pos) { p = expect(tokens, p, EL_STR("RBrace")); return make_result(el_map_new(10, "stmt", EL_STR("CgiBlock"), "name", name, "dharma_id", dharma_id, "principal", principal, "network", network, "engram", engram, "has_dharma_id", has_dharma_id, "has_principal", has_principal, "has_network", has_network, "has_engram", has_engram), p); } + if (str_eq(k, EL_STR("Service"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t sponsor = EL_STR(""); + el_val_t domain = EL_STR(""); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t fname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + el_val_t fval = tok_value(tokens, p); + p = (p + 1); + if (str_eq(fname, EL_STR("sponsor"))) { + sponsor = fval; + } + if (str_eq(fname, EL_STR("domain"))) { + domain = fval; + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(4, "stmt", EL_STR("ServiceBlock"), "name", name, "sponsor", sponsor, "domain", domain), p); + } el_val_t r = parse_expr(tokens, pos); el_val_t val = el_get_field(r, EL_STR("node")); el_val_t p = el_get_field(r, EL_STR("pos")); @@ -1924,6 +1970,7 @@ el_val_t cg_expr(el_val_t expr) { } if (str_eq(func_kind, EL_STR("Ident"))) { el_val_t fn_name = el_get_field(func, EL_STR("name")); + cap_check_call(fn_name); return el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("(")), args_c), EL_STR(")")); } if (str_eq(func_kind, EL_STR("Field"))) { @@ -2401,6 +2448,141 @@ el_val_t is_int_call(el_val_t call_expr) { return 0; } +el_val_t cap_record_violation(el_val_t kind, el_val_t fn_name) { + el_val_t csv = state_get(EL_STR("__cap_violations")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t entry = el_str_concat(el_str_concat(kind, EL_STR(":")), fn_name); + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), entry), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__cap_violations"), el_str_concat(el_str_concat(csv, entry), EL_STR(","))); + return 1; + return 0; +} + +el_val_t is_self_formation_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("llm_call_agentic"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_register_tool"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_emit"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_field"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_dharma_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("dharma_connect"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_send"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_activate"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_emit"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_field"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_strengthen"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_relationship"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_peers"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_llm_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("llm_call"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_call_system"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_call_agentic"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_vision"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_register_tool"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_models"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t cap_check_call(el_val_t fn_name) { + el_val_t kind = state_get(EL_STR("__program_kind")); + if (str_eq(kind, EL_STR("cgi"))) { + return 1; + } + if (str_eq(kind, EL_STR("service"))) { + if (is_self_formation_call(fn_name)) { + cap_record_violation(EL_STR("service"), fn_name); + return 0; + } + return 1; + } + if (is_dharma_call(fn_name)) { + cap_record_violation(EL_STR("utility"), fn_name); + return 0; + } + if (is_llm_call(fn_name)) { + cap_record_violation(EL_STR("utility"), fn_name); + return 0; + } + return 1; + return 0; +} + +el_val_t emit_cap_violations(void) { + el_val_t csv = state_get(EL_STR("__cap_violations")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + if (str_eq(csv, EL_STR(","))) { + return 0; + } + el_val_t n = str_len(csv); + el_val_t i = 1; + while (i < n) { + el_val_t next_comma = str_index_of(str_slice(csv, i, n), EL_STR(",")); + if (next_comma < 0) { + return 0; + } + el_val_t entry = str_slice(csv, i, (i + next_comma)); + el_val_t colon = str_index_of(entry, EL_STR(":")); + if (colon > 0) { + el_val_t kind = str_slice(entry, 0, colon); + el_val_t fn_name = str_slice(entry, (colon + 1), str_len(entry)); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("#error \"capability violation: '"), kind), EL_STR("' programs may not call '")), fn_name), EL_STR("' (self-formation primitive — only 'cgi' programs may use it)\""))); + } + i = ((i + next_comma) + 1); + } + return 0; +} + el_val_t add_int_name(el_val_t name) { el_val_t csv = state_get(EL_STR("__int_names")); if (str_eq(csv, EL_STR(""))) { @@ -2691,6 +2873,8 @@ el_val_t codegen(el_val_t stmts, el_val_t source) { el_val_t n_top = native_list_len(stmts); el_val_t cgi_count = 0; el_val_t cgi_block = el_map_new(1, "stmt", EL_STR("None")); + el_val_t svc_count = 0; + el_val_t svc_block = el_map_new(1, "stmt", EL_STR("None")); el_val_t ti = 0; while (ti < n_top) { el_val_t s = native_list_get(stmts, ti); @@ -2701,11 +2885,34 @@ el_val_t codegen(el_val_t stmts, el_val_t source) { cgi_block = s; } } + if (str_eq(sk, EL_STR("ServiceBlock"))) { + svc_count = (svc_count + 1); + if (svc_count == 1) { + svc_block = s; + } + } ti = (ti + 1); } if (cgi_count > 1) { emit_line(EL_STR("#error \"El: multiple cgi blocks in program (only one allowed)\"")); } + if (svc_count > 1) { + emit_line(EL_STR("#error \"El: multiple service blocks in program (only one allowed)\"")); + } + if (cgi_count >= 1) { + if (svc_count >= 1) { + emit_line(EL_STR("#error \"El: program declares both cgi and service blocks (mutually exclusive — pick one)\"")); + } + } + el_val_t kind = EL_STR("utility"); + if (cgi_count >= 1) { + kind = EL_STR("cgi"); + } + if (svc_count >= 1) { + kind = EL_STR("service"); + } + state_set(EL_STR("__program_kind"), kind); + state_set(EL_STR("__cap_violations"), EL_STR("")); emit_line(EL_STR("#include ")); emit_line(EL_STR("#include ")); emit_line(EL_STR("#include \"el_runtime.h\"")); @@ -2714,7 +2921,7 @@ el_val_t codegen(el_val_t stmts, el_val_t source) { el_val_t i = 0; while (i < n) { el_val_t stmt = native_list_get(stmts, i); - el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + kind = el_get_field(stmt, EL_STR("stmt")); if (str_eq(kind, EL_STR("FnDef"))) { el_val_t fn_name = el_get_field(stmt, EL_STR("name")); if (!str_eq(fn_name, EL_STR("main"))) { @@ -2769,6 +2976,7 @@ el_val_t codegen(el_val_t stmts, el_val_t source) { emit_line(EL_STR(" return 0;")); emit_line(EL_STR("}")); emit_blank(); + emit_cap_violations(); return EL_STR(""); return 0; } diff --git a/dist/platform/elc.prev6 b/dist/platform/elc.prev6 new file mode 100755 index 0000000000000000000000000000000000000000..80ca0d702f0d1e6a103e70ec9afa0b2c91c7cdf6 GIT binary patch literal 165928 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�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 S$_FRvhh}Ha90kiaqW=X7)Hq52 literal 0 HcmV?d00001 diff --git a/el-compiler/src/codegen.el b/el-compiler/src/codegen.el index 69886fe..be0e65f 100644 --- a/el-compiler/src/codegen.el +++ b/el-compiler/src/codegen.el @@ -345,6 +345,12 @@ fn cg_expr(expr: Map) -> String { if func_kind == "Ident" { let fn_name: String = func["name"] + // Capability-kind enforcement: services can't call + // self-formation primitives; utilities can't call any + // DHARMA or LLM primitives. cap_check_call records + // violations to be emitted as #error directives at the + // top of the generated C, so cc fails with a clear msg. + cap_check_call(fn_name) return fn_name + "(" + args_c + ")" } @@ -807,6 +813,114 @@ fn is_int_call(call_expr: Map) -> Bool { return false } +// ── Capability-kind enforcement ────────────────────────────────────────────── +// +// A program's top-level block (cgi / service / none) determines which +// runtime primitives it may call. The compiler records violations in +// process state during cg_expr's Call emission; codegen's entry point +// then emits #error directives at the top of the generated C so the +// downstream cc step fails with a clear message. +// +// Capability tiers: +// "cgi" — full self-formation. All primitives. +// "service" — bounded. Cannot call self-formation primitives: +// llm_call_agentic, llm_register_tool, dharma_emit, +// dharma_field. Single-turn LLM calls are allowed. +// "utility" — default. No DHARMA, no LLM. Pure compute + I/O. +// +// The compiler-level rule is structural: the binary either CAN or CANNOT +// emit the call. There is no runtime check, no opt-in, no override. + +fn cap_record_violation(kind: String, fn_name: String) -> Bool { + let csv: String = state_get("__cap_violations") + if str_eq(csv, "") { let csv = "," } + let entry: String = kind + ":" + fn_name + let key: String = "," + entry + "," + if str_contains(csv, key) { return true } + state_set("__cap_violations", csv + entry + ",") + return true +} + +// Self-formation primitives — the cut between CGI and service. A program +// that emits these calls IS structurally a CGI; we forbid them everywhere +// else. +fn is_self_formation_call(fn_name: String) -> Bool { + if str_eq(fn_name, "llm_call_agentic") { return true } + if str_eq(fn_name, "llm_register_tool") { return true } + if str_eq(fn_name, "dharma_emit") { return true } + if str_eq(fn_name, "dharma_field") { return true } + return false +} + +// Any DHARMA primitive — utilities have zero network presence. +fn is_dharma_call(fn_name: String) -> Bool { + if str_eq(fn_name, "dharma_connect") { return true } + if str_eq(fn_name, "dharma_send") { return true } + if str_eq(fn_name, "dharma_activate") { return true } + if str_eq(fn_name, "dharma_emit") { return true } + if str_eq(fn_name, "dharma_field") { return true } + if str_eq(fn_name, "dharma_strengthen") { return true } + if str_eq(fn_name, "dharma_relationship") { return true } + if str_eq(fn_name, "dharma_peers") { return true } + return false +} + +// Any LLM primitive — utilities have no LLM access at all. +fn is_llm_call(fn_name: String) -> Bool { + if str_eq(fn_name, "llm_call") { return true } + if str_eq(fn_name, "llm_call_system") { return true } + if str_eq(fn_name, "llm_call_agentic") { return true } + if str_eq(fn_name, "llm_vision") { return true } + if str_eq(fn_name, "llm_register_tool") { return true } + if str_eq(fn_name, "llm_models") { return true } + return false +} + +fn cap_check_call(fn_name: String) -> Bool { + let kind: String = state_get("__program_kind") + if str_eq(kind, "cgi") { return true } + if str_eq(kind, "service") { + if is_self_formation_call(fn_name) { + cap_record_violation("service", fn_name) + return false + } + return true + } + // utility (default) + if is_dharma_call(fn_name) { + cap_record_violation("utility", fn_name) + return false + } + if is_llm_call(fn_name) { + cap_record_violation("utility", fn_name) + return false + } + return true +} + +// Emit collected capability violations as #error directives. Called +// from codegen()'s entry point right after the cgi/service-block scan, +// so they appear at the very top of the generated C. +fn emit_cap_violations() -> Void { + let csv: String = state_get("__cap_violations") + if str_eq(csv, "") { return } + if str_eq(csv, ",") { return } + let n: Int = str_len(csv) + let i: Int = 1 + while i < n { + let next_comma: Int = str_index_of(str_slice(csv, i, n), ",") + if next_comma < 0 { return } + let entry: String = str_slice(csv, i, i + next_comma) + let colon: Int = str_index_of(entry, ":") + if colon > 0 { + let kind: String = str_slice(entry, 0, colon) + let fn_name: String = str_slice(entry, colon + 1, str_len(entry)) + emit_line("#error \"capability violation: '" + kind + "' programs may not call '" + fn_name + "' (self-formation primitive — only 'cgi' programs may use it)\"") + } + let i = i + next_comma + 1 + } +} + fn add_int_name(name: String) -> Bool { let csv: String = state_get("__int_names") if str_eq(csv, "") { csv = "," } @@ -1039,10 +1153,21 @@ fn vbd_has_restricted_call(stmts: [Map]) -> Bool { // ── Entry point ──────────────────────────────────────────────────────────────── fn codegen(stmts: [Map], source: String) -> String { - // Detect cgi blocks: at most one allowed. Emit a #error if more than one. + // Detect cgi/service blocks: at most one declarative top-level block. + // The block determines the program's CAPABILITY KIND: + // "cgi" — full self-formation. Calls all primitives. + // "service" — bounded. Cannot call self-formation primitives + // (llm_call_agentic, llm_register_tool, dharma_emit, + // dharma_field, mindlink-creation). + // "utility" — default; no DHARMA membership, no LLM, no agentic. + // Codegen enforces this with #error directives at every restricted + // call site. The capability boundary is structural: a binary either + // CAN or CANNOT do a thing, and the compiler decides at emission time. let n_top: Int = native_list_len(stmts) let cgi_count = 0 let cgi_block: Map = { "stmt": "None" } + let svc_count = 0 + let svc_block: Map = { "stmt": "None" } let ti = 0 while ti < n_top { let s = native_list_get(stmts, ti) @@ -1053,11 +1178,33 @@ fn codegen(stmts: [Map], source: String) -> String { let cgi_block = s } } + if str_eq(sk, "ServiceBlock") { + let svc_count = svc_count + 1 + if svc_count == 1 { + let svc_block = s + } + } let ti = ti + 1 } if cgi_count > 1 { emit_line("#error \"El: multiple cgi blocks in program (only one allowed)\"") } + if svc_count > 1 { + emit_line("#error \"El: multiple service blocks in program (only one allowed)\"") + } + if cgi_count >= 1 { + if svc_count >= 1 { + emit_line("#error \"El: program declares both cgi and service blocks (mutually exclusive — pick one)\"") + } + } + // Stash the program kind so cg_expr's Call branch can enforce + // per-kind capability restrictions on every emitted call. + let kind: String = "utility" + if cgi_count >= 1 { let kind = "cgi" } + if svc_count >= 1 { let kind = "service" } + state_set("__program_kind", kind) + // Clear capability-violation accumulator from any prior compile. + state_set("__cap_violations", "") // Preamble emit_line("#include ") @@ -1132,6 +1279,12 @@ fn codegen(stmts: [Map], source: String) -> String { emit_line("}") emit_blank() + // Emit any accumulated capability-violation #error directives. cc + // will fail on the first one and surface the message; placement at + // the bottom is fine — preprocessor errors halt the build wherever + // they appear. + emit_cap_violations() + // Return empty string — output was streamed via println "" } diff --git a/el-compiler/src/lexer.el b/el-compiler/src/lexer.el index c7e3c16..6f7f742 100644 --- a/el-compiler/src/lexer.el +++ b/el-compiler/src/lexer.el @@ -141,6 +141,7 @@ fn keyword_kind(word: String) -> String { if word == "true" { return "Bool" } if word == "false" { return "Bool" } if word == "cgi" { return "Cgi" } + if word == "service" { return "Service" } if word == "manager" { return "Manager" } if word == "engine" { return "Engine" } if word == "accessor" { return "Accessor" } diff --git a/el-compiler/src/parser.el b/el-compiler/src/parser.el index d194392..ca8a904 100644 --- a/el-compiler/src/parser.el +++ b/el-compiler/src/parser.el @@ -825,6 +825,55 @@ fn parse_stmt(tokens: [Map], pos: Int) -> Map { }, p) } + // service block: service "name" { sponsor: "...", domain: "...", ... } + // + // A `service` declaration restricts the program's capabilities at + // compile time: services CANNOT call self-formation primitives + // (llm_call_agentic, llm_register_tool, dharma_emit, dharma_field, + // mindlink-creation). Codegen enforces this with #error directives. + if k == "Service" { + let p = pos + 1 + let name = tok_value(tokens, p) + let p = p + 1 + let p = expect(tokens, p, "LBrace") + let sponsor = "" + let domain = "" + let running = true + while running { + let k2 = tok_kind(tokens, p) + if k2 == "RBrace" { + let running = false + } else { + if k2 == "Eof" { + let running = false + } else { + let fname = tok_value(tokens, p) + let p = p + 1 + let p = expect(tokens, p, "Colon") + let fval = tok_value(tokens, p) + let p = p + 1 + if str_eq(fname, "sponsor") { + let sponsor = fval + } + if str_eq(fname, "domain") { + let domain = fval + } + let k3 = tok_kind(tokens, p) + if k3 == "Comma" { + let p = p + 1 + } + } + } + } + let p = expect(tokens, p, "RBrace") + return make_result({ + "stmt": "ServiceBlock", + "name": name, + "sponsor": sponsor, + "domain": domain + }, p) + } + // bare expression or if/match statement let r = parse_expr(tokens, pos) let val = r["node"] diff --git a/elc-combined.el b/elc-combined.el index 7886ad6..bf039c6 100644 --- a/elc-combined.el +++ b/elc-combined.el @@ -142,6 +142,7 @@ fn keyword_kind(word: String) -> String { if word == "true" { return "Bool" } if word == "false" { return "Bool" } if word == "cgi" { return "Cgi" } + if word == "service" { return "Service" } if word == "manager" { return "Manager" } if word == "engine" { return "Engine" } if word == "accessor" { return "Accessor" } @@ -1361,6 +1362,55 @@ fn parse_stmt(tokens: [Map], pos: Int) -> Map { }, p) } + // service block: service "name" { sponsor: "...", domain: "...", ... } + // + // A `service` declaration restricts the program's capabilities at + // compile time: services CANNOT call self-formation primitives + // (llm_call_agentic, llm_register_tool, dharma_emit, dharma_field, + // mindlink-creation). Codegen enforces this with #error directives. + if k == "Service" { + let p = pos + 1 + let name = tok_value(tokens, p) + let p = p + 1 + let p = expect(tokens, p, "LBrace") + let sponsor = "" + let domain = "" + let running = true + while running { + let k2 = tok_kind(tokens, p) + if k2 == "RBrace" { + let running = false + } else { + if k2 == "Eof" { + let running = false + } else { + let fname = tok_value(tokens, p) + let p = p + 1 + let p = expect(tokens, p, "Colon") + let fval = tok_value(tokens, p) + let p = p + 1 + if str_eq(fname, "sponsor") { + let sponsor = fval + } + if str_eq(fname, "domain") { + let domain = fval + } + let k3 = tok_kind(tokens, p) + if k3 == "Comma" { + let p = p + 1 + } + } + } + } + let p = expect(tokens, p, "RBrace") + return make_result({ + "stmt": "ServiceBlock", + "name": name, + "sponsor": sponsor, + "domain": domain + }, p) + } + // bare expression or if/match statement let r = parse_expr(tokens, pos) let val = r["node"] @@ -1745,6 +1795,12 @@ fn cg_expr(expr: Map) -> String { if func_kind == "Ident" { let fn_name: String = func["name"] + // Capability-kind enforcement: services can't call + // self-formation primitives; utilities can't call any + // DHARMA or LLM primitives. cap_check_call records + // violations to be emitted as #error directives at the + // top of the generated C, so cc fails with a clear msg. + cap_check_call(fn_name) return fn_name + "(" + args_c + ")" } @@ -2207,6 +2263,114 @@ fn is_int_call(call_expr: Map) -> Bool { return false } +// ── Capability-kind enforcement ────────────────────────────────────────────── +// +// A program's top-level block (cgi / service / none) determines which +// runtime primitives it may call. The compiler records violations in +// process state during cg_expr's Call emission; codegen's entry point +// then emits #error directives at the top of the generated C so the +// downstream cc step fails with a clear message. +// +// Capability tiers: +// "cgi" — full self-formation. All primitives. +// "service" — bounded. Cannot call self-formation primitives: +// llm_call_agentic, llm_register_tool, dharma_emit, +// dharma_field. Single-turn LLM calls are allowed. +// "utility" — default. No DHARMA, no LLM. Pure compute + I/O. +// +// The compiler-level rule is structural: the binary either CAN or CANNOT +// emit the call. There is no runtime check, no opt-in, no override. + +fn cap_record_violation(kind: String, fn_name: String) -> Bool { + let csv: String = state_get("__cap_violations") + if str_eq(csv, "") { let csv = "," } + let entry: String = kind + ":" + fn_name + let key: String = "," + entry + "," + if str_contains(csv, key) { return true } + state_set("__cap_violations", csv + entry + ",") + return true +} + +// Self-formation primitives — the cut between CGI and service. A program +// that emits these calls IS structurally a CGI; we forbid them everywhere +// else. +fn is_self_formation_call(fn_name: String) -> Bool { + if str_eq(fn_name, "llm_call_agentic") { return true } + if str_eq(fn_name, "llm_register_tool") { return true } + if str_eq(fn_name, "dharma_emit") { return true } + if str_eq(fn_name, "dharma_field") { return true } + return false +} + +// Any DHARMA primitive — utilities have zero network presence. +fn is_dharma_call(fn_name: String) -> Bool { + if str_eq(fn_name, "dharma_connect") { return true } + if str_eq(fn_name, "dharma_send") { return true } + if str_eq(fn_name, "dharma_activate") { return true } + if str_eq(fn_name, "dharma_emit") { return true } + if str_eq(fn_name, "dharma_field") { return true } + if str_eq(fn_name, "dharma_strengthen") { return true } + if str_eq(fn_name, "dharma_relationship") { return true } + if str_eq(fn_name, "dharma_peers") { return true } + return false +} + +// Any LLM primitive — utilities have no LLM access at all. +fn is_llm_call(fn_name: String) -> Bool { + if str_eq(fn_name, "llm_call") { return true } + if str_eq(fn_name, "llm_call_system") { return true } + if str_eq(fn_name, "llm_call_agentic") { return true } + if str_eq(fn_name, "llm_vision") { return true } + if str_eq(fn_name, "llm_register_tool") { return true } + if str_eq(fn_name, "llm_models") { return true } + return false +} + +fn cap_check_call(fn_name: String) -> Bool { + let kind: String = state_get("__program_kind") + if str_eq(kind, "cgi") { return true } + if str_eq(kind, "service") { + if is_self_formation_call(fn_name) { + cap_record_violation("service", fn_name) + return false + } + return true + } + // utility (default) + if is_dharma_call(fn_name) { + cap_record_violation("utility", fn_name) + return false + } + if is_llm_call(fn_name) { + cap_record_violation("utility", fn_name) + return false + } + return true +} + +// Emit collected capability violations as #error directives. Called +// from codegen()'s entry point right after the cgi/service-block scan, +// so they appear at the very top of the generated C. +fn emit_cap_violations() -> Void { + let csv: String = state_get("__cap_violations") + if str_eq(csv, "") { return } + if str_eq(csv, ",") { return } + let n: Int = str_len(csv) + let i: Int = 1 + while i < n { + let next_comma: Int = str_index_of(str_slice(csv, i, n), ",") + if next_comma < 0 { return } + let entry: String = str_slice(csv, i, i + next_comma) + let colon: Int = str_index_of(entry, ":") + if colon > 0 { + let kind: String = str_slice(entry, 0, colon) + let fn_name: String = str_slice(entry, colon + 1, str_len(entry)) + emit_line("#error \"capability violation: '" + kind + "' programs may not call '" + fn_name + "' (self-formation primitive — only 'cgi' programs may use it)\"") + } + let i = i + next_comma + 1 + } +} + fn add_int_name(name: String) -> Bool { let csv: String = state_get("__int_names") if str_eq(csv, "") { csv = "," } @@ -2439,10 +2603,21 @@ fn vbd_has_restricted_call(stmts: [Map]) -> Bool { // ── Entry point ──────────────────────────────────────────────────────────────── fn codegen(stmts: [Map], source: String) -> String { - // Detect cgi blocks: at most one allowed. Emit a #error if more than one. + // Detect cgi/service blocks: at most one declarative top-level block. + // The block determines the program's CAPABILITY KIND: + // "cgi" — full self-formation. Calls all primitives. + // "service" — bounded. Cannot call self-formation primitives + // (llm_call_agentic, llm_register_tool, dharma_emit, + // dharma_field, mindlink-creation). + // "utility" — default; no DHARMA membership, no LLM, no agentic. + // Codegen enforces this with #error directives at every restricted + // call site. The capability boundary is structural: a binary either + // CAN or CANNOT do a thing, and the compiler decides at emission time. let n_top: Int = native_list_len(stmts) let cgi_count = 0 let cgi_block: Map = { "stmt": "None" } + let svc_count = 0 + let svc_block: Map = { "stmt": "None" } let ti = 0 while ti < n_top { let s = native_list_get(stmts, ti) @@ -2453,11 +2628,33 @@ fn codegen(stmts: [Map], source: String) -> String { let cgi_block = s } } + if str_eq(sk, "ServiceBlock") { + let svc_count = svc_count + 1 + if svc_count == 1 { + let svc_block = s + } + } let ti = ti + 1 } if cgi_count > 1 { emit_line("#error \"El: multiple cgi blocks in program (only one allowed)\"") } + if svc_count > 1 { + emit_line("#error \"El: multiple service blocks in program (only one allowed)\"") + } + if cgi_count >= 1 { + if svc_count >= 1 { + emit_line("#error \"El: program declares both cgi and service blocks (mutually exclusive — pick one)\"") + } + } + // Stash the program kind so cg_expr's Call branch can enforce + // per-kind capability restrictions on every emitted call. + let kind: String = "utility" + if cgi_count >= 1 { let kind = "cgi" } + if svc_count >= 1 { let kind = "service" } + state_set("__program_kind", kind) + // Clear capability-violation accumulator from any prior compile. + state_set("__cap_violations", "") // Preamble emit_line("#include ") @@ -2532,6 +2729,12 @@ fn codegen(stmts: [Map], source: String) -> String { emit_line("}") emit_blank() + // Emit any accumulated capability-violation #error directives. cc + // will fail on the first one and surface the message; placement at + // the bottom is fine — preprocessor errors halt the build wherever + // they appear. + emit_cap_violations() + // Return empty string — output was streamed via println "" }