Skip to content

test(vcr-oracle): pin #518 cross-backend contrast — RV32 loud-skips vs ARM silent miscompile (#242)#528

Merged
avrabe merged 1 commit into
mainfrom
oracle/i64-param-518-riscv-loudskip
Jun 27, 2026
Merged

test(vcr-oracle): pin #518 cross-backend contrast — RV32 loud-skips vs ARM silent miscompile (#242)#528
avrabe merged 1 commit into
mainfrom
oracle/i64-param-518-riscv-loudskip

Conversation

@avrabe

@avrabe avrabe commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

What

Issue-hunt pass with no new external signal (gates #418/#472/#396-emitter still await external triggers; no new issues/comments since the watermark; deps unchanged). Bounded behavior-frozen #242 increment serving cross-backend parity (VCR-SEL-005): measure how the #518 i64-param root cause manifests on RISC-V.

Measured — same root cause, opposite manifestation

objdump symtab + compile stderr: the same omission (an i64 param is never classified i64, so it reaches an i64 op as an i32 operand) is silent on ARM (#518 miscompile) but loud-skipped on RV32. The RV32 selector validates the operand-stack type before lowering an i64 op → stack type mismatch ... expected i64, found i32 → typed Errwarning: skipping function … + absent symbol. That is the #378/#180/#185 never-guess Ok-or-Err contract acting as the honest-fail backstop ARM's select_with_stack lacks for i64 params.

So on this class RV32 is incomplete-but-sound (no silent wrong-code); ARM is complete-but-unsound until its gated fix — the precise VCR-SEL-005 parity shape (ARM lowers X; RV32 loud-declines X).

Changes (frozen-safe — no codegen touched; frozen anchors 3/3 green)

rivet clean. The byte-changing fix stays a separate gated step.

Refs #242, #518.

🤖 Generated with Claude Code

…ps, ARM silently miscompiles (#242, #518)

No new external signal this issue-hunt pass (gates #418/#472/#396-emitter still
await external triggers; no new issues/comments since watermark; deps unchanged).
Bounded behavior-frozen #242 increment, cross-backend parity (VCR-SEL-005): measure
how the #518 i64-param root cause manifests on RISC-V.

Measured (objdump symtab + compile stderr): the SAME root cause (an i64 param is
never classified i64, so it reaches an i64 op as an i32 operand) is SILENT on ARM
(#518 miscompile) but LOUD-SKIPPED on RV32. The RV32 selector validates the
operand-stack TYPE before lowering an i64 op, hits `stack type mismatch ...
expected i64, found i32`, returns a typed Err → `warning: skipping function …` +
absent symbol. That is the #378/#180/#185 never-guess Ok-or-Err contract acting as
the honest-fail backstop ARM's select_with_stack LACKS for i64 params. So on this
class RV32 is INCOMPLETE-but-SOUND; ARM is COMPLETE-but-UNSOUND until the gated fix.

- scripts/repro/i64_param_518_riscv_loudskip.py: asserts all 7 i64-param fns are
  loud-skipped (warning + absent symbol) AND the i32 control (t_i32) is emitted
  (non-vacuity — the skip is #518-specific, not a blanket backend failure). A
  regression removing the RV32 stack-type guard would flip a loud-skip into a
  silent miscompile, which the oracle catches.
- roadmap VCR-ORACLE-001 #518 entry: record the cross-backend contrast.

FROZEN-SAFE — no codegen touched (frozen anchors 3/3 green); rivet clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@codecov

codecov Bot commented Jun 27, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@avrabe avrabe merged commit e35685c into main Jun 27, 2026
20 checks passed
@avrabe avrabe deleted the oracle/i64-param-518-riscv-loudskip branch June 27, 2026 07:46
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