Org X-Ray — Migration Readiness Report

What your Salesforce org contains — and how much of it converts to code you own. Modeled on the Lightning Experience Readiness Report your admins already know: a scored summary, category findings, and a recommended action plan. Generated by OpenForce from your org’s exported metadata; every number below is counted, not estimated.

Migration Readiness

Overall readiness for an exit onto owned code, scored from your metadata.

82.3% READY TODAY

High readiness

Most of this org converts automatically to code you own.

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.

130ready today (deterministic)
0needs translation (LLM + verification)
28needs a person / not in a pipeline yet
156metadata files scanned

Findings — Coverage: what converts today vs what needs translation

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.

82.3% ready today · 0.0% needs translation · 17.7% needs a person / not in a pipeline yet

Ready today 130 items

Transcribed today — deterministic transcription, running now, no AI in the loop.

ArtifactCount
Objects → PostgreSQL tables (Prisma models)3
Fields → typed columns93
Validation rules → Zod validators (formula subset)0
Record types → per-variant schemas0
List views → table configs + SQL filters19
Search layouts → Postgres full-text indexes3
Permission sets → RBAC policies + row security0
Page layouts → React detail + edit views12

Needs translation 0 items

Translation required — Apex, Flows and out-of-subset formulas go through the LLM + verification harness.

ArtifactCount
Validation-rule formulas outside the deterministic subset
flagged by the real generator, not estimated
0
Apex classes
0 lines, 0 SOQL statements
0
Apex triggers0
Flows0
Workflow rules0

Needs a person / not in a pipeline yet 28 items

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.

ArtifactCount
Profiles (permission sets cover the RBAC path today)0
Email templates the classifier can't auto-render0
Reports the SQL generator refuses0
Dashboards not fully rendered0
Integration points (named credentials, connected apps, remote sites)0
Sharing metadata (roles, sharing rules files)0
Custom UI components (LWC/Aura)0
Other metadata files (see inventory)28

Recommended action plan

An ordered plan built from what this org actually contains — steps for artifact types you don’t have are omitted.

  1. Review the coverage report
    Confirm the counted inventory above against your org and flag anything the metadata snapshot missed before scoping the conversion. Every number here is counted, not estimated.
  2. Convert schema and declarative logic
    Auto-transcribe 130 items — objects, fields, validation-rule formulas in the deterministic subset, record types, list views, search, permission sets and layouts — into owned code. Deterministic: runs today, no AI in the loop.
  3. Migrate data and cut over
    Export record data from the 3 object(s), load into PostgreSQL, run both systems in parallel to prove parity, then retire the Salesforce seats. After cutover the per-seat license line item is $0.

Exit bill of materials

What a migration of this org produces and what remains as translation work.

DeliverableQuantity
PostgreSQL tables (Prisma models)3
Typed columns93
Validators (Zod)
0 of 0 formulas need manual/LLM translation
0
Access policies (RBAC + row security)0
Generated views (React detail/edit + list views)43
Full-text search indexes3
Flows to translate
0 elements total
0
Apex classes to translate
0 source lines, 0 SOQL statements — 0 → SQL deterministically today
0
Apex triggers to translate0

Cost exposure

Seats80
Current per-seat cost$175/user/mo
Annual license spend — recurring every year$168,000/yr
Agentforce-era add-on exposure at renewal
$125–$550/user/mo add-ons (published 2026 list) — range shown, not a prediction
$120,000–$528,000/yr additional

A migration is a one-time conversion of the bill of materials above into code you own — after which the per-seat line item is $0 and the recurring cost is your own hosting and maintenance. This report does not estimate the conversion price; it scopes exactly what the conversion consists of.

Stay vs. Own — 5-year savings

Every figure below is computed from this org's measured cost exposure. Assumptions (tunable per deal): one-time conversion = 1.25× current annual license; aftercare = 12%/yr of former spend (flat, not per-seat); Salesforce escalation 8%/yr; all-in TCO 1.5× license.

LineStay on Salesforce (5 yr)Own it with OpenForce (5 yr)
License (with 8%/yr escalation)$985,589
All-in TCO (1.5× license)$1,478,383
Agentforce add-on (if adopted)$600,000 – $2,640,000
One-time conversion (1.25× annual)$210,000
Aftercare (12%/yr, flat)$80,640
5-year total$1,478,383 – $4,118,383$290,640

Net saved: $1,187,743 (up to $3,827,743 if they adopt Agentforce) · Payback ≈ 15 months · then you own the code, forever.

Integrations

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.

KindCount
None found0

0 integration point(s) total — 0 mapped to an owned-stack equivalent, 0 flagged for human design work.

Custom UI components

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 found0
LWC0
Aura0
Simple (display-only)0
Moderate (one data dependency)0
Complex (imperative calls / events / multiple dependencies)0

No custom UI components found.

Reports & dashboards

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).

Reports0
  auto-translatable to SQL0
  refused (see reasons below)0
Dashboards0
  fully rendered (every panel)0
  panels rendered0
  panels refused (see reasons below)0

Formula & roll-up fields

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)0
Rollup triggers (roll-up summaries)0
Query-time resolvers (cross-object formulas)0
Flagged (outside the supported subset)0

0 computed field(s) classified total.

Sharing model

Org-wide defaults, role hierarchy, and sharing rules — parsed and counted, not compiled into RLS here.

Org-wide defaults, role hierarchy, and sharing rules — parsed only, not compiled into RLS policies here (that step needs a real owner-column wiring the engine doesn't have yet; see the transcription CLI's Sharing→RLS output for that artifact). Default-deny: anything not modeled below grants nothing.

Objects with OWD modeled3
Roles0
Role hierarchy depth0
Sharing rules modeled0
Constructs flagged / not modeled1

OWD mix

Org-wide defaultObjects
ReadWrite2
ControlledByParent1

Flagged count always includes a standing advisory for Manual sharing: it is per-record runtime data with no metadata file to parse, so it can never be transcribed from a snapshot alone.

Appendix · Inventory

Everything found in the metadata snapshot, by type — the raw counts behind the readiness score above.

MetadataCount
Objects3
Fields93
Validation rules0
Record types0
List views19
Search layouts3
Permission sets0
Page layouts12
Profiles0
Flows0
Apex classes0
Apex triggers0
Apex source lines0
SOQL statements (measured)0
SOQL translating deterministically today0
Workflow rules0
Email templates0
Reports0
Other: .app-meta.xml26
Other: .weblink-meta.xml2
Total files scanned156