infa2td · Migration Control Room Sign in

The compiler that retires ETL estates — and proves it.

Point it at a PowerCenter, SSIS, DataStage, or Talend export. Every mapping routes through one canonical AST and comes out the other side as Teradata, Snowflake, or BigQuery artifacts — with a confidence score, a decision trace, and a typed blocker for anything no tool could infer.

Sign in to the Control Room Google SSO · your runs and workspaces are scoped to your identity.

PowerCenter XML SSIS DataStage Talend dbt CDC SQL/DDL canonical AST PARSER_REGISTRY → AST → LOWERER_REGISTRY deterministic: same export in, same SQL out INSERT/SELECT · MERGE CREATE TABLE DDL BTEQ · AirflowControl-M · Kestra runtime package OpenLineage JSON column lineage graphs explain.json _readiness_report.jsonreadiness: READY
  • PowerCenter XML
  • SSIS
  • DataStage
  • Talend
  • dbt
  • CDC
  • SQL/DDL
canonical AST
deterministic: same export in, same SQL out
  • INSERT/SELECT · MERGE
  • CREATE TABLE DDL
  • BTEQ · Airflow · Control-M · Kestra
  • runtime package
  • OpenLineage JSON
  • column lineage graphs
  • explain.json
  • readiness: READY

Deterministic by construction

The same export always produces the same SQL. A source adapter parses the tool-specific export once, at the boundary, into typed canonical facts — each carrying evidence, trust, and confidence. A planner freezes every decision into a typed MappingPlan. Fail-closed emitters render it: they never invent an identifier, a table name, or a strategy. A missing decision is a build error — never plausible-but-wrong SQL. Anything that cannot be safely automated becomes a typed, counted ACTION REQUIRED marker, never a silent drop.

Log — ▌tailing…
$ python main.py --source-tool powerCenter --target teradata
    --profile teradata-production --folder estate/ --output out/
    --with-validation --with-workflows --scheduler airflow --explain-facts full
queued
running · parsing source export…
planning… lowering… emitting…
validating… writing explain traces…
succeeded · readiness: READY
  • Preview command — the exact python main.py argv, reproducible outside the app.
  • Queued execution — live-tailing Log, elapsed time, Cancel.
  • Profiles — discovery · teradata-production · snowflake-cloud · dbt-modern · strict.

Readiness, not estimates

The verdict is a file, not a feeling.

Every run ends in a machine-readable readiness report: READY, REVIEW_REQUIRED, or BLOCKED. Every mapping gets a confidence score built on 36 deterministic inputs, classified HIGH / MEDIUM / LOW / BLOCKED. A strict profile turns thresholds — confidence floors, fallback-rate ceilings, blocker categories — into a CI pass/fail. Compare any run to a baseline and see exactly which mappings moved, band by band.

StatusREADY
Confidence
Mappings
Blockers
Confidence bands
  • HIGH
  • MEDIUM
  • LOW
  • BLOCKED
Failure breakdown (by aggregate count)

In the app, each bar drills down to the affected mappings and their evidence.

READY is a status, not a status meeting.

Evidence on every fact

A confidence score you cannot audit is a vibe. Every mapping opens into Evidence, Proofs, Translation, Trace, and Runtime: classified signals with explainers linking to the exact explain.json line; a proof bundle across Semantic, Ordering, Replay-safety, and Adapter facets; equivalence and write-contract verdicts; side-by-side diffs of source expression versus translated SQL; an ordered decision trace — rule id, decision, confidence — for every choice the compiler made.

every canonical fact · provenance envelope
{
  "evidence": {
    "source_product": "powerCenter",
    "source_object_ref": "operation:RNK_BY_REGION",
    "source_property": "Top/Bottom",
    "extraction_method": "parsed"
  },
  "trust": "declared",
  "confidence": "exact"
}
generated DML · m_RANK_TEST_dml.sql
-- infa2td generated
-- Source : m_RANK_TEST.xml
-- Folder : estate
INSERT INTO DW.FACT_ORDERS_RANKED ( … )
SELECT …
FROM STG.STG_ORDERS_RANK
QUALIFY ROW_NUMBER() OVER (PARTITION BY REGION
  ORDER BY AMOUNT DESC NULLS LAST) <= 10;
the verdict · _readiness_report.json
{
  "status": "READY",
  "confidence_score": …,
  "counters": {
    "diagnostic_count": …,
    "blocker_count": …,
    "warning_count": …,
    "manual_action_count": …
  }
}

The decision basis for cutting over a mapping without parallel-running it.

Gates, not goals

# every number below is pinned by a CI gate or a checked-in manifest

33/33PowerCenter transformation families
163expression functions translated
10,168tests passing
68CI gates, incl. non-increasing ratchets
19import-linter contracts enforcing the waist
36deterministic confidence-scoring inputs
7 · 4 · 4source adapters · SQL targets · schedulers
12runtime adapter families for non-SQL transforms
11mechanical SQL-override rewrites (NVL→COALESCE, ROWNUM→QUALIFY…)
2genuine ceilings in the entire converter — both fail loud

sources: PARITY_COVERAGE.md · function_manifest.json · Makefile · pyproject.toml · CONFIDENCE_SCORING.md · MATURITY_MATRIX.md · GENUINE_CEILINGS.md

Invariants are build failures, not review requests.

Ten lenses over every run

  1. WORKSPACE upload the source export
  2. CONFIGURE Profile · Target · Scheduler
  3. RUN queued, live-tailed, cancellable
  4. TRIAGE readiness, evidence, diffs
  5. SHIP download the .zip

One workbench puts the inputs, the generated code, and every analysis lens side by side.

  • Readiness KPIs, band donut, failure Pareto with drill-down.
  • Validation row-count reconciliation matrix per table.
  • World View the whole estate as one graph, ringed by band.
  • Parameters unresolved setup burden, ranked.
  • Code view Monaco over every artifact, jump-to-line.
  • Scheduler Map workflow task DAGs, linked to the script at line.
  • OpenLineage column-level lineage: field ← source.field.
  • Graph visualiser the engine's .dot graphs, rendered in-browser.
  • JSON Model explain.json explored as a node graph.
  • Explain Map how each mapping decomposed into execution units.

Workspaces shared as viewer or editor · Teams · manual actions tracked: Open / In progress / Resolved / Won't fix · Download .zip — the deployable deliverable.

The run list is waiting.

Create a workspace, upload the source export, pick a Profile and Target, and press Run. Triage readiness. Inspect evidence. Download the .zip.

Sign in to the Control Room

Google SSO via oauth2-proxy · internal tool · no self-serve signup.

Deterministic in. Provable out.