Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
311bdee
WIP: R3 gate #37: cost_lens_reads_target_realization (T-CostLens-Comp…
briansrls May 14, 2026
90f1e06
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
88b2184
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
afedaaf
WIP: R3 gate #37: cost_lens_reads_target_realization (T-CostLens-Comp…
briansrls May 14, 2026
8d534f0
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
5e689b0
docs: add gate 37 hand-rust receipt
briansrls May 14, 2026
c04cfdc
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
38021d0
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
1119b38
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
5445dcc
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
26e52ce
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
cf618f4
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
d950fdb
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
61edc67
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
512df24
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
d7e644d
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
964a647
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
6c5eb7a
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
b070c61
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
ed44895
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
f3a54a0
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
9a54bad
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
29ef68d
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
397ffbc
docs: make gate 37 P5 receipt checkable
briansrls May 14, 2026
0f04a9d
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
126cce6
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
a50f994
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
ef1b257
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
39517ce
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
4766d46
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
2264c93
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
928b6a4
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
c6b8a70
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 2026
6fe76a6
Merge remote-tracking branch 'origin/main' into session/royal-dove-906
briansrls May 14, 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
2 changes: 1 addition & 1 deletion docs/r3-program-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ This principle is NOT a separate lane; it's a per-lane gate-shape requirement ap
| 34 | `bridge_include_str_side_channels_retired` | state-check | T-Bridge-Retirement | **CONSUMER_LANDED (slice scope)** (PR #2459 squash 2026-05-10 00:05Z — `pipeline.dag` compile-time embed slice retired with structural `PipelineStageBinding` bootstrap witness + `l1_5_fixed_point_test.rs` reintroduction ratchet per `src/v3/std/bridge_ledger.dag` header) | slice-scope; **standalone closure brief #1976 STOP-BLOCKED** on Substrate T1 (compile-body witness) per `pipeline_authority.rs` `fn compile` still `ArrowBody::Unparsed` (#1939 substrate dep, clever-cat-146 verification 2026-05-09) |
| 35 | `bridge_exact_string_patching_residual_retired` | state-check | T-Bridge-Retirement | **PASSING** | PB lower-helper slice retired in `bridge_ledger.dag`; residual Row-4 classes → `bridge_exact_string_semantic_patching_residual` (Open) |
| 36 | `bridge_retirement_ledger_zero` | ledger-count | T-Bridge-Retirement | DECLARED | unified ledger reports 0 |
| 37 | `cost_lens_reads_target_realization` | structural-fold | T-CostLens-Composition | **INTEGRATION_RECEIPT (partial — ε-slice)** — `src/v3/compiler/tests/integration/lens_cost_target_realization_test.rs` pins `cost_lens_composes_symbolic_cost_with_rust_type_realization_row` (Rust-side `symbolic_cost_of` × `Semiring<SymbolicCost>::sequential` × bootstrap `rust_int.TypeRealization.cost`) and `cost_lens_reads_cost_field_on_rust_callable_realization_row` (`rust_is_empty_callable.CallableRealization.cost`). ε ratification (Q-Cost-Composition-Layering / PR #2181): lens output stays abstract `SymbolicCost`; per-primitive realization rows remain emit-time facts — **gates #40 + #70** now carry separate integration receipts in `m1_5_verification_test.rs` + the same `lens_cost_target_realization_test.rs` module (2026-05-12 bundle); row #37 remains the partial ε-slice for composition-row wiring alone. | Rust-side composition consumer + cited integration tests |
| 37 | `cost_lens_reads_target_realization` | structural-fold | T-CostLens-Composition | **INTEGRATION_RECEIPT (partial — ε-slice)** — `src/v3/compiler/tests/integration/lens_cost_target_realization_test.rs` pins `cost_lens_composes_symbolic_cost_with_rust_type_realization_row` (Rust-side `symbolic_cost_of` × `Semiring<SymbolicCost>::sequential` × bootstrap `rust_int.TypeRealization.cost`) and `cost_lens_reads_cost_field_on_rust_callable_realization_row` (`rust_is_empty_callable.CallableRealization.cost`). ε ratification (Q-Cost-Composition-Layering / PR #2181): lens output stays abstract `SymbolicCost`; per-primitive realization rows remain emit-time facts — **gates #40 + #70** now carry separate integration receipts in `m1_5_verification_test.rs` + the same `lens_cost_target_realization_test.rs` module (2026-05-12 bundle); row #37 remains the partial ε-slice for composition-row wiring alone. **P5 Mechanism (b) deferral receipt (PR #3086):** expanded non-test hand-Rust in existing SG-0 path `src/v3/compiler/src/lib.rs`; lane **T-PB-A**; concrete row **`ROADMAP.md` § "Lane acceptance — .dag gates" / `pb_hand_rust_at_shim_floor`** (the file remains under the SG-0 non-test census until PB-zero / pipeline-emitted Rust dissolves hand-maintained compiler helpers). Supporting single-authority evidence: `v3_compiler::realization_cost::compose_symbolic_cost_with_realization_costs` is a narrow Rust-side consumer wrapper over the existing `Semiring<SymbolicCost>::sequential` + `ConstantCost` composition, takes only validated `RealizationCostAmount` values from `RealizationCostTable`, and is exercised by `lens_cost_target_realization_test.rs` plus `r3_free_consequences_second_batch_test.rs`; it introduces no second realization-cost authority. | Rust-side composition consumer + cited integration tests |
| 38 | `coercion_cost_equals_complexity_by_construction` | structural-fold | T-CostLens-Composition | **SATISFIED-BY-CONSTRUCTION** (α-narrow PR #2171; `Semiring<SymbolicCost>` `sequential`/`iterate` at `src/v3/std/algebra.dag:181-188` is sole composition authority — no parallel "complexity-vs-cost" reconciliation surface exists) | thesis unification holds structurally |
| 39 | `no_coercion_cost_dimension` | substrate-shape | T-CostLens-Composition | **SATISFIED-BY-CONSTRUCTION** (α-narrow PR #2171; `SymbolicCost` 7-variant at `src/v3/std/algebra.dag:181` is the sole cost dimension; no parallel `CoercionCost` carrier exists at HEAD per grep) | no separate cost dimension |
| 40 | `symbolic_cost_expr_equals_executable` | SymbolicCost-typed | T-CostLens-Composition | **CONSUMER_LANDED + PASSING** — `m1_5_verification_test.rs`: `symbolic_cost_expr_equals_smoke_suite_passes` (literal `ConstantCost` path) + `symbolic_cost_expr_equals_countdown_demo_suite_passes` (independent `countdown` linear-semantics pin via `assert_recursive_countdown_linear_semantics`, then representative-program **executability + v3 literal roundtrip** for `demo`: `symbolic_cost_of` → `symbolic_cost_verification_fixture` → `SymbolicCostExprEquals` / `TestRunner`); `symbolic_cost_expr_equals_fail_closed_*` pins type + value mismatch fail-closed paths on `ClaimResult::Fail` (not `NotYetImplemented`). NYI-shell-retirement invariant pinned behavior-first by `symbolic_cost_expr_equals_executable_ratchet_test.rs` — single `TestRunner::run_suite` test (`symbolic_cost_expr_equals_well_shaped_claim_passes_and_never_returns_not_yet_implemented`) asserts `ClaimResult::Pass` and forbids both `NotYetImplemented(_)` (dispatch-fallthrough) and `Fail(_)` (evaluator regression) on the well-shaped path; fail-closed dispatch-arm tripwire, robust to dispatch reshaping / helper renames / message-text edits. Typed-shape rejection / fail-closed Fail-path coverage lives in `m1_5_verification_test.rs::symbolic_cost_expr_equals_fail_closed_*` (not duplicated in the ratchet file). | `TestRunner` structural `SymbolicCost` comparison + representative program |
Expand Down
16 changes: 15 additions & 1 deletion src/v3/compiler/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,10 @@ pub mod realization_cost {

use std::collections::HashMap;

use crate::dag::{literal_decimal_i64, Dag, DeclarationId, FieldValue, LiteralBits, ValueBody};
use crate::dag::{
literal_decimal_i64, sequential, Dag, DeclarationId, FieldValue, LiteralBits, SymbolicCost,
ValueBody,
};

/// 🟢 GREEN (terminal): closed mirror of the six `*Realization`
/// meta-types in `src/v3/std/emit_model.dag`; each variant selects a
Expand Down Expand Up @@ -260,6 +263,17 @@ pub mod realization_cost {
}
}

/// Compose the target-agnostic symbolic cost with target realization
/// costs read from a `LanguageSpec` row table.
pub fn compose_symbolic_cost_with_realization_costs(
algebra_cost: SymbolicCost,
costs: impl IntoIterator<Item = RealizationCostAmount>,
) -> SymbolicCost {
costs.into_iter().fold(algebra_cost, |acc, cost| {
sequential(acc, SymbolicCost::ConstantCost { _0: cost.value() })
})
}

struct RealizationMetas {
type_meta: DeclarationId,
callable_meta: DeclarationId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

use v3_compiler::compile_to_dag;
use v3_compiler::dag::{
literal_decimal_i64, per_call_descent_evidence, sequential, ArithmeticOp, Behavior,
ComparisonOp, Dag, Declaration, DeclarationId, FieldValue, LiteralBits, OperatorKind,
SymbolicCost, TransformTarget, ValueBody,
literal_decimal_i64, per_call_descent_evidence, ArithmeticOp, Behavior, ComparisonOp, Dag,
Declaration, DeclarationId, FieldValue, LiteralBits, OperatorKind, SymbolicCost,
TransformTarget, ValueBody,
};
use v3_compiler::emit_rust::emit_rust;
use v3_compiler::generated_full_bootstrap_dag;
Expand All @@ -28,7 +28,8 @@ use v3_compiler::lens_cost_target_realization::{
pattern_realization_meta, type_instantiation_realization_meta, type_realization_meta,
};
use v3_compiler::realization_cost::{
RealizationCostCategory, RealizationCostKey, RealizationCostTable,
compose_symbolic_cost_with_realization_costs, RealizationCostCategory, RealizationCostKey,
RealizationCostTable,
};

use crate::common::assert_recursive_countdown_linear_semantics;
Expand Down Expand Up @@ -187,11 +188,13 @@ fn cost_lens_composes_symbolic_cost_with_rust_type_realization_row() {
"literal bind should stay constant zero at algebra layer, got {algebra_cost:?}"
);

let composed = sequential(
let table = RealizationCostTable::for_language(&boot, named_id(&boot, "rust_language"))
.expect("rust realization-cost table should build");
let composed = compose_symbolic_cost_with_realization_costs(
algebra_cost,
SymbolicCost::ConstantCost {
_0: target_primitive_cost,
},
[table
.cost(&RealizationCostKey::Type(named_id(&boot, "Int")))
.expect("Rust Int realization cost")],
);
assert!(
matches!(composed, SymbolicCost::ConstantCost { _0: 1 }),
Expand Down Expand Up @@ -368,40 +371,40 @@ let demo: Int = countdown(3) + 1

let type_cost = table
.cost(&RealizationCostKey::Type(int_decl))
.expect("Rust Int realization cost")
.value();
.expect("Rust Int realization cost");
let add_cost = table
.cost(&RealizationCostKey::Operator {
target: int_decl,
op: add_op,
})
.expect("Rust Int add realization cost")
.value();
.expect("Rust Int add realization cost");
let sub_cost = table
.cost(&RealizationCostKey::Operator {
target: int_decl,
op: sub_op,
})
.expect("Rust Int sub realization cost")
.value();
.expect("Rust Int sub realization cost");
let eq_cost = table
.cost(&RealizationCostKey::Operator {
target: int_decl,
op: eq_op,
})
.expect("Rust Int eq realization cost")
.value();
.expect("Rust Int eq realization cost");
assert_eq!(
(type_cost, add_cost, sub_cost, eq_cost),
(
type_cost.value(),
add_cost.value(),
sub_cost.value(),
eq_cost.value()
),
(1, 1, 1, 1),
"fixture rows should expose Rust Int/Add/Sub/Eq realization costs"
);

let composed = [type_cost, add_cost, sub_cost, eq_cost]
.into_iter()
.fold(algebra_cost, |acc, cost| {
sequential(acc, SymbolicCost::ConstantCost { _0: cost })
});
let composed = compose_symbolic_cost_with_realization_costs(
algebra_cost,
[type_cost, add_cost, sub_cost, eq_cost],
);
assert!(
mentions_linear(&composed),
"cost lens demo should preserve the observable linear bound while folding Rust realization rows, got {composed:?}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,17 @@ use std::sync::OnceLock;

use v3_compiler::compile_to_dag;
use v3_compiler::dag::{
sequential, ArithmeticOp, Behavior, ComparisonOp, Dag, DeclarationId, OperatorKind,
SymbolicCost, TransformTarget,
ArithmeticOp, Behavior, ComparisonOp, Dag, DeclarationId, OperatorKind, SymbolicCost,
TransformTarget,
};
use v3_compiler::emit_rust::emit_rust;
use v3_compiler::generated_full_bootstrap_dag;
use v3_compiler::lens_cost::{complexity_of, ComplexityLookup};
use v3_compiler::lens_cost_symbolic::{symbolic_cost_of, SymbolicCostLookup};
use v3_compiler::realization_cost::{RealizationCostKey, RealizationCostTable};
use v3_compiler::realization_cost::{
compose_symbolic_cost_with_realization_costs, RealizationCostAmount, RealizationCostKey,
RealizationCostTable,
};
use v3_compiler::test_runner::{ClaimResult, TestClaimValue, TestRunner};
use v3_compiler::CompileError;

Expand Down Expand Up @@ -188,6 +191,7 @@ let demo: Int = countdown(3) + 1
let realized_costs = realized_rows
.iter()
.map(|row| realization_cost(&table, int_decl, row.op))
.map(|cost| cost.value())
.collect::<Vec<_>>();
assert_eq!(
realized_costs,
Expand Down Expand Up @@ -284,7 +288,7 @@ fn compose_expected_structural_cost(
rows.into_iter()
.map(|row| realization_cost(table, int_decl, row.op))
.fold(algebra_cost, |acc, primitive_cost| {
sequential(acc, SymbolicCost::ConstantCost { _0: primitive_cost })
compose_symbolic_cost_with_realization_costs(acc, [primitive_cost])
})
}

Expand All @@ -306,7 +310,7 @@ fn realization_cost(
table: &RealizationCostTable,
int_decl: DeclarationId,
op: DeclarationId,
) -> i64 {
) -> RealizationCostAmount {
table
.cost(&RealizationCostKey::Operator {
target: int_decl,
Expand All @@ -315,7 +319,6 @@ fn realization_cost(
.unwrap_or_else(|| {
panic!("missing Rust LanguageSpec realization cost for operator row {op:?}")
})
.value()
}

fn compose_observed_structural_cost(
Expand All @@ -327,7 +330,7 @@ fn compose_observed_structural_cost(
rows.iter()
.map(|row| realization_cost(table, int_decl, row.op))
.fold(algebra_cost, |acc, primitive_cost| {
sequential(acc, SymbolicCost::ConstantCost { _0: primitive_cost })
compose_symbolic_cost_with_realization_costs(acc, [primitive_cost])
})
}

Expand Down
Loading