Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
da220d2
Two independently-green PRs met on main and the corpus went red: rest…
Aug 26, 2026
324ea90
Prove required record fields cannot be omitted
Aug 26, 2026
6f8638f
witness: make the ran/never-ran split executable for the two new disp…
Aug 26, 2026
6c14c47
ci: re-push to trigger a dispatch that never arrived
Aug 26, 2026
b07e24b
Pin the existing successful-tree stamp order
Aug 26, 2026
1277fc7
Name the required-field refusal in the carrier control
Aug 26, 2026
1bc049d
Enroll required-field refusal hermetically
Aug 26, 2026
9f56a4e
Merge remote-tracking branch 'origin/session/cool-swift-307-exhaustiv…
Aug 26, 2026
a0ecdaa
Revert "Merge remote-tracking branch 'origin/session/cool-swift-307-e…
Aug 26, 2026
7a463d2
Merge remote-tracking branch 'origin/main' into HEAD
Aug 26, 2026
a17db42
Carry occurrence identity through v1 Node construction
Aug 27, 2026
e759990
Merge origin/main into occurrence identity carrier
Aug 27, 2026
6b9c319
Regenerate identity-bearing v1 seed
Aug 27, 2026
40d55d4
Traverse nested nodes in identity control
Aug 27, 2026
e6bdbcd
Account for shared nodes in identity control
Aug 27, 2026
765465d
Index shared authored occurrences once
Aug 27, 2026
43f5c0c
Canonicalize occurrence transport projections
Aug 27, 2026
26962d0
Revert "Canonicalize occurrence transport projections"
Aug 27, 2026
7de2a77
Complete remaining identity test constructions
Aug 27, 2026
594c932
Control OCI parser identity uniqueness
Aug 27, 2026
4a89871
Advance allocator beyond published occurrences
Aug 27, 2026
4ea83bc
Control annotation subject identity coverage
Aug 27, 2026
724ce2d
Publish allocator state from accepted node trees
Aug 27, 2026
09b6a3f
Control occurrence allocation across real modules
Aug 27, 2026
3cb0158
Publish occurrence allocation across parser lists
Aug 27, 2026
5314593
Floor function identities over accepted children
Aug 27, 2026
249c7d0
Publish condition identities through if parsing
Aug 27, 2026
897cdeb
Make parser occurrence allocation mandatory
Aug 27, 2026
a3c3ccf
Avoid duplicate node declaration occurrence
Aug 27, 2026
0aa737f
Record parser context publication rung
Aug 27, 2026
7478c9d
Use durable parser repair citation
Aug 27, 2026
671e5a8
Publish list slice operand identities
Aug 27, 2026
ef38f94
Clarify slice publication repair population
Aug 27, 2026
f85eceb
Merge remote-tracking branch 'origin/main' into session/crisp-lynx-780
Aug 27, 2026
8fb5278
Merge remote-tracking branch 'origin/main' into session/crisp-lynx-780
Aug 27, 2026
4ad57ad
Merge remote-tracking branch 'origin/main' into session/crisp-lynx-780
Aug 27, 2026
99dade2
Merge remote-tracking branch 'origin/main' into session/crisp-lynx-780
Aug 27, 2026
a46d138
Merge remote-tracking branch 'origin/main' into session/crisp-lynx-780
Aug 28, 2026
e8e6eb6
Merge remote-tracking branch 'origin/main' into session/crisp-lynx-780
Aug 28, 2026
0f07302
Merge remote-tracking branch 'origin/main' into session/crisp-lynx-780
Aug 28, 2026
7f9c70d
Merge main into session/crisp-lynx-780
Aug 28, 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
69 changes: 69 additions & 0 deletions dag/test/claim/required_record_field_omission_witness_test.dag
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
module test.claim.required_record_field_omission_witness

import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import tools.multi_module_compile_fixture {
MultiModuleCompileFixture,
MultiModuleCompileFixtureOutcome,
FixtureInstrumentRefused,
FixtureCompileRefused,
FixtureCompileCompleted,
fixture_source,
compile_fixture,
fixture_blocking_rows,
fixture_rows_of_class,
}

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly

data required_record_field_omission_witness_note: String = "Construction control for the v1 NodeOccurrenceIdentity carrier. The negative and positive manifests differ only in whether the required `occurrence_identity` field is supplied. The negative reaches the isolated v1-to-Rust compiler and observes exactly one blocking MissingField row naming occurrence_identity; FixtureInstrumentRefused cannot impersonate that refusal. The positive reaches Rust emission with no diagnostics and a nonempty artifact population. Both measured arms carry nonempty source and compiler digests, binding the receipt to the ordered manifest and running transform. This instrument does not assert interpreter behavior or any non-Rust render target."

fn required_record_field_fixture(source: String) -> MultiModuleCompileFixtureOutcome {
compile_fixture(MultiModuleCompileFixture {
sources: [fixture_source("required_field/entry.dag", source)],
entry: "required_field/entry.dag",
})
}

fn required_record_field_omission_run() -> MultiModuleCompileFixtureOutcome {
required_record_field_fixture(
source: "module required_field.entry\ntype Pair { occurrence_identity: Int, label: String }\ndata pair: Pair = Pair { label: \"red\" }\n"
)
}

fn required_record_fields_supplied_run() -> MultiModuleCompileFixtureOutcome {
required_record_field_fixture(
source: "module required_field.entry\ntype Pair { occurrence_identity: Int, label: String }\ndata pair: Pair = Pair { occurrence_identity: 1, label: \"green\" }\n"
)
}

