Skip to content

ModelCore PrimitiveFactBundle.spec_facts opaque-Node fill — replace untyped catch-all with structured fact bundle using declared primitive_fact_axis_{width,signedness,range,encoding} symbols (T-33 #3474 codex RC discharge as follow-up debt-PR on main) - #3500

Merged
briansrls merged 9 commits into
mainfrom
session/crisp-raven-275
May 21, 2026

Conversation

@briansrls

@briansrls briansrls commented May 21, 2026 •

Copy link
Copy Markdown
Contributor

Summary

T-33 (#3474) codex RC follow-up debt-PR: replaces the opaque catch-all PrimitiveFactBundle.spec_facts: Node with a structured axis-keyed bundle that consumes the declared primitive_fact_axis_* symbols, giving primitive facts a typed authority instead of a single unstructured Node payload.

  • src/v4/std/model_core.dag: add PrimitiveFactAxisBinding { axis: Symbol, fact: Node }; change PrimitiveFactBundle.spec_facts from Node to List<PrimitiveFactAxisBinding>. Declared axis vocabulary expanded to seven canonical Symbols: width, signedness, range, encoding, surface_spelling, overflow_disposition, std_projection.
  • src/v4/extdeps/languages/rust.dag: per-kind producers emit axis-keyed bindings covering T-4 source-spec facts —
    • Integer: {surface_spelling, width, signedness, overflow_disposition, std_projection}
    • Float: {surface_spelling, width, encoding, std_projection}
    • Non-integer: {surface_spelling, encoding, std_projection}
  • primitive_fact_axis_range is declared as canonical vocabulary but intentionally unbound in the Rust producer: range is derivable from width + signedness for integers and is not a separately-stored T-4 fact in the current catalog. It will be bound when a primary range fact lands.
  • v4_std_model_core_dag_smoke_test.rs: add PrimitiveFactAxisBinding to the carrier inventory; new ratchet v4_std_model_core_primitive_fact_bundle_uses_axis_keyed_spec_facts asserts the bundle/binding shape and that all seven canonical axis Symbols remain declared.

Test plan

  • cargo test -p v3-compiler v4_std_model_core — 7/7 pass (including new axis-keyed-spec-facts ratchet).

@briansrls
briansrls marked this pull request as ready for review May 21, 2026 08:50

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: c9c49ec7 · Trigger: schedule
  • Thinking: 366s wall

BLOCKING (2)

Root Cause

  • src/v4/std/model_core.dag ModelCore introduced axis bindings before the axis vocabulary covered every T-4 primitive fact or separated range from overflow disposition → extend the axes/fact carriers and bind each source-spec fact under its own correct key.

ROADMAP — Incomplete

  • T-4 fact-bundle contract: The PR moves toward structured fact bundles, but the new axis fill does not yet satisfy T-4's required source-spec facts.

⚠️ The structured fact-bundle direction is right, but the current bindings still lose and mislabel load-bearing primitive facts.

rust_primitive_fact_bundle(facts_node: rust_integer_facts_node(facts: facts))
PrimitiveFactBundle {
substrate_carrier: rust_integer_facts_node(facts: facts),
spec_facts: [

This comment was marked as resolved.

Comment thread src/v4/extdeps/languages/rust.dag Outdated
fact: rust_int_kind_node(kind: facts.signedness)
),
rust_primitive_axis_binding(
axis: primitive_fact_axis_range,

This comment was marked as resolved.

briansrls added 2 commits May 21, 2026 05:40
…e-spec facts

Adds three declared axis Symbols and binds them in the Rust extdep producer:
- primitive_fact_axis_surface_spelling — was omitted (codex BLOCKING #1)
- primitive_fact_axis_overflow_disposition — was misnamed as range (codex BLOCKING #2)
- primitive_fact_axis_std_projection — closes T-4 source-spec coverage

Integer bundles bind {surface_spelling, width, signedness, overflow_disposition, std_projection}.
Float bundles bind {surface_spelling, width, encoding, std_projection}.
Non-integer bundles bind {surface_spelling, encoding, std_projection}.

primitive_fact_axis_range stays declared as canonical vocabulary but unbound here — range is
derivable from width+signedness for integers and not a separately-stored T-4 fact in the
current Rust catalog; rebinding when a primary range fact lands.

Smoke ratchet updated to assert all seven canonical axis Symbol declarations.
@briansrls

Copy link
Copy Markdown
Contributor Author

Discharged the codex schedule review (3 BLOCKING) at 638bc8722:

(1) surface_spelling omitted — fixed. Declared new axis primitive_fact_axis_surface_spelling and bound it in all three Rust producers (integer / float / non-integer). T-4 source-spec spelling is now at the structured boundary, not buried in substrate_carrier.

(2) primitive_fact_axis_range populated with overflow_release — fixed. Declared new axis primitive_fact_axis_overflow_disposition and rebound facts.overflow_release there. primitive_fact_axis_range stays declared as canonical vocabulary but is intentionally unbound for Rust integers: range is derivable from width+signedness and not a separately-stored T-4 fact in the current catalog — will rebind when a primary range fact lands.

(3) Axes incomplete for T-4 source-spec facts — addressed. Declared third new axis primitive_fact_axis_std_projection and bound facts.std_projection per-kind. Per-primitive coverage now:

  • Integer: {surface_spelling, width, signedness, overflow_disposition, std_projection}
  • Float: {surface_spelling, width, encoding, std_projection}
  • Non-integer: {surface_spelling, encoding, std_projection}

Ratchet v4_std_model_core_primitive_fact_bundle_uses_axis_keyed_spec_facts extended to pin all seven declared axis Symbols. cargo test -p v3-compiler v4_std_model_core → 7/7 pass.

@briansrls

Copy link
Copy Markdown
Contributor Author

Updated PR body to match landed bindings — explicit per-kind axis sets (Integer/Float/Non-integer) and the intentional primitive_fact_axis_range declared-but-unbound rationale. No code change.

The exploratory "duplicate-or-missing axis keys" observation noted; tracked-not-acted as out of scope for this debt-PR — if axis completeness becomes load-bearing, a stricter carrier (e.g. fixed-record-per-kind or set-of-axes invariant) is a separate modeling pass.

— sent from crisp-raven-275

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: 638bc872 · Trigger: schedule
  • Thinking: 338s wall

BLOCKING (3)

Root Cause

  • src/v4/extdeps/languages/rust.dag RustIntegerPrimitiveFacts has no representation or encoding source field → add the Rust integer representation carrier and axis binding before exposing the bundle as the ModelCore boundary.
  • src/v4/std/model_core.dag PrimitiveFactBundle.spec_facts mixes source-spec facts and std-projection evidence → keep spec_facts source-only and model std coincidence through a separate grounded relation or existing coincidence consumer.
  • src/v3/compiler/tests/integration/v4_std_model_core_dag_smoke_test.rs The ModelCore ratchet is still being extended as hand-maintained Rust → add the required checkable P5 receipt or move this assertion into the structural/generated test lane.

⚠️ The prior inline issues are fixed, but the fact bundle still blurs source facts, grounding evidence, and SG-0 receipt discipline.

rust_primitive_fact_bundle(facts_node: rust_integer_facts_node(facts: facts))
PrimitiveFactBundle {
substrate_carrier: rust_integer_facts_node(facts: facts),
spec_facts: [

This comment was marked as resolved.

Comment thread src/v4/extdeps/languages/rust.dag Outdated
fact: rust_overflow_node(overflow: facts.overflow_release)
),
rust_primitive_axis_binding(
axis: primitive_fact_axis_std_projection,

This comment was marked as resolved.

}
}

#[test]

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: The added hand-written src/v3 Rust test expands the SG-0 test surface without the required P5 PR-body or planning-artifact receipt in the supplied review surface, violating INVARIANTS.md P5 for new Rust tests.

@briansrls

Copy link
Copy Markdown
Contributor Author

Discharge of codex schedule re-review on 638bc872 at 0302768b2:

(1) Inline rust.dag:1148 — surface_spelling omitted — already fixed in prior commit 638bc8722. Integer / float / non-integer producers all bind primitive_fact_axis_surface_spelling (rust.dag:1149-1152 / 1175 / 1196). Stale relay; verified against current HEAD.

(2) Inline rust.dag:1148 — two's-complement representation missing from integer spec_facts — fixed. Added rust_repr_integer_twos_complement: Symbol data declaration; bound primitive_fact_axis_encoding for the integer producer with that Symbol. Integer spec_facts now matches the float/non-integer encoding shape and the Rust Reference source-spec fact.

(3) Inline rust.dag:1166 — std_projection conflates source-spec with grounding — fixed. Practice-8 valid: std_projection is the Rust→v4.std grounding witness, not a Rust Reference source-spec fact. Dropped the axis binding in all three producers and removed primitive_fact_axis_std_projection from the model_core.dag declared-axis set. The std_projection field stays inside substrate_carrier and routes to grounding via the existing inhabitance/witness path.

(4) Inline v4_std_model_core_dag_smoke_test.rs:213 — hand-written src/v3 Rust test without P5 receipt — premise wrong (this PR does not add the file). v4_std_model_core_dag_smoke_test.rs was created in PR #3474 (T-33 land) and is already a row on INVARIANTS.md §P5(b) plus sg0_census_test.rs:858 with the pb_rust_tests_outside_residual_zero dissolution lane. This PR adds one test function inside that existing file; no new SG-0 census line is required because the file row already exists. git log --follow shows the file was added in 908795344 (T-33), not in this branch.

Per-primitive axis-keyed spec_facts now:

  • Integer: {surface_spelling, width, signedness, encoding=two's-complement, overflow_disposition}
  • Float: {surface_spelling, width, encoding=ieee754_binary}
  • Non-integer: {surface_spelling, encoding=representation}

cargo test -p v3-compiler v4_std_model_core → 7/7 pass. Six declared axes (width, signedness, range, encoding, surface_spelling, overflow_disposition); range remains canonical-but-unbound (derivable from width+signedness).

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: 0302768b · Trigger: schedule
  • Thinking: 315s wall

BLOCKING (2)

Root Cause

  • src/v4/extdeps/languages/rust.dag RustIntegerPrimitiveFacts has no range carrier/source fields → add declared min/max range facts to the record/node and bind them through primitive_fact_axis_range.
  • src/v4/extdeps/languages/rust.dag RustIntegerPrimitiveFacts collapses overflow to overflow_release: OverflowAction → model the Rust Reference overflow cases as a source-spec disposition carrier and bind that carrier in spec_facts.

⚠️ The structured ModelCore boundary still drops or misstates Rust source-spec facts.

rust_primitive_fact_bundle(facts_node: rust_integer_facts_node(facts: facts))
PrimitiveFactBundle {
substrate_carrier: rust_integer_facts_node(facts: facts),
spec_facts: [

This comment was marked as resolved.

Comment thread src/v4/extdeps/languages/rust.dag Outdated
fact: rust_inhabitant_atom(id: rust_repr_integer_twos_complement)
),
rust_primitive_axis_binding(
axis: primitive_fact_axis_overflow_disposition,

This comment was marked as resolved.

@briansrls

Copy link
Copy Markdown
Contributor Author

Discharge of codex re-review on 0302768b at 689a0c994:

(1) Inline rust.dag:1148 — primitive_fact_axis_range unbound, omitted source min/max — out of scope, not adopting. The brief is to fill the opaque spec_facts: Node catch-all using the declared axis vocabulary; range stays canonical-declared but unbound. Adding range_min/range_max source fields to RustIntegerPrimitiveFacts is substrate evolution of rust.dag's extdep fact carriers themselves — separate dispatch. (Note: cursor's prior APPROVE_WITH_COMMENTS on this same posture flagged it as a non-blocking observation; treating consecutive codex BLOCKINGs that push past the brief as the "pre-ratified rework must re-confirm-shape before silently growing" pattern from project memory.)

(2) Inline rust.dag:1166 — primitive_fact_axis_overflow_disposition misstates mode/flag-dependent Rust overflow — premise valid; fix is to drop the binding. Current OverflowAction = PanicOnOverflow | TwoComplementWrap doesn't capture Rust's mode-dependence (debug=panic / release=wrap default + overflow_checks flag). Rather than misstate the source spec, this binding is removed at 689a0c994; primitive_fact_axis_overflow_disposition stays declared as canonical vocabulary but unbound, mirroring range's posture. Mode-aware overflow carrier is substrate evolution of OverflowAction (or migration to the already-declared OverflowDisposition<IRCarrier>) — separate dispatch.

Net integer spec_facts now: {surface_spelling, width, signedness, encoding=two's-complement} — only Rust Reference source-spec facts the current RustIntegerPrimitiveFacts carrier can faithfully render. Float and non-integer producers unchanged.

7/7 v4_std_model_core smoke tests pass.

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-pro
  • Commit: 689a0c99 · Trigger: manual
  • Comparison: main @ ac010645 ... session/crisp-raven-275 @ 689a0c99
  • Conversation: View conversation

1. Story of the diff

This PR turns ModelCore.PrimitiveFactBundle.spec_facts from a second opaque Node copy into a typed list of axis-keyed facts. The new PrimitiveFactAxisBinding carrier in src/v4/std/model_core.dag:23-26 gives each fact an axis: Symbol and fact: Node, and PrimitiveFactBundle.spec_facts now carries List<PrimitiveFactAxisBinding> at src/v4/std/model_core.dag:31. The Rust language model then stops filling both substrate_carrier and spec_facts with the same all-purpose facts node, instead building per-primitive fact lists for integer, float, and non-integer Rust primitives in src/v4/extdeps/languages/rust.dag:1146-1204. The smoke test expands the ModelCore carrier inventory and adds a structural ratchet that PrimitiveFactBundle is no longer opaque-Node-shaped and that the declared primitive fact axes exist.

2. Invariant categories

  1. LAYER MODEL (substrate vs implementation).

Finding — Modeling Faithfulness / facts flow forward. The PR is substrate-touching: PrimitiveFactBundle.spec_facts becomes the canonical structured fact surface at src/v4/std/model_core.dag:31, and the new test explicitly treats primitive_fact_axis_range as one of the canonical primitive fact axes at src/v3/compiler/tests/integration/v4_std_model_core_dag_smoke_test.rs:244-250. But the Rust integer bundle populated at src/v4/extdeps/languages/rust.dag:1148-1165 carries surface spelling, width, signedness, and encoding only; it never binds primitive_fact_axis_range. Rust’s own numeric-type reference gives min/max ranges for unsigned integer types and for signed integer types, so range is a real source-spec fact, not merely an invented label. Rust Documentation Practice 8 says external primitive models must state the facts the spec gives, including range, as structured carriers. chatgpt-review-c9d060e0-6a8a-42…

Either bind the range axis for integer primitives now, or remove/retarget the range axis from this canonical spec-fact contract and provide the structural derivation that makes it intentionally absent from spec_facts.

  1. INVARIANTS.md + modeling-discipline.md.

Finding — Practice 8 fact-bundle modeling / P1 Modeling Faithfulness. Same blocking issue as above: rust_primitive_bundle_from_integer_facts now defines the fact bundle surface, but omits the declared range axis from the integer fact list at src/v4/extdeps/languages/rust.dag:1148-1165. The invariant’s “hollow alias” rule is broader than aliases: external primitive specs carry facts such as width, signedness, representation, range, and encoding, and the fix shape is to model those facts in a fact-bundle rather than silently discard them. chatgpt-review-940156cd-474e-48…

The PR improves the shape substantially by replacing the opaque Node, but it still drops one of the declared canonical axes at the boundary where facts are supposed to flow forward.

  1. CODING.md.

Compliant. The Rust test helper added at src/v3/compiler/tests/integration/v4_std_model_core_dag_smoke_test.rs:51-64 is a small pure helper over SurfaceModule, and the new .dag functions use explicit data constructors rather than hidden state or broad procedural mutation.

  1. TESTING.md.

Finding — regression test does not cover the load-bearing fact flow. The added test verifies that PrimitiveFactBundle.spec_facts is List<PrimitiveFactAxisBinding> and that primitive_fact_axis_range exists as a declared Symbol at src/v3/compiler/tests/integration/v4_std_model_core_dag_smoke_test.rs:220-257, but it does not verify that any Rust primitive bundle actually uses the declared range axis. That allows the current under-modeled integer bundle at src/v4/extdeps/languages/rust.dag:1148-1165 to pass. Add a behavior/structural ratchet over the Rust model bundle construction, or extend the existing smoke surface enough to assert that integer primitive spec_facts include the canonical range binding.

  1. LOCKED DESIGN DECISIONS.

N/A — the diff does not edit a locked design document or reverse a locked decision; it implements the live T-33/Practice-8 direction rather than changing the design authority.

  1. TRACKED vs UNTRACKED DEBT.

Finding — untracked staged axis. primitive_fact_axis_overflow_disposition is added to ModelCore ownership at src/v4/std/model_core.dag:3, declared at src/v4/std/model_core.dag:20, imported into Rust at src/v4/extdeps/languages/rust.dag:41, and asserted by the smoke test at src/v3/compiler/tests/integration/v4_std_model_core_dag_smoke_test.rs:249-250, but no changed bundle binds it and there is no visible 🟡 feature: / consumer: gate or dissolution trigger. If overflow disposition is part of this PR’s semantic surface, bind it where applicable; if it is future staging, mark it as a bounded scaffold with the named consumer/task and dissolve-on-arrival trigger; otherwise remove it from this PR. The dissolution discipline requires staged surfaces to have a concrete gate and exit plan, not just a declared symbol. chatgpt-review-c9d060e0-6a8a-42…

2.5. Top-down PM intent review

Finding. The PM-level intent behind this work is to replace opaque/hollow primitive modeling with fact-bundle modeling so target primitive facts become trustworthy homomorphism inputs; the modeling discipline frames fact modeling as producing the homomorphism’s inputs and requires external primitive facts such as width, signedness, representation, range, and encoding to be represented structurally. chatgpt-review-c9d060e0-6a8a-42…

chatgpt-review-c9d060e0-6a8a-42…

The PR advances that intent by replacing spec_facts: Node, but src/v4/extdeps/languages/rust.dag:1148-1165 still leaves the declared range axis empty for Rust integer primitives, so a worker following this model would believe the primitive fact bundle is complete while one source-spec axis is absent.

3. Verdict

REQUEST_CHANGES

The PR is directionally right and removes the worst opaque-Node shape, but the newly canonical fact-bundle surface drops the declared integer range fact and introduces an unused overflow-disposition axis without a tracked gate. Because this is substrate/modeling work, those gaps should be fixed before the shape propagates to consumers.

openai-pro RC: `primitive_fact_axis_overflow_disposition` added in this PR is unbound
without a tracked dissolution trigger. Both `range` (declared in T-33 #3474) and the
new `overflow_disposition` are awaiting rust.dag substrate evolution before they can
faithfully bind. Add 🟡 needs-more-work scaffold gates per P5 staged-surface discipline:

- range: dissolve-on per-primitive range source carrier (range_min/range_max on
  RustIntegerPrimitiveFacts)
- overflow_disposition: dissolve-on mode-aware carrier (OverflowDisposition<IRCarrier>
  or equivalent debug/release + overflow_checks flag)
@briansrls

Copy link
Copy Markdown
Contributor Author

Discharge of openai-pro REQUEST_CHANGES on 689a0c99:

(#2) Untracked staged axis primitive_fact_axis_overflow_disposition — fixed at 68c9f42d0. Added 🟡 needs-more-work dissolution-tracked scaffold gates per P5 to both declared-unbound axes:

  • primitive_fact_axis_overflow_disposition — dissolve-on rust.dag evolving OverflowAction into a mode-aware carrier (debug/release + overflow_checks flag, e.g. via the already-declared OverflowDisposition<IRCarrier>)
  • primitive_fact_axis_range — dissolve-on per-primitive range source carrier (range_min/range_max on RustIntegerPrimitiveFacts)

(range was inherited from T-33 #3474 already ungated, but the same posture applies; folding both into one consistent tracked-debt shape.)

(#1) range axis unbound at integer producer (REQUEST_CHANGES) — premise valid (matches earlier codex finding); held line on scope. Adding source-fact carriers (range_min/range_max) to RustIntegerPrimitiveFacts is substrate evolution of rust.dag's extdep fact carrier itself, outside this PR's brief ("fill the opaque spec_facts: Node catch-all using declared axes"). Now explicitly tracked-debt via the 🟡 scaffold gate — dissolves the moment a Rust range carrier lands.

(#3) Test does not ratchet that integer producer binds range) — dependent on #1; resolves when the range binding is added (debt-PR), at which point the ratchet should also extend. No standalone fix today; the existing axis-Symbol-declared ratchet remains correct for the current declared-but-yellow-gated posture.

Route #1 is consistent with prior cursor APPROVE_WITH_COMMENTS and parent-tier scope direction ("don't absorb rust.dag substrate evolution into this PR; the pre-ratified-rework-must-re-confirm-shape memory point applies"). Routing the higher-weight openai-pro reviewer call to parent for explicit re-confirm.

— sent from crisp-raven-275

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review metadata

  • Provider / model: codex / unknown
  • Commit: 68c9f42d · Trigger: schedule
  • Thinking: 267s wall

BLOCKING (1)

Root Cause

  • src/v4/std/model_core.dag Primitive fact axes are modeled as association-list entries instead of a unique-key carrier → make spec_facts a Map/unique axis query or another shape that makes duplicate axis facts unrepresentable, then update rust.dag and the ratchet.

⚠️ The prior source-fact issues are now tracked or fixed, but the new ModelCore keyed boundary still needs API-level enforcement.

Comment thread src/v4/std/model_core.dag
type PrimitiveFactBundle {
substrate_carrier: Node
spec_facts: Node
spec_facts: List<PrimitiveFactAxisBinding>

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKING: PrimitiveFactBundle.spec_facts is an ordered List of axis bindings, so the substrate admits duplicate or conflicting facts for the same axis and leaves the keyed-bundle invariant to convention, violating INVARIANTS.md P2 / modeling-discipline Practice 6.

@briansrls

Copy link
Copy Markdown
Contributor Author

Codex schedule review on 68c9f42d (BLOCKING + inline at model_core.dag:33) — both findings reduce to the same root: PrimitiveFactBundle.spec_facts: List<PrimitiveFactAxisBinding> allows duplicate/conflicting axis bindings; codex proposes Map<Symbol, Node> (which v4.std.collection already declares).

Premise valid; held line on scope. Identical-shape finding to cursor's earlier APPROVE_WITH_COMMENTS exploratory observation on 638bc872 ("List does not rule out duplicate or missing axis keys per bundle; if axis completeness becomes load-bearing, a later modeling pass may want a stricter carrier"). Cursor classed it non-blocking exploratory; codex now classes it BLOCKING.

This is the 4th distinct substrate-evolution scope-expansion finding on this debt-PR (after range source carriers, mode-aware overflow carrier, and now Map-vs-List carrier shape). All three are premise-valid substrate gaps but outside the operator-ratified brief ("fill the opaque spec_facts: Node catch-all using declared axes"). Per project memory point feedback_pre_ratified_rework_reconfirm_before_fire — accumulated scope-expansion from reviewer pressure goes UP for operator re-confirm-shape, not absorbed silently.

Currently parked awaiting operator re-confirm-shape ruling routed via parent jolly-eagle-492 → PM smart-lynx-142 on the prior absorb-vs-followup question (range binding). This new uniqueness finding folds into the same routing; if operator rules "absorb substrate-evolution" it covers Map-shape + range-binding + mode-aware overflow together as one coherent rework, otherwise all three stay as tracked debt for separate dispatch.

No fix commit on this round per parking posture; will revisit on operator ruling.

— sent from crisp-raven-275

@briansrls
briansrls merged commit 8908e50 into main May 21, 2026
7 checks passed
briansrls added a commit that referenced this pull request May 21, 2026
…IEEE 754 spelling

codex/codex-default BLOCKING (3 of 3) on #3533 HEAD f96a95b: float/complex
encoding axis used `ieee754_binary64`, which is a CPython implementation
tightening of the Python Language Reference's actual wording. Per Reference §3.2:

  "These represent machine-level double precision floating point numbers."

and for complex: "as a pair of machine-level double precision floating point
numbers." Rename the encoding symbols + struct fields + node field labels to
`machine_representation` / `machine_double_precision` / `pair_machine_double_precision`
to track reference wording exactly. The tighter IEEE 754 binary64 commitment is a
CPython/ABI fact for a separate (future) implementation carrier.

Findings #1 (model_core.dag not landed) and #2 (std_projection conflates source
spec with std-coincidence) addressed by reply on PR: #1 is factually wrong
(model_core.dag landed in PR #3474 on main, rust.dag already consumes it via
#3500); #2 is the operator-ratified rust.dag pattern from the brief — if it's a
cross-cutting design defect it belongs in a lane-wide RFC against rust.dag, not
a python-slice-only unilateral divergence.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request May 22, 2026
…3533)

* T-4 python.dag wave-1 — fact-bundle + ModelCore (rust.dag pattern)

Authors the Python 3.14 Reference fact-bundles for int / float / complex /
bool / None / NotImplemented / Ellipsis grounding into ModelCore, mirroring
the rust.dag wave-1 shape (`rust_model_core_wave1`). int honestly omits the
width / signedness / overflow axes — the Python reference defines int as
unbounded arbitrary-precision with no overflow event, so we bind only
surface_spelling + encoding rather than fabricate a width tag (per fact-bundle
reseed discipline). bool binds the int-subtype encoding. Singletons bind the
sole-inhabitant encoding. Lex / grammar / MVP-1 / LanguageModel scaffolding
deliberately deferred — that work lands behind T-11 rust-first specialization,
not python wave-1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* T-4 python.dag — drop unused imports + tighten bool bundle comment

cursor/composer-2.5 review on #3533: `Set` and `primitive_fact_axis_signedness`
were copy-ahead from the rust slice and never referenced; the bool bundle
comment incorrectly said it "binds signedness" when it only binds
surface_spelling + encoding. Drop both unused imports; rewrite the bool comment
to explain why signedness is NOT bound (bool is `int`-subtype, signedness lives
on the parent int fact-bundle, not re-asserted inside bool).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* T-4 python.dag — discharge codex E-6 finding: tag consumer-less ModelCore as E-6(b) staging

codex/codex-default REQUEST_CHANGES on #3533 (premise valid): the diff added
`python_model_core_wave1()` but no in-module consumer binds it (no
PythonLanguageModel carrier yet — that lives behind T-11 rust-first
specialization). Under INVARIANTS §P2 / E-6, a target-spec decl without a
same-PR consumer is admissible only as the bounded E-6(b) exception with a
named scaffold marker + dissolution trigger.

Tighten the header status claim ("LanguageModel wave-1" → "primitive
fact-bundles + a wave-1 ModelCore staging carrier", explicitly noting the
E-6(b) shape) and add the inline 🟡 E-6(b) marker on
`python_model_core_wave1` with dissolve-on = PythonLanguageModel binding
`core:` to it. No model-logic change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* T-4 python.dag — codex finding #3: track Reference §3.2 wording, not IEEE 754 spelling

codex/codex-default BLOCKING (3 of 3) on #3533 HEAD f96a95b: float/complex
encoding axis used `ieee754_binary64`, which is a CPython implementation
tightening of the Python Language Reference's actual wording. Per Reference §3.2:

  "These represent machine-level double precision floating point numbers."

and for complex: "as a pair of machine-level double precision floating point
numbers." Rename the encoding symbols + struct fields + node field labels to
`machine_representation` / `machine_double_precision` / `pair_machine_double_precision`
to track reference wording exactly. The tighter IEEE 754 binary64 commitment is a
CPython/ABI fact for a separate (future) implementation carrier.

Findings #1 (model_core.dag not landed) and #2 (std_projection conflates source
spec with std-coincidence) addressed by reply on PR: #1 is factually wrong
(model_core.dag landed in PR #3474 on main, rust.dag already consumes it via
#3500); #2 is the operator-ratified rust.dag pattern from the brief — if it's a
cross-cutting design defect it belongs in a lane-wide RFC against rust.dag, not
a python-slice-only unilateral divergence.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request May 22, 2026
…isBinding> → Map<Symbol, Node> uniqueness constraint — discharge E3-deferred follow-up from #3500 (codex BLOCKING #4: List admits duplicate axis bindings; std/collection already declares Map) (#3549)

* WIP: ModelCore substrate-evolution (3/4): spec_facts: List<PrimitiveFactAxisB

* WIP: ModelCore substrate-evolution (3/4): spec_facts: List<PrimitiveFactAxisB

* WIP: ModelCore substrate-evolution (3/4): spec_facts: List<PrimitiveFactAxisB

* Fix v4 primitive fact map helper syntax
briansrls added a commit that referenced this pull request May 22, 2026
…oproduct evolution + bind primitive_fact_axis_overflow_disposition — discharge E3-deferred follow-up from #3500 (OverflowAction needs debug/release mode-dependence per Rust Reference) (#3553)

* WIP: rust.dag substrate-evolution (2/4): overflow_disposition mode-aware copr

* WIP: rust.dag substrate-evolution (2/4): overflow_disposition mode-aware copr

* WIP: rust.dag substrate-evolution (2/4): overflow_disposition mode-aware copr

* WIP: rust.dag substrate-evolution (2/4): overflow_disposition mode-aware copr

* WIP: rust.dag substrate-evolution (2/4): overflow_disposition mode-aware copr

* WIP: rust.dag substrate-evolution (2/4): overflow_disposition mode-aware copr

* Revert cross-lane fold rename from overflow PR

* WIP: rust.dag substrate-evolution (2/4): overflow_disposition mode-aware copr

* WIP: rust.dag substrate-evolution (2/4): overflow_disposition mode-aware copr

* Refresh v4 language owns ledgers after map repair

* WIP: rust.dag substrate-evolution (2/4): overflow_disposition mode-aware copr

* WIP: rust.dag substrate-evolution (2/4): overflow_disposition mode-aware copr

* WIP: rust.dag substrate-evolution (2/4): overflow_disposition mode-aware copr
@briansrls
briansrls deleted the session/crisp-raven-275 branch June 1, 2026 18:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant