franken_engine: FrankenEngine: The JavaScript Runtime That Tries to Prove Its Own Claims
A Rust runtime for hostile extension workloads, where containment, replay, and evidence are built into the engine instead of bolted on after the breach.
- FrankenEngine treats security as an evidence system, not a permissions checklist.
- Its real novelty is that claims, replay, and containment are part of the runtime’s core loop, not add-on tooling.
- The lowering pipeline turns ordinary JavaScript into labeled, inspectable artifacts that can be denied, replayed, or quarantined.
- This is narrower than Node, Deno, or Bun, but far more radical for hostile extension workloads.
Most runtimes ask a simple question: can this code run? FrankenEngine asks a harsher one: can we prove what happened, prove what should have happened, and replay the gap? That shift changes the whole shape of the system. Security stops being a policy file and becomes an evidence trail.
FrankenEngine is a from-scratch Rust execution substrate where security, replay, and evidence are first-class concerns of the core pipeline rather than instrumentation around it.
The README Is Not Allowed to Lie
The repo’s sharpest idea is almost bureaucratic. Public claims are supposed to have artifacts behind them, so the project turns documentation into something closer to governed output. That is why the headline feature here is not just a runtime, but a claim-to-proof posture.
That matters because open-source often fails in a familiar way. Benchmarks drift, promises outrun code, and security claims get fuzzy fast. FrankenEngine tries to make that gap expensive.
I understand this isn't in sync with the prevailing open-source ethos that seeks community contributions, but it's the only way I can move at this velocity and keep my sanity.
What FrankenEngine Is Actually For
This is not a general-purpose Node replacement. The target is adversarial extension workloads, where the host must assume third-party JavaScript or TypeScript can be malicious, buggy, or both. In that setting, a permission prompt is not enough. You need containment, provenance, and a way to reconstruct incidents byte for byte.
| Runtime | Primary focus | Replay and evidence | Best fit |
|---|---|---|---|
| Node.js | Ecosystem breadth | External tooling required | General application servers |
| Deno | Safer default runtime | Limited forensic posture | Modern JS and TS apps |
| Bun | Speed and integration | Not designed for auditable replay | Fast developer workflows |
| FrankenEngine | Hostile extension containment | Built into the engine | Untrusted extensions and agentic systems |
That is the key framing: FrankenEngine is solving a narrower problem than the incumbents, but a much nastier one. It is trying to make JavaScript safe enough to run where trust is thin and the cost of ambiguity is high.
A Runtime Built Around Evidence
The architecture makes more sense once you see the whole chain. ASTs become canonical values, lowering passes generate witnesses, and the IR stages carry information-flow labels that separate safe movement from forbidden leakage. The important thing is not transformation alone. It is transformation plus traceability.
How the Lowering Pipeline Turns Code Into Proofs
This is where the project becomes more than a story about Rust. The pipeline is built so that compilation is also enforcement. If a piece of data wants to move from secret to public, the runtime can classify the path, mark it, and produce a denial artifact instead of pretending the problem never existed.
That is why the names matter: Ir2FlowProofArtifact, PassWitness, and IFC labels are not decorative abstractions. They are the mechanism that turns execution into evidence. The code is trying to prove that flow was either permitted or rejected, and it wants the proof to survive outside the running process.
// Conceptual shape of the pipeline, simplified
source -> AST -> IR0 -> IR1 -> IR2 -> IR3
| | | |
canonical passes IFC execution
hash witness labels artifacts
// A forbidden flow produces a denial artifact
// A permitted flow produces a signed proof trail
Why Deterministic Replay Changes the Debugging Game
FrankenEngine’s replay story is not about convenience. It is about making incidents reproducible under pressure. The baseline interpreter and its execution profiles are built so the same inputs can produce the same artifact chain in deterministic mode, which is what turns a crash, leak, or policy violation into something an operator can actually study.
The detail that stands out is mundane and important at once: floating-point behavior gets a special wrapper and total_cmp semantics so replay does not wobble across hardware. That is the difference between a debugging feature and a forensic record.
In other words, the runtime is not chasing only correctness. It is chasing repeatable correctness under observation.
Containment Is Not a Binary Decision
The containment executor treats extension state as a lifecycle, not a yes-or-no switch. Running can become challenged, sandboxed, suspended, terminated, or quarantined. That makes the policy model feel more like incident response than access control.
| State | What it implies | Operational goal |
|---|---|---|
| Running | Execution is currently allowed | Continue normal work |
| Challenged | Behavior needs scrutiny | Collect more evidence |
| Sandboxed | Activity is constrained | Limit blast radius |
| Suspended | Execution is paused | Prevent further harm |
| Terminated | Execution is ended | Stop the process |
| Quarantined | Execution is ended with evidence | Preserve a replayable incident bundle |
That lifecycle is the tell. FrankenEngine is not optimizing for the cleanest possible allow-deny API. It is optimizing for what happens after the host starts doubting the code it is running.
Why This Beats a Normal Runtime, and Where It Doesn’t
Compared with Node, Deno, Bun, and Wasmtime, FrankenEngine wins on a very specific axis: auditable trust under adversarial conditions. It is built to make exfiltration harder, incident reconstruction easier, and public claims more accountable.
It likely loses on ecosystem size, maturity, and raw speed. That is fine. The project is not trying to be the default runtime for everything. It is trying to be the runtime you reach for when the cost of being wrong is high and the code you are running is not on your side.
The Bet Behind the Project
FrankenEngine is betting that the future of extension platforms and agentic systems will require cryptographic accountability, not just sandboxing. If that bet pays off, the interesting unit is no longer the engine alone. It is the chain of claims, proofs, and replay artifacts that surrounds it.
That is a pretty radical place to end up for a JavaScript runtime. But it is also a useful one: if the code is untrusted, the evidence had better be trusted.