Back to flin
flin

30 TODOs, 5 Production Panics, 0 Security Issues

The audit results: 30 TODO markers, 5 production panic calls, and zero security vulnerabilities.

Thales & Claude | March 25, 2026 9 min flin
flinaudittodospanicssecurityresults

Every programmer writes TODOs. They are promises to your future self -- markers left in the heat of implementation, when the feature at hand matters more than the edge case you just noticed. In a codebase built across 301 sessions, those promises accumulate. The question is never whether TODOs exist. The question is whether they represent minor polish or ticking bombs.

FLIN's audit catalogued every open item in 186,252 lines of Rust. Thirty TODOs, ranging from a missing storage backend to an outdated compiler warning message. Five production panic calls that could theoretically crash the runtime. And, in the most welcome finding of the entire audit, zero security vulnerabilities -- no SQL injection vectors, no XSS in template rendering, no path traversal in file operations, no hardcoded secrets.

Here is the full inventory.

The TODO Taxonomy

Not all TODOs are equal. The audit classified each one by severity based on two criteria: how likely is it that a user will hit this code path, and what happens when they do?

Severity Distribution:
  CRITICAL  --  2  (blocks core functionality)
  HIGH      --  4  (degrades important features)
  MEDIUM    -- 11  (affects secondary features)
  LOW       -- 13  (cosmetic or rare edge cases)

The two critical TODOs were both in the core execution path. TODO-001 was the unimplemented storage.destroy_entity() method in the database module -- meaning that destroy commands (hard deletes) appeared to work but never actually removed data from disk. TODO-003 was the missing CloseUpvalue emission in the codegen module -- meaning that closures capturing mutable variables could exhibit incorrect behavior when the enclosing scope exited.

// TODO-001: database/zerocore.rs line 4488
// The destroy command executed in memory but never persisted
fn destroy_entity(&mut self, entity_type: &str, id: u64) {
    // In-memory removal worked fine
    self.collections.get_mut(entity_type)
        .map(|c| c.remove(&id));

// But disk persistence was missing: // TODO: Implement storage.destroy_entity() to remove from disk // Result: destroyed entities would reappear after server restart } ```

// TODO-003: codegen/emitter.rs line 325
// Closures did not close over upvalues on scope exit
fn end_scope(&mut self) {
    // Variables go out of scope...
    // TODO: Emit CloseUpvalue when full closure support is implemented
    // Result: mutable captures could read stale values
}

These were not theoretical risks. Any FLIN application using destroy would experience data resurrection on restart. Any FLIN application using closures with mutable captures could see stale state. Both bugs were subtle enough that they might not be noticed for weeks -- and debugging them without the audit trail would have been enormously time-consuming.

The High-Priority Items

The four high-priority TODOs affected features that worked partially but had correctness gaps:

TODO-002: Transaction WAL entries. Transactions executed correctly in memory but did not write grouped entries to the Write-Ahead Log. This meant that a crash during a transaction commit could leave the database in a partially committed state -- exactly the scenario transactions are designed to prevent.

TODO-004 and TODO-012: Destructuring codegen. Two related TODOs marking the same gap -- destructuring patterns in let statements (let [a, b, c] = list) did not generate bytecode. The parser accepted the syntax, the typechecker validated it, but the codegen silently produced no output.

TODO-020: Component click handler serialization. When FlinUI components like

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles