Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
282a1b3
docs(research): document IR CFG emitter baseline
caverav Aug 18, 2026
4e8a9b2
perf(benchmark): add IR CFG emitter phase harness
caverav Aug 18, 2026
4a9f681
perf(benchmark): isolate harness workspace
caverav Aug 18, 2026
be38db2
perf(benchmark): harden measurement scheduling
caverav Aug 18, 2026
191209c
perf(benchmark): run the correctness pass once per binary, not per pair
caverav Aug 18, 2026
825c6e3
perf(benchmark): alternate execution order inside every measured pair
caverav Aug 18, 2026
53e5992
docs(research): record pipeline baseline
caverav Aug 18, 2026
53e335d
perf(benchmark): build both sides at one canonical path and gate bina…
caverav Aug 18, 2026
ede255a
perf(benchmark): gate binary identity in both directions
caverav Aug 18, 2026
c7ad4ac
docs(research): replace the void baseline with A/A evidence at 8e7f080
caverav Aug 18, 2026
6db8939
docs(oracle): adjudicate the ci-check.sh ruler change and protect the…
caverav Aug 18, 2026
1b90df0
docs(research): reconcile the baseline from measured samples, not war…
caverav Aug 18, 2026
6fcae26
docs(research): prioritize measured pipeline work
caverav Aug 18, 2026
0f80fc1
docs(research): make the attribution's derived numbers reproducible
caverav Aug 18, 2026
3dac057
docs(research): record transient harness activation
caverav Aug 18, 2026
74d3d15
docs(research): qualify path-bound binary probes
caverav Aug 18, 2026
62ccd4d
test(oracle): protect decompiler test loader chain
caverav Aug 18, 2026
adb4397
test(oracle): protect all oracle loader hooks
caverav Aug 18, 2026
9196d2a
test(oracle): verify compiled oracle inventory
caverav Aug 18, 2026
6359a44
fix(ir): model indirect control terminators
caverav Aug 18, 2026
b9e9468
feat(ir): validate block identity at every consumer boundary
caverav Aug 18, 2026
fc8288a
refactor(ir): rebuild CFG edges through one canonical path
caverav Aug 18, 2026
4268b8d
test(ir): pin that only guard-stranded blocks are pruned
caverav Aug 18, 2026
74c6d30
docs(research): record indirect control model
caverav Aug 18, 2026
b343806
docs(protocol): reconcile indirect control class
caverav Aug 18, 2026
9c02714
test(cfg): compare CFG relations with independent expected graphs
caverav Aug 18, 2026
5e0ea89
fix(cfg): withhold post-dominance where no exit is reachable
caverav Aug 18, 2026
55c4484
test(cfg): compare normalized relations across twenty processes
caverav Aug 18, 2026
75fc070
test(emit): differentiate structured and forced-DFS artifacts
caverav Aug 18, 2026
d6368c7
fix(cfg): preserve fallback control meaning
caverav Aug 18, 2026
4f8fb54
test(oracle): protect IR and CFG boundary tests
caverav Aug 18, 2026
90b26de
fix(emit): keep omitted helper paths resolvable
caverav Aug 18, 2026
6240c6c
fix(emit): classify structured declines and roll them back whole
caverav Aug 18, 2026
4c6f5d5
test(bench): follow the emitter's surviving helper bodies
caverav Aug 18, 2026
69a365f
docs(protocol): adjudicate the omitted-path collapse
caverav Aug 18, 2026
01fbcac
test(emit): read the output around the first omitted helper
caverav Aug 18, 2026
b5c9a38
test(emit): pin helper-body omissions to the function
caverav Aug 18, 2026
62f0dbb
test(oracle): verify protected digests in CI
caverav Aug 18, 2026
e5e422d
docs(protocol): adjudicate executable section 7 digests
caverav Aug 18, 2026
901ae0a
fix(emit): invalidate stale bindings from unmodelled writes
caverav Aug 18, 2026
97ac9e8
fix(emit): keep text rewrites inside syntax boundaries
caverav Aug 18, 2026
0927b49
fix(emit): bind annotations to their own render line
caverav Aug 18, 2026
9e89ae2
fix(core): name a contested pool target by pool index
caverav Aug 18, 2026
68b3c2c
test(emit): compare whole artifact sets across twenty processes
caverav Aug 18, 2026
6e0ca2b
fix(emit): read helper structure through the code-span scanner
caverav Aug 19, 2026
37e7334
test(report): plant every decline cause and traversal event
caverav Aug 19, 2026
c93e415
fix(emit): decide a 32-bit read by its producer width
caverav Aug 19, 2026
75fa594
fix(emit): name the atomic destination the load writes
caverav Aug 19, 2026
7e3b907
docs(research): rebind rewritten commit citations
caverav Aug 19, 2026
a37da0c
fix(emit): account for every provenance candidate
caverav Aug 19, 2026
37b74d6
fix(oracle): bind values to predecessors
caverav Aug 19, 2026
3ed16cb
fix(emit): parse generic calls in code spans
caverav Aug 19, 2026
76c96d8
fix(emit): protect recovered data spans
caverav Aug 19, 2026
bc08d96
test(emit): cover every rollback state family
caverav Aug 19, 2026
ccbc849
test(emit): refresh determinism ruler
caverav Aug 19, 2026
40b6ea9
test(oracle): protect emitter repair rulers
caverav Aug 19, 2026
84a0db5
fix(cfg): account repeated emitted copies
caverav Aug 19, 2026
87f47ca
docs(research): refresh performance reference
caverav Aug 19, 2026
063326b
docs(research): correct performance evidence
caverav Aug 19, 2026
3f4f6b6
docs(research): correct pre-correctness ceiling
caverav Aug 19, 2026
d30468d
perf(emit): avoid duplicate register clones
caverav Aug 19, 2026
8f236aa
perf(benchmark): add phase resource ruler
caverav Aug 19, 2026
4172a68
perf(benchmark): bind separate resource scoring
caverav Aug 19, 2026
15f5eda
test(benchmark): protect resource ruler
caverav Aug 19, 2026
d34e463
test(benchmark): fail closed on ruler deletion
caverav Aug 19, 2026
745310e
docs(research): record phase resource evidence
caverav Aug 19, 2026
74dc6d4
docs(research): record final performance result
caverav Aug 19, 2026
ef096bd
feat(emit): reconcile block identity ledger
caverav Aug 19, 2026
4c249c7
revert(emit): remove unaccepted E1 candidate
caverav Aug 19, 2026
c4cacb2
docs(research): disclose failed final contract
caverav Aug 19, 2026
177670e
fix(accounting): reject invalid block ledgers
caverav Aug 19, 2026
a8217dc
fix(accounting): bind invalid graph evidence
caverav Aug 19, 2026
95383b8
fix(accounting): verify rejected graph witness
caverav Aug 19, 2026
819b95c
fix(core): stabilize artifact ordering
caverav Aug 19, 2026
59cc313
docs(research): record IR CFG emitter results
caverav Aug 19, 2026
28fef99
fix(ir): make target radix explicit
caverav Aug 19, 2026
773cd93
fix(cfg): classify DFS loops by dominance
caverav Aug 19, 2026
2e0c2de
fix(emitter): merge state at entry loops
caverav Aug 19, 2026
81f9bc1
test(oracle): protect block ledger contract
caverav Aug 19, 2026
f12a890
ci(guards): enforce every local guard in GitHub CI
caverav Aug 19, 2026
e1287af
docs(oracle): complete the DFS loop-relation record
caverav Aug 19, 2026
09217a6
docs(oracle): correct the protected-digest accounting
caverav Aug 19, 2026
9d15bc9
docs(oracle): scope every history digest to its commit
caverav Aug 19, 2026
79e49df
docs(oracle): scope history claims
caverav Aug 19, 2026
bf4749e
docs(oracle): preserve rewritten run provenance
caverav Aug 22, 2026
3936187
docs(compat): pin a reproducible public real-binary baseline
caverav Aug 22, 2026
ce39132
docs(compat): repair the real-binary baseline evidence gaps
caverav Aug 22, 2026
b324b5a
docs(compat): precision repair
caverav Aug 22, 2026
2186654
docs(compat): definition repair
caverav Aug 22, 2026
8e84067
docs(compat): clarity repair
caverav Aug 22, 2026
5394347
docs(compat): disclose the guard-polarity flip
caverav Aug 22, 2026
39b55c3
perf(evidence): freeze correctness head
caverav Aug 22, 2026
893f6a1
test(perf): fail closed on raw evidence
caverav Aug 22, 2026
9fb3522
docs(perf): refresh raw benchmark evidence
caverav Aug 22, 2026
546bf1e
docs(research): close public evidence gaps
caverav Aug 22, 2026
af93ea5
docs(performance): record post-correctness profile
caverav Aug 22, 2026
55e4de1
docs(performance): record trial results
caverav Aug 22, 2026
dfa6564
fix(emitter): count unresolved control flow from the finished body
caverav Aug 22, 2026
c8ebe24
docs(compat): adjudicate the real-binary semantic differences
caverav Aug 22, 2026
e4d15fa
test(compat): count the invalid-CFG body as an unresolved site
caverav Aug 22, 2026
b74db8e
docs(resource): adjudicate the accounting digests
caverav Aug 22, 2026
42e1c62
docs(compat): pin the product state and record the exact-function runs
caverav Aug 22, 2026
22d1739
docs(compat): close the public status of the adjudicated items
caverav Aug 22, 2026
ed90d54
refactor(compat): drop an unused pattern from the semantics oracle
caverav Aug 22, 2026
53cb733
docs(compat): record the cold-build reproduction and the measured wal…
caverav Aug 22, 2026
89a695b
fix(emitter): count calls from final artifacts
caverav Aug 23, 2026
8b9dd23
test(quality): reconcile helper call totals
caverav Aug 23, 2026
53f644d
docs(compat): reconcile final call evidence
caverav Aug 23, 2026
53db30f
docs(cli): document emission diagnostics
caverav Aug 23, 2026
9cbcab2
docs(readme): replace non-ASCII arrows
caverav Aug 23, 2026
a54ffa7
docs(delivery): record atomic history repair
caverav Aug 23, 2026
b7718d4
docs(research): close stale R8 risk note
caverav Aug 23, 2026
29c497e
Merge branch 'main' into research/ir-cfg-emitter
caverav Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
56 changes: 56 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,67 @@ jobs:
- name: Lint shell scripts
run: nix develop -c ./scripts/lint-shell.sh

