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.

33.1% READY TODAY

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.

101ready today (deterministic)
43needs translation (LLM + verification)
161needs a person / not in a pipeline yet
0installed-package components (excluded — sealed source)
442metadata 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.

33.1% ready today · 14.1% needs translation · 52.8% needs a person / not in a pipeline yet

Ready today 101 items

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

ArtifactCount
Objects → PostgreSQL tables (Prisma models)6
Fields → typed columns68
Validation rules → Zod validators (formula subset)0
Record types → per-variant schemas0
List views → table configs + SQL filters7
Search layouts → Postgres full-text indexes5
Permission sets → RBAC policies + row security3
Page layouts → React detail + edit views7
Custom applications → app nav + switcher modules
regenerated from each CustomApplication's ordered tabs by the real app parser — transcribe emits these today
2
LWC components → React (deterministic .tsx)
template + the mechanical slice of the JS converted to a compiling React component by the real LWC→React converter — every construct traced to the directive table
3

Needs translation 43 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
1,897 lines, 36 SOQL statements — 32 (88.9%) already translate to SQL deterministically
26
Apex triggers0
Flows
44 elements to translate
10
Workflow rules0
LWC components — template converted, behavior needs a person
render path auto-converted to JSX; @wire / imperative behavior stubbed and marked for a human to finish (see Components section)
7

