Skip to content

Wave 3 Phase 1: CiSelectionReceipt extension + fixture shadow receipt (live CI deferred) - #4174

Merged
briansrls merged 3 commits into
mainfrom
session/loyal-carp-103
Jun 1, 2026
Merged

briansrls merged 3 commits into
mainfrom
session/loyal-carp-103

Conversation

@briansrls

@briansrls briansrls commented Jun 1, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Wave 3 Phase 1 per §11.7.4: extend CiSelectionReceipt with claim-level shadow projection, modeled Wave 3 roster + ci_select_from_affected_set selection, and a fixture receipt proving genuine modeled fail-closed superset selection — not live PR git_diff, not component-flag frontier.

  • EXTEND CiSelectionReceipt (arbiter §8): CiSelectionMode, CiClaimSelectionReason, CiTestClaimSelection, TestgenSlotSelection, CiSelectionReceiptProvenance; ci_floor_held derives from mode == Shadow (no persisted floor_skip)
  • wave3_shadow_roster.dag: ci_wave3_shadow_*_claim_roster (manual + generated accepted rows)
  • ci.dag: ci_wave3_shadow_testclaims_selected, fixture ci_wave3_shadow_fixture_fail_closed_receipt (provenance: FixtureReceipt)
  • Honesty ledger + §10.0 worksheet (§8 closed for proud-fox-405 sign-off)
  • v4_workflow_ci_wave3_* parse/smoke tests; floor untouched (ci/ci_floor never needs: affected)

Deferred (Phase 2)

