The Ghidra pass on Wispr Flow's helper
What Ghidra did in this project, why it did not run at the start, what it proved, and what it changed. Wispr Flow 1.6.1102 on Windows 11. 2026-10-11. Home · Teardown section 7 · Development journey
Short answer
- Was Ghidra used? Yes, in the second pass only. The first pass used no disassembler.
- On what? Only on
Wispr Flow Helper.exe, the one machine-code part of Wispr Flow. The rest of the app is JavaScript, and REA reads JavaScript without a disassembler. - How? REA 6.3.0 used Ghidra 12.1.4 as its native-code engine. I read 21 paste functions as Ghidra pseudocode. Each one has an REA Evidence ID.
- Was flowlite rebuilt after it? Yes.
flowlite/flowlite.pynow uses the paste rules that Ghidra proved. The tests ran again after the change. - Why did REA not install and start Ghidra at the beginning? REA never installs Ghidra; it uses only an installation that you point it to with
GHIDRA_INSTALL_DIR. That variable was not set. Also, I did not check the engines in the first pass. See section 2.
1. Project status
- Repository: github.com/az9713/wispr-flow-rea-teardown, branch
main. - Ghidra commit:
0f18137"Redo the helper teardown with Ghidra; apply its paste rules to flowlite". It changed 30 files: 2,872 lines added and 22 removed. - Live pages: az9713.github.io/wispr-flow-rea-teardown. Section 7 of the teardown shows the Ghidra results.
- Contents: the teardown report, the development journey (17 sections), the index page with run steps and limits,
flowlite/,ghidra/(21 pseudocode files andevidence.tsv), andtools/. - State: the Ghidra pass is complete. The open items are in section 10.
2. Why Ghidra did not run at the start
Wispr Flow is a Windows app, but most of it is not machine code. It is an Electron app: 133 MB of JavaScript in app.asar. Only one 20,228,632-byte file, Wispr Flow Helper.exe, is machine code. Speech capture, the server connection and transcription are all in the JavaScript. So the first pass answered most of the brief without a disassembler. Only the helper's paste rules needed one.
Ghidra did not run on the helper in the first pass for five reasons. Three are REA design rules. One is the harness, and one is my error.
Reason 1 (REA design): REA never installs Ghidra or Java
REA's own documentation states this in three places:
"REA does not install or upgrade Ghidra, Java, Python, npm, Node.js, Hopper, or a compiler." (docs/windows-ghidra-p0.md)
"Setup never installs Ghidra, Java, or Python." … "writes only after approval, and never downloads, installs, upgrades, or modifies Ghidra or Java." (docs/installation.md, Ghidra section)
"Extract Ghidra and install the JDK outside REA, then export absolute paths". (docs/installation.md)
The REA skill that I followed gives the same rule to the agent: "REA setup never installs or upgrades Node.js, npm, Homebrew, Java, Ghidra, IDA, JADX, Binwalk, or Unblob. Use existing prerequisites". The documentation does not give the reason for this rule. INFERRED Ghidra is third-party software: the download is 569,649,598 bytes, and it needs its own JDK. An install of that size changes the PC outside REA's own files.
Reason 2 (REA design): REA does not search the disk for Ghidra
REA finds Ghidra only through the environment variable GHIDRA_INSTALL_DIR. rea doctor reported missing_analysis_engine with the message GHIDRA_INSTALL_DIR is not set. But a Ghidra 12.1.4 copy was already on this PC, in the user's tools folder. A different session had put it there on 2026-10-10. REA could not see it, because the variable was not set.
Reason 3 (REA design): the other two engines were not usable here
- Hopper is the only engine that REA setup can install, and only after approval. REA's documentation says: "Hopper installation remains unavailable on Windows."
- IDA is commercial software. REA uses it only through an existing
ida-pro-mcpregistration.rea doctorreportedIDA MCP registration is not configured. - Ghidra on Windows is an "experimental Windows x64 P0" boundary. It is read-only: 25 inventory and analysis operations, and no renames or comments in the Ghidra database.
Reason 4 (harness): the MCP calls stopped on a timeout
In the first pass, the REA MCP calls ran for a long time with no progress, and Claude Code stopped them on its MCP idle timeout:
analyze_javascript_applicationon the 133 MB ASAR: no progress for 3,385 s.inspect_managed_artifacton the helper: no progress for 3,666 s.
This is a limit of the harness (Claude Code), not of the model or of REA. Even with a configured Ghidra, a long Ghidra run through Claude Code's MCP connection would have met the same limit. The second pass did not use Claude Code's MCP connection for this reason (see section 4).
Reason 5 (my error): I used the wrong tool and did not check the engines
- The REA skill routes a ".NET NativeAOT PE/ELF" file to "native Ghidra analysis". I first sent the helper to
inspect_managed_artifact, which reads managed .NET files. The helper has no CLR header (the header directory is0 0), so that tool did not apply. - I did not run
rea doctorto check the engines in the first pass. - My first report gave the timeouts as the reason the helper was not decompiled. That was incomplete. The missing engine was the real blocker. The teardown and the journey now say this.
- The rule from the skill, "use existing prerequisites", meant that an install of Ghidra needed your request. You asked for it in the second pass ("do all these steps and use Ghidra to redo the teardown and rebuild the app").
Rule learned: "Check that the engine exists before you blame the timeout."
3. The role of Ghidra
What Ghidra did
- Engine behind REA. REA started Ghidra in headless mode (no window) and sent it requests. REA set
REA_ANALYSIS_PROVIDER=ghidra. REA gave each result an Evidence ID. - Disassembly and analysis. Ghidra turned the 20 MB helper into 56,803 functions and found 14,969 strings. Evidence:
ev_63ff9ab0f8afa4dfd337adbc0aea57e776623c5a8e10cf35790ae26bea871bab. - Cross-references. Ghidra listed which code uses which address. This was how I found the paste code (see section 5).
- Pseudocode. Ghidra's decompiler turned 21 functions into readable C-like code. This is a reconstruction of the machine code, not the original source.
What Ghidra did not do
- No function names. NativeAOT removes the .NET names. Ghidra calls each function
FUN_plus its address. I gave the names, such as "SimulatePaste", from the log messages inside each function. - No saved names in Ghidra. Windows Ghidra in REA is read-only, so my names are only in the files in
ghidra/. - No NativeAOT type recovery. REA has an optional adapter for this (
ghidra-nativeaot). Its documentation lists only targets "analyzed on Linux x64", .NET runtime 8.0.22, and a JAR that you build yourself. I did not use it. - No runtime observation. Ghidra reads the file. It does not run the helper. So it cannot show which branch runs on your PC.
- No work on the JavaScript. Speech capture, the gRPC stream and transcription stay as REA's JavaScript analyzer found them.
4. Setup and run
- Java. JDK 23.0.2 was already installed at
C:\Program Files\Java\jdk-23, withjavac. Ghidra 12.1 needs JDK 21 or newer. - Download.
ghidra_12.1.4_PUBLIC_20260921.zip, 569,649,598 bytes. Its SHA-256 matched the release note:ddac49f903da9d5bac833e5cc79395098b9c33cfd3279be5f31bd00387d2d4db. - Unzip. I used
C:\Windows\System32\tar.exe. It printed manyCan't unlink already-existing object: Permission deniedlines. The folder already held the copy from 2026-10-10, and a Ghidra process from that session still held its files open. I compared the folder with the zip: 5,219 files, 0 missing, 0 size differences. I did not stop that process, because I had not started it. - Environment. I set
GHIDRA_INSTALL_DIRas a permanent user variable. Claude Code's REA MCP server had started before that, so it still cannot see Ghidra. A restart of Claude Code fixes this. - First run failed.
rea analyze ... --provider ghidrastopped after 340 s with"code": "provider_timeout","operation": "list_documents","timeout_ms": 330000. REA's default startup limit is 330,000 ms (5.5 minutes). - Time limit raised. REA's documentation names the fix,
REA_GHIDRA_STARTUP_TIMEOUT_MS. I set it to 10,800,000 ms (3 hours). - One session for all queries. Each REA CLI command imports and analyzes the file again, because REA's Ghidra project is temporary. So I wrote
tools/rea_session.mjs. It startsrea --mcpas a child process, keeps one Ghidra session open, and runs requests from a folder queue. It does not go through Claude Code's MCP connection, so the idle timeout does not apply. - Analysis time.
open_binaryreturned in 0.2 s. The first deep request,binary_overview, waited for Ghidra's analysis. Ghidra's log saidTotal Time 1310 secs, thenAnalysis succeeded. 1,310 s is about 22 minutes, about 4 times REA's default limit. - Close. I closed the session with
close_binaryand saved a snapshot of the results: 796,889 bytes, 79 Evidence records. I stopped my driver by its task ID. Its REA server and Ghidra process ended.
Other errors on the way, with their fixes:
SyntaxError: Bad escaped character in JSON at position 41:printfhad changed the backslashes in a Windows path in a queue file. Fix: write queue files from Node, and skip a bad file instead of a crash.UnicodeEncodeError: 'charmap' codec can't encode character '\u9810'intools/strs.py, when a pointer was not a real string. Fix: keep only ASCII text.
5. Method: finding code without names
- The usual method is to search for the Windows functions that paste:
SendInput,SetClipboardData,SetWindowsHookExW. REA'sfind_xrefs_to_namereturnedname_not_foundfor all three. The helper does not import them by name in its import table. - The helper writes log messages, such as "Pasted successfully using delayed clipboard manager". Ghidra found these as strings. But a search for code that uses the string's address returned an empty list (
[]). - The reason: in NativeAOT, a string is a .NET object. The object has an 8-byte type pointer and a 4-byte length, then the characters. The code points at the start of the object, which is 12 bytes (
0xC) before the characters. - So I asked REA for references to string address − 12. That found the function behind each log message. Example: the reference at
0x1403256d8for "Pasted successfully using delayed clipboard manager". - I read each function as pseudocode and followed its calls to the next function.
tools/strs.pywrites the string text next to eachPTR_DAT_reference in the pseudocode, so the files can be read without Ghidra.
Rule learned: "A NativeAOT string reference points 12 bytes before the text."
6. What Ghidra proved
PROVEN These rules come from the pseudocode, its constants and its log strings.
- Two paste paths.
- Delayed-render path (first try). The helper registers the text on the clipboard without copying it, then presses the paste keys. When the target app reads the clipboard, Windows sends the helper message
0x305. The helper then supplies the text as format13, format1or the HTML format, and logs"Clipboard read detected! Rendering delayed data...". This is how the helper knows that the paste reached the app. - Regular path (fallback). The helper uses it if the delayed-render path fails, or if the text has
{{TAB}}or{{BREAK}}markers. It saves the clipboard, writes the text, presses the keys, then restores the clipboard.
- Delayed-render path (first try). The helper registers the text on the clipboard without copying it, then presses the paste keys. When the target app reads the clipboard, Windows sends the helper message
- Formats written.
Text, and alsoHTML FormatwhenhtmlTextis not empty. - Paste keys. Ctrl+V is the key array
0x560011(key code0x11Ctrl,0x56V). Shift+Insert is0x2d0010(0x10Shift,0x2DInsert). The helper uses Shift+Insert only when the flagshift-insertis on and the focused process isCursor,WindsurforCode. Otherwise it uses Ctrl+V. - Key timing. It sends all key-downs in one
SendInputcall, waits 50 ms (Sleep(0x32)), then sends all key-ups. It tries a failed key-up again once. - Waits. 50 ms after the keys (
"Pasted text in window, now sleeping for 50 ms for paste to complete"). In marked text: 150 ms before a Tab key, and 50 ms between sections. On the regular path: 500 ms, then the restore. - Restore delay for each app (delayed-render path). The helper compares the start of the process name, upper and lower case equal (comparison mode
5):If the app does not read the clipboard in that time, the helper logsApps (process name starts with) Restore delay Time limit for the app to read the clipboard vncviewer,tvnviewer,mstsc,msrdc,wfica32,vmware-view,rdcman,anydesk,teamviewer(remote-desktop apps)5,000 ms 3,000 ms OUTLOOK,olk,WINWORD,WhatsApp3,000 ms 3,000 ms All other apps 500 ms 1,000 ms "Clipboard not read within timeout -- paste likely failed"and reports a failure. - No restore when the clipboard changed after the paste (
"Clipboard changed since paste, skipping restoration"), or when the flagdisable-clipboard-restoreis on. - What is saved and restored. FormatsToRestore:
Text,UnicodeText,HTML Format, the bitmap and image formats, and the Windows clipboard-history markers (CanIncludeInClipboardHistory,CanUploadToCloudClipboard,ExcludeClipboardContentFromMonitorProcessing,Clipboard Viewer Ignore). FormatsToIgnore:FileDrop,Rich Text Format,Portable Document Format,WaveAudio,Csvand others. Any other format is logged as"Found unknown clipboard format". - Safety checks.
- If a modifier key is held, the helper reports failure cause 2.
- When the flag
windows-key-up-simulationis on, it releases a held Alt (key codes0x12,0xA4,0xA5) or Windows key (0x5B,0x5C) with a "masking sequence" that uses Ctrl (0x11). - If the target window runs at a higher privilege level (for example, as administrator), the paste fails with cause 4,
UIPI_RESTRICTIONS. - If the keys were already sent, it does not paste again on the regular path, so the text cannot appear twice.
- Threading. The regular path runs on an STA thread. If the caller is not on one, the helper starts a new STA thread and waits for it.
7. Inferred and still hidden
INFERRED
- The function names in section 11. Each name comes from the log strings inside that function, not from a symbol.
- The Windows names of the numbers:
0x305/0x306=WM_RENDERFORMAT/WM_RENDERALLFORMATS, and formats13/1=CF_UNICODETEXT/CF_TEXT. The numbers are in the code. The names come from my knowledge of Win32, not from the binary. - Comparison mode
5=OrdinalIgnoreCase(.NET knowledge, not in the binary). - The purpose of a third list in the format setup function. It names the apps
Cursor,slack,GitHubDesktop,Discord,Spotify,chrome,brave,Arc,msedge,Opera,MozillaFirefox,Notepad,Windsurf, and the siteschatgpt.com,github.com,google.com,claude.ai,gemini.google.com,replit.com,v0.dev. I did not trace where the helper uses these lists.
STILL HIDDEN
- The live values of the flags
shift-insert,disable-clipboard-restoreandwindows-key-up-simulation. The code has both branches. The server sends the flags. - The keyboard-hook procedure. Only
"Failed to create keyboard hook"andMultiKeybindServicewere found. Not decompiled. - The privilege check
FUN_140322010, the HTML conversionFUN_1403274e0, and the UI Automation text reading. Not decompiled. - Second references to the clipboard-history markers, at
0x140329848and0x140329884. Not read.
8. Consequences of the Ghidra pass
8.1 On the findings
| Topic | Before Ghidra (first pass) | After Ghidra |
|---|---|---|
Message protocol between the app and the helper (PasteText, PasteOutcome, PasteBlocked) | PROVEN from the JavaScript | No change. Ghidra did not touch the JavaScript. |
| Paste keys | HIDDEN. Strings such as SendInput and PasteViaClipboard showed that the helper pastes, but not with which keys. | PROVEN Ctrl+V, or Shift+Insert in 3 editors when a flag is on. |
| Key timing and waits | HIDDEN | PROVEN 50 ms hold, 50 ms after, 150 ms before Tab, 500 ms on the regular path. |
| Clipboard restore rules | HIDDEN. Only the class names ClipboardRestore and ClipboardRestorePolicy were known. | PROVEN 500 / 3,000 / 5,000 ms by app; no restore when the clipboard changed or a flag is on. |
| How the helper knows the paste worked | HIDDEN | PROVEN the delayed-render clipboard and message 0x305; 1,000 or 3,000 ms time limit. |
| Refusals | HIDDEN. Only the message name PasteBlocked was known. | PROVEN modifier held (cause 2), higher-privilege window (cause 4, UIPI_RESTRICTIONS). |
| Which branch runs on a real PC | HIDDEN | STILL HIDDEN. The server flags decide it. |
In the same pass, I checked the teardown again and fixed two errors. Ghidra did not find these; a new count and a new read of the bundles found them:
- The number of database migrations is 169. The report said "~190".
- The report named the gRPC library as
@grpc/grpc-js. It now says "a grpc-node client (library not named…)", because the bundle does not name the library.
8.2 On flowlite
| Behavior | flowlite before | flowlite after (copies the helper) |
|---|---|---|
| Paste keys | Always Ctrl+V | Shift+Insert in code, cursor, windsurf; Ctrl+V in other apps |
| Key timing | keyboard.send("ctrl+v"), no hold | Keys down, 50 ms, keys up in reverse order, then 50 ms |
| Held modifier keys | Not checked | Waits up to 2 s for Ctrl, Shift, Alt and Windows to be released |
| Restore delay | Fixed 0.15 s | 0.5 s; 3 s for Outlook, Word, WhatsApp; 5 s for remote-desktop apps |
| Restore when the clipboard changed | Always restored | Skipped |
| Restore blocks the next dictation | Yes (time.sleep) | No (threading.Timer) |
| Log line | 3.2s audio, 0.85s ASR: '...' | 5.1s audio, 0.92s ASR, python -> ctrl+v, restore 0.5s: "..." |
One difference: Wispr uses Shift+Insert only when its shift-insert flag is on. flowlite has no flags, so it always uses Shift+Insert in those three editors.
Not copied, to keep flowlite small: the delayed-render clipboard, the HTML Format copy, the snapshot of every clipboard format, and the {{TAB}} and {{BREAK}} markers. So flowlite cannot know if a paste reached the app, and it restores only clipboard text. An image on the clipboard is lost.
8.3 Costs
- Download: 569,649,598 bytes.
- Analysis time: 1,310 s (about 22 minutes) before the first answer. Later requests used the open session, so they did not wait for a new analysis.
- Extra code:
tools/rea_session.mjs(60 lines) to work around the 330,000 ms default and the per-command import;tools/strs.py(21 lines) to show string text in the pseudocode. - Two rejected tool calls and one question from you before the run started ("why doesn't Ghidra look into the binary"), then "Go".
8.4 Changes on this PC
- A permanent user environment variable,
GHIDRA_INSTALL_DIR, points to the Ghidra 12.1.4 folder. - The Ghidra folder holds the same 5,219 files as the zip.
- Claude Code's REA MCP tools still cannot see Ghidra until you restart Claude Code.
- The Ghidra process from 2026-10-10 still runs. I did not start it, so I did not stop it.
8.5 Changes in the repository
- New:
ghidra/pseudocode/(21 files),ghidra/evidence.tsv,tools/rea_session.mjs,tools/strs.py, and this page. - Changed:
flowlite/flowlite.py(77 lines),flowlite/receipts/flowlite_injected.log,flowlite/receipts/target.png(cropped to 656 × 189 px),wispr-flow-teardown.html(new section 7),DEVELOPMENT-JOURNEY.html(new section 17),index.html. - No secret values from Wispr's files are in the pseudocode or on these pages.
9. The flowlite rebuild and its tests
flowlite is a Python script, so it has no build step. "Rebuilt" means that I changed flowlite/flowlite.py and ran the tests again, in the same commit, 0f18137.
New parts of the code:
foreground_process()reads the name of the focused app through Windows calls (GetForegroundWindow,GetWindowThreadProcessId,OpenProcess,QueryFullProcessImageNameW).SHIFT_INSERT_APPS = {"code", "cursor", "windsurf"}andpick_keys()choose the paste keys.SLOW_RESTOREandrestore_delay()choose the restore delay from the start of the process name.selftest()holds the checks for these rules.
Test results:
| Test | Result | What it covers |
|---|---|---|
python flowlite.py --selftest | selftest ok | The key choice for each app, and the 0.5 s, 3 s and 5 s delays. This is the only check of the Shift+Insert branch and of the 3 s and 5 s delays. |
python flowlite.py --test test.wav | Let's meet at 6 p.m. on Thursday to review the quarterly report. | Transcription only |
flowlite/receipts/driver.py, inject mode | foreground_is_target: true; the test window got "Let's meet at 6 p.m. on Thursday to review the quarterly report. "; clipboard_restored: true; log 5.1s audio, 0.92s ASR, python -> ctrl+v, restore 0.5s | The full path from audio to pasted text. The test window is a python process, so only the Ctrl+V branch ran. |
| Live voice | Not done | — |
10. Open items
- Not decompiled: the keyboard hook, the privilege check
FUN_140322010, the HTML conversionFUN_1403274e0, and the UI Automation text reading. - Not known: the live flag values. Only a runtime capture of the server's flags could show them.
- Not tested: flowlite with a live voice, and the Shift+Insert branch in a real editor.
- Claude Code: restart it so that the REA MCP tools see Ghidra.
- Old Ghidra process from 2026-10-10: still running; it is yours to stop.
- Receipt file:
flowlite/receipts/driver.pystill contains the name of the test PC's audio device. - Other engines: IDA and Hopper are still not set up. Hopper cannot be installed on Windows through REA.
11. The 21 functions
Each name is INFERRED from the log strings in the function. Each link opens the pseudocode file on GitHub.
| Name (inferred) | Ghidra function | REA Evidence ID |
|---|---|---|
| PasteText | FUN_140325210 | ev_dcadbc2da87cdcb9accca51a40f30008d8d196253852aa77184a1638cccaa035 |
| PasteTextInternal | FUN_140325ec0 | ev_5c80d4f5a8f7c23b962cff65491a5e63fb84f67b399c62c0720dee817050a0f8 |
| PasteRegular | FUN_1403259d0 | ev_3107c101e2232fe2554dfcc240e802a5558dd60f3fea6860fb11c20c9e2487af |
| SimulatePaste | FUN_140324cc0 | ev_1e82ad9e36f4d70d5a77d3d00242672b8fbf172a0052f21f82ca4582d4d60620 |
| SendMultipleKeyEvents | FUN_140322420 | ev_e4cf49c4216da88aec83106d51c761f9adf73d1e071f9e55c2eb2a2eabccbe23 |
| SendMaskingSequence | FUN_140323170 | ev_0b7f777d818d6fe2903427fc9f6443018cd48532f5ee8e191b008ddb6fa75d70 |
| SimulateTab | FUN_140325720 | ev_fa8232b713df8387028f5ca726685cdb5e1d1f876825cd623a26474b0259991f |
| Sleep | FUN_14016a3e0 | ev_a6c8afed1703f254b9ac1f108d1612d31b0bbea3614d471ff39f8ba8f9b4c19c |
| CopyWithFormatting | FUN_140326e60 | ev_8dc21b58ac38790f87852027f56292372a67e0787af469efc26e6cb35c2c6395 |
| RestoreAfterPaste | FUN_140326b76 | ev_d010683ff6d1d581c03156211d5146324e007f004bfeac7bb7dd8dbf8ed81311 |
| RestoreDelayMs | FUN_140318380 | ev_0a153dd50f3f4cdf8c2a0a51144ffa243c9091b31399482590a78bb3e1207250 |
| FailureTimeoutMs | FUN_1403183f0 | ev_9caad8a7122a8f59c1e9718e8fc9db0387bf82c6e5ed019983639c6bfd572b2d |
| ProcessPrefixMatch | FUN_140318320 | ev_db2a095a44aa4e31510f8a32a5da2e0f271ffb1094e32c6cb7e7a8ce5e071893 |
| RestoreDelayAppLists | FUN_140318450 | ev_953a27683c90b4a9fa3f3796ac1966cbea44565e888a45efead90f64fc84ca01 |
| ForegroundAppInit | FUN_140409240 | ev_62474b466f60f64b3f6de80945d4f4bc7ac6681ebda6c61d262fa9dad7b55600 |
| CapturePasteTarget | FUN_1403196b0 | ev_2e36ae139aa1308f38ee98ac2eb7b38e5ccdb8aa4dceff278c8a3dfa210f2e30 |
| LoadDelayedClipboard | FUN_1403186e0 | ev_d0d08a755fa52ab537fdde28e664d4cfeff4d52b61ce876f16b8ad5c18893605 |
| DelayedRenderWndProc | FUN_140319890 | ev_485e2d7d7c324d5656a3de994bd8d7f1e2c7e2303b167b8d827e1a5150bf1198 |
| ScheduleRestore | FUN_140319cf0 | ev_0d0ff5eb9ff59fc4ce85c2e039072540d5ff7d2949101ee95163098ed30f76d3 |
| ClipboardReadTimeout | FUN_140411990 | ev_f382f1ce023ca79de30a20a4f5905b4c72e3ccc5932d5f581d63a3ef559b6545 |
| ClipboardFormatLists | FUN_140327960 | ev_7ccd18a16a303acd80a19274017a1575d560de2869a3ac246a297bf4c2fa9aaf |
12. Where each fact is recorded
| Fact | This page | Teardown §7 | Journey §17 | Index |
|---|---|---|---|---|
| Why no engine ran at first | §2 (full) | §1 (short) | yes | no |
Setup, time limit, rea_session.mjs | §4 | yes | yes | no |
| 1,310 s analysis, 56,803 functions | §3, §4 | yes | 1,310 s only | no |
| 12-byte string method | §5 | yes | yes | no |
| Proven paste rules | §6 | yes | summary | as flowlite limits |
| Inferred and hidden | §7 | yes | no | no |
| Consequences (before and after) | §8 | no | no | no |
| flowlite changes and tests | §9 | no | yes | run steps and limits |
| Functions with Evidence IDs | §11 | yes | no | no |
Sources for section 2: REA 6.3.0 repository documents docs/installation.md, docs/windows-ghidra-p0.md and docs/ghidra-nativeaot.md, and the REA skill reverse-engineer-anything.