Needs a person / not in a pipeline yet 161 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)
see Integrations section — endpoints need a human-designed replacement
2
Sharing metadata (roles, sharing rules files)0
Custom UI components — manual rewrite (flagged LWC + all Aura)
no deterministic path — Aura and render-path-blocked LWC need a human rewrite; see Components section
5
Not yet pipelined · GenAiFunction (.genaifunction-meta.xml)
Agentforce GenAI Function — an invocable action for Salesforce's proprietary Einstein/Agentforce LLM runtime; no self-hosted equivalent to generate into. Rebuilding agentic AI on owned infra is a product decision (own model + orchestration + grounding), not a transpile.
11
Not yet pipelined · FlexiPage (.flexipage-meta.xml)
Lightning page (flexipage) — the saved config of Salesforce's Lightning App Builder (its drag-and-drop page-layout tool). Each page is parsed and labeled per-page in the Lightning pages section, and its layout semantics (highlights / detail / related lists) are reproduced by the generated record layouts. Layout editing on the owned CRM is answered by an editable layout config: admins edit a served JSON config (field order, sections) that takes effect on refresh with no redeploy, and a drag-and-drop editor can layer on later. Translating this specific page's config into that layout config is a per-page transpile not yet proven per item, so it is counted against readiness. — Contact_Record_Page, Coral_Cloud_UtilityBar, Experience_Instance_Record_Page, Experience_Record_Page, Review_Record_Page, Sample_Data_Import_UtilityBar
9
Not yet pipelined · GenAiPromptTemplate (.genaiprompttemplate-meta.xml)
Agentforce prompt template — a versioned prompt for Salesforce's Einstein LLM; the text is portable, but it only runs against SF's model and grounding. Reusing it is a product decision about which model/retrieval to build, not a translation task.
4
Not yet pipelined · ContentAsset (.asset)
ContentAsset payload — the branding/static file itself behind a ContentAsset. On the owned stack it is copied as-is into public/branding/ with a theme-config reference; the copy pipeline is planned, so it stays counted against readiness until proven.
3
Not yet pipelined · ContentAsset (.asset-meta.xml)
ContentAsset — an org-managed branding/static file (logo, login background) wrapped in a versioned, shareable asset. On the owned stack it becomes a plain file in public/branding/ plus a theme-config reference (the version/sharing wrapper is dropped); the StaticResource/ContentAsset copy pipeline that emits it is planned, so it stays counted against readiness until proven.
3
Not yet pipelined · GenAiPlugin (.genaiplugin-meta.xml)
Agentforce plugin (topic/action grouping for an Agentforce agent) — SF-proprietary agent runtime with no self-hosted target; a person decides whether to rebuild the agent, it does not transpile.
3
Not yet pipelined · SiteDotCom (.site-meta.xml)
Experience Cloud / Site.com site — a public-facing website (portal/community) hosted by Salesforce, not part of the internal CRM data model; migrating it is a public-site rebuild on owned hosting, not a CRM transpile.
3
Not yet pipelined · Bot (.bot-meta.xml)
Einstein Bot definition (Agentforce/legacy chatbot) — dialog and intent config bound to SF's NLU runtime; a self-hosted CRM has no bot engine to target, so rebuilding conversational flows is a product decision, not a transpile.
2
Not yet pipelined · BotVersion (.botversion-meta.xml)
Einstein Bot version — a versioned snapshot of a Bot's dialogs; same SF-proprietary runtime with no self-hosted target; scoped with its parent Bot as a product decision.
2
Not yet pipelined · GenAiPlannerBundle (.genaiplannerbundle)
Agentforce planner bundle — the reasoning/planner config that drives an Agentforce agent; proprietary runtime, nothing equivalent to generate. Rebuilding the agent is a product decision, not a translation.
2
Not yet pipelined · Network (.network-meta.xml)
Experience Cloud network (community) settings — membership, self-registration, and access config for a public site; a person rebuilds this with the site itself, there is no self-hosted CRM target.
2
Not yet pipelined · StaticResource (.resource-meta.xml)
StaticResource — a bundled asset (image/script/zip) referenced from Apex/VF/LWC via $Resource.<name>. On the owned stack it is copied into the app's public/assets/ with cache headers and a $Resource→URL manifest rewrites its references; the copy/reference pipeline is planned, so it stays counted against readiness.
2
Not yet pipelined · AiEvaluationDefinition (.aievaluationdefinition-meta.xml)
Agentforce AI evaluation definition — test/eval cases for an Einstein/Agentforce agent; only meaningful against SF's AI runtime, so there is nothing to generate for a self-hosted CRM.
1
Not yet pipelined · DigitalExperience (.digitalexperience-meta.xml)
Experience Cloud digital experience (LWR site pages/content) — page structure and content for a public site; a public-site rebuild surface, not internal CRM metadata.
1
Not yet pipelined · DigitalExperienceConfig (.digitalexperienceconfig-meta.xml)
Experience Cloud digital-experience config — org-level settings for LWR sites; scoped with the public-site rebuild, no CRM data model to generate.
1
Not yet pipelined · EmbeddedServiceConfig (.embeddedserviceconfig-meta.xml)
Embedded Service (web chat / messaging deployment) config — snippet and routing for SF's embedded chat on a website; a contact-center / web-widget rebuild on the chosen provider, no CRM metadata to transpile.
1
Not yet pipelined · MessagingChannel (.messagingchannel-meta.xml)
Messaging channel (SMS/WhatsApp/etc. via SF Messaging) — a contact-center channel bound to Service Cloud plus a telco integration; a person re-provisions channels on the chosen messaging provider, there is no CRM metadata to transpile.
1
Not yet pipelined · NavigationMenu (.navigationmenu-meta.xml)
Experience Cloud navigation menu — menu structure for a public site's pages; rebuilt with the site, carries no internal CRM data or logic.
1
Not yet pipelined · PresenceUserConfig (.presenceuserconfig-meta.xml)
Omni-Channel presence user config — maps users to presence/capacity settings in Service Cloud's routing engine; contact-center config with no CRM data model to generate.
1
Not yet pipelined · Queue (.queue-meta.xml)
Queue — a group of users that owns and receives assigned records/work items; the group models as a team in a self-hosted CRM, but its routing (assignment rules, Omni-Channel) needs a person to rebuild.
1
Not yet pipelined · QueueRoutingConfig (.queueroutingconfig-meta.xml)
Omni-Channel queue routing config — routing rules that feed work into Service Cloud queues; tied to the Omni-Channel runtime, a person's contact-center rebuild, not a transpile.
1
Not yet pipelined · ServiceChannel (.servicechannel-meta.xml)
Service channel (Omni-Channel work type) — routes a work-item type into Service Cloud's Omni-Channel engine; a self-hosted CRM has no Omni-Channel runtime to target, so routing is a person's contact-center rebuild.
1
Not yet pipelined · ServicePresenceStatus (.servicepresencestatus-meta.xml)
Omni-Channel service presence status (agent online/busy states) — contact-center config for Service Cloud's presence engine; no self-hosted equivalent, re-provisioned by a person if a contact center is in scope.
1
Not yet pipelined · Settings (.settings-meta.xml)
Org settings (per-subtype) — a mixed bag triaged individually: some map to owned-stack config (LightningExperience theme→theme token, Security→auth/JWT config), while Chatter / Territory2 / Communities settings are no longer needed on the owned stack. The per-subtype triage is planned, so it stays counted against readiness until each subtype is resolved.
1
Quick actions — need a person
Contact.Personalized_Schedule — see the UI actions section for each item's specific reason
1
Visualforce pages — hand rewrite (React view + endpoint)
CommunitiesLanding — 1 bind custom Apex controllers (CommunitiesLandingController), cross-linked to the Apex deep run
1
Loose files · experiences/
Experience Cloud (LWR/Site.com) site content — page/branding/view config for a public community site; migrating it is a separate public-site rebuild on owned hosting, a product decision, not a CRM-schema migration. Counts against readiness.
35
Loose files · digitalExperiences/
Experience Cloud (LWR/Site.com) site content — page/branding/view config for a public community site; migrating it is a separate public-site rebuild on owned hosting, a product decision, not a CRM-schema migration. Counts against readiness.
34
Loose files · genAiFunctions/
Agentforce/Einstein GenAI artifact (GenAI function schema or Lightning Type renderer) — payload of Salesforce's proprietary Agentforce runtime, with no self-hosted target to generate into; rebuilding agentic AI on owned infra is a product decision (own model + orchestration + grounding), not a migration. Counts against readiness.
22
Loose files · lightningTypes/
Agentforce/Einstein GenAI artifact (GenAI function schema or Lightning Type renderer) — payload of Salesforce's proprietary Agentforce runtime, with no self-hosted target to generate into; rebuilding agentic AI on owned infra is a product decision (own model + orchestration + grounding), not a migration. Counts against readiness.
2
Compact layouts — record-type variants not yet wired
Custom_Compact_Layout — transcribed, but only an object's DEFAULT compact layout drives the generated highlights panel today; per-record-type variants need a person
1

