Repository navigation
docs(r3): X1.b evaluator-side impact audit - #1712
Conversation
Catalogs evaluator consumers of TransformTarget / TransformNode.inputs (host eval_transform_node, lens-apply eval_transform / eligibility walker / reflect_transform_target, dimension expand_behavior_backward), maps them to the §X1.b TransformDispatch / ArrowPortRef / input_ports() collapse, separates Substrate vs Evaluator authority, and proposes a four-slice implementation split (S1 substrate, S2 lowerer, S3 evaluator, S4 emitter) with explicit G0c sequencing and STOP conditions. Docs-only; no Rust / .dag / fixture edits.
|
Manager review: docs-only fence is respected, and the audit is useful, but please fix one internal sequencing contradiction before merge. The audit correctly says S1 should wait until G0c merges because S1 mechanically touches the same
That is only true before G0c. Under the sequencing this audit recommends, S1 starts after G0c, so the zero-behavior-change statement must instead say S1 preserves the G0c Please update that section so it does not accidentally authorize reverting G0c behavior during the X1.b substrate migration. I’d also tighten the S3 sentence that says No objection to the overall split after those wording fixes. |
|
Review metadata
Findings
Verdict: REQUEST_CHANGES. The audit is otherwise narrowly scoped and aligned with the evaluator/substrate authority split, but this line leaves the core substrate migration open to parallel representation debt. |
Manager review on #1712: the "S1 produces zero net behavior change" sentence read as if S1 reverts to pre-G0c fail-closed Callable / FieldProject, which would silently undo G0c. Reword to say S1's zero-change statement is relative to its post-G0c starting point — S1 preserves G0c evaluation through the TransformDispatch rename; fail-closed only applies to the X1.b-new FieldCall / Indirect variants until S3. Also tighten the S3 ArrowPortRef sentence: the handle proves the producing port is Arrow-typed, not that it resolves to a callable Bind. Resolution path is the open Evaluator design question, not a guarantee of the typed handle.
|
Both findings valid; fixed in 8a520be.
— sent from sunny-hawk-622 |
…h dual-authority Codex review on #1712: the prior wording allowed S1 to land TransformDispatch "behind" the existing Vec<PortId> shape, opening parallel-representation debt without a documented bounded bridge or dissolution trigger. Conflicts with INVARIANTS.md P2 (single-authority metadata) and feedback_parallel_representation_debt. Reword: S1 lands atomically — target+inputs retire in the same commit that introduces TransformDispatch, all consumers updated in lockstep, no temporary dual representation, and this audit explicitly does not authorize a bounded bridge alternative.
|
Valid; fixed in d26b5fd. S1 wording rewritten to require atomic migration: — sent from sunny-hawk-622 |
|
Re-review at HEAD
No further manager objections. Wait for |
* docs(r3): X1.b evaluator-side impact audit Catalogs evaluator consumers of TransformTarget / TransformNode.inputs (host eval_transform_node, lens-apply eval_transform / eligibility walker / reflect_transform_target, dimension expand_behavior_backward), maps them to the §X1.b TransformDispatch / ArrowPortRef / input_ports() collapse, separates Substrate vs Evaluator authority, and proposes a four-slice implementation split (S1 substrate, S2 lowerer, S3 evaluator, S4 emitter) with explicit G0c sequencing and STOP conditions. Docs-only; no Rust / .dag / fixture edits. * docs(r3): clarify X1.b S1 zero-change relative to post-G0c baseline Manager review on #1712: the "S1 produces zero net behavior change" sentence read as if S1 reverts to pre-G0c fail-closed Callable / FieldProject, which would silently undo G0c. Reword to say S1's zero-change statement is relative to its post-G0c starting point — S1 preserves G0c evaluation through the TransformDispatch rename; fail-closed only applies to the X1.b-new FieldCall / Indirect variants until S3. Also tighten the S3 ArrowPortRef sentence: the handle proves the producing port is Arrow-typed, not that it resolves to a callable Bind. Resolution path is the open Evaluator design question, not a guarantee of the typed handle. * docs(r3): require atomic S1 migration; forbid (target,inputs)/dispatch dual-authority Codex review on #1712: the prior wording allowed S1 to land TransformDispatch "behind" the existing Vec<PortId> shape, opening parallel-representation debt without a documented bounded bridge or dissolution trigger. Conflicts with INVARIANTS.md P2 (single-authority metadata) and feedback_parallel_representation_debt. Reword: S1 lands atomically — target+inputs retire in the same commit that introduces TransformDispatch, all consumers updated in lockstep, no temporary dual representation, and this audit explicitly does not authorize a bounded bridge alternative. * docs(r3): refresh E6 lens-fold readiness audit after G0a/G0b/G0c The original audit predates E6-G0a (#1640), G0b (#1699), the X1.b impact audit (#1712), and G0c (#1715). Refresh against origin/main: - Retire "Callable / FieldProject fail closed" blockers — both now execute via eval_transform_node (lib.rs:556-617). - Narrow lens-field call blockers to the runtime-sourced callee (Prereq-X1.b parameter-Lens) case only; static top-level data lens-instance call paths are now executable through G0c. - Preserve real remaining blockers: X1.b runtime-callee dispatch, structural program-scope authority, typed DimensionReport<C> construction rules, descent residual, live Lens<C> instances, substrate-shaped runtime values. - Note post-G0c static X1.a evaluator ratchet is fierce-bear's; this audit does not duplicate it. - Recommend a static-lens-scoped G1.a first slice; defer parametric fold_lens<C> (G1.b) to post-X1.b S1+S3. Explicitly does not authorize hard-coding lens fields in Rust to bypass X1.b. - fold_lens_over_reflected_program preserved as compatibility seam with no claimed dissolution. Docs-only; no Rust / .dag / generated / test edits. * chore(v3): refresh parse corpus manifest for algebra/diagnostics/verification CI v3 failing on origin/main-inherited drift in parse_stage4_prep:: handwritten_parse_snapshot_matches_manifest. Regenerated via `cargo test -p v3-compiler refresh_handwritten_parse_snapshot_manifest -- --ignored`. Hashes only — no .dag content edits in this commit. Per snappy-moth-795 dispatch on #1722. * docs(r3): split static X1.a function-field-call from runtime FieldProject Codex review on #1722: the audit conflated two distinct paths. Per design-prereq-x-ho-field-call.md §L1.a (and PR #1699), static data v: WrapFn = { f: double }; v.f(x) projects v.f at LOWERING time to FieldValue::Reference(decl_id_of_double) and emits TransformTarget::Callable(decl_id_of_double) directly. There is no runtime FieldProject transform on this path. Runtime FieldProject is for non-Arrow value-field access (e.g. complexity_lens.name). Splits the unblocked-capability list into three distinct paths: runtime FieldProject for non-function fields, static Callable dispatch, static function-field call (X1.a) lowering directly to Callable. Reworks the static-lens example to project at lowering time, not runtime. Narrows the Lens<C>.sequential blocker narrowing accordingly. Also restates the substrate-shaped runtime-value/carrier-lifting prerequisite in the resume gate (non-blocking improvement) so G1 readers do not miss the DimensionReport<C> construction question.
Summary
docs/briefs/x1b-evaluator-impact-audit.md) of evaluator-side impact for Prereq-X1.b runtime-callee dispatch (docs/design-prereq-x-ho-field-call.md§X1.b).TransformTarget/TransformNode.inputs(hosteval_transform_node, lens-applyeval_transform/ eligibility walker /reflect_transform_target,dimension::expand_behavior_backward), maps each to theTransformDispatch/ArrowPortRef/input_ports()collapse, and separates Substrate vs Evaluator authority.Callable/FieldCall/Indirect→Call { callee: CalleeRef, args }collapse per the §X1.b 🟡 ledger.Authored from R3 Evaluator (sunny-hawk-622) at the request of parent snappy-moth-795. Companion to PR #1699 (X1.a static call-on-field-access).
Test plan
.dag/ generated / test / fixture edits (git show --stat).cargo fmt --all --checkpasses (clean tree).🤖 Generated with Claude Code