Result: done
Files: crates/nikaia/src/parser/mod.rs crates/nikaia-std/src/grammar.rs crates/nikaia-std/src/tools/ast.nika crates/nikaia-std/src/tools/check_core_pilot.nika crates/nikaia-std/src/tools/check_grammar.nika crates/nikaia-std/src/tools/check_imports.nika crates/nikaia-std/src/tools/emit_core_match.nika crates/nikaia-std/src/tools/emit_grammar.nika crates/nikaia-std/src/tools/emit_holes.nika crates/nikaia-std/src/tools/emit_pattern.nika crates/nikaia-std/src/tools/emit_state.nika crates/nikaia-std/src/tools/fold_bound.nika crates/nikaia-std/src/tools/grammar_types.nika crates/nikaia-std/src/tools/lowered.rs crates/nikaia-std/src/tools/lowered/ast.rs crates/nikaia-std/src/tools/lowered/check_core_pilot.rs crates/nikaia-std/src/tools/lowered/check_grammar.rs crates/nikaia-std/src/tools/lowered/check_imports.rs crates/nikaia-std/src/tools/lowered/emit_core_match.rs crates/nikaia-std/src/tools/lowered/emit_grammar.rs crates/nikaia-std/src/tools/lowered/emit_holes.rs crates/nikaia-std/src/tools/lowered/emit_pattern.rs crates/nikaia-std/src/tools/lowered/emit_state.rs crates/nikaia-std/src/tools/lowered/fold_bound.rs crates/nikaia-std/src/tools/lowered/grammar_types.rs crates/nikaia-std/src/tools/lowered/node_numbers.rs crates/nikaia-std/src/tools/node_numbers.nika tests/compiler/tests/grammar_members_a_member_twice_fails.nika tests/compiler/tests/grammar_members_a_member_twice_fails.stdout tests/compiler/tests/grammar_members_a_missing_field_fails.nika tests/compiler/tests/grammar_members_a_missing_field_fails.stdout tests/compiler/tests/grammar_members_an_unknown_member.nika tests/compiler/tests/grammar_members_an_unknown_member.stdout tests/compiler/tests/grammar_members_builds_a_struct.nika tests/compiler/tests/grammar_members_builds_a_struct.stdout tests/compiler/tests/grammar_members_null_into_a_field_that_takes_none_fails.nika tests/compiler/tests/grammar_members_null_into_a_field_that_takes_none_fails.stdout
Commit: grammar: members[S] builds a struct by the mapping rule (ADR-grammar-2 D3, D5)
Body: membersS parses to Pattern::Members; grammar_types copies the value rule per field of S (S must be a struct the grammar’s file declares, else NK1164) and lowers to helper rules __nikaia_members_N{,_all,_more,_one,_value(i)} that gather each member as Option<Option