Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
7281901
body_lowering_fold: an if's arms are read at their slots of the if_ex…
Oct 2, 2026
8351814
if_arm_position: one warm producer for the four claims
Oct 2, 2026
4a1a9bd
nested_if_else_eval: the evaluated form of the nested-if else arm
Oct 3, 2026
020dcee
v2 parse: choice-overlap proof reads k=2 lookahead and proves not-pre…
Oct 3, 2026
f45e4e5
choice_plan_test: import LiveTreeDisposition and SubstrateInputsOnly;…
Oct 3, 2026
7855f23
v2 parse lookahead: a guard also refuses the other side's covered pre…
Oct 3, 2026
8793156
dag grammar: guard arg, stmt and the lambda name head with proved-pla…
Oct 3, 2026
4ae94b4
dag grammar: a match arm body is one production, the statement sequence
Oct 3, 2026
1f4fdd9
dag grammar: one if, head read once, block form's else optional (oper…
Oct 3, 2026
915f2f6
dag grammar: statement let only; let x = e in body refuses at the in …
Oct 3, 2026
0485142
v2 parse lookahead: a site is read as deep as its own longest proved …
Oct 3, 2026
a014044
Merge branch 'session/eager-crab-610' into session/eager-crab-610-p2
Oct 3, 2026
ad16a52
dag grammar: brace literal and parenthesised lambda heads guarded; an…
Oct 3, 2026
a96d5f5
Merge remote-tracking branch 'origin/main' into session/eager-crab-610
Oct 3, 2026
ff7f579
Merge branch 'session/eager-crab-610' into session/eager-crab-610-p2
Oct 3, 2026
84412f3
Merge branch 'pr13029' into p2-on-13029
Oct 3, 2026
aa79eb1
body_lowering_fold: the positional if-row reader answers an empty els…
Oct 3, 2026
290171e
Merge remote-tracking branch 'origin/main' into session/eager-crab-61…
Oct 3, 2026
86dbaa1
Merge remote-tracking branch 'origin/main' into session/eager-crab-61…
Oct 3, 2026
20ca83a
route claims: one minimal parse per claim; else-less readers handed t…
Oct 3, 2026
d143032
let-in sources moved or retired; the lookahead walk honours guards on…
Oct 3, 2026
3d3742b
Merge remote-tracking branch 'origin/main' into session/eager-crab-61…
Oct 3, 2026
4b9e1cc
else_less_if_value_category: smallest sources (floor: four claims 94-…
Oct 3, 2026
1f2247d
Merge remote-tracking branch 'origin/main' into session/eager-crab-61…
Oct 3, 2026
825b5a4
lookahead: a deeper read restarts from the overlapping pairs' first t…
Oct 3, 2026
ab3742f
else_less_if_value_category: the guard is parsed as a fn body alone
Oct 3, 2026
ac75819
route claims: each file's parses run once in a warm pure producer
Oct 3, 2026
7668231
lookahead: a deeper read is restricted at the second token too
Oct 3, 2026
b353235
Merge origin/main; if_arm_reader_differential reads the else slot thr…
Oct 3, 2026
bcbadf1
Merge remote-tracking branch 'origin/main' into session/eager-crab-61…
Oct 3, 2026
974055f
v2 grammar: a keyword is not a value name; module and data are contex…
Oct 3, 2026
3682b17
Merge origin/main into root E (#13056 and #13133 landed)
Oct 3, 2026
c2a85f3
dag.dag: drop the duplicated if rows the merge resolution introduced
Oct 3, 2026
79a4c2d
root E: rename the last let alias binder; the bare NAME= subject uses…
Oct 3, 2026
6eb9be6
root E: the bare NAME= sugar carries no guard; its keyword binder ref…
Oct 3, 2026
7cb167c
Merge remote-tracking branch 'origin/main' into session/tidy-raven-39…
Oct 3, 2026
5612f09
keyword_value_name_parse: minimal fixtures; split the label control
Oct 4, 2026
49d1886
keyword_value_name_parse: data-decl fixtures for match positions; spl…
Oct 4, 2026
2c91990
keyword_value_name_parse: drop the duplicated node-then-if control; t…
Oct 4, 2026
418bd36
floor_cost_debt: two over-budget kvn parse controls, by ruling of sha…
Oct 4, 2026
7f04137
floor_cost_debt: remove the stray closing brace that broke the module…
Oct 4, 2026
0b89edf
kvn claims: parse supplied token streams, keep one text-route inhabit…
Oct 4, 2026
39524b1
floor_cost_debt: drop chunk_22; both kvn claims are under the new-wit…
Oct 4, 2026
41d5a63
dag grammar: a punned field pattern named true/false refuses as Keywo…
Oct 4, 2026
b72b994
Merge origin/main into session/tidy-raven-393-kwbinder
Oct 4, 2026
50b4cd8
Merge origin/main into session/tidy-raven-393-kwbinder
Oct 4, 2026
cfd9538
workspace_microvm_access: rename main's new 'let alias' binder to hos…
Oct 4, 2026
95e974c
Merge origin/main into session/tidy-raven-393-kwbinder
Oct 4, 2026
e73af6e
Merge origin/main into session/tidy-raven-393-kwbinder
Oct 4, 2026
cfa31bb
Merge origin/main into session/tidy-raven-393-kwbinder
Oct 5, 2026
22ea598
Merge remote-tracking branch 'origin/main' into session/tidy-raven-39…
Oct 5, 2026
cc7c133
Merge remote-tracking branch 'origin/main' into session/tidy-raven-39…
Oct 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions dag/extdeps/languages/typescript/program.dag
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,8 @@ fn ts_return(expr: TsExpr?) -> TsStmt {
Return { expr: expr }
}

fn ts_if(cond: TsExpr, then: TsStmt, else_stmt: TsStmt?) -> TsStmt {
If { cond: cond, then: then, else_stmt: else_stmt }
fn ts_if(cond: TsExpr, then_stmt: TsStmt, else_stmt: TsStmt?) -> TsStmt {
If { cond: cond, then: then_stmt, else_stmt: else_stmt }
}

fn ts_for_of(var_name: String, iterable: TsExpr, body: TsStmt) -> TsStmt {
Expand Down
4 changes: 2 additions & 2 deletions dag/gunbc/node_http_server_emit.dag
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ fn node_http_request_handler_block() -> TsStmt {
args: [ts_ident(name: "path")]
)
),
then: node_http_match_handler_body(),
then_stmt: node_http_match_handler_body(),
else_stmt: none
)
),
Expand Down Expand Up @@ -213,7 +213,7 @@ fn node_http_request_handler_block() -> TsStmt {
op: ">",
right: ts_lit_num(text: "0")
),
then: ts_block(stmts: [
then_stmt: ts_block(stmts: [
ts_const(
name: "allow",
value: ts_call(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ data seed_admits_a_keyword_as_a_pattern_binder: RecurringFailureMode = Recurring
"CEILING AND NEXT-RUNG TRIGGER: structurally impossible once no v2 source is admitted through the seed parser alone -- the native parse is the one grammar every module must pass. The capability that retires the leniency's reach is the native route qualifying the corpus it parses, so a keyword binder refuses at a gate every PR runs rather than only in a census.",
"SECOND SHAPE (N7-1, gunbc#13028): a fn PARAMETER spelled `loop` and then READ as a value -- `fn infer_loop_member_role(loop: Node)` with `loop.kind`, `loop: loop`, `at: loop` in its body. The v2 parser admits the declaration (`fn f(loop: Int) -> Int { 1 }` parses) and refuses every value use with parse_g0_tokens_remain, so the whole of v2.compiler.infer became a native file refusal while every seed-interpreted control stayed green. Found by bisecting the file's new items through v2.compiler.parse parse_module_prepared under the seed: exactly the three items that read `loop` refused. The same root as the pattern-binder shape -- the seed lexes a keyword as an identifier -- reached through a binding position the pattern-binder repair does not cover.",
"THIRD SPECIMEN (the parameter shape, keyword `then`): v2.compiler.service_realization realization_require_conj declared `then: fn() -> Optional<RealizationRefusal>` and called it as `then()`; `then` is ^dag_token_kw_then. The whole module was a native file refusal (dependency/native census run 37197235156, parse_g0_tokens_remain, no locus); v2.compiler.parse_acceptance_census located it at bytes 18350..18351, the `(` after the keyword. Renaming the parameter (and its argument labels) to `proceed` is the repair: the source was invalid, as in the second shape.",
"FOURTH SPECIMEN, THE BINDER/REFERENCE ASYMMETRY (2026-10-03, ROOT E of the native seven): the v2 grammar admitted keywords as BINDING names (dag_binding_name_keyword_tokens at every parameter, `let`, `node NAME` / `NAME =` and field-pattern binder) but admitted only an identifier plus `module` / `data` as a REFERENCE (dag_grammar_primary_name_expr), so a name could be declared and never used. The refusal then landed at the first USE as the generic parse_g0_tokens_remain, far from the binder: src/v2/compiler/body_lowering_fold.dag `body_lower_exit_first(.., then: Node, ..)` refused at `node: then`, and src/v2/compiler/service_realization.dag `realization_require_conj(.., then: fn() ..)` at `then()` -- both inside the native seven's import closure, measured at main a0a5c62161b. A native census over dag + src/v2 (the v2.cli.compile_cli if-arm-reader-differential refused-file list, located per file by a single-file native emit) found nine such files at their first refusal, and a declaration scan found five non-contextual keyword PARAMETERS (then x3, alias, as).",
"REPAIR AND THE CONTEXTUAL PRECEDENT (operator ruling via the N7 manager, 2026-10-03: close the asymmetry from the BINDER side, symmetrically): every value-binder position now consumes the reference production itself (dag_grammar_primary_name_expr) behind a leading not-predicate guard that refuses any other keyword as v2.std.parse_refusal_reason KeywordAsValueName, located at the keyword (dag_grammar_value_name_before / dag_grammar_value_name_unconditional / dag_grammar_field_pattern_binder_guard). A field LABEL is not a value name and still admits a keyword. ONE declared set, dag_contextual_value_name_keywords = module, data, is read by BOTH ends, so a name is declarable exactly when it is referenceable. The criterion for that set, recorded here as the precedent for the next keyword question: a keyword may be a value name only if it heads nothing that can begin or continue an expression -- `module` and `data` head declarations only (136 parameters are named `module`); clause keywords (then, else, in, as, where) and expression heads (if, match, let, fn, loop) never qualify, because admitting them buys ambiguity for no capability. Each guard fires only where the keyword can only be a binder (a parameter before `:`, `node NAME` before `:` / `=`, a bare NAME before `=`, a field-pattern binder before `,` / `}` excluding the literal patterns true / false, `let` unconditionally), because patterns and the `node` sugar are probed ahead of statements and RefuseOnMatch stops the parse. Claims: v2.test.parse.keyword_value_name_parse (five located subjects, five probed-position controls). The keyword binders in the corpus were renamed, not admitted. RUNG, PER POSITION, STATED: the bare `NAME =` statement sugar refuses a keyword binder only as the generic parse_g0_tokens_remain, because statement alternatives dispatch by FIRST set and a not-predicate guard is transparent to it (measured: `loop = 1` refuses at the keyword, unnamed); the keyword is still never ACCEPTED there (v2.test.parse.keyword_value_name_parse kvn_bare_eq_keyword_binder_still_refuses_holds). NEXT TRIGGER, the capability: FIRST-set computation that sees through a refusal guard, at which point that form takes the named guard like the others.",
],
evidence: [],
}
22 changes: 11 additions & 11 deletions dag/gunbc/roadmap/roadmap_allocation_client.dag
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ fn js_and(left: TsExpr, right: TsExpr) -> TsExpr { ts_binop(left: left, op: "&&"
fn js_or(left: TsExpr, right: TsExpr) -> TsExpr { ts_binop(left: left, op: "||", right: right) }
fn js_not(expr: TsExpr) -> TsExpr { ts_prefix(op: "!", expr: expr) }
fn js_invoke(name: String, args: List<TsExpr>) -> TsExpr { ts_call(callee: js_id(name: name), args: args) }
fn js_when(cond: TsExpr, stmts: List<TsStmt>) -> TsStmt { ts_if(cond: cond, then: ts_block(stmts: stmts), else_stmt: none) }
fn js_branch(cond: TsExpr, then: List<TsStmt>, otherwise: List<TsStmt>) -> TsStmt { ts_if(cond: cond, then: ts_block(stmts: then), else_stmt: Present { value: ts_block(stmts: otherwise) }) }
fn js_when(cond: TsExpr, stmts: List<TsStmt>) -> TsStmt { ts_if(cond: cond, then_stmt: ts_block(stmts: stmts), else_stmt: none) }
fn js_branch(cond: TsExpr, then_arm: List<TsStmt>, otherwise: List<TsStmt>) -> TsStmt { ts_if(cond: cond, then_stmt: ts_block(stmts: then_arm), else_stmt: Present { value: ts_block(stmts: otherwise) }) }
fn js_quiet(stmts: List<TsStmt>) -> TsStmt { ts_try(body: ts_block(stmts: stmts), catch_param: "error", handler: ts_block(stmts: [])) }
fn js_typeof(expr: TsExpr, kind: String) -> TsExpr { js_eq(left: ts_prefix(op: "typeof ", expr: expr), right: js_lit(value: kind)) }

Expand Down Expand Up @@ -179,7 +179,7 @@ fn allocation_render_statements() -> List<TsStmt> {
alternate: js_plus(left: ts_lit_str(value: "Stale, last observed "), right: ts_binop(left: js_field(name: "observed_at"), op: "||", right: ts_lit_str(value: "never"))))),
js_row(term: "Lease ends", value: js_field(name: "expires_at")),
js_do(expr: js_send(object: js_id(name: "card"), method: "append", args: [js_id(name: "title"), js_id(name: "list")])),
ts_if(cond: js_field(name: "connection"), then: ts_block(stmts: [
ts_if(cond: js_field(name: "connection"), then_stmt: ts_block(stmts: [
ts_const(name: "code", value: js_create(tag: "code")),
js_text(target: js_id(name: "code"), value: js_field(name: "connection")),
js_do(expr: js_send(object: js_id(name: "card"), method: "append", args: [js_id(name: "code")])),
Expand All @@ -188,7 +188,7 @@ fn allocation_render_statements() -> List<TsStmt> {
js_text(target: js_id(name: "waiting"), value: ts_lit_str(value: "No connection is advertised until a fresh observation shows it running.")),
js_do(expr: js_send(object: js_id(name: "card"), method: "append", args: [js_id(name: "waiting")])),
]) }),
ts_if(cond: ts_binop(left: js_field(name: "retired_at"), op: "===", right: ts_lit_str(value: "")), then: ts_block(stmts: [
ts_if(cond: ts_binop(left: js_field(name: "retired_at"), op: "===", right: ts_lit_str(value: "")), then_stmt: ts_block(stmts: [
ts_const(name: "release", value: js_create(tag: "button")),
js_set(target: js_get(object: js_id(name: "release"), property: "type"), value: ts_lit_str(value: "button")),
js_do(expr: js_send(object: js_id(name: "release"), method: "setAttribute", args: [ts_lit_str(value: "data-allocation-release"), ts_lit_str(value: "")])),
Expand All @@ -201,7 +201,7 @@ fn allocation_render_statements() -> List<TsStmt> {
js_do(expr: js_send(object: js_id(name: "card"), method: "append", args: [js_id(name: "release")])),
]), else_stmt: none),
ts_const(name: "prior", value: js_send(object: js_id(name: "allocationCards"), method: "get", args: [js_field(name: "id")])),
ts_if(cond: js_id(name: "prior"), then: ts_block(stmts: [js_do(expr: js_send(object: js_id(name: "prior"), method: "replaceWith", args: [js_id(name: "card")]))]),
ts_if(cond: js_id(name: "prior"), then_stmt: ts_block(stmts: [js_do(expr: js_send(object: js_id(name: "prior"), method: "replaceWith", args: [js_id(name: "card")]))]),
else_stmt: Present { value: ts_block(stmts: [js_do(expr: js_send(object: js_id(name: "allocationList"), method: "append", args: [js_id(name: "card")]))]) }),
js_do(expr: js_send(object: js_id(name: "allocationCards"), method: "set", args: [js_field(name: "id"), js_id(name: "card")])),
])),
Expand Down Expand Up @@ -231,7 +231,7 @@ fn allocation_flow_statements() -> List<TsStmt> {
ts_const(name: "pending", value: js_invoke(name: "allocationPending", args: [])),
js_when(cond: js_not(expr: js_id(name: "pending")), stmts: [ts_return(expr: none)]),
ts_const(name: "recorded", value: js_send(object: js_id(name: "allocations"), method: "find", args: [js_fn(params: ["a"], stmts: [js_ret(expr: js_and(left: js_and(left: js_id(name: "a"), right: js_typeof(expr: js_id(name: "a"), kind: "object")), right: js_eq(left: js_get(object: js_id(name: "a"), property: "id"), right: js_get(object: js_id(name: "pending"), property: "key"))))])])),
js_branch(cond: js_and(left: js_id(name: "recorded"), right: js_eq(left: js_get(object: js_id(name: "recorded"), property: "profile"), right: js_get(object: js_id(name: "pending"), property: "profile"))), then: [
js_branch(cond: js_and(left: js_id(name: "recorded"), right: js_eq(left: js_get(object: js_id(name: "recorded"), property: "profile"), right: js_get(object: js_id(name: "pending"), property: "profile"))), then_arm: [
js_do(expr: js_invoke(name: "allocationSettleIntent", args: [])),
js_status(value: js_lit(value: "Your earlier request was recorded; it is shown below.")),
], otherwise: [
Expand Down Expand Up @@ -264,10 +264,10 @@ fn allocation_flow_statements() -> List<TsStmt> {
js_status(value: js_lit(value: "Requesting release…")),
js_do(expr: js_then(promise: js_invoke(name: "allocationFetch", args: [js_plus(left: js_item_path(id: js_id(name: "id")), right: js_lit(value: allocation_release_suffix)),
ts_object(fields: [ts_field(key: "csrf_token", value: js_id(name: "allocationCsrf")), ts_field(key: "generation", value: js_id(name: "generation"))])]), handler: js_fn(params: ["result"], stmts: [
js_branch(cond: js_invoke(name: "allocationSnapshotFor", args: [js_id(name: "result"), js_id(name: "id")]), then: [
js_branch(cond: js_invoke(name: "allocationSnapshotFor", args: [js_id(name: "result"), js_id(name: "id")]), then_arm: [
js_do(expr: js_invoke(name: "allocationRender", args: [js_result(property: "body")])),
js_status(value: js_lit(value: "Release recorded; the controller retires the workspace.")),
], otherwise: [js_branch(cond: js_and(left: js_result(property: "readable"), right: js_result(property: "body")), then: [js_do(expr: js_invoke(name: "allocationRefused", args: [js_result(property: "body")]))],
], otherwise: [js_branch(cond: js_and(left: js_result(property: "readable"), right: js_result(property: "body")), then_arm: [js_do(expr: js_invoke(name: "allocationRefused", args: [js_result(property: "body")]))],
otherwise: [js_status(value: js_plus(left: js_body(property: "reason"), right: js_lit(value: " Reload to see whether the release was recorded.")))])]),
]))),
])),
Expand All @@ -289,12 +289,12 @@ fn allocation_flow_statements() -> List<TsStmt> {
ts_field(key: "profile", value: js_get(object: js_id(name: "intent"), property: "profile")),
])]), handler: js_fn(params: ["result"], stmts: [
js_set(target: js_get(object: js_id(name: "allocationCreate"), property: "disabled"), value: js_not(expr: js_invoke(name: "allocationWritable", args: []))),
js_branch(cond: js_and(left: js_invoke(name: "allocationSnapshotFor", args: [js_id(name: "result"), js_get(object: js_id(name: "intent"), property: "key")]), right: js_eq(left: js_body(property: "profile"), right: js_get(object: js_id(name: "intent"), property: "profile"))), then: [
js_branch(cond: js_and(left: js_invoke(name: "allocationSnapshotFor", args: [js_id(name: "result"), js_get(object: js_id(name: "intent"), property: "key")]), right: js_eq(left: js_body(property: "profile"), right: js_get(object: js_id(name: "intent"), property: "profile"))), then_arm: [
js_do(expr: js_invoke(name: "allocationSettleIntent", args: [])),
js_do(expr: js_invoke(name: "allocationRender", args: [js_result(property: "body")])),
js_status(value: js_lit(value: "Request recorded; placement and boot are reported below.")),
], otherwise: [js_branch(cond: js_and(left: js_and(left: js_result(property: "readable"), right: js_result(property: "body")), right: ts_binop(left: js_result(property: "status"), op: "!==", right: ts_lit_num(text: "200"))),
then: [js_do(expr: js_invoke(name: "allocationRefused", args: [js_result(property: "body")]))],
then_arm: [js_do(expr: js_invoke(name: "allocationRefused", args: [js_result(property: "body")]))],
otherwise: [js_status(value: js_plus(left: js_or(left: js_and(left: js_result(property: "body"), right: js_body(property: "reason")), right: js_lit(value: "The answer did not name this request.")), right: js_lit(value: " Your request is kept; Request workspace repeats it.")))])]),
]))),
])),
Expand All @@ -311,7 +311,7 @@ fn allocation_live_statements() -> List<TsStmt> {
ts_const(name: "allocationList", value: js_element(id: "allocation-list")),
ts_const(name: "allocationCsrf", value: js_get(object: js_get(object: js_id(name: "allocationRoot"), property: "dataset"), property: "csrf")),
], concat(allocation_key_statements(), concat(allocation_request_statements(), concat(allocation_render_statements(), concat(allocation_flow_statements(), [
ts_if(cond: js_id(name: "allocationCsrf"), then: ts_block(stmts: [
ts_if(cond: js_id(name: "allocationCsrf"), then_stmt: ts_block(stmts: [
js_do(expr: js_send(object: js_id(name: "allocationForm"), method: "addEventListener", args: [ts_lit_str(value: "submit"), js_id(name: "allocationSubmit")])),
js_do(expr: js_invoke(name: "allocationLoad", args: [])),
js_do(expr: ts_call(callee: js_id(name: "setInterval"), args: [js_id(name: "allocationPoll"), ts_lit_num(text: "5000")])),
Expand Down
6 changes: 3 additions & 3 deletions dag/gunbc/roadmap/roadmap_belt.dag
Original file line number Diff line number Diff line change
Expand Up @@ -289,8 +289,8 @@ fn belt_refusal_member_id(a: MemberAction<DispatchMember, DispatchMemberAt>) ->
}
}

fn belt_refusal_ids(as: List<MemberAction<DispatchMember, DispatchMemberAt>>) -> List<String> {
as |> map(a => belt_refusal_member_id(a: a))
fn belt_refusal_ids(actions: List<MemberAction<DispatchMember, DispatchMemberAt>>) -> List<String> {
actions |> map(a => belt_refusal_member_id(a: a))
}

fn belt_reconcile_json_value(
Expand All @@ -308,7 +308,7 @@ fn belt_reconcile_json_value(
json_kv(key: "upserts", value: json_array(elements: belt_member_ids(ms: r.upserts) |> map(id => json_string(s: id)))),
json_kv(key: "would_teardown", value: json_array(elements: belt_member_ids(ms: r.teardowns) |> map(id => json_string(s: id)))),
json_kv(key: "refusal_count", value: json_int(n: belt_reconcile_refusal_count(r: r))),
json_kv(key: "refused", value: json_array(elements: belt_refusal_ids(as: r.refusals) |> map(id => json_string(s: id)))),
json_kv(key: "refused", value: json_array(elements: belt_refusal_ids(actions: r.refusals) |> map(id => json_string(s: id)))),
])
}

Expand Down
Loading