Skip to content

Re-ground Joern's tool-native decline on a field evaluation of the shipped scan bundle (A26) - #122

Merged
DavidBakerEffendi merged 1 commit into
mainfrom
dave/joern-scan-native-a25
Sep 2, 2026
Merged

Re-ground Joern's tool-native decline on a field evaluation of the shipped scan bundle (A26)#122
DavidBakerEffendi merged 1 commit into
mainfrom
dave/joern-scan-native-a25

Conversation

@DavidBakerEffendi

@DavidBakerEffendi DavidBakerEffendi commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

What this is

A maintainer challenge to the Joern tool-native row — Joern ships a query database (https://queries.joern.io, the joern-scan bundle) — sent the preregistered decline's grounds into the field. The result is Amendment A25: no partition cell moves, and the decline comes back stronger than it went in.

What the field evaluation measured

Half of the old grounds failed. The preregistration declined the scan surface as "downloaded from a floating latest release asset, unpinnable at run time". Measured: the pinned v4.0.614 release publishes a versioned querydb.zip asset, and the shipped joern-scan --updatedb --dbversion 4.0.614 installs exactly it (URL + SHA-256 retained). The bundle is pinnable, and joern-scan runs end to end with zero benchmark input. The retired claim stays recorded as retired, per the A10 precedent.

The decline survives on the bundle's own content and behavior, retained under reports/raw/amendment-a26-joern-scan-native/ (produced by scripts/probe-joern-scan-native.sh, which works on a copy of the pinned distribution — the pin is never mutated):

  • The version-pinned bundle dumps 58 queries (27 c, 10 android, 9 php, 7 java, 3 kotlin, 2 ghidra) — none for JavaScript, none for Python.
  • Java's seven: six bind servlet/Spring/SQL/certificate/crypto identities no probe uses. The seventh — call-to-exec, the one query naming this profile's command sink — is cpg.method("java.lang.Runtime.exec").callIn, and cpg.method(...) full-match-filters the method name property (exec), so it matches zero methods on the very javasrc2cpg graph whose cpg.method("exec").callIn is non-empty (binding check retained).
  • Executed over all 36 probe fixtures: zero findings of any query, source-sink positives included (per-fixture argv, exit status, and finding counts retained).
  • A shipped-product defect retained along the way: on this pin joern-scan's Python auto-detection emits importCode.pythonsrc(...), which does not compile against the product's own console; the documented --language python runs — and still decides nothing.

Why the cells stay declined rather than becoming scored

The A7 shape: no shipped query binds any probe endpoint — by absence in two languages, by a structurally impossible binding in the third — so the eighteen cells remain capability coverage decided from the bundle's text and confirmed by execution, not an activated model set producing 36 false negatives. Even the sink-existence hazard cannot reach these fixtures: the one sink-existence query aimed at Runtime.exec is the one that cannot bind.

Changes

  • docs/native-profile.md — the Joern activation section's scan-bundle paragraph re-grounded (retired claim kept visible), the S-cell rationale extended, and Amendment A25 appended (drafted as A25, renumbered to A26 before opening: concurrent PR Amendment A25: re-ground OpenTaint's native declines on the shipped scan entry point's measured silence #121 claims A25 for OpenTaint).
  • src/main.rs — the Joern NATIVE_PARTITION S-cell rationale re-grounded to cite A25.
  • adapters/joern/README.md — the three tool-native sections' unpinnability sentences replaced with the measured grounds.
  • docs/adapters.md, docs/java-native.md, docs/javascript-native.md — the same claim corrected where echoed.
  • scripts/probe-joern-scan-native.sh + reports/raw/amendment-a26-joern-scan-native/ — the reproducible probe and its retained evidence.

No cell moves, so no runner arm changes, no report re-runs, and no site-card change; the retained 0/6 reports predate the amendment and keep their wording (A10 precedent). No freeze is invalidated — v0.6.1 contains no tool-native report and validate-freeze stays green.

Battery

  • cargo fmt --check
  • cargo test ✓ (207 passed)
  • cargo run -- validate ✓ (852 cases)
  • cargo run -- validate-reports ✓ (82 reports)
  • cargo run -- validate-freeze reports/freeze.json ✓ (v0.6.1)
  • cargo run -- generate-results --manifest reports/freeze.json --output-directory <dir> --check
  • astro build ✓ (45 pages)

🤖 Generated with Claude Code

…ipped scan bundle (A26)

A maintainer challenge - Joern ships a query database (queries.joern.io,
the joern-scan bundle) - sent the preregistered decline's packaging claim
into the field. Half of it failed: the pinned v4.0.614 release publishes a
versioned querydb.zip asset, and the shipped `joern-scan --updatedb
--dbversion 4.0.614` installs exactly it, so the bundle is pinnable and
the earlier unpinnability grounds are retired.

The decline survives on stronger evidence, measured rather than asserted:
the version-pinned bundle dumps fifty-eight queries - none for JavaScript
or Python - and its one query naming this profile's command sink
(call-to-exec) filters the method-name property with a full-match regex
that matches zero methods on a javasrc2cpg graph. Executed over all
thirty-six probe fixtures with zero benchmark input, the installed bundle
fired no query anywhere, the source-sink positives included. The Python
leg also retains a shipped-product defect: auto-detection emits
importCode.pythonsrc, which does not compile against the product's own
console; the documented --language python runs, and still decides nothing.

No partition cell moves: all eighteen Joern cells stay unsupported, as
capability coverage on the A7 shape - no shipped query binds any probe
endpoint - not as thirty-six false negatives. Evidence retained under
reports/raw/amendment-a26-joern-scan-native/, produced by
scripts/probe-joern-scan-native.sh, which works on a copy of the pinned
distribution so the pin is never mutated. No freeze is invalidated; the
retained 0/6 reports predate the amendment and keep their wording, per
the A10 precedent. Drafted as A25; renumbered to A26 because concurrent PR #121 claims A25 for OpenTaint.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@DavidBakerEffendi
DavidBakerEffendi force-pushed the dave/joern-scan-native-a25 branch from 282eeba to 9bbc75e Compare September 2, 2026 06:09
@DavidBakerEffendi DavidBakerEffendi changed the title Re-ground Joern's tool-native decline on a field evaluation of the shipped scan bundle (A25) Re-ground Joern's tool-native decline on a field evaluation of the shipped scan bundle (A26) Sep 2, 2026
@DavidBakerEffendi
DavidBakerEffendi merged commit 612acf0 into main Sep 2, 2026
2 checks passed
@DavidBakerEffendi
DavidBakerEffendi deleted the dave/joern-scan-native-a25 branch September 2, 2026 07:01
DavidBakerEffendi added a commit that referenced this pull request Sep 2, 2026
…ctivation surface (A28) (#124)

## What this is

A maintainer challenge sent [Amendment
A14](https://github.com/BrokkAi/dataflowbench/blob/main/docs/native-profile.md#a14--2026-09-01-infers-native-row-declines-on-a-measured-silence)'s
central phrase — *"Pulse taint is off absent a configuration"* — into
the field, the same movement A25 (OpenTaint) and A26 (Joern) made for
their native declines. Part of the phrase failed. The decline survives
on stronger evidence, recorded as **Amendment A28**. No cell moves: all
six Infer native cells stay `unsupported`, 0 / 6, Java alone.

## What was measured (all three arms executed on the pinned v1.3.0
binary, evidence retained under
`reports/raw/amendment-a28-infer-native-activation/`)

1. **The distribution bundles default taint data — enumerated.** Exactly
one shipped taint surface exists: `lib/infer/infer/config/taint/`, four
Objective-C `NSLib` files (`NSString`, `NSArray`, `NSDictionary`,
`NSSet`) plus a README stating they "are always included when running
infer". Every file's single top-level key is `pulse-taint-propagators`.
No sources, no sinks, no sanitizers, no policies, no `.inferconfig`
anywhere in the distribution, no Java identity.
2. **A zero-configuration invocation activates it — proven, not
quoted.** Corrupting one bundled file in a byte copy of the distribution
kills a zero-config Java *capture* with exit 3, the error naming the
file from `Config.pulse_taint_config`'s directory fold
(`engagement-proof-transcript.txt`). This matters because the pinned
release's signature failure mode is *silent* config loss: here the
opposite is established — A14's silence is an **engaged** silence. The
loader runs, loads the shipped taint data, and that data binds no
endpoint to any policy.
3. **The full default surface decides nothing the split invocation
missed.** `infer run --sarif` — the release's whole default checker set,
not the adapter's `capture` + `analyze --pulse-only` arms — produced
**zero findings of any rule** over all twelve Java native fixtures
(verbatim SARIF retained per fixture). No non-taint Pulse finding exists
to reconcile against any anchor, so no cell becomes a live activation
deciding `not-reached`.

## Why the cells stay declined

The shipped model set expresses no flow question over any probe endpoint
— the one taint artifact it ships is propagator-only and
Objective-C-only. The twelve zero-finding full-default runs are the
decline's evidence, not scored runs; `not-reached` would assert an asked
question that found no flow, and no question is asked. (A7's / A26's
distinction.)

## What changes where

- `docs/native-profile.md` — A28 amendment entry; the Infer activation
section gains the engaged-silence paragraph (A14's imprecise sentence
stays quoted, per the retired-sentence discipline); table rows 1–2
restated.
- `src/main.rs` — the six `NATIVE_PARTITION` Infer rationales
re-grounded (Amendments A14, A28). The retained 0 / 6 report predates
the amendment and keeps A14's wording, exactly as A26 left Joern's; the
corrected strings land with the next evidence re-run.
- `docs/java-native.md`, `adapters/infer/README.md` — mirrored.
- `scripts/probe-infer-native-activation.sh` — the three-arm probe
(works on a scratch copy; the pinned distribution is never mutated).

## Battery

`cargo fmt --check` ✓ · `cargo test` 207 ✓ · `validate` 852 cases ✓ ·
`validate-reports` 82 ✓ · `validate-freeze reports/freeze.json` (v0.6.1)
✓ · `generate-results --check` current ✓ · astro build 45 pages ✓

Amendment number: drafted as A27, renumbered to **A28** before merge —
the concurrent #123 claims A27 for Semgrep's native re-grounding (race
note recorded in the entry). Rebased on main past A25 (#121) and A26
(#122).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Fable 5 <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