Result: done
Files: crates/nikaia-std/src/tools/ast.nika crates/nikaia-std/src/tools/bounds_basic.nika crates/nikaia-std/src/tools/bounds_body.nika crates/nikaia-std/src/tools/bounds_shape.nika crates/nikaia-std/src/tools/bounds_walk.nika crates/nikaia-std/src/tools/buffers.nika crates/nikaia-std/src/tools/check_arith.nika crates/nikaia-std/src/tools/check_arm_leaves.nika crates/nikaia-std/src/tools/check_binds.nika crates/nikaia-std/src/tools/check_core_expr.nika crates/nikaia-std/src/tools/check_core_flow.nika crates/nikaia-std/src/tools/check_core_leaves.nika crates/nikaia-std/src/tools/check_core_ops.nika crates/nikaia-std/src/tools/check_core_stmt.nika crates/nikaia-std/src/tools/check_crossings.nika crates/nikaia-std/src/tools/check_facts.nika crates/nikaia-std/src/tools/check_flow.nika crates/nikaia-std/src/tools/check_function.nika crates/nikaia-std/src/tools/check_host.nika crates/nikaia-std/src/tools/check_kinds.nika crates/nikaia-std/src/tools/check_notes.nika crates/nikaia-std/src/tools/check_numbers4.nika crates/nikaia-std/src/tools/check_overflow.nika crates/nikaia-std/src/tools/check_places.nika crates/nikaia-std/src/tools/check_reads.nika crates/nikaia-std/src/tools/check_references.nika crates/nikaia-std/src/tools/check_shapes.nika crates/nikaia-std/src/tools/check_texts.nika crates/nikaia-std/src/tools/check_types.nika crates/nikaia-std/src/tools/check_visit.nika crates/nikaia-std/src/tools/check_walk.nika crates/nikaia-std/src/tools/check_walks.nika crates/nikaia-std/src/tools/claim_names.nika crates/nikaia-std/src/tools/dsl.nika crates/nikaia-std/src/tools/emit_below.nika crates/nikaia-std/src/tools/emit_calls.nika crates/nikaia-std/src/tools/emit_core_below.nika crates/nikaia-std/src/tools/emit_core_leaves.nika crates/nikaia-std/src/tools/emit_core_match.nika crates/nikaia-std/src/tools/emit_core_reads.nika crates/nikaia-std/src/tools/emit_expr.nika crates/nikaia-std/src/tools/emit_keeps.nika crates/nikaia-std/src/tools/emit_locals.nika crates/nikaia-std/src/tools/emit_ops.nika crates/nikaia-std/src/tools/emit_stmt.nika crates/nikaia-std/src/tools/emit_walk.nika crates/nikaia-std/src/tools/fold_bound.nika crates/nikaia-std/src/tools/foreign.nika crates/nikaia-std/src/tools/grammar_types.nika crates/nikaia-std/src/tools/interpreter.nika crates/nikaia-std/src/tools/keep.nika crates/nikaia-std/src/tools/keeps.nika crates/nikaia-std/src/tools/leaves.nika crates/nikaia-std/src/tools/lowered.rs crates/nikaia-std/src/tools/lowered/ast.rs crates/nikaia-std/src/tools/lowered/bounds_basic.rs crates/nikaia-std/src/tools/lowered/bounds_body.rs crates/nikaia-std/src/tools/lowered/bounds_shape.rs crates/nikaia-std/src/tools/lowered/bounds_walk.rs crates/nikaia-std/src/tools/lowered/buffers.rs crates/nikaia-std/src/tools/lowered/check_arith.rs crates/nikaia-std/src/tools/lowered/check_arm_leaves.rs crates/nikaia-std/src/tools/lowered/check_binds.rs crates/nikaia-std/src/tools/lowered/check_core_expr.rs crates/nikaia-std/src/tools/lowered/check_core_flow.rs crates/nikaia-std/src/tools/lowered/check_core_leaves.rs crates/nikaia-std/src/tools/lowered/check_core_ops.rs crates/nikaia-std/src/tools/lowered/check_core_stmt.rs crates/nikaia-std/src/tools/lowered/check_crossings.rs crates/nikaia-std/src/tools/lowered/check_facts.rs crates/nikaia-std/src/tools/lowered/check_flow.rs crates/nikaia-std/src/tools/lowered/check_function.rs crates/nikaia-std/src/tools/lowered/check_host.rs crates/nikaia-std/src/tools/lowered/check_kinds.rs crates/nikaia-std/src/tools/lowered/check_notes.rs crates/nikaia-std/src/tools/lowered/check_numbers4.rs crates/nikaia-std/src/tools/lowered/check_overflow.rs crates/nikaia-std/src/tools/lowered/check_places.rs crates/nikaia-std/src/tools/lowered/check_reads.rs crates/nikaia-std/src/tools/lowered/check_references.rs crates/nikaia-std/src/tools/lowered/check_shapes.rs crates/nikaia-std/src/tools/lowered/check_texts.rs crates/nikaia-std/src/tools/lowered/check_types.rs crates/nikaia-std/src/tools/lowered/check_visit.rs crates/nikaia-std/src/tools/lowered/check_walk.rs crates/nikaia-std/src/tools/lowered/check_walks.rs crates/nikaia-std/src/tools/lowered/claim_names.rs crates/nikaia-std/src/tools/lowered/dsl.rs crates/nikaia-std/src/tools/lowered/emit_below.rs crates/nikaia-std/src/tools/lowered/emit_calls.rs crates/nikaia-std/src/tools/lowered/emit_core_below.rs crates/nikaia-std/src/tools/lowered/emit_core_leaves.rs crates/nikaia-std/src/tools/lowered/emit_core_match.rs crates/nikaia-std/src/tools/lowered/emit_core_reads.rs crates/nikaia-std/src/tools/lowered/emit_expr.rs crates/nikaia-std/src/tools/lowered/emit_keeps.rs crates/nikaia-std/src/tools/lowered/emit_locals.rs crates/nikaia-std/src/tools/lowered/emit_ops.rs crates/nikaia-std/src/tools/lowered/emit_stmt.rs crates/nikaia-std/src/tools/lowered/emit_walk.rs crates/nikaia-std/src/tools/lowered/fold_bound.rs crates/nikaia-std/src/tools/lowered/foreign.rs crates/nikaia-std/src/tools/lowered/grammar_types.rs crates/nikaia-std/src/tools/lowered/interpreter.rs crates/nikaia-std/src/tools/lowered/keep.rs crates/nikaia-std/src/tools/lowered/keeps.rs crates/nikaia-std/src/tools/lowered/leaves.rs crates/nikaia-std/src/tools/lowered/maps.rs crates/nikaia-std/src/tools/lowered/names.rs crates/nikaia-std/src/tools/lowered/node_numbers.rs crates/nikaia-std/src/tools/lowered/order.rs crates/nikaia-std/src/tools/lowered/prover_calls.rs crates/nikaia-std/src/tools/lowered/prover_walk.rs crates/nikaia-std/src/tools/lowered/sharing.rs crates/nikaia-std/src/tools/lowered/text_tiers.rs crates/nikaia-std/src/tools/lowered/throws.rs crates/nikaia-std/src/tools/lowered/trust.rs crates/nikaia-std/src/tools/lowered/type_rules.rs crates/nikaia-std/src/tools/lowered/types.rs crates/nikaia-std/src/tools/lowered/views.rs crates/nikaia-std/src/tools/maps.nika crates/nikaia-std/src/tools/names.nika crates/nikaia-std/src/tools/node_numbers.nika crates/nikaia-std/src/tools/order.nika crates/nikaia-std/src/tools/prover_calls.nika crates/nikaia-std/src/tools/prover_walk.nika crates/nikaia-std/src/tools/sharing.nika crates/nikaia-std/src/tools/text_tiers.nika crates/nikaia-std/src/tools/throws.nika crates/nikaia-std/src/tools/trust.nika crates/nikaia-std/src/tools/type_rules.nika crates/nikaia-std/src/tools/types.nika crates/nikaia-std/src/tools/views.nika crates/nikaia/src/ast/mod.rs crates/nikaia/src/parser/mod.rs crates/nikaia/src/text_tiers.rs tests/compiler/tests/async_parse_group_is_not_built_yet.nika tests/compiler/tests/async_parse_group_is_not_built_yet.stderr tests/compiler/tests/async_parse_lambda_is_not_built_yet.nika tests/compiler/tests/async_parse_lambda_is_not_built_yet.stderr tests/compiler/tests/async_parse_statement_is_not_built_yet.nika tests/compiler/tests/async_parse_statement_is_not_built_yet.stderr tests/compiler/tests/async_parse_value_is_not_built_yet.nika tests/compiler/tests/async_parse_value_is_not_built_yet.stderr tests/compiler/tests/async_group_and_lambda_are_checked.nika tests/compiler/tests/async_group_and_lambda_are_checked.stderr tests/compiler/tests/async_group_starts_no_task.nika tests/compiler/tests/async_group_starts_no_task.stderr tests/compiler/tests/async_return_out_of_a_group_is_refused.nika tests/compiler/tests/async_return_out_of_a_group_is_refused.stderr tests/compiler/tests/async_task_with_nothing_beside_it.nika tests/compiler/tests/async_task_with_nothing_beside_it.stderr tests/compiler/tests/async_value_argument_is_a_plain_value.nika tests/compiler/tests/async_value_argument_is_a_plain_value.stderr tests/compiler/tests/async_value_waits_before_a_nested_use.nika tests/compiler/tests/async_value_waits_before_a_nested_use.stderr tests/specification/EXPECTED.txt tests/compiler/tests/async_binding_named_in_another_task.nika tests/compiler/tests/async_binding_named_in_another_task.stderr assets/badges/self-hosted.svg
Commit: async: the checker takes async e, async fn { … } and async { … }, records each task’s wait point, NK2110/NK2111/NK1132
Body: New AST nodes Expr::Async and Expr::AsyncGroup (ast.nika, 152 arms copied across the tools); the parser takes the value form, the statement form, a run lambda and the group (handles and options stay refused); the checker records each task’s wait point in facts.async_waits (CheckAsyncWait: Before(op id), BeforeStatement(start), GroupEnd; key the async node id) for a5, types async e as e and async fn { … } as its lambda’s last value, refuses an empty window (NK2110, three shapes), an async {} with no task (NK2111) and a jump or a return leaving a form (NK1132, return in a group too, read from D10); a later statement that itself starts a task naming a pending binding is no main-line wait (Part II’s let b = async enrich(a)); the lowering refuses both nodes as not built yet. Rust added/changed (for #557/#125): ast::id_slot (two arms), text_tiers::visit_expr_mut (two arms), the parser’s async_expr rule (three arms and their catch arms), stmt (async_stmt arm removed), async_stmt (removed). Known gap: an async in an f-string hole is not seen by the wait-point scan. tests/specification/EXPECTED.txt regenerated: Part II 10 #3 (a sketch, already NK1117) now also NK2110, #105/#106 parse now (NK1117 for their undeclared names). The four async_parse__is_not_built_yet tests are removed (their forms are taken now).
Part: #986
Pushed: local c3c7e170137e899b15518c2f6f831d295a72eb4d
Tests: tests/compiler –both-settings 645 passed, 0 failed (642 before, minus 4 removed, plus 7 new); it binary whole: 2884 passed, 3 failed under load (map_entries::and_modify…, foreign_pointers::sqlite3_from_end_to_end, specification::… before regenerating EXPECTED.txt), the three pass on rerun; seven new async_ tests, each failed on the unfixed compiler (parser’s not-built refusal; async_binding_named_in_another_task gave NK2110 twice before its fix); clippy clean; pre-push green; lower-std fixpoint holds
Gate: green
Deviation: none
Found: none
Needs: none
Changelog: none
Owner: none
Disk freed: none (cache 3.3G, / 7.6G free; new entries over 100 MB: rlib/df8bcfe6 397, rlib/af187e66 196, run-bundle/c1ccf85a 307)
Rs2nika: none
Attribution:
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01GFeMqxRbtUMiGVyDMxsvEq