Overall readiness for an exit onto owned code, scored from your metadata.
Significant custom logic
Plan for guided translation — the deterministic core is smaller in this org.
This score is coverage of auto-transcription: the share of inventoried items that convert deterministically today, with no AI in the loop. Validation-rule formulas outside the deterministic subset are counted against it, so the number is honest rather than flattering.
Category-by-category, in the Readiness-Report rhythm: what is ready, what needs attention, what is blocked. Each metadata item weighs 1. Validation rules whose formulas fall outside the deterministic subset are counted against today’s coverage — they were flagged by running the actual generator on your rules.
Transcribed today — deterministic transcription, running now, no AI in the loop.
| Artifact | Count |
|---|---|
| Objects → PostgreSQL tables (Prisma models) | 51 |
| Fields → typed columns | 597 |
| Validation rules → Zod validators (formula subset) | 3 |
| Record types → per-variant schemas | 0 |
| List views → table configs + SQL filters | 17 |
| Search layouts → Postgres full-text indexes | 6 |
| Permission sets → RBAC policies + row security | 0 |
| Page layouts → React detail + edit views | 46 |
| Email templates → render modules deterministic {!Object.Field} merge templates | 1 |
Translation required — Apex, Flows and out-of-subset formulas go through the LLM + verification harness.
| Artifact | Count |
|---|---|
| Validation-rule formulas outside the deterministic subset flagged by the real generator, not estimated | 0 |
| Apex classes 317,863 lines, 2,471 SOQL statements — 1,940 (78.5%) already translate to SQL deterministically | 1,035 |
| Apex triggers | 26 |
| Flows | 0 |
| Workflow rules | 1 |
Inventoried but not yet in either automated pipeline — scoped for human work (UI rewrites, endpoint design) or awaiting an engine surface; counted against readiness so the score stays honest.
| Artifact | Count |
|---|---|
| Profiles (permission sets cover the RBAC path today) | 0 |
| Email templates the classifier can't auto-render | 0 |
| Reports the SQL generator refuses Matrix/joined/custom-summary or unknown-object shapes — see Reports & dashboards section | 8 |
| Dashboards not fully rendered | 0 |
| Integration points (named credentials, connected apps, remote sites) see Integrations section — endpoints need a human-designed replacement | 4 |
| Sharing metadata (roles, sharing rules files) | 0 |
| Custom UI components (LWC/Aura) 100% require manual rewrite — see Components section | 176 |
| Other metadata files (see inventory) | 9,174 |
An ordered plan built from what this org actually contains — steps for artifact types you don’t have are omitted.
What a migration of this org produces and what remains as translation work.
| Deliverable | Quantity |
|---|---|
| PostgreSQL tables (Prisma models) | 51 |
| Typed columns | 597 |
| Validators (Zod) 0 of 3 formulas need manual/LLM translation | 3 |
| Access policies (RBAC + row security) | 0 |
| Generated views (React detail/edit + list views) | 109 |
| Full-text search indexes | 6 |
| Flows to translate 0 elements total | 0 |
| Apex classes to translate 317,863 source lines, 2,471 SOQL statements — 1,940 → SQL deterministically today | 1,035 |
| Apex triggers to translate | 26 |
Seat count / per-seat cost not provided — the license-exposure comparison is omitted rather than estimated. Re-run the X-Ray with those two numbers to see annual spend vs one-time conversion.
Provide --seats N --cost PERSEAT_MONTHLY to the X-Ray to
model the savings of replacing Salesforce with a stack you own.
Outbound/inbound integration points this org depends on — counted and mapped where an owned-stack equivalent exists, flagged honestly where it doesn't.
Named credentials, connected apps, remote-site entries, and outbound Apex callouts this org depends on. Endpoint business logic and live credentials are never inspected or fabricated — only counted and mapped where an owned-stack equivalent exists.
| Kind | Count |
|---|---|
remoteSite | 4 |
apexCallout | 37 |
41 integration point(s) total — 4 mapped to an owned-stack equivalent, 37 flagged for human design work.
LWC/Aura bundles found on disk — inventoried and scoped, not auto-converted.
Custom UI (Lightning Web Components / Aura). There is no trustworthy automated LWC/Aura→React translator — faking one would ship silently-wrong UI. Every component here needs a human rewrite; the value is precise scoping (public API, data dependencies, events), not a fabricated conversion.
| Components found | 176 |
| LWC | 122 |
| Aura | 54 |
| Simple (display-only) | 77 |
| Moderate (one data dependency) | 0 |
| Complex (imperative calls / events / multiple dependencies) | 99 |
100% need manual rewrite — stated honestly, not hidden inside the coverage score.
What the real report/dashboard generator can translate to SQL/config today vs what it honestly refuses.
Reports translate to a single deterministic SQL SELECT when their shape allows it (Tabular/Summary, implicit-AND filters, no custom summary formulas); Matrix/joined reports and other unsupported shapes are honestly refused, never approximated. Dashboard panels are resolved through the SAME translate/refuse machinery: a panel renders only when it binds exactly to what its backing report produces, and is refused — by construct — whenever the value would have to be fabricated (a renderable chart kind alone is not enough).
| Reports | 8 |
| auto-translatable to SQL | 0 |
| refused (see reasons below) | 8 |
| Dashboards | 0 |
| fully rendered (every panel) | 0 |
| panels rendered | 0 |
| panels refused (see reasons below) | 0 |
| Construct | Reports |
|---|---|
| unknown report object | 2 |
| unknown field | 3 |
| unresolved report type | 2 |
| custom filter logic | 1 |
Computed fields, classified by the owned-stack construct each becomes.
Computed fields, split by the owned-stack construct they become: a same-object formula becomes a Postgres GENERATED ALWAYS AS column; a cross-object formula becomes a query-time resolver (generated columns can't reference another table's row); a roll-up summary becomes a trigger-maintained aggregate. Anything outside that subset is flagged, never guessed.
| Generated columns (same-object formulas) | 1 |
| Rollup triggers (roll-up summaries) | 2 |
| Query-time resolvers (cross-object formulas) | 2 |
| Flagged (outside the supported subset) | 4 |
9 computed field(s) classified total.
Everything found in the metadata snapshot, by type — the raw counts behind the readiness score above.
| Metadata | Count |
|---|---|
| Objects | 51 |
| Fields | 597 |
| Validation rules | 3 |
| Record types | 0 |
| List views | 17 |
| Search layouts | 6 |
| Permission sets | 0 |
| Page layouts | 46 |
| Profiles | 0 |
| Flows | 0 |
| Apex classes | 1,035 |
| Apex triggers | 26 |
| Apex source lines | 317,863 |
| SOQL statements (measured) | 2,471 |
| SOQL translating deterministically today | 1,940 (78.5%) |
| Workflow rules | 1 |
| Email templates | 1 |
| Reports | 8 |
| Other: (no extension) | 1 |
| Other: .app | 4 |
| Other: .app-meta.xml | 5 |
| Other: .cmp | 35 |
| Other: .cmp-meta.xml | 35 |
| Other: .compactlayout-meta.xml | 11 |
| Other: .component | 19 |
| Other: .component-meta.xml | 19 |
| Other: .css | 97 |
| Other: .csv | 1 |
| Other: .design | 2 |
| Other: .document-meta.xml | 2 |
| Other: .documentfolder-meta.xml | 1 |
| Other: .emailfolder-meta.xml | 1 |
| Other: .eot | 2 |
| Other: .evt | 13 |
| Other: .evt-meta.xml | 13 |
| Other: .featureparameterboolean-meta.xml | 12 |
| Other: .featureparameterdate-meta.xml | 1 |
| Other: .featureparameterinteger-meta.xml | 14 |
| Other: .fieldset-meta.xml | 18 |
| Other: .fieldtranslation-meta.xml | 6,492 |
| Other: .flexipage-meta.xml | 4 |
| Other: .gif | 4 |
| Other: .globalvalueset-meta.xml | 1 |
| Other: .globalvaluesettranslation-meta.xml | 8 |
| Other: .html | 109 |
| Other: .intf | 1 |
| Other: .intf-meta.xml | 1 |
| Other: .js | 301 |
| Other: .js-meta.xml | 122 |
| Other: .json | 145 |
| Other: .labels-meta.xml | 2 |
| Other: .letter-meta.xml | 1 |
| Other: .matchingrule-meta.xml | 1 |
| Other: .md-meta.xml | 193 |
| Other: .notiftype-meta.xml | 1 |
| Other: .objecttranslation-meta.xml | 578 |
| Other: .page | 79 |
| Other: .page-meta.xml | 79 |
| Other: .png | 426 |
| Other: .psd | 1 |
| Other: .py | 1 |
| Other: .quickaction-meta.xml | 26 |
| Other: .reportfolder-meta.xml | 1 |
| Other: .reporttype-meta.xml | 1 |
| Other: .resource-meta.xml | 2 |
| Other: .sh | 1 |
| Other: .snap | 1 |
| Other: .svg | 225 |
| Other: .tab-meta.xml | 17 |
| Other: .tokens | 1 |
| Other: .tokens-meta.xml | 1 |
| Other: .translation-meta.xml | 8 |
| Other: .ttf | 2 |
| Other: .txt | 8 |
| Other: .weblink-meta.xml | 22 |
| Other: .woff | 2 |
| Total files scanned | 12,194 |