Skip to content

docs: withdraw the "9 unattributed object branches" claim — a vocabulary mismatch, not a finding - #279

Open
avrabe wants to merge 1 commit into
mainfrom
docs/correct-only-in-synth
Open

docs: withdraw the "9 unattributed object branches" claim — a vocabulary mismatch, not a finding#279
avrabe wants to merge 1 commit into
mainfrom
docs/correct-only-in-synth

Conversation

@avrabe

@avrabe avrabe commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

I read a reconciler's vocabulary as a finding about the object, committed it here as evidence, and filed it upstream as synth#944. It was wrong, and synth v0.57.0 (#967) settles it with data from the very manifests committed in this directory.

What they found

Reproducing the exact 9 keys from switch-thin.{witness,provenance}.json, joined the way witness object-disposition does, every one is a provenance entry for a real source WASM op:

count source op object realization
preserved 6 br unconditional branch
folded-predication 3 select predicated IT-move — no branch at all

None is a miscompile. None is an unattributed compiler-introduced branch.

witness's manifest records only br_if / br_table_target / br_table_default / if_then / if_else. It never instruments unconditional br or selectcorrectly, because those are not decisions. So only_in_synth means "synth entry with no witness branch record", and its hardcoded text — "(object branch witness never instrumented)" — is literally accurate while reading as an alarm.

What this PR changes

The claim this repo carried:

Those 9 are new object-code obligations: control flow that exists in the shipped binary and in no source or WASM decision, so no source-level MC/DC argument can discharge them.

is withdrawn. The correction goes inline where the claim was, not appended elsewhere, and the "What this does NOT establish" bullet that repeated it is struck through rather than deleted — so the record shows what was believed and why it changed. The mpu-thin (12) and const-init (4) counts get the same treatment.

The mistake worth naming

The join was doing exactly what it documented. I supplied the alarming interpretation, and the number was large enough to look like a finding. The tell I missed: only_in_synth is a reconciler category — it describes a relationship between two tools' records, not a property of the object. A count that only exists because two tools instrument different things is a vocabulary mismatch until proven otherwise.

Upstream outcome is genuinely useful though: synth v0.57.0 now emits verified machine-readable origins for branches it really does introduce, so the category that does need discharging is populated and named rather than inferred from a count. That is a better state than before I filed it — but the claim in this repo was still wrong, and it was wrong on main.

Related: this is the second correction to this document (the first marked per-file attribution provisional pending witness#179). Both were caught by upstream reproducing our committed artefacts, which is an argument for committing the raw manifests rather than only the rendered rollups.

…vocabulary mismatch, not a finding

I read a reconciler's vocabulary as a finding about the object, committed it as
evidence, and filed it upstream as synth#944. It was wrong.

synth reproduced the exact 9 keys from the manifest + provenance map committed in
this repo and showed every one is a provenance entry for a REAL SOURCE WASM OP:

  6  preserved            br       -> unconditional branch
  3  folded-predication   select   -> predicated IT-move, no branch at all

None is a miscompile; none is an unattributed compiler-introduced branch.
witness's manifest records only br_if / br_table_target / br_table_default /
if_then / if_else — it never instruments unconditional br or select, CORRECTLY,
because they are not decisions. `only_in_synth` means "synth entry with no
WITNESS branch record", and its hardcoded text "(object branch witness never
instrumented)" is literally accurate while reading as an alarm.

So the claim this repo carried —

  "Those 9 are new object-code obligations: control flow that exists in the
   shipped binary and in no source or WASM decision, so no source-level MC/DC
   argument can discharge them."

— is withdrawn. The correction is inline where the claim was, not appended
elsewhere, and the "does NOT establish" bullet that repeated it is struck through
rather than deleted so the record shows what was believed and why it changed.

The mpu-thin (12) and const-init (4) counts get the same treatment: same
category, not unexplained obligations.

Fixed upstream in synth v0.57.0 (#967), which now emits verified
machine-readable origins for genuinely compiler-introduced branches — so the
category that DOES need discharging is populated and named instead of inferred
from a count.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QG86sovTbfnPNY9SfhSmo
@codecov

codecov Bot commented Aug 14, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

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