Who does this work: every item in this bucket is executed by our migration engineers — a person in the lead, AI as leverage — not handed back to your team. Each one runs through the same per-item verification the rest of this report describes: the unit is built, checked for behavioral parity against your Salesforce source, and recorded as verified, held as draft for review, or rejected and reworked. This list is the migration plan we run for you, item by item.

Outside scan scope

Directories in the retrieve that the project’s package scope excluded — counted here for disclosure, not folded into the readiness score.

This org declares a package scope in sfdx-project.json, so the scan looked only inside its packageDirectories. The directories below exist in the retrieve but sit outside that scope — nothing in them is counted in the readiness score above, including any reports, dashboards, or objects they hold. A full migration retrieve should include them if they carry production metadata; re-run the X-Ray against a full retrieve to fold them in.

Directory (unscanned)FilesRecognized metadata inside (count only)
.github/11no recognized metadata types
data/8no recognized metadata types
bin/7no recognized metadata types
docs/7no recognized metadata types
guest-profile-metadata/6no recognized metadata types
apex-scripts/4no recognized metadata types
.vscode/3no recognized metadata types
config/3no recognized metadata types
.husky/1no recognized metadata types

Nothing to migrate — per-type verdicts

Unrecognized metadata a person would do nothing with — each stated with a defensible reason and excluded from the readiness denominator, so the “needs a person” count reflects real work, not inert files.

32 file(s) across 7 type(s) carry no data model and no logic a CRM replacement must reproduce — localized label translations, binary/static assets, display-only or theming metadata, build/test tooling. Each is excluded from the “needs a person” count and the human-work denominator, with a per-type reason stated so a skeptical reviewer can challenge any single line. Nothing is hidden.

Type / familyFilesWhy there is nothing to migrate
.png17PNG image — binary/static asset served as-is by any CRM; nothing to transpile or model.
.tab-meta.xml5CustomTab — a navigation container only; app navigation is regenerated from CustomApplication, and a tab carries no data or logic of its own.
.svg4SVG image/icon — binary/static asset served as-is by any CRM; nothing to transpile or model.
.woff23web font — binary/static asset served as-is by any CRM; nothing to transpile or model.
.brandingset-meta.xml1BrandingSet — org visual theme (colors/logo/image); reapply as CSS design tokens in the generated UI, nothing to transpile.
.jpeg1JPEG image — binary/static asset served as-is by any CRM; nothing to transpile or model.
.lightningexperiencetheme-meta.xml1LightningExperienceTheme — org theme (colors/branding); reapply as CSS design tokens in the generated UI, nothing to transpile.

AutoNumber substitutions (uniqueness kept, display format not)