# The checker self-tests and the annotation and provenance plant tests are
# Python, so without this lane they were enforced only by
# `scripts/ci-check.sh` on a developer machine. Run through the flake
# because the script needs `mapfile -d`, which macOS bash 3.2 lacks.
- name: Lint Python scripts
run: nix develop -c ./scripts/lint-python.sh

# The pre-measurement identity gate decides whether a benchmark run is
# comparable at all, and its regression suite is plain bash with no
# toolchain of its own, so it is invoked exactly as `scripts/ci-check.sh`
# invokes it.
- name: Benchmark identity gate
run: ./scripts/bench-identity-gate-test.sh

- name: Clippy
run: nix develop -c cargo clippy --workspace --all-targets -- -D warnings

# Named targets, not --workspace: `autotests = false` or a deleted file
# would leave --workspace passing with a quietly smaller suite.
- name: Oracle loader guard
run: nix develop -c cargo test -p flutterdec-decompiler --test provenance_audit --test loop_entry_provenance_audit --test arm64_control_effects --test cfg_identity --test dfs_loop_address_invariance --test entry_loop_state_merge --test helper_syntax_boundaries --test rewrite_boundaries --test unmodelled_write_effects --test register_width_provenance --test atomic_rmw_effects --test annotation_anchor_identity --test provenance_accounting --test block_ledger_contract