test fn omitted_required_record_field_refuses() -> Bool {
match required_record_field_omission_run() {
FixtureCompileRefused { module_count: _, diagnostics: rows, source_digest: source_digest, compiler_digest: compiler_digest } =>
let blocking = fixture_blocking_rows(rows)
let missing = fixture_rows_of_class(rows, "MissingField")
match first(missing) {
Present { value: row } =>
count(blocking) == 1
&& count(missing) == 1
&& row.subject_name == "occurrence_identity"
&& row.count == 1
&& count(source_digest as String) > 0
&& count(compiler_digest as String) > 0
Absent => false
}
FixtureCompileCompleted { module_count: _, emitted_files: _, diagnostics: _, source_digest: _, compiler_digest: _ } => false
FixtureInstrumentRefused { cause: _ } => false
}
}

test fn complete_required_record_literal_accepts() -> Bool {
match required_record_fields_supplied_run() {
FixtureCompileCompleted { module_count: _, emitted_files: files, diagnostics: rows, source_digest: source_digest, compiler_digest: compiler_digest } =>
count(rows) == 0
&& count(files) > 0
&& count(source_digest as String) > 0
&& count(compiler_digest as String) > 0
FixtureCompileRefused { module_count: _, diagnostics: _, source_digest: _, compiler_digest: _ } => false
FixtureInstrumentRefused { cause: _ } => false
}
}
153 changes: 84 additions & 69 deletions src/v1/00_core.dag

Large diffs are not rendered by default.

1,430 changes: 921 additions & 509 deletions src/v1/02_parse.dag

Large diffs are not rendered by default.

10 changes: 6 additions & 4 deletions src/v1/04_env.dag
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
module v1.compiler.infer_env

import std.occurrence_identity { OccurrenceSynthetic }

import v1.std.core { Node, NewlineIndex, InternTable, empty_intern_table, merge_intern_tables, intern, intern_find, intern_str, source_text_at, authored_name_at, find_child_named, Cardinality, Connective, ExprData, InferredNode, kernel_span, module_path_segments, param_node_name_at, param_node_type_expr, CompilerDiagnostic, AmbiguousReference, UnresolvedType }
import v1.compiler.type_head_exposure { TypeHeadExposure }

Expand Down Expand Up @@ -725,7 +727,7 @@ fn qualify_borrowed_type_names(n: Node, owner_module_path: String, env: TypeEnv,
} else {
let qname = concat(mp, ".", name)
Node {
name: qname, span: n.span, ident_span: Present { value: kernel_span(name: qname) },
occurrence_identity: OccurrenceSynthetic, name: qname, span: n.span, ident_span: Present { value: kernel_span(name: qname) },
children: qualified_children, connective: n.connective, params: n.params,
inferred: n.inferred, return_cardinality: n.return_cardinality, uses: n.uses,
body: n.body, transport: n.transport, properties: n.properties,
Expand All @@ -740,7 +742,7 @@ fn qualify_borrowed_type_names(n: Node, owner_module_path: String, env: TypeEnv,

fn node_with_children(n: Node, children: List<Node>) -> Node {
Node {
name: n.name, ident: n.ident, span: n.span, ident_span: n.ident_span,
occurrence_identity: OccurrenceSynthetic, name: n.name, ident: n.ident, span: n.span, ident_span: n.ident_span,
children: children, connective: n.connective, params: n.params,
inferred: n.inferred, return_cardinality: n.return_cardinality, uses: n.uses,
body: n.body, transport: n.transport, properties: n.properties,
Expand All @@ -752,7 +754,7 @@ fn node_with_children(n: Node, children: List<Node>) -> Node {

fn node_with_inferred(n: Node, inferred: InferredNode?) -> Node {
Node {
name: n.name, ident: n.ident, span: n.span, ident_span: n.ident_span,
occurrence_identity: OccurrenceSynthetic, name: n.name, ident: n.ident, span: n.span, ident_span: n.ident_span,
children: n.children, connective: n.connective, params: n.params,
inferred: inferred, return_cardinality: n.return_cardinality, uses: n.uses,
body: n.body, transport: n.transport, properties: n.properties,
Expand Down Expand Up @@ -1068,7 +1070,7 @@ fn env_with_type_variable_bindings(env: TypeEnv, tp_names: List<String>) -> Type
fold(tp_names, init: env, f: (e, tp_name) =>
let tp_binding = TypeBinding {
name: tp_name,
resolved: Node { name: tp_name, span: kernel_span(name: tp_name), ident_span: Present { value: kernel_span(name: tp_name) }, children: [], connective: NoConnective, params: [], inferred: Present { value: TypeVariable { id: tp_name } }, return_cardinality: Required, uses: [], body: none, transport: none, properties: [], type_annotation: none, is_self_recursive: false, has_non_tail_self_call: false, match_pattern: none, expr_data: NoExprData },
resolved: Node { occurrence_identity: OccurrenceSynthetic, name: tp_name, span: kernel_span(name: tp_name), ident_span: Present { value: kernel_span(name: tp_name) }, children: [], connective: NoConnective, params: [], inferred: Present { value: TypeVariable { id: tp_name } }, return_cardinality: Required, uses: [], body: none, transport: none, properties: [], type_annotation: none, is_self_recursive: false, has_non_tail_self_call: false, match_pattern: none, expr_data: NoExprData },
provenance: SubValueUnknown
}
TypeEnv { module_path: e.module_path,
Expand Down
Loading
Loading