Salesforce AutoNumber columns become a unique, auto-assigned cuid in the owned schema — stable and non-null, but not the sequential display format (e.g. ALL-{0}). Listed here so the one property not reproduced is a known decision.

4 AutoNumber field(s) keep uniqueness (a stable, auto-assigned id) but not the Salesforce sequential display format (4 declare one). The owned schema substitutes a cuid: unique and non-null, but a different shape than ALL-{0}. These columns are already counted as transcribed — this ledger changes no readiness number; it names the one property not reproduced so any process that parsed the SF display string is a known follow-up, never a silent drop.

Object.FieldSF display format
Booking__c.NameB-{00000000}
Credit__c.NameC-{00000000}
Guest_Review__c.NameR-{00000000}
Session__c.NameS-{00000000}

Checked — none found

Surfaces the X-Ray looked for and found zero of in this org — so absence reads as “checked, none found”, not “never looked”.

Surfaces the X-Ray actively looked for in this org and found none of. Listed so a zero reads as “checked, none found” — not “never looked”. Each maps to a real recognizer (an inventory counter or a documented Metadata API type).

Reports · Dashboards · Workflow rules · Approval processes · Email templates · Record types · Connected apps · Roles · Sharing rules · Assignment rules · Escalation rules · Auto-response rules · Duplicate rules · Matching rules · Territory management · Forecasting types · Global value sets · Public groups

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 101 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. Translate and parity-verify Apex and Flows
    Run 26 Apex class(es) and 0 trigger(s) (1,897 lines, 36 SOQL — 32 already deterministic SQL) and 10 Flow(s) (44 elements) through the LLM + verification harness. Each output is checked for behavioral parity against the source — translated, then verified, never trusted blind.
  4. Migrate data and cut over
    Export record data from the 6 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)6
Typed columns68
Validators (Zod)
0 of 0 formulas need manual/LLM translation
0
Access policies (RBAC + row security)3
Generated views (React detail/edit + list views)21
Full-text search indexes5
Flows to translate
44 elements total
10
Apex types to translate (classes / enums / interfaces)
1,897 source lines, 36 SOQL statements — 32 → SQL deterministically today
26
Apex triggers to translate0

Cost exposure

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.

Stay vs. Own — 5-year savings

Provide --seats N --cost PERSEAT_MONTHLY to the X-Ray to model the savings of replacing Salesforce with a stack you own.

Migration plan — the human 30%

Who does this work: the hours below are ours, not a task list left with your team. Our migration engineers run each workstream — a person in the lead, AI as leverage — under the same per-item verification the coverage section describes: every unit is built, checked for behavioral parity against your Salesforce source, and recorded as verified, held as draft for review, or rejected and reworked.

UNCALIBRATED — rates pending first real migration. Every hour below is a measured quantity × a named, tunable rate — no invented numbers. The rates are placeholders until the first real migration calibrates them; the arithmetic and the schedule model are fixed.

WorkstreamMan-hoursBasis (quantity × rate)
Apex translation163.4 hCOMPLEX 305 code lines × 0.3; STANDARD 326 code lines × 0.12; MECHANICAL 175 code lines × 0.05; TEST 12 class(es) × 2 h/class (parity capture + golden fill; UNCALIBRATED)
Component rewrite (LWC/Aura)122 h7 partial × 6 h + 5 flagged × 16 h (3 auto-converted × 0)
Integration re-implementation60 h5 endpoint(s) × 12 h
Not yet pipelined — identified, with porting path (needs a person today)462 h154 item(s) × 3 h
Data-migration dry-runs24 h6 object(s) × 4 h
Build subtotal831.4 hsum of workstreams
Code review (15% of build)124.7 hon the build critical path
QA (40% of build)332.5 hparallel stream, 30% lag
Total man-hours (pre-buffer)1,288.6 hbuild + review + QA
Schedule (parallel QA, critical path over 3)Value
Build calendar (build ÷ team)318.7 h
QA calendar (QA ÷ team)110.8 h
QA start lag95.6 h
Critical path = max(build, lag + QA)318.7 h
Calendar (+20% buffer)12.7 weeks ≈ 2.9 months

Budget: $231,945 = 1,546.3 h (incl. 20% buffer) × $150/h.