- name: Core oracle loader guard
run: nix develop -c cargo test -p flutterdec-core --test pipeline_determinism

- name: IR oracle loader guard
run: nix develop -c cargo test -p flutterdec-ir --test branch_target_radix

# The compiled inventory, not the loader source text. A comment, a `cfg`
# that is never true, or a macro that swallows its argument leaves a hook
# byte-identical while removing the oracle it loads from the build.
- name: Compiled oracle inventory
run: nix develop -c python3 scripts/check-oracle-inventory.py

# The auxiliary resource inventory: the benchmark harness digests plus the
# allocator and phase-stack loaders that the resource ruler depends on.
# Separate protocol, separate digest table, same fail-closed shape.
- name: Resource ruler inventory
run: nix develop -c python3 scripts/check-resource-ruler.py

- name: Test
run: nix develop -c cargo test --workspace

- name: Build release CLI
run: nix develop -c cargo build -p flutterdec-cli --release

# The benchmark harness is its own workspace root, so every `--workspace`
# and root `--all` lane above stops at its manifest. That exclusion is what
# keeps its `bench-spans` instrumentation out of the product checks, and it
# is also why the harness needs its own three lanes here.
- name: Benchmark harness format
run: nix develop -c cargo fmt --manifest-path crates/flutterdec-bench/Cargo.toml --all --check

