So funktioniert es · für Entwickler & Architekten
Quellcode rein.
Sicheres Rust raus.
Constat überführt IBM i Programme (ILE COBOL, RPG IV in fester und freier Form, eingebettetes SQL, DDS und CL) in einen Rust-Workspace, der sich baut und läuft. Ein echter Compiler, kein Skript und kein LLM. Eine Pipeline, kein manuelles Neuschreiben, keine verlorene Logik.
Die Pipeline
Fünf Stufen, durchgängig
Parsen
Ihr RPG, COBOL, DDS und CL werden von einem echten Parser in ein präzises internes Modell eingelesen. Nichts abgeleitet, nichts geraten.
Auf IR absenken
Das Modell wird über typisierte Zwischenrepräsentationen in SSA-Form abgesenkt, sodass jede Operation explizit und erfasst ist.
Optimieren
Compiler-Durchläufe räumen den Code auf, wie es jeder echte Compiler tut, ohne zu ändern, was er berechnet.
Rust generieren
Idiomatisches Rust kommt aus einem beweisgestützten Codegenerator, dazu ein PostgreSQL-Schema, wo DB2 im Umfang liegt.
Verifizieren
Die Ausgabe wird mit maschinengeprüften Beweisen (Lean 4) und SMT-Solvern (Z3, CVC5) auf Äquivalenz geprüft und mit prüfbaren Nachweisen verpackt.
Exaktes Verhalten
Was erhalten bleibt
Geschäftslogik wird nicht angenähert. Die Ausgabe reproduziert genau die Teile der IBM i Semantik, die ein naiver Konverter falsch macht:
- 01
Gepackte und gezonte Dezimalarithmetik, bis zur letzten Stelle
- 02
EBCDIC-Sortierung und Zeichensemantik
- 03
REDEFINES / OCCURS Satz- und Speicherstruktur
- 04
PERFORM / GO TO Kontrollfluss
- 05
Plattformdienste: Data Queues, Nachrichtenwarteschlangen, Data Areas, Spool, Journaling
So beweisen wir es
Ein verifizierter Compiler, und eine klare Vertrauensgrenze
Die meisten Werkzeuge prüfen die Ausgabe im Nachhinein. Constat verifiziert den Generator selbst und benennt dann genau, was vertraut statt bewiesen bleibt.
- 01
Der Generator ist der Beweis
Der Codegenerator ist selbst ein Programm, geschrieben und maschinengeprüft in einem Theorembeweiser. Was Ihr Rust schreibt, ist genau das, worüber die Beweise sind, keine separate Spezifikation.
- 02
Am Generator bewiesen, pro Programm nachgeprüft
Die Korrektheit des Generators wird einmal im Beweiser maschinell geprüft, sodass das, was Ihr Rust schreibt, genau das ist, worum es in den Beweisen geht. Jedes Programm wird zusätzlich mit Ihren Eingaben durchgängig geprüft. Wo eine Operation noch nicht modelliert ist oder das erzeugte Rust einen auditierten Nachbearbeitungsschritt braucht, zählen wir das zur Vertrauensgrenze, statt es als bewiesen auszugeben.
- 03
Zwei Solver, unabhängig gegengeprüft
Darüber hinaus werden migrierte Programme von den Solvern Z3 und CVC5 geprüft, die ihre Arithmetik und Datenverarbeitung über die von uns modellierten Operationen als äquivalent beweisen, mit einem zweiten Solver als unabhängiger Gegenprobe. Jede Beweispflicht nennt ihren Umfang; es ist keine pauschale Aussage über jedes Programm.
- 04
Die Vertrauensgrenze, benannt
Wir benennen genau, was vertraut statt bewiesen bleibt: den Beweiser-Kernel, den Rust-Compiler über eine eingeschränkte Ausgabe-Teilmenge, die Laufzeitbibliothek, einen kurzen auditierten Nachbearbeitungsschritt am erzeugten Rust und eine benannte Liste von Annahmen über die Legacy-Plattform, jede durch einen reproduzierbaren Test abgesichert.
Auf Eisen ausführen
Ein öffentliches Programm, auf echtem IBM i, Byte für Byte identisch
NC116A ist ein Dezimalpräzisions-Test aus der öffentlichen NIST-COBOL-85-Konformitätssuite, geschrieben von NIST, nicht von uns. Wir haben es transpiliert und dann auf einem laufenden IBM i V7R5 und auf dem erzeugten Rust ausgeführt. Die Ausgabe ist dieselbe, bis aufs Byte.
NC116A NIST COBOL-85 conformance suite Rundung, Abschneiden, Skala, 18-stellige Multiplikation. Ein Programm, das jeder nachschlagen kann. *> Test 3: ROUNDED (3 dec to 2 dec) MOVE 123.456 TO WS-DEC3 COMPUTE WS-DEC2 ROUNDED = WS-DEC3 IF WS-DEC2 = 123.46 PERFORM PASS ELSE PERFORM FAIL END-IF*> Test 7: Division with decimal result MOVE 10 TO WS-INT5 COMPUTE WS-DEC2 = WS-INT5 / 3 IF WS-DEC2 = 3.33 PERFORM PASS ELSE PERFORM FAIL END-IF let ws_dec2_v40 = scaled_divide(ws_int5_v39, 0u8, v38, 0u8, 2u8);let ws_large_c_v32 = axiom_arith_mul_overflow_pic(ws_large_a_v30, ws_large_b_v31, 18u8).0; Beide ausführen. Die Ausgabe vergleichen.
PASS NC116A-01PASS NC116A-02PASS NC116A-03PASS NC116A-04PASS NC116A-05PASS NC116A-06PASS NC116A-07PASS NC116A-08PASS NC116A-09PASS NC116A-10NC116A PRECISION TESTSPASS: 10FAIL: 00 PASS NC116A-01PASS NC116A-02PASS NC116A-03PASS NC116A-04PASS NC116A-05PASS NC116A-06PASS NC116A-07PASS NC116A-08PASS NC116A-09PASS NC116A-10NC116A PRECISION TESTSPASS: 10FAIL: 00 44 öffentliche NIST-Programme laufen Byte-genau auf echtem IBM i. NC116A ist eines davon.
Ein zweiter, unabhängiger Beleg: der formale Beweis
theorem qRound_within_half (N D : ℤ) (hN : 0 < N) (hD : 0 < D) : 2 * |qRound N D * D - N| ≤ D := by …theorem qRound_ties_away (N D : ℤ) (hN : 0 < N) (hD : 0 < D) (htie : 2 * qRem N D = D) : qRound N D = qTrunc N D + 1 := by …-- #print axioms qRound_within_half'…qRound_within_half' depends on axioms: [propext, Quot.sound] Der Dezimalkern ist für jeden Operanden im von NC116A genutzten Bereich maschinengeprüft: das erzeugte ROUNDED ist die nächste skalierte Ganzzahl, und Gleichstände brechen half-away-from-zero, nicht das round-half-to-even, das eine naive Portierung von Rust erben würde. 9 Theoreme, 0 sorry, 0 Annahmen von uns, dieselben Standard-Axiome wie der Bankbeweis unten.
axiom transpile NC116A.cbl --platform ibm-icargo run --release # -> 10 PASS / 0 FAIL, byte-identical to IBM i NC116A ist also zweifach und unabhängig versiegelt: der Byte-identische Lauf auf echtem IBM i und dieser Beweis über alle Operanden seines Dezimalkerns. Es hat keinen Datenbankzustand, daher gibt es hier keine Datenbank-Bisimulation, und der allgemeine vorzeichenbehaftete Fall ist außerhalb des Rahmens, weil seine Tests ihn nicht ausüben. Für die vollständige DB2-Migration mit einer Bisimulation über alle Eingaben siehe das Bankprogramm unten.
Treue, kein Papierkram
Als die Referenz falsch lag, stimmten wir mit der echten Maschine überein
NC142A ist ein weiterer öffentlicher NIST-Test. Seine committete "erwartete Ausgabe" sagt, dass alle acht Prüfungen bestehen. Führt man ihn auf einem echten IBM i V7R5 aus, tun sie das nicht: bei einem MOVE von "54321" in ein numerisches Feld löst die Maschine einen Dezimaldatenfehler aus und der Job bricht nach dem ersten Test ab. Das erzeugte Rust bricht an derselben Stelle auf dieselbe Weise ab.
PASS ×8 sagt, es besteht MCH1202 abend das echte Verhalten MCH1202 abend stimmt mit echtem Eisen überein PASS NC142A-01MCH1202 Escape sev-40 NC142A *STMT → CEE9901, job abends Das ist der ehrliche Test eines Migrationswerkzeugs: die echte Plattform reproduzieren, samt ihrer Strenge und ihrer Fehler, nicht eine nachsichtige Referenz. Wir stimmen mit der Maschine Byte für Byte überein, sogar dort, wo der veröffentlichte Lösungsschlüssel falsch war. Wir haben NC142A als Oracle-Treue-Korrektur im öffentlichen Korpus eingeordnet, nicht als Änderung unserer Ausgabe.
Sehen Sie die Evidenz
Ein Programm, jedes Artefakt
Kein Diagramm. Ein echtes versiegeltes Programm durch die gesamte Pipeline, jede Stufe ein wörtlicher Auszug aus dem Artefakt, aus dem sie stammt. Lesen Sie den Quellcode, das erzeugte Rust, das Theorem und das Run-on-both-Ergebnis selbst.
BORROW_INT Drains open borrowings, accrues interest (principal × rate/daycount × days), and CALLs GL_POST to book a balanced double-entry journal. L2 BISIMILAR vs live IBM i V7R5 Die vollständige Artefaktkette ansehen 7 Stufen, von der Quelle bis zu einem nachprüfbaren Dossier
- 01
Das Programm
inputEchtes COBOL. Der Kern der Abgrenzung: der Tagessatz, dann Kapital mal Satz mal Tage.
COMPUTE-ACCR-AMOUNT. IF DC-365 COMPUTE WS-RATE-DAILY = HV-BW-RATE / K-DAYCOUNT-365 ON SIZE ERROR SET STEP-FAIL TO TRUE EXIT PARAGRAPH END-IF COMPUTE WS-ACCR-RAW = HV-BW-PRINCIPAL * WS-RATE-DAILY * WS-DAYS-TO-ACCRUE ON SIZE ERROR SET STEP-FAIL TO TRUE MOVE RC-AMOUNT-OVERFLOW TO WS-OUT-RC END-COMPUTEfrom projects-xl/bankdemo/src/borrow_int.sqlcblle:559 - 02
Jede Zeile ist rückführbar
generatedDie Source-Map verknüpft jede erzeugte Rust-Funktion mit der genauen COBOL-Zeile, aus der sie stammt. Lies den neuen Code gegen den alten.
COBOL paragraph Rust :559 COMPUTE-ACCR-AMOUNT :5542 · compute_accr_amount :535 COMPUTE-DAYS-TO-ACCRUE :5460 · compute_days_to_accrue :454 ACCR-SINGLE-BORROW :5204 · accr_single_borrow from .axiom/compiler/borrow_int.map.json - 03
Das erzeugte Rust
generatedDieselbe Arithmetik in speichersicherem Rust. Die Skala der gepackten Dezimalzahl bleibt exakt erhalten, gerechnet auf 128-Bit-Ganzzahlen, nie mit Gleitkomma. Die Namen sind die SSA-Form des Compilers; die Map oben bindet jeden an das COMPUTE.
pub fn compute_accr_amount(data: &mut ProgramData) { let v298 = scaled_divide_i128_keep(v297, 6u8, v296 as i128, 0u8, 6u8); let v330 = axiom_arith_mul_overflow_pic_i128(v328, v329, 38u8).0; let v332 = axiom_arith_mul_overflow_pic_i128(v330, v331 as i128, 38u8).0; store_packed_trunc(|b| data.set_field_107(b), v332.wrapping_div(100i128), 11usize, true, 21u32, false);}from .axiom/…/borrow_int.rs (regenerated at build) - 04
DB2 zu PostgreSQL, Regel für Regel
generatedJede DB2-Eigenheit wird nach PostgreSQL umgeschrieben, und die Spur wird Anweisung für Anweisung festgehalten.
CHAR(CURRENT DATE, ISO)TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD')CHAR(x,ISO)→TO_CHAR, CURRENT-registerDAYS(DATE(?)) - DAYS(DATE(?))((DATE(?) - DATE '0001-01-01')::int + 1) - …DAYS→date-arithfrom verify/dossier/sql-rewrites/borrow_int.sql-rewrites.jsonl - 05
Das Theorem und sein Beleg
proof-artifact + receiptEin maschinengeprüftes Bisimulations-Theorem: für jede Eingabe erzeugen der DB2- und der PostgreSQL-Lauf denselben Zustand. Der Beleg ist die wörtliche Kernel-Axiomliste. Er ruht auf einem einzigen Standard-Lean-Axiom und auf keiner Annahme von uns.
theorem borrowInt_master : ∀ (inputs …), db2Run inputs = pgRun inputs := by …-- #print axioms borrowInt_master'…borrowInt_master' depends on axioms: [propext]from lean4/Axiom/Bisim/BorrowIntMasterInstance.lean:185 + …MasterInstance.axioms.txt - 06
Auf beiden ausgeführt, Byte für Byte verglichen
verificationDas Original lief auf echter IBM i V7R5-Hardware; das Rust lief mit denselben Eingaben. Der resultierende Geschäftszustand stimmte überein, Zeile für Zeile.
- BORROWPF
- 3/3 rows · ACCRINT 4980 / 5985 / 7500 (packed decimal, 6dp, truncated identically)
- GLJRN
- 6/6 rows · double-entry balanced, sum DR = CR = 18465.00
- captured
- iron BANKDEMOXL via IBM i MCP, 2026-06-23
from verify/bisim/oracles/borrow_int/{BORROWPF,GLJRN}.S1.json - 07
Ein Dossier, das du erneut prüfen kannst
receiptEin einziger Befehl prüft den gesamten Datensatz von Anfang bis Ende erneut, sodass nachträglich nichts vertauscht oder verändert werden kann.
- artifacts_checked
- 21
- proof_artifacts_proven
- 2
- dossier_digest
- 61f950ee0cb024cd51d72ae391e268ed…
- codegen_sha256
- 7ed16a32379e18ef…
- verdict
- COHERENT
from axiom audit --json (fresh run, 2026-07-18)
Was das abdeckt und was nicht
- The dossier manifest seals the .axiom/* artifacts; the emitted .rs is tracked with its own hash, not yet inside the manifest.
- The run-on-both observational equivalence lives in the bisimulation registry, not inside the per-program dossier.
- Here the equivalence proof is the Lean bisimulation theorem; the standalone Z3/CVC5 pass is a separate, more conservative overflow analysis.
Wie ein KI-Agent es prüft
An AI agent drives the whole thing through the MCP server and re-checks the result itself.
mcp__axiom__transpile(source, decouple=["DB2=postgresql"], audit=true)→ { rc: 0, result: { verify }, audit: { verdict: "COHERENT", artifacts_checked: 21, dossier_digest } }the agent re-verifies every SHA-256 in the manifest itself. trust nothing, check everything transpileauditanalyzeplancodegen_provenanceverb_statusdoctor--agent emits one JSON line; --fail-on gates the exit code (rc 3 = verification gate tripped); --progress ndjson streams phase events. A green exit cannot contradict the certificate.
Was Sie erhalten
Ein Workspace, der Ihnen gehört
Lesbares Rust und ein offenes PostgreSQL-Schema auf Ihrer Infrastruktur. Dazu der vollständige Datensatz pro Programm: der Syntaxbaum, die Zwischenrepräsentationen, die formalen Beweise, die SMT-Formeln zum Nachprüfen mit Ihrem eigenen Z3 oder CVC5 und eine zeilengenaue Quelle→Rust-Zuordnung. Nichts bleibt zwischen Ihrem COBOL und dem Rust verborgen; Ihr Team liest die Mathematik der Migration, nicht nur die Ausgabe. Kein Laufzeit-Lock-in, keine Blackbox.