Every rate used (12 assumptions — challenge any)
  • Apex translation: MECHANICAL 0.05 h/code-line, STANDARD 0.12 h/code-line, COMPLEX 0.3 h/code-line, UNPARSED 0.4 h/code-line (UNCALIBRATED, held ≥ COMPLEX — parser could not establish the file's shape); TRIVIAL 0 (automated — deterministic engine, no human translation).
  • Apex test classes: 2 h per test class (UNCALIBRATED — parity-evidence work: capture the Salesforce deploy/run + hand-fill golden assertions; the parity harness is not yet wired into transcribe, so this is real human work, not an automated 0).
  • Component rewrite: partial 6 h each, flagged 16 h each; converted = 0 h (auto-converted).
  • Integration endpoint: 12 h each.
  • Refused report/dashboard: 2 h each.
  • Needs-pipeline metadata item: 3 h each.
  • Data-migration object dry-run: 4 h each.
  • Code review: 15% of build hours (reviewRatio 0.15), on the build critical path.
  • QA: 40% of build hours (qaRatio 0.4), scheduled in parallel starting after 30% of the build critical path (qaLagPct 0.3).
  • Team size: 3; productive hours per person-week: 30.
  • Contingency buffer: 20% applied last to both hours and calendar (bufferPct 0.2).
  • Blended rate: $150/h.

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
namedCredential1
remoteSite1
apexCallout5

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

Custom UI components

LWC/Aura bundles found on disk — LWC run through the real deterministic converter, Aura scoped for manual rewrite.

Custom UI (Lightning Web Components / Aura). LWC templates and the mechanical slice of their JavaScript are converted to a compiling React .tsx by the real deterministic converter (src/translate/lwc-convert.ts) — the same fail-closed posture as the SOQL translator: any construct outside the directive table becomes a NAMED blocker, never a faked translation. Aura is a different framework with no converter and stays 100% manual.

Components found15
LWC / Aura15 / 0
  LWC converted (deterministic .tsx, zero blockers)3
  LWC partial (template converted, behavior needs a person)7
  LWC flagged (render-path blocker — manual rewrite)5
  Aura (manual rewrite — no converter)0

Per-component verdicts (partial / flagged)

ComponentVerdictBlockers (construct + phase)
contactProfileCardflaggedlightning module import (lightning/uiRecordApi) (js); @wire getRecord (js); getter name not mechanically convertible (js); getter mailingCity not mechanically convertible (js) — +3 more
errorPanelflaggedimport from c/ldsUtils (js); getter errorMessages not mechanically convertible (js); lifecycle render() (js); JS service module (no template — not a rendered component) (template)
experienceOverviewflaggedlightning module import (lightning/uiRecordApi) (js); @wire getRecord (js); getter name not mechanically convertible (js); getter description not mechanically convertible (js) — +2 more
experienceSchedulepartiallightning module import (lightning/alert) (js); lightning module import (lightning/navigation) (js); @salesforce/apex import (ExperienceController.getExperienceSessionsForDate) (js); @salesforce/apex import (ContextService.isCommunity) (js) — +9 more
generateSocialMediaPostspartial@salesforce/apex import (SocialMediaPostsController.generateSocialMediaPosts) (js); handler generateSocialMediaPosts not mechanically convertible (js)
ldsUtilsflaggedJS service module (no template — not a rendered component) (template)
sampleDatapartiallightning module import (lightning/toast) (js); @salesforce/apex import (DataTreeImporter.importData) (js); @salesforce/apex import (SampleDataGenerator.generateData) (js); handler handleOnClick not mechanically convertible (js)
sessionBookingOverviewpartiallightning module import (lightning/uiRecordApi) (js); @wire getRecord (js); getter booked not mechanically convertible (js); getter capacity not mechanically convertible (js)
siteExperiencespartiallightning module import (lightning/uiObjectInfoApi) (js); @salesforce/apex import (ExperienceController.getExperiences) (js); @wire getExperiences (js); @wire getPicklistValues (js) — +1 more
siteFooterpartial@salesforce platform import (@salesforce/resourceUrl/coralcloudsite) (js); getter logoUrl not mechanically convertible (js)
siteHeaderpartiallightning module import (lightning/alert) (js); handler handleBookClick not mechanically convertible (js)
weatherCardflaggedbase component <lightning-radio-group> (template)

3 of 15 LWC (20.0%) convert to a compiling React .tsx deterministically; 7 convert their template only (behavior stubbed for a person); 5 need a full manual rewrite. All 0 Aura component(s) are 100% manual — a different framework with no converter.

Lightning pages (flexipages)

Record / app / home page composition — a per-page readiness label. Transparency, not coverage: these are already counted in “Needs a person” above.

Lightning pages (flexipages) are a needs-a-person surface — this labeler names, per page, WHY; it does not claim to build them. 1 of 6 page(s) are standard-only record pages a generated record layout covers semantically — layout semantics (highlights / detail / related lists), not pixel parity. Every page here is already counted once against readiness via the .flexipage-meta.xml line in “Needs a person” above — this subsection is transparency only and changes no count. 3 duplicate page file(s) (same api name re-shipped across packaging bundles) were de-duplicated, first wins.

PageTypeObjectVerdictWhy it needs a person
Contact_Record_PageRecordPageContactneeds a person
custom LWC/Aura c:contactProfileCard needs rewrite as an owned React component (see Components section).
runtime_sales_merge:mergeCandidatesPreviewCard — Salesforce-managed runtime component (runtime_sales_merge: namespace), no owned equivalent; needs a person.
runtime_sales_social:socialPanel — Salesforce social/Chatter panel: SF-proprietary runtime, no owned equivalent; product decision.
runtime_sales_activities:activityPanel — Salesforce activity timeline panel: SF-proprietary runtime, no owned equivalent; product decision.
Dynamic Forms: 19 field placements across 6 sections — field placement is not transcribed (record page renders the classic-layout-derived form); field-gated visibility rules on a simple record field using equals / not-equals / greater-than are transcribed into the generated form’s conditional visibility, while component-gated rules, other operators, relationship-traversal operands and boolean-filter rules stay flagged for a person (the field stays visible).
Coral_Cloud_UtilityBarUtilityBarneeds a person
vacuous page — declares no components; nothing to reproduce, a person should confirm intent.
Experience_Instance_Record_PageRecordPageSession__cneeds a person
custom LWC/Aura c:sessionBookingOverview needs rewrite as an owned React component (see Components section).
Experience_Record_PageRecordPageExperience__cneeds a person
custom LWC/Aura c:experienceOverview needs rewrite as an owned React component (see Components section).
custom LWC/Aura c:experienceSchedule needs rewrite as an owned React component (see Components section).
Dynamic Forms: 10 field placements across 3 sections — field placement is not transcribed (record page renders the classic-layout-derived form); field-gated visibility rules on a simple record field using equals / not-equals / greater-than are transcribed into the generated form’s conditional visibility, while component-gated rules, other operators, relationship-traversal operands and boolean-filter rules stay flagged for a person (the field stays visible).
Review_Record_PageRecordPageGuest_Review__ccovered (layout semantics)
Sample_Data_Import_UtilityBarUtilityBarneeds a person
vacuous page — declares no components; nothing to reproduce, a person should confirm intent.

1 covered (layout semantics) · 5 needs a person · 6 page(s) total · 3 duplicate(s) dropped.

UI actions (field sets, quick actions, web links)

Config-family UI actions — convertible items credited ready-today, the rest counted with the parser’s precise per-item reason.

Field sets, quick-create QuickActions, and external-URL WebLinks — run through the real UI-action parser (the same one transcribe uses to emit typed config the generated app consumes). Convertible items are credited ready-today; everything else stays a needs-a-person row with the parser's precise, per-item reason, never a blanket "not built".

Field sets → typed config0
Quick-create actions → create forms0
Quick-update actions → edit forms0
External-URL links → link config0
Flagged (need a person)1

Flagged UI actions — per-item reason

ItemKindWhy it needs a person
Contact.Personalized_SchedulequickActionFlow action "Contact.Personalized_Schedule" — launches Salesforce Flow "PersonalizedSchedule"; converts only once that flow is translated (flow automation surface).

Visualforce pages

Legacy server-rendered pages, pair-collapsed to one unit each and labeled from their markup — superseded wrappers credited ready-today, custom-controller pages named for rewrite.

Legacy Visualforce pages, each labeled from its <apex:page> markup. A .page and its .page-meta.xml descriptor are ONE unit (the companion folds in, no double-count). Coverage (superseded) is earned only by a pure standardController + <apex:detail>/<apex:relatedList> wrapper the generated record UI reproduces — fail-closed; everything with a custom controller, script, or custom component is a hand rewrite, with its controller classes named and cross-linked to the Apex deep run.

1 page(s) · 0 superseded (credited ready-today) · 1 need a person.

PageVerdictApex controller(s)Why
CommunitiesLandingneeds a personCommunitiesLandingControllercustom Apex-controller page — logic lives in CommunitiesLandingController (analyzed in the Apex deep-run); rewrite as an owned React view plus an API endpoint that replaces the controller.

Apex deep run

Per-class conversion inventory of every Apex file — classified by measured properties, never by a time estimate.

Every *.cls / *.trigger classified by measured properties only — code lines, method count, embedded SOQL, and risk markers (callouts, async, dynamic SOQL) — never by a time estimate. The deterministic verdict is the real pre-pass: TRIVIAL files translate today with no AI in the loop; TEST classes are regenerated as a parity harness, not translated line-for-line.

Apex files26
  classes / triggers / interfaces / enums26 / 0 / 0 / 0
Code lines (of 1,897 total)1,549
Methods (parsed)51
Deterministically translatable files (no LLM)0
Callout / async / @AuraEnabled / test classes5 / 1 / 5 / 12
SOQL — total / deterministic / flagged36 / 32 / 4
DML statements25
Parse failures (method count unknown, flagged)0

Conversion complexity buckets

BucketFilesCode lines
COMPLEX
carries real risk — callouts, async (@future / Queueable / Batchable / Schedulable), dynamic SOQL, or large / high-method.
4305
STANDARD
ordinary business logic between the mechanical and complex boundaries.
3326
MECHANICAL
small and bounded — few methods and SOQL, no callouts, async, or dynamic SOQL; a low-branching translation.
7175
TEST
regenerated as a parity harness, not translated line-for-line.
12743

Largest classes (by code lines)

ClassKindBucketCode lines
SetupServiceAgentUserclassSTANDARD168
SampleDataTestclassTEST138
DataTreeImporterTestclassTEST116
SetupServiceAgentUserTestclassTEST110
DataTreeImporterclassCOMPLEX98
SampleDataGeneratorclassSTANDARD87
WeatherServiceclassCOMPLEX82
ListExperiencesFromTypeTestclassTEST79
ListExperiencesFromTypeclassSTANDARD71
ExperienceControllerTestclassTEST69

LLM assessment: not run (key-gated per engagement).

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

23 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 modeled6
Roles0
Role hierarchy depth0
Sharing rules modeled0
Constructs flagged / not modeled1

OWD mix

Org-wide defaultObjects
ControlledByParent3
ReadWrite3

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
Objects6
Fields68
Validation rules0
Record types0
List views7
Search layouts5
Permission sets3
Page layouts7
Profiles0
Flows10 (44 elements)
Apex classes26
Apex triggers0
Apex source lines1,897
SOQL statements (measured)36
SOQL translating deterministically today32 (88.9%)
Workflow rules0
Email templates0
Reports0
Other: (no extension)18
Other: .aievaluationdefinition-meta.xml1
Other: .asset3
Other: .asset-meta.xml3
Other: .bot-meta.xml2
Other: .botversion-meta.xml2
Other: .brandingset-meta.xml1
Other: .compactlayout-meta.xml1
Other: .corswhitelistorigin-meta.xml4
Other: .csptrustedsite-meta.xml5
Other: .css7
Other: .digitalexperience-meta.xml1
Other: .digitalexperienceconfig-meta.xml1
Other: .embeddedserviceconfig-meta.xml1
Other: .flexipage-meta.xml9
Other: .genaifunction-meta.xml11
Other: .genaiplannerbundle2
Other: .genaiplugin-meta.xml3
Other: .genaiprompttemplate-meta.xml4
Other: .html1
Other: .jpeg1
Other: .json93
Other: .lightningexperiencetheme-meta.xml1
Other: .messagingchannel-meta.xml1
Other: .navigationmenu-meta.xml1
Other: .network-meta.xml2
Other: .page1
Other: .png17
Other: .presenceuserconfig-meta.xml1
Other: .queue-meta.xml1
Other: .queueroutingconfig-meta.xml1
Other: .quickaction-meta.xml1
Other: .resource-meta.xml2
Other: .servicechannel-meta.xml1
Other: .servicepresencestatus-meta.xml1
Other: .settings-meta.xml1
Other: .site-meta.xml3
Other: .svg4
Other: .tab-meta.xml5
Other: .woff23
Total files scanned442

Flow element histogram

ElementCount
assignments10
start10
recordLookups8
actionCalls5
recordCreates4
decisions2
formulas2
loops1
screens1
recordUpdates1