- name: Benchmark harness clippy
run: nix develop -c cargo clippy --manifest-path crates/flutterdec-bench/Cargo.toml --all-targets -- -D warnings

# Linux only, and not a weakened lane: the harness reads its peak RSS from
# `/proc/self/status`, and `host_identity_is_readable_on_this_platform`
# asserts that value is present, so the suite is Linux-only by
# construction. `scripts/ci-check.sh` is a Linux gate, this runs the same
# command there, and it fails the job when it fails.
- name: Benchmark harness tests
if: runner.os == 'Linux'
run: nix develop -c cargo test --manifest-path crates/flutterdec-bench/Cargo.toml
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
/target
# The benchmark harness is its own workspace root, so it builds into its own
# target directory rather than the workspace one above.
/crates/flutterdec-bench/target
/result
/.direnv
/dist
/out
/.post-correctness-tmp/
/.worker-tmp/
/.zenith-validator/
/.venv
*.log
/adapters/installed/*
Expand Down
6 changes: 6 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ members = [
"crates/flutterdec-ir",
"crates/flutterdec-decompiler",
]
# The benchmark harness is deliberately not a member. It depends on
# `flutterdec-decompiler` and `flutterdec-core` with `bench-spans` on, and
# workspace feature unification would then turn that instrumentation on for
# every product build and test in the workspace. It stays buildable on its own
# with `--manifest-path crates/flutterdec-bench/Cargo.toml`.
exclude = ["crates/flutterdec-bench"]
resolver = "2"

[workspace.package]
Expand Down
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,10 @@ Main outputs under `-o <OUT_DIR>`:
- `engine_symbol_ingestion` for auto-loaded local engine symbol cache matches keyed by `libflutter.so` build id
- `bootflow_discovery` entries tagged by `source` (`adapter`, `manifest`, `apk_startup`)

For the complete public emission-counter schema, units, block-ledger semantics,
and record-split rejection diagnostics, see
[`docs/cli-reference.md`](docs/cli-reference.md#emission-diagnostics-in-qualityjson).

## See The Pipeline

The goal of these examples is simple: show original public source first, then show what `flutterdec` recovers from the shipped APK.
Expand Down Expand Up @@ -480,7 +484,7 @@ This source is ordinary app UI code. It builds a ping badge with `BoxConstraints

<p align="center"><strong>Recovered 2: From The ZedSecure APK With flutterdec</strong></p>

<p align="center"><strong> ARM64</strong></p>
<p align="center"><strong>Next: ARM64</strong></p>

At the machine-code layer, the APK still looks like indirect selector dispatch through pool-loaded metadata and call targets.

Expand All @@ -489,7 +493,7 @@ At the machine-code layer, the APK still looks like indirect selector dispatch t
</p>

<p align="center">
<strong> Function IR</strong>
<strong>Next: Function IR</strong>
</p>

<p align="center">
Expand All @@ -499,7 +503,7 @@ At the machine-code layer, the APK still looks like indirect selector dispatch t
The IR stage makes the selector-bearing pool values explicit before readability passes.

<p align="center">
<strong> Pseudocode</strong>
<strong>Next: Pseudocode</strong>
</p>

<p align="center">
Expand Down
Loading