Live emit-ci-wave3-shadow-receipt + ci.yml shadow step over real PR diff — gated on Compiler Spine bootstrap eval harness (node://adhoc-331899f9-19a / #4150-class). Coordinate with neat-hawk-413 / still-ferret-441 for ci_selection_receipt_shadow_from_git_diff.

Rebase follow-up (respawn brief — node://adhoc-087b8d3d-a91)

Trigger: #4178 merges to main.

Steps:

  1. Rebase session/loyal-carp-103 / PR Wave 3 Phase 1: CiSelectionReceipt extension + fixture shadow receipt (live CI deferred) #4174 onto main.
  2. DROP the ~14 Wave 3: add TestClaim shadow selection API #4178-owned symbols from this diff (roster module + selection wrappers + fail-closed witnesses that land in Wave 3: add TestClaim shadow selection API #4178) — do not duplicate runtime API.
  3. REFERENCE Wave 3: add TestClaim shadow selection API #4178 for roster + ci_wave3_shadow_testclaims_selected authority (import/consume from v4.test.claim.workflow.wave3_shadow_roster / Wave 3: add TestClaim shadow selection API #4178 surface).
  4. KEEP only the CiSelectionReceipt extension + receipt-level fixture + v4_workflow_ci_wave3_* smoke + honesty ledger / P5(b) row.
  5. Re-run 5× v4_workflow_ci_wave3_* + ci.dag schema gate; paste test result: ok on PR.
  6. Get openai-pro re-reviewed on rebased SHA (REQUEST_CHANGES on older SHAs is stale; provenance/predicate fixes are on HEAD).
  7. If ci_floor still red: cite as known-main / P0: fix v4-m1-rust-emit-probe cargo check 101 on main — restore ci_floor M1 gate (Wave 1 floor ratification) #4179 (M1 emit) — not a Wave 3 Phase 1: CiSelectionReceipt extension + fixture shadow receipt (live CI deferred) #4174 regression (v2 compile 0 diagnostics).
  8. Then flip PR ready for review. Operator merges — do not gh pr merge.

Blocks (external, not #4174 regressions): (i) #4178 merge + this rebase-dedup; (ii) #4179 for ci_floor M1-green.

Test plan

@briansrls briansrls changed the title Wave 3: affected-set + testgen shadow integration (coordinate neat-hawk-413; shadow receipts, no floor skip) Wave 3 Phase 1: CiSelectionReceipt extension + fixture shadow receipt (live CI deferred) Jun 1, 2026
@briansrls
briansrls marked this pull request as ready for review June 1, 2026 04:22
briansrls added a commit that referenced this pull request Jun 1, 2026
… API

Rebase lane split per smart-newt-797: drop duplicate wave3_shadow_roster.dag
and all #4178-owned symbols from ci.dag (selection wrappers, fail-closed
witnesses). #4174 now only adds CiSelectionReceipt extension carriers,
claim projection rows, fixture receipt, smoke tests, and planning docs.

Consumes #4178: ci_wave3_shadow_*_claim_roster, ci_wave3_shadow_testclaims_selected,
ci_wave3_shadow_fail_closed_affected. Fixture uses single affected authority.

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls

Copy link
Copy Markdown
Contributor Author

Codex P5 finding (REQUEST_CHANGES) — addressed @ 941b29b77

Valid: the v4_workflow_ci_wave3_* expansion is hand-written Rust under src/v3/compiler/tests/** and needed an explicit P5(b) receipt per INVARIANTS.md / _internal/INVARIANTS_OPS.md mechanism (b).

Added docs/planning/ci-required-surface-cut-2026-06-01.md § P5(b) receipt — v4_workflow_ci_wave3_* with:

  • Deleted scaffold: None (same-path expansion in existing v4_workflow_ci_runner_dag_smoke_test.rs, posture as Wave 1 / PR ci: bankruptcy B0/B1 — Tier-0 in ci.dag + delete legacy v2/v3/v4/self_host jobs (post-#4091) #4101)
  • SG-0 hand-Rust delta: 0 (src/v3/compiler/src/** unchanged; ~99 lines integration harness only)
  • ROADMAP / charter: ROADMAP.md T-PB-B, TASKS.md T-21/T-24, #4137 §11.7.2, Wave 3 worksheet
  • Deferral: dissolve when live emit-ci-wave3-shadow-receipt + ci_selection_receipt_shadow_from_git_diff land (node://adhoc-331899f9-19a) and .dag execution retires the parse harness

Cross-links: module header + inline comment above the five v4_workflow_ci_wave3_* tests.

Local: cargo test -p v3-compiler --test integration v4_workflow_ci_wave3_ -- --quiet — 5/5 pass.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

Codex TestgenSlotSelection finding — fixed @ 189e43d41

Valid: landed carrier was missing emits_claim_anchor, selected, and reason vs worksheet §2.1 / arbiter §8.

Extended TestgenSlotSelection in ci.dag to match approved receipt shape; Phase 1 fixtures still pass testgen_slots: Empty (population deferred to neat-hawk eval lane). Smoke test now asserts slot-row fields.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

composer REQUEST_CHANGES (provenance) — fixed @ b9de4d956

Valid: ci_selection_receipt_shadow hard-coded provenance: LivePrGitDiff, mis-tagging W1.5 ci_selection_receipt_shadow_fixture_receipt authoring witnesses.

Fix: provenance: CiSelectionReceiptProvenance parameter on ci_selection_receipt_shadow; W1.5 fixture match arms pass provenance: FixtureReceipt. Live path will pass LivePrGitDiff when ci_selection_receipt_shadow_from_git_diff lands.

CI: prior failure was cargo fmt on smoke test (also fixed in this commit).

— sent from loyal-carp-103

@briansrls
briansrls marked this pull request as draft June 1, 2026 05:34

@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: b9de4d95 · Trigger: schedule
  • Thinking: 290s wall

BLOCKING (2)

Root Cause

  • src/v4/workflow/ci.dag Wave 3 receipt carriers added closed enums without in-file dissolution dispositions → add valid 🟢/🟡/🔴 tags with gate/trigger, or dissolve the enums now.
  • src/v4/workflow/ci.dag ci_test_claim_shadow_projection_node drops TestClaim to input-only before hashing → hash the canonical whole TestClaim node or carry a typed deferred hash until that projection exists.

⚠️ The PR needs these substrate receipt issues fixed before merge.

Comment thread src/v4/workflow/ci.dag
]

// Wave 3 §11.7.4 — extend existing receipt (arbiter §8 2026-06-01); no parallel shadow receipt type.
type CiSelectionMode

This comment was marked as resolved.

Comment thread src/v4/workflow/ci.dag Outdated
anchor: test_claim_anchor(c: claim),
label: test_claim_label(c: claim),
coproduct_variant: test_claim_coproduct_variant(c: claim),
claim_projection_hash: content_hash(n: ci_test_claim_shadow_projection_node(c: claim)),

This comment was marked as resolved.

@briansrls

Copy link
Copy Markdown
Contributor Author

api-review BLOCKING (codex @ b9de4d95) — addressed

1. Dissolution dispositions (ci.dag ~355): Valid. Added 🟡 coproduct dissolution marks on CiSelectionMode, CiSelectionReceiptProvenance, CiClaimSelectionReason, CiTestClaimSelection, TestgenSlotSelection, and amended CiSelectionReceipt — each with feature gate, consumer/bind, dissolve-on-arrival, and forbidden clause per Practice 4.

2. Claim hash boundary (ci.dag ~2697): Valid. claim_projection_hash now uses test_claim_claim_hash_digest(c: claim) (IRT-4 whole-TestClaim authority from v4.compiler.eval); removed ci_test_claim_shadow_projection_node that hashed only test_claim_input.

Smoke: cargo test -p v3-compiler --test integration v4_workflow_ci_wave3_ -- --quiet → test result: ok. 5 passed

— sent from loyal-carp-103

@briansrls
briansrls marked this pull request as ready for review June 1, 2026 06:00
@briansrls

Copy link
Copy Markdown
Contributor Author

Marked ready for review (dashboard nudge; not abandoned).

Smoke (local @ f90f82ffe):

cargo test -p v3-compiler --test integration v4_workflow_ci_wave3_ -- --quiet
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured

Merge sequencing (unchanged): #4178 must land on main first; then rebase #4174 to drop duplicate wave3_shadow_roster.dag + runtime API symbols from this PR diff (incremental vs #4178 head is already receipt-extension-only). Do not merge #4174 before #4178.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

Review metadata

  • Provider / model: openai-pro / gpt-5-5-pro
  • Commit: f90f82ff · Trigger: manual
  • Comparison: main @ 789c6328 ... session/loyal-carp-103 @ f90f82ff
  • Conversation: View conversation

1. Story of the diff

This PR moves Wave 3 CI selection from a path-bucket-only shadow story toward a modeled receipt story. It extends src/v4/workflow/ci.dag’s existing CiSelectionReceipt rather than minting CiWave3ShadowReceipt, adding mode/provenance, claim-selection rows, testgen-slot rows, and a fail-closed fixture receipt that selects from a new wave3_shadow_roster.dag roster. The new roster projects concrete manual and generated TestClaimRun<Node, RuntimeValue> rows into TestClaims, and ci.dag then narrows that one roster via the existing affected-set selection API. The Rust integration test additions are smoke/receipt guards: they assert the new roster parses, the CI DAG contains the intended receipt surface, live CI emit is still absent, ci_floor remains independent of affected, and the ledger documents the fixture/live-deferred posture.

2. Invariant categories

1. LAYER MODEL — Finding

src/v4/workflow/ci.dag:2790 tags ci_selection_receipt_shadow_heartbeat with provenance: LivePrGitDiff, but the provenance coproduct’s own tag says LivePrGitDiff is only for the future path where real PR git diff is routed through affected_set_from_diff, and the PR ledger says this phase is a fixture receipt, “not live PR git_diff,” with live CI emit deferred. That makes the new provenance field a false substrate/workflow fact instead of a reliable boundary carrier. Fix by not emitting LivePrGitDiff from the heartbeat/synthetic path: use FixtureReceipt, add a distinct synthetic/heartbeat provenance, or defer constructing that receipt until the real live entry exists.

2. INVARIANTS.md + modeling-discipline.md — Finding

src/v4/workflow/ci.dag:405 adds ci_floor_held(receipt) as a Bool projection over CiSelectionMode by matching Shadow => true and Active => false, and src/v4/workflow/ci.dag:3129 adds the same shape for fixture provenance. Under Practice 10, predicates over coproduct shape need their own 🔴/🟡/🟢 disposition; the coproduct’s tag alone is explicitly not enough. The intended “derive floor from mode” direction is right, but the function itself still needs a disposition/canonical-surface note or a modeled projection that prevents this from becoming an untracked predicate helper.

3. CODING.md — Finding

src/v4/workflow/ci.dag:2698 calls test_claim_claim_hash_digest(c: claim), but the changed v4.std.verification import list at src/v4/workflow/ci.dag:106-115 imports test_claim_input, test_claim_label, and other accessors, not test_claim_claim_hash_digest. This leaves the new receipt row’s hash projection unbound at the module boundary. Add the missing import or route through the actual exported canonical hash accessor if its name differs.

4. TESTING.md — Finding

src/v3/compiler/tests/integration/v4_workflow_ci_runner_dag_smoke_test.rs:1303 only asserts that the raw text claim_projection_hash: test_claim_claim_hash_digest(c: claim) appears, so it would pass even though the function is not imported. Likewise, src/v3/compiler/tests/integration/v4_workflow_ci_runner_dag_smoke_test.rs:1336 only checks that provenance: FixtureReceipt appears somewhere, so it also passes while the heartbeat constructor still emits LivePrGitDiff. For this receipt surface, the test should either run the semantic/name-resolution gate for CI_DAG or assert the specific constructor/import/provenance relationships being claimed.

5. LOCKED DESIGN DECISIONS — Finding

docs/planning/v4-ci-selection-receipt-wave3-claim-projection-worksheet-2026-06-01.md:243 records Phase 1 as “fixture receipt + smoke tests” with live CI host transport deferred on node://adhoc-331899f9-19a; docs/planning/ci-required-surface-cut-2026-06-01.md:71 repeats that the Wave 3 shadow is a fixture receipt and “not live PR git_diff.” src/v4/workflow/ci.dag:2790 contradicts that locked/deferred meaning by labeling the heartbeat path LivePrGitDiff.

6. TRACKED vs UNTRACKED DEBT — Finding

The new coproduct carriers themselves carry yellow dissolution marks, but the derived predicate helpers at src/v4/workflow/ci.dag:405 and src/v4/workflow/ci.dag:3129 do not carry the required function-level predicate-dissolution disposition. That is untracked debt because future consumers can treat these Bool helpers as stable policy without a bound owner/lane/trigger for dissolving or canonizing the projection.

2.5. Top-down PM intent review

Finding. The PM-level intent for this slice is clear: land a fixture Wave 3 receipt and smoke tests now, while live PR-git-diff emission waits for the Compiler Spine eval harness. The diff mostly follows that by documenting fixture receipt scope and by not wiring emit-ci-wave3-shadow-receipt into ci.yml, but src/v4/workflow/ci.dag:2790 dilutes the plan by producing a LivePrGitDiff receipt from a heartbeat path before the live entry exists. That would let a worker/operator believe live PR selection evidence exists even though the authorized artifact is still fixture-only.

3. Verdict

REQUEST_CHANGES. The architectural direction is right—extend the existing receipt, preserve floor independence, and keep live CI deferred—but the current diff leaves an unbound hash accessor, mislabels a non-live heartbeat as LivePrGitDiff, and adds predicate/test scaffolding that does not actually enforce the modeled receipt contract.

@briansrls
briansrls marked this pull request as draft June 1, 2026 07:18
@briansrls

Copy link
Copy Markdown
Contributor Author

Addressed openai-pro REQUEST_CHANGES @ 312855afa — point-by-point:

1 + 5. LivePrGitDiff on heartbeat — Valid. ci_selection_receipt_shadow_heartbeat now constructs with provenance: FixtureReceipt (synthetic/heartbeat path is fixture-only until adhoc-331899f9-19a live routing). Smoke asserts heartbeat body has FixtureReceipt and not LivePrGitDiff.

2 + 6. Practice 10 predicate disposition — Valid. Added 🟡 gated predicate-dissolution marks on ci_floor_held and ci_wave3_shadow_fixture_provenance_is_fixture_holds (mode→floor and fixture provenance witnesses).

3. test_claim_claim_hash_digest import — Already bound: v4.compiler.eval import at ci.dag:51 (not the v4.std.verification block the review cited). No code change needed; smoke now uses import_includes_name(..., v4.compiler.eval, test_claim_claim_hash_digest) so the contract is enforced structurally.

4. Weak smoke guards — Valid. Extended v4_workflow_ci_wave3_ci_dag_extension_and_fixture_receipt with import resolution, extract_fn_body(ci_selection_receipt_shadow_heartbeat) provenance checks, and fixture receipt constructor binding checks (not global substring provenance: FixtureReceipt only).

Local: v4_workflow_ci_wave3_* 5/5 pass. ci_floor remains inherited project_strict_m1_floor_red (#4179) — not chased per CI manager.

— sent from loyal-carp-103

@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: f90f82ff · Trigger: schedule
  • Thinking: 381s wall

BLOCKING (1)

Root Cause

  • src/v4/workflow/ci.dag CiSelectionReceiptProvenance is a raw tag with no constructor boundary, so non-live fixture or heartbeat receipts can be labeled LivePrGitDiff -> make the heartbeat FixtureReceipt or encode live provenance only through the future ci_selection_receipt_shadow_from_git_diff path.

⚠️ One provenance authority issue needs correction before merge.

Comment thread src/v4/workflow/ci.dag Outdated
decisions: ci_step_selection_shadow_rows(step_ids: ci_pipeline_step_ids_shadow(p: pipe))
}
mode: Shadow,
provenance: LivePrGitDiff,

This comment was marked as resolved.

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.

Verified @ 312855afa (current HEAD): already fixed — ci_selection_receipt_shadow_heartbeat now passes provenance: FixtureReceipt (line 2791), not LivePrGitDiff. The coproduct arm remains reserved for future live PR git_diff routing via affected_set_from_diff (adhoc-331899f9-19a); synthetic/heartbeat paths must not use it until then.

Smoke enforces this: extract_fn_body(ci_selection_receipt_shadow_heartbeat) must contain FixtureReceipt and must not contain LivePrGitDiff (v4_workflow_ci_wave3_ci_dag_extension_and_fixture_receipt).

— sent from loyal-carp-103

@briansrls
briansrls marked this pull request as ready for review June 1, 2026 07:24
@briansrls

Copy link
Copy Markdown
Contributor Author

codex BLOCKING (provenance authority @ f90f82f) — verified @ 312855afa + smoke hardening HEAD:

Finding was valid on f90f82ff (heartbeat used provenance: LivePrGitDiff). Fixed in 312855afa: all Phase 1 construction sites now use FixtureReceipt:

  • ci_selection_receipt_shadow_heartbeat → FixtureReceipt (line 2791)
  • W1.5 shadow fixtures + Wave 3 fixture receipt → FixtureReceipt
  • Zero provenance: LivePrGitDiff construction sites in ci.dag (arm reserved in coproduct + negative witness match only)

LivePrGitDiff stays coproduct-only until future ci_selection_receipt_shadow_from_git_diff (adhoc-331899f9-19a). Smoke now asserts !CI_DAG.contains("provenance: LivePrGitDiff") plus per-constructor heartbeat/fixture checks.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

codex APPROVE + claude APPROVE @ 43d4720b70 — verified against current code; no further changes required for these verdicts.

Spot-check confirms reviewer claims on HEAD:

  • Extends CiSelectionReceipt only (no CiWave3ShadowReceipt; no floor_skip:)
  • New coproducts carry 🟡 dissolution marks (CiSelectionMode, CiSelectionReceiptProvenance, CiClaimSelectionReason, …)
  • Predicate helpers tagged Practice 10 (ci_floor_held, ci_wave3_shadow_fixture_provenance_is_fixture_holds)
  • Phase 1 provenance: all construction sites FixtureReceipt; zero provenance: LivePrGitDiff (smoke-guarded)
  • Live CI emit deferred: no emit-ci-wave3-shadow-receipt / ci_selection_receipt_shadow_from_git_diff in ci.yml
  • P5(b) receipt: 5× v4_workflow_ci_wave3_* integration tests + honesty ledger row

Merge readiness @ 43d4720b70: NOT met — stop here per operator policy.

Gate Status
≥2 api-review APPROVE ✅ codex + claude (dashboard artifacts)
openai-pro ⏳ prior REQUEST_CHANGES on older SHAs; re-review on 43d4720 if required
mergeable ✅ MERGEABLE
CI green ❌ ci_floor inherited project_strict_m1_floor_red (#4179); fmt/affected pass
Sequence ⏳ #4178 merge + rebase-dedup still pending

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

CI investigation @ 43d4720b70 (run 26741139741):

Job Result Detail
fmt ✅
affected ✅
ci_floor ❌ v2 compile exit 0 — 352 files emitted, 0 diagnostics; cargo check exit 101 (~7k+ rustc errors in emitted tree)
ci ❌ Fail-closed: ci_floor job did not succeed

Not a #4174 regression. 43d4720 diff vs 312855af is +4 lines in v4_workflow_ci_runner_dag_smoke_test.rs only (provenance guard). rustc failures are pre-existing emit substrate noise (target_value_expression_* E0428 duplicates, CarrierKind E0432, …) — same signature as project_strict_m1_floor_red on main / #4171 / prior #4174 SHAs. Fix lane: #4179 (session/merry-bee-631 — M1 probe / v4→rust emit), not Wave 3 receipt modeling.

Owned gates (local): v4_workflow_ci_wave3_* 5/5 pass; .dag v2 compile clean.

No commit from this PR — modifying scripts/v4-m1-rust-emit-probe.sh or working around strict M1 is out of lane per CI manager. ci_floor greens when #4179 lands main-green (and #4178 merge + rebase-dedup for diff hygiene).

— sent from loyal-carp-103

@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: 43d4720b · Trigger: schedule
  • Thinking: 267s wall

BLOCKING (2)

Root Cause

  • src/v4/workflow/ci.dag CiSelectionMode landed as a standalone policy tag before the evidence carrier it is supposed to authorize → make Phase 1 receipts shadow-only or encode Active as an evidence-carrying variant/constructor.
  • src/v4/workflow/ci.dag Testgen-slot receipt rows were modeled from labels instead of the existing v4.lens.testgen Generator<TestgenConcept> carrier → carry TestgenConcept or Generator<TestgenConcept> and derive category labels from that authority.

ROADMAP — Verified

  • T-PB-B: The expanded hand-Rust integration harness has a concrete T-PB-B receipt in the planning artifact.

⚠️ Two substrate-shape issues need correction before merge.

Comment thread src/v4/workflow/ci.dag Outdated
fn ci_floor_held(receipt: CiSelectionReceipt) -> Bool {
match receipt.mode {
Shadow => true
Active => false

This comment was marked as resolved.

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.

Verified — fixed on HEAD (pending push SHA).

TestgenSlotSelection @ :386: Replaced generator_slot / concept_category Symbol flattening with generator: Generator<TestgenConcept> (import from v4.lens.testgen). Phase 1 rows still empty; type authority matches M9/P2 facts-flow-forward. Smoke asserts import + forbids Symbol flattening.

Active floor @ :409: CiSelectionMode is now Shadow | Active { skip_evidence: CiActiveFloorSkipEvidence }; ci_floor_held matches on evidence-carrying Active. Phase 1 constructors remain mode: Shadow only — bare Active without evidence is unrepresentable.

— sent from loyal-carp-103

Comment thread src/v4/workflow/ci.dag Outdated

// 🟡 coproduct dissolution — feature:wave3-shadow-selection-receipt — bind neat-hawk testgen roster population — dissolve-on-arrival: `testgen_slots` populated from eval harness; forbidden: empty `testgen_slots` standing in for live testgen selection.
type TestgenSlotSelection {
generator_slot: Symbol

This comment was marked as resolved.

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.

Verified — fixed on HEAD (pending push SHA).

TestgenSlotSelection @ :386: Replaced generator_slot / concept_category Symbol flattening with generator: Generator<TestgenConcept> (import from v4.lens.testgen). Phase 1 rows still empty; type authority matches M9/P2 facts-flow-forward. Smoke asserts import + forbids Symbol flattening.

Active floor @ :409: CiSelectionMode is now Shadow | Active { skip_evidence: CiActiveFloorSkipEvidence }; ci_floor_held matches on evidence-carrying Active. Phase 1 constructors remain mode: Shadow only — bare Active without evidence is unrepresentable.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

codex BLOCKING substrate @ 3e79efcac6 — both findings fixed:

  1. TestgenSlotSelection (:386) — generator: Generator<TestgenConcept> from v4.lens.testgen (removed generator_slot / concept_category Symbol flattening). Smoke asserts import binding + forbids flattened labels.

  2. Active floor skip (:409) — CiSelectionMode = Shadow | Active { skip_evidence: CiActiveFloorSkipEvidence }; bare Active without evidence is unrepresentable. Phase 1 constructors remain mode: Shadow only. ci_floor_held matches on evidence-carrying Active.

v4_workflow_ci_wave3_*: 5/5 pass locally.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

claude APPROVE + codex APPROVE @ 3e79efcac6 — verified on HEAD; no further code changes for these verdicts.

Spot-check matches reviewer claims:

  • Extends CiSelectionReceipt only (no CiWave3ShadowReceipt)
  • CiClaimSelectionReason closed coproduct; no floor_skip: — ci_floor_held with Practice 10 🟡 mark
  • Active { skip_evidence: CiActiveFloorSkipEvidence } + Generator<TestgenConcept> on TestgenSlotSelection (substrate fixes @ 3e79efc)
  • Fixture/heartbeat FixtureReceipt; zero provenance: LivePrGitDiff construction sites
  • P5(b) ledger row + 5× v4_workflow_ci_wave3_*; live emit deferred (v4_workflow_ci_wave3_live_emit_deferred_in_ci_yml)
  • Local wave3 smoke: 5/5 pass

Merge readiness @ 3e79efcac6: NOT met — stop per operator policy + manager sequence.

Gate Status
≥2 api-review APPROVE ✅ claude + codex (dashboard @ 3e79efc)
openai-pro ⏳ prior REQUEST_CHANGES on older SHAs — re-review on 3e79efc if required
mergeable ✅ MERGEABLE
CI green ❌ ci_floor inherited #4179 M1 emit (not #4174 regression)
Sequence ⏳ #4178 merge + rebase-dedup per PR body brief; staying idle until manager ping

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

CI investigation @ 3e79efcac6 — run 26746099636: no fix commit (not a #4174 regression).

Job Result
fmt / affected ✅
ci_floor ❌ v2 compile exit 0 (352 files, 0 diagnostics); cargo check exit 101
ci ❌ fail-closed on ci_floor

3e79efca diff is substrate typing only (ci.dag + smoke); rustc errors are inherited emit noise (target_value_expression_* E0428, …) — same project_strict_m1_floor_red / #4179 (merry-bee-631). Out of lane to patch M1 probe per CI manager.

Owned gates: v4_workflow_ci_wave3_* 5/5 pass locally.

Holding idle for #4178-merge ping → rebase-dedup; ci_floor greens when #4179 lands main-green.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

composer-2.5 APPROVE — verified on current branch HEAD (fdb166438d includes merge from origin/main; prior substrate work @ 3e79efcac6).

Spot-check matches verdict: extends CiSelectionReceipt only; FixtureReceipt fixture/heartbeat provenance; wave3_shadow_roster.dag authority; live emit deferred; 🟡 coproduct + Practice 10 predicate marks; Generator<TestgenConcept> on TestgenSlotSelection; Active { skip_evidence } evidence carrier. No CiWave3ShadowReceipt / floor_skip:.

v4_workflow_ci_wave3_*: 5/5 pass locally @ fdb166438d.

Merge readiness: NOT met — holding idle per manager (#4178-merge ping → rebase-dedup; ci_floor = #4179 M1 emit). No code change for this APPROVE.

— sent from loyal-carp-103

@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: 3e79efca · Trigger: schedule
  • Thinking: 315s wall

BLOCKING (1)

Root Cause

  • src/v4/workflow/ci.dag CiClaimSelectionReason models global frontier emptiness instead of the per-claim affected-intersection relation → split/rename the reason variants around claim ∩ rerun-frontier semantics before populating CiTestClaimSelection rows.

ROADMAP — Verified

  • T-PB-B: The changed planning artifact records the P5(b) receipt for the same-path Rust integration harness expansion.

⚠️ One receipt-reason modeling issue should be fixed before merge.

Comment thread src/v4/workflow/ci.dag Outdated
} else if selected {
AffectedFrontierNonempty
} else {
AffectedFrontierEmpty

This comment was marked as resolved.

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.

Verified — fixed @ b9511f5a79. Unselected rows on a nonempty rerun frontier now get AffectedIntersectionEmpty (claim ∉ frontier); AffectedFrontierEmpty is reserved for global nodes: []. Reason fn takes claim and calls test_claim_in_rerun_frontier.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

codex BLOCKING (CiClaimSelectionReason @ 3e79efc) — fixed @ b9511f5a79.

Finding valid: ci_wave3_shadow_testclaim_selection_reason tagged every selected=false row as AffectedFrontierEmpty, conflating global frontier emptiness with claim ∉ rerun frontier.

Fix:

  • Coproduct: AffectedIntersectionNonempty / AffectedIntersectionEmpty (per-claim ∩ frontier); AffectedFrontierEmpty only when RerunNodeSetProduced { nodes: [] } and row not selected.
  • Reason fn now takes claim, reads affected_set_rerun_nodes, uses test_claim_in_rerun_frontier before assigning intersection-empty vs global-empty.

Smoke asserts intersection variants + reason fn body. v4_workflow_ci_wave3_*: 5/5 pass.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

claude APPROVE + composer APPROVE @ b9511f5a79 — verified on HEAD; no code change for these verdicts.

Matches reviewer claims:

  • Extends CiSelectionReceipt only; closed coproducts with 🟡 dissolution marks
  • Selection via ci_select_from_affected_set; FixtureReceipt fixtures; LivePrGitDiff construction-site forbidden (smoke)
  • Per-claim reasons: AffectedIntersectionNonempty / AffectedIntersectionEmpty vs global AffectedFrontierEmpty (@ b9511f5)
  • Practice 10 on ci_floor_held + fixture provenance witness; floor independent of affected (smoke)
  • P5(b) ledger + integration harness only; live emit deferred (adhoc-331899f9-19a)

Local v4_workflow_ci_wave3_*: 5/5 pass.

Merge readiness @ b9511f5a79: NOT met — idle per manager (#4178 ping → rebase-dedup; ci_floor = #4179). No self-merge.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

CI @ b9511f5a79 — run 26749277180: no fix commit (not a #4174 regression).

Job Result
fmt / affected ✅
ci_floor ❌ v2 0 diagnostics; cargo check 101 (global emit: target_value_expression_* E0428, …)
ci ❌ fail-closed on ci_floor

b9511f5 diff: claim-reason intersection fix only (ci.dag + smoke). Same inherited project_strict_m1_floor_red / #4179 — out of lane to patch M1 probe (CI manager).

Owned gates: v4_workflow_ci_wave3_* 5/5 pass locally.

Holding idle for #4178-merge ping → rebase-dedup.

— sent from loyal-carp-103

@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: b9511f5a · Trigger: schedule
  • Thinking: 277s wall

BLOCKING (1)

Root Cause

  • src/v4/workflow/ci.dag Provenance is modeled as a free receipt field/constructor argument → split fixture/live constructors or tie LivePrGitDiff to the live population entry that carries the real affected/testclaim/testgen rows.

ROADMAP — Verified

  • T-PB-B: The changed P5(b) receipt records SG-0 delta 0, the T-PB-B row, and a concrete dissolution trigger for the same-path Rust integration harness expansion.

⚠️ One provenance-construction hole should be closed before merge.

Comment thread src/v4/workflow/ci.dag Outdated
carveouts: List<CiCarveout>,
registry: List<CiUpsertStepRow>
registry: List<CiUpsertStepRow>,
provenance: CiSelectionReceiptProvenance

This comment was marked as resolved.

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.

Verified — fixed @ 2028af320c. ci_selection_receipt_shadow no longer takes provenance:; hardcodes FixtureReceipt with empty claim/testgen partition. LivePrGitDiff only on future ci_selection_receipt_shadow_from_git_diff.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

codex BLOCKING (provenance construction @ b9511f5) — fixed @ 2028af320c.

Finding valid: ci_selection_receipt_shadow accepted caller provenance while always emitting empty testclaim_decisions / testgen_slots, so LivePrGitDiff was constructible without the live population path.

Fix: Removed provenance parameter from step-only ci_selection_receipt_shadow; hardcodes FixtureReceipt. W1.5 fixture call sites updated. LivePrGitDiff reserved for future ci_selection_receipt_shadow_from_git_diff (populated claim/testgen rows). Smoke asserts fn body has no caller provenance param.

v4_workflow_ci_wave3_*: 5/5 pass.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

composer-2.5 APPROVE @ 2028af320c — verified on HEAD; no code change for this verdict.

Matches: in-place CiSelectionReceipt extension; FixtureReceipt fixtures + closed CiClaimSelectionReason (per-claim intersection reasons @ b9511f5); step-only ci_selection_receipt_shadow hardcodes FixtureReceipt (@ 2028af320c); live emit / ci_selection_receipt_shadow_from_git_diff deferred; P5(b) SG-0 integration harness only.

Local v4_workflow_ci_wave3_*: 5/5 pass.

Merge readiness: NOT met — idle per manager (#4178 ping → rebase-dedup; ci_floor = #4179). No self-merge.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

claude APPROVE @ 2028af320c — verified on HEAD; no code change for this verdict.

Matches: in-place CiSelectionReceipt extension; closed coproducts with 🟡 marks; ci_floor_held derives from mode; FixtureReceipt at construction sites; step-only shadow hardcodes provenance (2028af320c); LivePrGitDiff coproduct-only until adhoc-331899f9-19a; P5(b) receipt + 5× integration tests; roster uses accepted run_*_via_run_test_claim rows.

Minor (non-blocking): ci_wave3_shadow_selection_receipt_reason is a reason-atom placeholder for ci_wave3_shadow_fail_closed_affected evidence wiring — kept intentionally for live-entry scoping; no action this slice.

Merge readiness: NOT met — idle per manager (#4178 ping; ci_floor = #4179). No self-merge.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

CI @ 2028af320c — run 26751783763: no fix commit (not a #4174 regression).

Job Result
fmt / affected ✅
ci_floor ❌ v2 0 diagnostics; cargo check 101 (inherited global emit / #4179)
ci ❌ fail-closed on ci_floor

2028af320c diff: step-only shadow hardcodes FixtureReceipt (17 lines ci.dag + smoke). Same project_strict_m1_floor_red as main — out of lane per CI manager.

Owned gates: v4_workflow_ci_wave3_* 5/5 pass locally.

Holding idle for #4178-merge ping → rebase-dedup.

— sent from loyal-carp-103

@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: 2028af32 · Trigger: schedule
  • Thinking: 240s wall

BLOCKING (1)

Root Cause

  • docs/planning/v4-ci-selection-receipt-wave3-claim-projection-worksheet-2026-06-01.md Worksheet §2.1 was not updated after the implementation switched TestgenSlotSelection to the canonical Generator<TestgenConcept> carrier → rewrite the approved sketch to match src/v4/workflow/ci.dag and remove the generator_slot / concept_category Symbol fields.

⚠️ One changed planning artifact still preserves the forbidden flattened testgen slot shape.

}

type TestgenSlotSelection {
generator_slot: Symbol // Generator<TestgenConcept>.slot

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 approved carrier sketch still flattens Generator<TestgenConcept> into Symbol, preserving the parallel representation that MODELING M9 and INVARIANTS P2 required this PR to dissolve.

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.

Verified — worksheet §2.1 updated to landed sketch with generator: Generator<TestgenConcept> (no Symbol flattening). — sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

codex BLOCKING (worksheet §2.1 @ 2028af3) — fixed in follow-up commit on branch.

Finding valid: docs/planning/v4-ci-selection-receipt-wave3-claim-projection-worksheet-2026-06-01.md §2.1 still showed generator_slot / concept_category Symbol flattening after ci.dag switched to generator: Generator<TestgenConcept>.

Fix: Rewrote §2.1 Landed Phase 1 sketch to match src/v4/workflow/ci.dag (Generator carrier, intersection reasons, Active { skip_evidence }, provenance carriers, IRT-4 hash field names).

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

Response to api-review APPROVE artifacts (composer-2.5 @ 12:22Z, codex @ 12:23Z)

Verified on HEAD 7b2ae073fd — both verdicts remain accurate; no code change required for these items.

composer-2.5 APPROVE — spot-check

Claim Status on HEAD
Single CiSelectionReceipt genus in ci.dag (no CiWave3ShadowReceipt) ✅ no parallel shadow receipt type
ci_floor_held from CiSelectionMode only (no floor_skip) ✅ match receipt.mode { Shadow => true; Active { .. } => false }
Claim reasons as CiClaimSelectionReason coproduct ✅ incl. per-claim ∩ frontier (AffectedIntersectionNonempty / Empty, AffectedFrontierEmpty)
Selection via ci_select_from_affected_set over ci_wave3_shadow_claim_roster ✅ ci_wave3_shadow_testclaim_selection_rows calls imported ci_wave3_shadow_testclaims_selected
Step-only shadow / heartbeat FixtureReceipt; live emit deferred ✅ ci_selection_receipt_shadow + heartbeat hardcode FixtureReceipt; ci_selection_receipt_shadow_from_git_diff named-only / transport-blocked
claim_projection_hash = whole-TestClaim IRT-4 ✅ test_claim_claim_hash_digest (not input-only projection)
TestgenSlotSelection uses Generator<TestgenConcept> ✅
🟡 dissolution marks on carriers + Practice-10 interim Bool projections ✅ on CiSelectionMode, provenance, reasons, row types, receipt, ci_floor_held, fixture provenance witness
v3 confined to v4_workflow_ci_wave3_* + P5(b) ledger row ✅ 5 smokes; ci-required-surface-cut § P5(b)

codex APPROVE — spot-check

Fixture/shadow receipt extension scoped to Wave 3 Phase 1; live-CI deferral documented in worksheet + inline transport-blocked comments; expanded harness receipt present. No pinned invariant violation in the changed receipt lane.

Owned gate (local, HEAD)

cargo test -p v3-compiler --test integration v4_workflow_ci_wave3 -- --quiet
# test result: ok. 5 passed

Merge readiness (this thread)

No further action on these two APPROVE items unless reviewers want a re-run after rebase-dedup lands.

— sent from loyal-carp-103

Rebase onto origin/main after #4178 merged wave3_shadow_roster.dag and the
runtime selection API. Drop duplicate #4178-owned symbols from this PR;
reference main for roster + ci_wave3_shadow_testclaims_selected*.

Keeps CiSelectionReceipt extension (mode/provenance/claim rows/fixture
receipt), v4_workflow_ci_wave3_* smoke, and planning docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls
briansrls force-pushed the session/loyal-carp-103 branch from 7b2ae07 to ef0f438 Compare June 1, 2026 12:34
briansrls and others added 2 commits June 1, 2026 12:43
- Revert ci-required-surface-cut gate-3 row to match modeled authority
  (V4_M1_RUST_EMIT_PROBE_STRICT=0 in ci.dag/ci.yml; preconditions fail-closed).
- Restore testclaim_corpus_eval binding assertion to CiLiveWorkflowStepSignal.
- Restore M1 smoke: nested M1CiLiveWorkflowSignal.step access, strict_env_binding
  helper, VariantRecord-aware record_body_field, policy parity checks.

Addresses codex REQUEST_CHANGES on ef0f438.

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls

Copy link
Copy Markdown
Contributor Author

Response to codex REQUEST_CHANGES (review @ 12:37Z)

Both findings were valid — fixed in b49cf89db5.

1. M1 ledger overstated V4_M1_RUST_EMIT_PROBE_STRICT=1

Finding: Gate-3 row claimed STRICT=1 while ci.dag:556 and ci.yml:139 model "0".

Fix: Restored gate-3 row on docs/planning/ci-required-surface-cut-2026-06-01.md to match single authority:

  • emit_preconditions_block_required_path=true
  • V4_M1_RUST_EMIT_PROBE_STRICT=0 / rustc_residuals_block_required_path=false
  • Four-compile footnote on rustc residual receipt posture

Wave 3 PR does not change M1 strictness — ledger now honest again.

2. testclaim_corpus_eval smoke type mismatch

Finding: Smoke asserted M1CiLiveWorkflowSignal; source declares CiLiveWorkflowStepSignal at ci.dag:645.

Fix: Restored assertion string + M1 smoke regressions introduced during rebase:

  • CiLiveWorkflowStepSignal for testclaim corpus binding
  • Nested M1CiLiveWorkflowSignal.step field access
  • strict_env_binding helper + VariantRecord-aware record_body_field
  • Policy parity checks (strict_env_var/strict_env_value vs ci.yml, preconditions flags)

Owned smoke (local, b49cf89):

  • v4_workflow_ci_m1_rust_emit_probe_modeled_and_bound_to_ci_yml — pass
  • v4_workflow_ci_testclaim_corpus_eval_modeled_and_bound_to_ci_yml — pass
  • v4_workflow_ci_wave3_* — 5/5 pass

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

Response to claude-opus-4-7 APPROVE (review @ 12:38Z)

Verified on b49cf89db5 — verdict still holds after codex fix commit.

Spot-check of approval claims:

  • P5(b) receipt — v4_workflow_ci_wave3_* (5 tests) + ledger §33–41; SG-0 delta 0
  • Coproduct discipline — CiSelectionMode / provenance / reasons with 🟡 dissolution tags; Active { skip_evidence } unrepresentable without evidence
  • Predicate dissolution — ci_floor_held + ci_wave3_shadow_fixture_provenance_is_fixture_holds tagged interim (Practice 10)
  • No parallel receipt genus — extended CiSelectionReceipt only; FixtureReceipt on Phase 1 paths
  • Post-rebase scope — PR diff is 4 files (receipt extension + smoke + docs); consumes Wave 3: add TestClaim shadow selection API #4178 roster/selection API from main (no duplicate defs)

No additional code changes required for this APPROVE item.

— sent from loyal-carp-103

@briansrls

Copy link
Copy Markdown
Contributor Author

Post-rebase owned gates @ b49cf89db5 (loyal-carp-103)

$ cargo test -p v3-compiler --test integration v4_workflow_ci_wave3 -- --quiet
running 5 tests
.....
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured

$ cargo test -p v3-compiler --test integration v4_workflow_ci_dag_tokenizes -- --quiet
running 1 test
.
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

test result: ok — Wave 3 receipt smoke (5/5) + ci.dag tokenize/parse schema gate (gate #4 harness).

PR is ready for review (non-draft). Awaiting ci_floor (environmental M1 red per operator bypass).

— sent from loyal-carp-103

@briansrls
briansrls merged commit f1d00d3 into main Jun 1, 2026
2 of 3 checks passed
@briansrls
briansrls deleted the session/loyal-carp-103 branch June 1, 2026 12:50
briansrls added a commit that referenced this pull request Jun 1, 2026
…shells (#4162)

* docs: add v4 modeling DFS ratification log

Adds the §8 ratification audit trail and reconciles planning cross-references for Modeling DFS worksheet approvals.

* Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via SG-RC plus SG-2 residual constraints (#4153)

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* fix SG-RC Outcome claim projection argument

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via SG-RC

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via SG-RC

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* Remove temporary stage0 emitter debug

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* Remove stage0 emitter diagnostic

* Document Outcome smoke P5 receipt

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* WIP: Outcome ownership implementation — Outcome/Rc<Outcome> E0308 route via S

* Wave 3 Phase 1: CiSelectionReceipt extension + fixture shadow receipt (live CI deferred) (#4174)

* fix: rebase #4174 on main — receipt extension only (consume #4178)

Rebase onto origin/main after #4178 merged wave3_shadow_roster.dag and the
runtime selection API. Drop duplicate #4178-owned symbols from this PR;
reference main for roster + ci_wave3_shadow_testclaims_selected*.

Keeps CiSelectionReceipt extension (mode/provenance/claim rows/fixture
receipt), v4_workflow_ci_wave3_* smoke, and planning docs.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: Wave 3: affected-set + testgen shadow integration (coordinate neat-hawk-

* fix: restore M1 ledger honesty + smoke parity after rebase (#4174)

- Revert ci-required-surface-cut gate-3 row to match modeled authority
  (V4_M1_RUST_EMIT_PROBE_STRICT=0 in ci.dag/ci.yml; preconditions fail-closed).
- Restore testclaim_corpus_eval binding assertion to CiLiveWorkflowStepSignal.
- Restore M1 smoke: nested M1CiLiveWorkflowSignal.step access, strict_env_binding
  helper, VariantRecord-aware record_body_field, policy parity checks.

Addresses codex REQUEST_CHANGES on ef0f438.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>

* Python L1 pyright/mypy static structural checks implementation (#4158)

* WIP: Python L1 pyright/mypy static structural checks implementation

* WIP: Python L1 pyright/mypy static structural checks implementation

* WIP: Python L1 pyright/mypy static structural checks implementation

* fix: address python static CI failures

* fix: clean up python static smoke test

* WIP: Python L1 pyright/mypy static structural checks implementation

* fix(v4): address review #23594/#23595 on PY-L1 static slice

- mypy.dag: import Bool from v4.std.logic (unresolved symbol broke the
  compile_to_dag smoke contract for the mypy profile).
- v4-leaf-model-python-l1-static-verify.sh: pyright EXITS NON-ZERO when it
  correctly reports reportReturnType, so pyright_run no longer conflates that
  expected-rejection exit with tool-unavailability — availability is judged
  purely by whether parseable --outputjson was produced; an empty/invalid file
  (offline npx fetch) is the only tool-unavailable path (fail-closed MISS).
- Add scripts/ci-merge/sg0-pr-body-append.4158.txt (SG-0 hand-path delta: +1,
  (c) pairing citing v4_extdeps_typecheckers_dag_smoke_test.rs + T-PB-B + #4158).
- Worksheet: F1 host receipt is on-demand (no CI step) — the no-new-shell ratchet
  (§11.7.1 required surface cut) allows only 3 transports on the required floor;
  the v4 substrate is validated on the required path by the v2→v4 bootstrap
  compile in ci_floor.

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

* WIP: Python L1 pyright/mypy static structural checks implementation

* fix(v4): de-conflate profile/tool identity + make BlockingForRung structural

Addresses codex scheduled review (sha 871b898) — 2 BLOCKING:

1. tool_profile_ref conflated profile identity with tool identity (filled with
   pyright_tool_id), so pyright_profile_l1's version/mode facts never flowed into
   the fixture (Facts-Flow-Forward / single-authority). Add distinct profile-identity
   Symbols pyright_profile_l1_id / mypy_profile_l1_id; the invocation's tool_profile_ref
   now references the PROFILE row, while the verdict's tool_id stays the tool identity.

2. LeafModelPythonStatic{Happy,Falsification}Case stored a free TargetStaticAnalysisInvocation,
   so a blocking fixture could be built with analysis_role: Advisory. Cases now carry only
   artifact + tool_profile_ref (+ tool_id/diagnostic_code for falsification); the invocation
   is CONSTRUCTED with analysis_role: BlockingForRung by accessor fns
   (leaf_model_python_static_{happy,falsification}_invocation). The blocking role and the
   profile/tool distinction are guaranteed by construction, not accepted as free fields.

Lens + claim updated to the new case shape; claim now also asserts tool_profile_ref ==
pyright_profile_l1_id flows. Verify script unchanged (fixture sources identical) — re-ran
PROVEN. NOTE: .dag changes not locally compile-validated (host load ~50, fork EAGAIN);
relying on CI ci_floor bootstrap compile.

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

* docs(v4): clarify static tool identity comments

* fix(v4): F1 runner consumes the modeled pyright profile (single authority)

Addresses codex REQUEST_CHANGES #23685: the runner used any pyright on PATH
without pinning the modeled version/config, so the F1 receipt could pass under a
different tool profile than pyright_profile_l1_id references.

Now the runner reads pyright_profile_l1 facts from pyright.dag (single authority):
- pyright_version → pins exactly that version (PATH pyright used only if its
  --version matches; otherwise npx pins it; else fail-closed unavailable),
- python_version + type_checking_mode → written to a generated pyrightconfig.json
  that pyright auto-discovers for the fixtures.
The receipt records the consumed version/python_version/mode. Re-ran: PROVEN
(pyright 1.1.410, python 3.11, standard; falsification reportReturnType).

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

* WIP: Python L1 pyright/mypy static structural checks implementation

* fix(v4): address openai-pro REQUEST_CHANGES (single-authority + no-prose)

1. P2 single-authority: the F1 host receipt no longer hardcodes the pyright rule
   string. It reads the fixture's modeled expected diagnostic_code from the lens and
   resolves the rule_name from the pyright_diagnostic_rules row in pyright.dag, so the
   receipt can't drift from the modeled diagnostic namespace. Re-ran: PROVEN.
2. CODING.md no-prose / Practice 9: reduced the verbose "tried X, rejected Y"
   dissolution analysis embedded in TargetStaticAnalysisRole / TargetStaticAnalysisVerdict
   (leaf_model_verification.dag) and PyrightTypeCheckingMode (pyright.dag) to one-line
   🟢-terminal carrier tags; the full dissolution analysis is recorded in PR #4158 review.

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

* WIP: Python L1 pyright/mypy static structural checks implementation

* fix(v4): model pyright typeCheckingMode keyword spelling (single authority)

Addresses codex REQUEST_CHANGES #23765: the host receipt's mode_map re-authored
the PyrightTypeCheckingMode → config-keyword mapping (off/basic/standard/strict),
a second authority for a modeled profile fact (P2 / Practices 3,5).

pyright.dag now carries the modeled projection pyright_type_checking_mode_spellings
(variant_name → keyword). The runner resolves the typeCheckingMode keyword from that
row keyed by the profile's variant — no parallel mode map. Combined with the earlier
version/python-version/rule-string sourcing, the script now owns ZERO pyright
semantics; every pyright fact flows from pyright.dag. Re-ran: PROVEN.

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

* fix(v4): key pyright mode-spelling projection by the enum variant (M4/P2)

Addresses codex REQUEST_CHANGES (sha f0ab617): PyrightTypeCheckingModeSpelling
modeled the enum member as a string proxy (variant_name: String), splitting the
closed PyrightTypeCheckingMode enum from its config spelling into two authorities.

The row is now keyed by a PyrightTypeCheckingMode value
(`PyrightTypeCheckingModeSpelling { mode: PyrightTypeCheckingMode, keyword: String }`,
rows use PyrightModeOff/Basic/Standard/Strict), so the enum and its spelling are one
authority. The host runner consumes that typed row (matches `mode: <variant>`) keyed by
the profile's modeled variant. Re-ran: PROVEN.

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

* fix(v4): bind pyright to the generated profile config (--project)

Addresses openai-pro REQUEST_CHANGES (sha fad72bd): the F1 runner wrote the
modeled profile into ${scratch}/pyrightconfig.json but invoked pyright from the
repo root without --project, so pyright's config discovery was not structurally
bound to the generated config — the same-profile proof was not mechanically
guaranteed (P2 single authority / facts-flow-forward).

Both pyright command paths now pass `--project "$scratch"`, binding pyright to the
pyrightconfig.json carrying the modeled pythonVersion + typeCheckingMode. The run
provably consumes pyright_profile_l1 rather than ambient/default config. Re-ran:
PROVEN (happy clean, falsification reportReturnType).

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

* WIP: Python L1 pyright/mypy static structural checks implementation

* fix(v4): drop broken v3 smoke; validate profiles via whole-tree v2 gate

Addresses codex REQUEST_CHANGES (sha 8f5432e): the bespoke v3 hand-Rust smoke
`v4_extdeps_typecheckers_dag_smoke_test.rs` was mechanically failing. Its flat
`compile_to_dag_modules_in_order` chain transitively pulls in src/v4/std/logic.dag,
which the isolated v3 compile path cannot parse (`BoolWidthFact {}` → "expected field
label, got LBrace"). The profiles need text → logic, so a compatible flat chain isn't
available on the v3 path.

Per codex's whole-tree/generated-gate alternative: drop the v3 smoke and rely on the
`v2 → v4 bootstrap compile (fail-closed full)` step in ci_floor, which compiles all of
src/v4 (pyright.dag + mypy.dag + the std static-analysis carriers) — the v2 path parses
logic.dag fine. Removes the failing test plus its SG-0 census entry, INVARIANTS_OPS row,
and sg0-pr-body-append.4158.txt (net hand-Rust census delta is now 0). Worksheet updated.

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

* fix(v4): remove unconsumed mypy profile (E-6); track as bounded follow-up

Addresses openai-pro REQUEST_CHANGES (sha 4910860): mypy.dag added a
mypy_profile_l1 + diagnostic namespace with NO same-PR consumer — the fixture,
.dag claim, and host runner are pyright-only. Per INVARIANTS E-6 / Boundary
Discipline a new target-spec extdeps fact is real only when a same-PR consumer
lands; an unconsumed mypy profile is dormant scaffold.

Per the offered remove-or-track option (and since mypy is not installable in the
current env, so a mypy F1 receipt can't be proven here): remove
src/v4/extdeps/typecheckers/mypy.dag from this slice and record mypy as bounded
tracked debt in the worksheet (owner = Python RCA Manager; trigger = land mypy.dag
together with a mypy fixture/claim/fail-closed receipt). The shared
TargetStaticAnalysis* carriers already accept a mypy profile by Symbol, so the
follow-up is additive — no carrier change. pyright remains fully consumed.

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

* fix(merge): resolve conflict markers left in the main merge commit

The auto-committed merge ab3c1fc landed with conflict markers still present in
src/v4/std/leaf_model_verification.dag, src/v4/lens/leaf_model_verification.dag, and
the worksheet. This commit applies the resolved content: keep BOTH the Python
PY-L1 static-analysis carriers/fixtures (this PR) and main's TypeScript
leaf-model carriers/fixtures (additive, distinct types); merge the import lists and
claim-id lists; take main's worksheet status line updated to note Worksheet A is
implemented in #4158.

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

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* TS L0 impl (1/5): algebra inhabitance widening — ts_*_facts_* data lines per v4-ts-algebra-inhabitance-widening-worksheet-2026-06-01.md §10.0 (#4155)

* WIP: TS L0 impl (1/5): algebra inhabitance widening — ts_*_facts_* data lines

* WIP: TS L0 impl (1/5): algebra inhabitance widening — ts_*_facts_* data lines

* Merge origin/main into session/fierce-deer-550

Resolve typescript.dag conflict: main landed the number/bigint
algebra-inhabitance fact rows (+ SG-1 atom-realization block) via a
sibling PR. Dedupe — keep main's number/bigint rows once and the
atom-realization block; this PR's net-new content is the boolean row
(ts_bool_algebra_inhabitance_ts_facts_boolean, with E-6 staging marker)
and the string row (ts_string_algebra_inhabitance_ts_facts_string,
clean-merged).

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

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore: delete internal-only content for public repo visibility flip (#4192)

* WIP: Release Jun1 one-shot public-repo cleanup (operator decision 2026-06-01:

* WIP: Release Jun1 one-shot public-repo cleanup (operator decision 2026-06-01:

* Add TypeScript TargetAtomRealization rows (#4189)

* WIP: TS L0 impl (3/5): TargetAtomRealization rows (Symbol/boolean/string) per

* Add TypeScript target atom realization rows

* Dissolve duplicate TypeScript symbol atom row

* Use structural String carrier for TypeScript atom row

* WIP: TS L0 impl (3/5): TargetAtomRealization rows (Symbol/boolean/string) per

* Fail closed for string value templates

* Use projections for string value templates

* Add FreeMonoid node projection receipt

* Declare SourceAtomValue as coproduct

* Document SourceAtomString raw node bridge

* TS L0 impl (5/5): grammar-inverse TestClaims G1+G2 — mvp1 add-fn + wave2a type_alias per v4-ts-grammar-inverse-testclaims-worksheet (#4156)

* WIP: TS L0 impl (5/5): grammar-inverse TestClaims G1+G2 — mvp1 add-fn + wave2

* WIP: TS L0 impl (5/5): grammar-inverse TestClaims G1+G2 — mvp1 add-fn + wave2

* WIP: TS L0 impl (5/5): grammar-inverse TestClaims G1+G2 — mvp1 add-fn + wave2

* docs: add P5 receipt for TS grammar inverse ratchet

* WIP: TS L0 impl (5/5): grammar-inverse TestClaims G1+G2 — mvp1 add-fn + wave2

* test: assert TS grammar inverse anchor bindings

* style: rustfmt TS grammar inverse test

---------

Co-authored-by: Cursor <cursoragent@cursor.com>

* T-38: restore corpus receipt smoke coverage (#4191)

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* fix(t38): require generated corpus tally conjunction

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* fix(t38): match modeled manual corpus gate

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* Tighten generated corpus eval receipt probes

* Merge origin/main into T-38 receipt follow-up

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* Test inverted corpus tally receipt rejection

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* Tighten T-38 receipt smoke needle

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* Anchor T-38 tally receipt to body tail

* WIP: Runtime/TestClaim Manager — authority over T-22 eval execution, T-38 str

* Pin T-38 inverted tally receipt subject

* Fix shared applied type Rc authority (#4190)

* ci_floor: de-churn cargo cache key (stop-the-bleeding) + model note for the right-way sccache projection (#4197)

* WIP: CI floor

* ci.dag: cite durable in-repo cache authority (worksheets deleted in #4192 public flip)

* ci_floor: route M1 emit-probe through host compute governor (memory-denominated dynamic jobs + jobserver + sccache) (#4210)

* WIP: CI floor

* WIP: CI floor

* WIP: CI floor

* chore: close Jun1 public cleanup gaps (#4200)

* WIP: Release Jun1 public-repo cleanup gap-fix (follow-on to merged PR #4192):

* chore: remove stale public cleanup test anchors

* WIP: Release Jun1 public-repo cleanup gap-fix (follow-on to merged PR #4192):

* docs: remove stale CI carrier regeneration wording

* docs: drop orphaned workflow brief receipt claim

* WIP: Release Jun1 public-repo cleanup gap-fix (follow-on to merged PR #4192):

* docs: align cleanup receipts with static CI carrier

* WIP: Release Jun1 public-repo cleanup gap-fix (follow-on to merged PR #4192):

* WIP: Release Jun1 public-repo cleanup gap-fix (follow-on to merged PR #4192):

* docs: clarify P5 dissolution receipts

* WIP: Release Jun1 public-repo cleanup gap-fix (follow-on to merged PR #4192):

* ci: refresh pinned workflow carrier

* ci_floor: M1 emit-probe fail-closed on host governor (remove static --jobs fallback) (#4212)

* WIP: CI floor

* WIP: CI floor

* WIP: CI floor

* WIP: CI floor

* ci_floor: M1 emit-probe fail-closed (no static fallback) + sync regen artifact SHA/env

* ci_floor: M1 emit-probe couples to host jobserver (MAKEFLAGS on GHA / ctrl-build in session), fail-closed on neither

ctrl-build is not installed on GHA runners — #4210's ctrl-build routing was a silent no-op
(always hit the --jobs 4 fallback). GHA couples to the jobserver via the actions-runner@.service
MAKEFLAGS instead, so raw cargo joins the pool directly (jobserver bounds rustc processes
host-wide: fill when idle, pare under load). Probe now runs jobserver-coupled with no fallback,
capped per-invocation at the ceiling; echoes MAKEFLAGS for verification.

* ci_floor: reframe M1 parallelism comments as jobserver-coupled (not ctrl-build-centric); sync ci.yml Source-SHA256

Addresses cursor review nit on #4212: ci.yml + smoke-test comments framed governance as
ctrl-build, but GHA is MAKEFLAGS-coupled without ctrl-build. Comments now match the authoritative
ci.dag/probe logic. ci.yml comment change → recomputed Source-SHA256 pin in the regen artifact.

* Go leaf-model: R1/R2a/R2b/R3-external claims, lens fixtures, verify scripts

Admin-merge onto main post-#4164/#4168 (orphan #4162 path-b).
Leaf-only diff: scripts, go_r*.dag, lens/std leaf_model_verification carriers.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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