chore: DWARF / witness mapping discovery for fused output (sub-#130)#131
Merged
Conversation
5 tasks
meld currently passes DWARF custom sections through fusion byte-for-byte. DWARF addresses encode byte offsets into the per-input code section, but fusion rewrites function bodies into a new merged code section — so every preserved DWARF address points at the wrong instruction (or out of range). The pulseengine `witness` MC/DC tool reads those addresses via gimli, so coverage attribution for fused modules is currently silently wrong. This change: - Adds `meld-core/tests/dwarf_passthrough.rs` pinning the current lossy-but-present behaviour as five green tests so any future remapping work has a clear oracle to flip. - Documents the witness DWARF contract and the cross-repo integration shape in the test's module docstring (witness intentionally stays out of meld-core's dep graph). No production code changes — defaults are unchanged. Phased plan (Phase 1.5 explicit policy, Phase 2 DWARF remap, Phase 3 adapter DIEs) tracked in #130. Refs #130 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Phase 1.5 shipped on main in PR #135 (commit c7a2c0b) during the 16 days this branch sat idle. The DWARF default flipped from PassThrough (broken-but-present) to Strip (correct-but-lossy), and `FuserConfig` gained a new `dwarf_handling` field. Three rebase-driven updates: 1. Add the `dwarf_handling` field to both helper builders. The PassThrough path is the one Phase 2 (#143) will flip from broken to correct, so the existing tests' premise — pin the broken behaviour as a Phase-2 oracle — needs the explicit opt-in now that Strip is the default. 2. Rename `fuse_default` → `fuse_passthrough` to make its scope explicit. The discovery oracle was never about "whatever the default does" — it was about pinning passthrough behaviour for Phase 2 to flip — and that's clearer post-1.5. 3. Re-purpose the `current_default_is_merge_not_drop` test to `current_default_is_strip_post_phase_1_5`. The original was written to flag a future default flip; the flip has now happened, so the assertion inverts. Future changes (e.g. Phase 2 making PassThrough the new default) continue to be surfaced by this same test. 4. Update docstrings and inline comments referencing Phase 1.5 as "will ship" to "shipped in #135 / PR c7a2c0b". All 5 discovery tests still pass against the updated helpers, and the full meld-core lib suite (236/236) is unaffected. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
59cfebb to
4e72d47
Compare
LS-N verification gate
Approved Failed LS entries(none) Missing regression tests
Updated automatically by |
avrabe
added a commit
that referenced
this pull request
May 21, 2026
P3 cross-component stream-pair detection foundation + a fully operational Mythos delta-pass auto-runner. 12 commits since v0.8.1. Headline changes: - Cross-component stream<T> pairing detection (#141, ADR-3). The StreamPairGraph foundation for the in-module stream adapter: meld now inventories at resolve time which fused components form producer -> consumer stream pairings. The ring-buffer / copy-chain emitter is a runtime-verified follow-up (ADR-3 Path N). - Mythos delta-pass auto-runner (#162, #164, #170, #173, #175). The AI-driven discover protocol now runs automatically on every Tier-5 PR by the maintainer, via claude-code-action on a Max-plan OAuth token. Five plumbing fixes brought it to a working end-to-end state: scan -> NO_FINDINGS verdict -> sticky comment -> mythos-pass-done label. - LS-N verification gate (#161, #165). Every approved loss-scenario in safety/stpa/loss-scenarios.yaml is now enforced to have a matching ls_<letter>_<num>_* regression test; 19/19 verified. - DWARF / witness-mapping discovery (#131) — Phase 1 of the #130 epic; pins today's lossy passthrough as the green-to-red oracle for the Phase 2 remap work. - Regression coverage for LS-A-8/9/19 and LS-CP-4 (#163/165/166/169) — closed every missing-test entry the LS-N gate surfaced. - CI footprint reduction (#171) — bench/fuzz/ci skip on docs- and safety-only PRs; meld is a leaner consumer of the shared fleet. - fuzz.yml musl-target drop (#170, closes #168) — fixes the recurring "sanitizer incompatible with statically linked libc" fuzz failures. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
meld-core/tests/dwarf_passthrough.rs.Rebased + refreshed for Phase 1.5 (post-#135)
Original draft sat for 16 days while Phase 1.5 (PR #135, commit
c7a2c0b) flipped the default DWARF policy fromPassThroughtoStrip. The fixup commit on this branch:dwarf_handlingfield to both helper builders.fuse_default→fuse_passthrough— the discovery oracle was never "whatever default does", it was "pin passthrough for Phase 2 to flip".current_default_is_merge_not_droptest (which asserted the pre-1.5 default) tocurrent_default_is_strip_post_phase_1_5(post-1.5 reality + future-flip canary).5/5 discovery tests pass; full meld-core lib suite is 236/236.
What the test pins
(Numbers from
tests/wit_bindgen/fixtures/lists.wasm; duplicate sections per the buggy passthrough; addresses inside encoded against the input's old code section.)Audit findings (committed in the test docstring + filed in #130)
FuserConfig::default().dwarf_handlingis nowDwarfHandling::Strip(Phase 1.5). To exercise the passthrough path you must opt in viadwarf_handling: DwarfHandling::PassThrough.merger.rs:2010-2012naively concatenates per-modulecustom_sectionswith no dedup or rewriting.lib.rs::encode_output(line 1390 area) emits all of them unlessDropis configured ORStripremoves them.meld-core/src/parses or rewrites.debug_*content.Cross-repo dependency: witness
pulseengine/witnessv0.11.x is the consumer that breaks under PassThrough. It usesgimli(crates/witness-core/src/decisions.rs) to build a(code-section byte offset) -> (file, line)map for MC/DC attribution. The DWARF passed through by meld today (when PassThrough is opted-into) gives gimli wrong + duplicated input.Witness is intentionally NOT a meld-core dependency. End-to-end "run witness on a fused module and check coverage" lives in the cross-repo integration story; this PR is the meld-side discovery oracle.
Test plan
any=falseand matrix-scan will skip. Next Tier-5 PR (likely Phase 2 DWARF Phase 2: address remap (#130) #143's actual remap code) gets the full auto-runner test.Sequencing post-merge
🤖 Generated with Claude Code