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.

38.9% 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.

211ready today (deterministic)
128needs translation (LLM + verification)
204needs a person / not in a pipeline yet
1,886metadata 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.

38.9% ready today · 23.6% needs translation · 37.6% needs a person / not in a pipeline yet

Ready today 211 items

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

ArtifactCount
Objects → PostgreSQL tables (Prisma models)12
Fields → typed columns105
Validation rules → Zod validators (formula subset)
8 formula(s) outside the deterministic subset counted below
5
Record types → per-variant schemas0
List views → table configs + SQL filters10
Search layouts → Postgres full-text indexes6
Permission sets → RBAC policies + row security6
Page layouts → React detail + edit views13
Reports → SQL SELECT + React views
8 report(s) with unsupported shapes stay below
1
Custom applications → app nav + switcher modules
regenerated from each CustomApplication's ordered tabs by the real app parser — transcribe emits these today
1
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
Custom Metadata records — seeded as config data
each *.md-meta.xml parsed by the real parser and proven seedable by the real seed generator against the transcribed __mdt objects — transcribe emits data/seed-custom-metadata.ts
27
UI actions → typed config (field sets, quick-create actions, external-URL links)
10 field set(s), 12 quick-create action(s), 0 external-URL link(s) converted by the real parser — AltAttendance, Alternate, Alternate_no_service, Attendance_Service_Deliveries, Bulk_Service_Deliveries, Contact.AddContactToProgram, Contact.CreateServiceDelivery, CreateContact, +14 more
22

Needs translation 128 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
8
Apex classes
23,166 lines, 229 SOQL statements — 205 (89.5%) already translate to SQL deterministically
107
Apex triggers2
Flows0
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)
11

Needs a person / not in a pipeline yet 204 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 refuses
Matrix/joined/custom-summary or unknown-object shapes — see Reports & dashboards section
8
Dashboards not fully rendered
at least one panel refused — see Reports & dashboards section
2
Integration points (named credentials, connected apps, remote sites)0
Sharing metadata (roles, sharing rules files)
see Sharing → row security section
9
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
29
Unhandled metadata · .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. — Attendance, Bulk_Service_Deliveries, Contact_Record_Page, Program_Cohort_Record_Page, Program_Engagement_Record_Page, Program_Management_Home, Program_Record_Page, Service_Delivery_Record_Page, +4 more
12
Unhandled metadata · .featureparameterinteger-meta.xml
ISV managed-package feature parameter (integer) — LMA telemetry/toggle channel; no CRM behavior to migrate. (Metadata API catalog classifies FeatureParameterInteger as "nothing-to-migrate", but that is documented, not generator-proven here — so it is counted against readiness fail-closed until a pipeline verifies it.) [file suffix inferred from the type name, not yet confirmed]
11
Unhandled metadata · .md-meta.xml
Unrecognized metadata type — no pipeline claims it and it is not known to be inert; a person must assess it.
4
Unhandled metadata · .asset
Unrecognized metadata type — no pipeline claims it and it is not known to be inert; a person must assess it.
2
Unhandled metadata · .asset-meta.xml
Unrecognized metadata type — no pipeline claims it and it is not known to be inert; a person must assess it.
2
Unhandled metadata · .dashboardfolder-meta.xml
Unrecognized metadata type — no pipeline claims it and it is not known to be inert; a person must assess it.
1
Unhandled metadata · .group-meta.xml
Public group — a membership set used in sharing rules and folder access; the group maps to an RBAC team, but its use in sharing is not yet built. (Metadata API catalog: Group.) [file suffix inferred from the type name, not yet confirmed]
1
Unhandled metadata · .labels-meta.xml
Custom labels — named display strings (i18n). transcribe already reads them (parseCustomLabels) to resolve @salesforce/label references during component emit, but it does not yet emit them as a standalone i18n message catalog the owned app ships, so they stay counted against readiness until that surface is built (copied as an i18n resource, not transpiled).
1
Unhandled metadata · .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
Unhandled metadata · .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.
1
Unhandled metadata · .pathassistant-meta.xml
Defines a Path (per-stage guidance + key fields) for an object; a UI-guidance surface the generated record views could reproduce, but the Path→UI transpile is not built — counted against readiness. (Metadata API catalog: PathAssistant.)
1
Unhandled metadata · .reportfolder-meta.xml
Unrecognized metadata type — no pipeline claims it and it is not known to be inert; a person must assess it.
1
Unhandled metadata · .reporttype-meta.xml
A custom Report Type defines the object-join and field set reports build on; the report generator resolves against transcribed objects but does not yet consume custom report-type joins — counted against readiness. (Metadata API catalog: ReportType.)
1
Unhandled metadata · .resource-meta.xml
A Static Resource is a file (image/zip/JS/CSS) served as-is; copied verbatim into the owned app's assets, with no schema or logic to transpile (a bundled JS library is carried over unchanged). (Metadata API catalog classifies StaticResource as "nothing-to-migrate", but that is documented, not generator-proven here — so it is counted against readiness fail-closed until a pipeline verifies it.)
1
Unhandled metadata · .sharingset-meta.xml
A Sharing Set grants Experience/portal users access via a user-to-record lookup match; an external-user access model the owned RLS does not yet emit — counted against readiness. (Metadata API catalog: SharingSet.)
1
Unhandled metadata · .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.
1
Quick actions — need a person
LogACall, ProgramEngagement__c.Add_to_Program_Cohort, ServiceSchedule__c.Add_More_Participants, ServiceSchedule__c.Add_More_Sessions, ServiceSchedule__c.Delete_Future_Sessions, ServiceSession__c.Delete_All_Service_Deliveries — see the UI actions section for each item's specific reason
6
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.
108

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)
robot/62no recognized metadata types
metadeploy/10no recognized metadata types
.github/9no recognized metadata types
scripts/9no recognized metadata types
orgs/8no recognized metadata types
datasets/4no recognized metadata types
lib/2no recognized metadata types
data/1no recognized metadata types
push/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.

1,107 file(s) across 5 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
.fieldtranslation-meta.xml951Localized field-label translation — display strings only, no schema or logic; migrate only if multi-language UI is in scope (a data copy, not a transpile).
.objecttranslation-meta.xml130Localized object-label translation — display strings only, no schema or logic; relevant only for multi-language UI.
.tab-meta.xml10CustomTab — a navigation container only; app navigation is regenerated from CustomApplication, and a tab carries no data or logic of its own.
.translation-meta.xml9Org-wide UI translation (labels/picklist/report labels) — display strings only; relevant only for multi-language UI.
.compactlayout-meta.xml7CompactLayout — highlights-panel field ordering; the generated record UI derives its own layout, so there is no data or logic to migrate.

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

Flows · Workflow rules · Approval processes · Email templates · Record types · Named credentials · Connected apps · Remote site settings · Roles · Queues · Assignment rules · Escalation rules · Auto-response rules · Duplicate rules · Matching rules · Territory management · Forecasting types · Global value sets

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 211 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 107 Apex class(es) and 2 trigger(s) (23,166 lines, 229 SOQL — 205 already deterministic SQL) through the LLM + verification harness. Each output is checked for behavioral parity against the source — translated, then verified, never trusted blind.
  4. Resolve flagged formulas and unmodeled logic
    8 validation-rule formula(s) fall outside the deterministic subset and were flagged by running the real generator on your rules. These need manual/LLM translation and review — they are counted against readiness above.
  5. Migrate data and cut over
    Export record data from the 12 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)12
Typed columns105
Validators (Zod)
8 of 13 formulas need manual/LLM translation
13
Access policies (RBAC + row security)6
Generated views (React detail/edit + list views)36
Full-text search indexes6
Flows to translate
0 elements total
0
Apex classes to translate
23,166 source lines, 229 SOQL statements — 205 → SQL deterministically today
107
Apex triggers to translate2

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%

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 translation984.9 hCOMPLEX 1,530 code lines × 0.3; STANDARD 3,178 code lines × 0.12; MECHANICAL 771 code lines × 0.05; TEST 53 class(es) × 2 h/class (parity capture + golden fill; UNCALIBRATED)
Component rewrite (LWC/Aura)530 h11 partial × 6 h + 29 flagged × 16 h (3 auto-converted × 0)
Integration re-implementation12 h1 endpoint(s) × 12 h
Report / dashboard rebuild16 h8 refused × 2 h
Unhandled metadata (needs a person)468 h156 item(s) × 3 h
Data-migration dry-runs48 h12 object(s) × 4 h
Build subtotal2,058.9 hsum of workstreams
Code review (15% of build)308.8 hon the build critical path
QA (40% of build)823.6 hparallel stream, 30% lag
Total man-hours (pre-buffer)3,191.3 hbuild + review + QA
Schedule (parallel QA, critical path over 3)Value
Build calendar (build ÷ team)789.2 h
QA calendar (QA ÷ team)274.5 h
QA start lag236.8 h
Critical path = max(build, lag + QA)789.2 h
Calendar (+20% buffer)31.6 weeks ≈ 7.3 months

Budget: $574,436 = 3,829.6 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
apexCallout1

1 integration point(s) total — 0 mapped to an owned-stack equivalent, 1 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 found43
LWC / Aura37 / 6
  LWC converted (deterministic .tsx, zero blockers)3
  LWC partial (template converted, behavior needs a person)11
  LWC flagged (render-path blocker — manual rewrite)23
  Aura (manual rewrite — no converter)6

Per-component verdicts (partial / flagged)

ComponentVerdictBlockers (construct + phase)
__tests__flaggedJS service module (no template — not a rendered component) (template)
accordionSectionpartialimport from c/util (js); lifecycle connectedCallback() (js); getter classes not mechanically convertible (js); handler open not mechanically convertible (js) — +4 more
attendanceflaggedimport from c/util (js); lightning module import (lightning/navigation) (js); lightning module import (lightning/platformResourceLoader) (js); lightning module import (lightning/uiRecordApi) (js) — +27 more
attendanceRowflaggedimport from c/util (js); lightning module import (lightning/uiRecordApi) (js); @api get/set record with side-effecting setter (js); @api get/set fieldSet with side-effecting setter (js) — +6 more
bulkServiceDeliveryUIpartiallightning module import (lightning/navigation) (js); import from c/util (js); lightning module import (lightning/platformResourceLoader) (js); @salesforce platform import (@salesforce/client/formFactor) (js) — +17 more
formattedFieldflagged@salesforce platform import (@salesforce/i18n/timeZone) (js); import from c/util (js); field timeZone initializer not mechanical (js); getter value not mechanically convertible (js) — +1 more
futureSessionDeleterpartialimport from c/util (js); lightning module import (lightning/platformShowToastEvent) (js); @salesforce/apex import (ServiceScheduleCreatorController.deleteSessionsAfter) (js); @salesforce/apex import (ServiceScheduleCreatorController.getToday) (js) — +5 more
groupServiceDeliveriesflaggedimport from c/progressSteps (js); import from c/navigationItems (js); handler handleOption1 not mechanically convertible (js); handler handleOption2 not mechanically convertible (js) — +7 more
listViewSelectorflaggedlightning module import (lightning/uiListApi) (js); lightning module import (lightning/platformResourceLoader) (js); @salesforce platform import (@salesforce/user/Id) (js); @salesforce platform import (@salesforce/resourceUrl/pmm) (js) — +10 more
loadingStencilpartiallifecycle renderedCallback() (js); handler setOpacity not mechanically convertible (js)
modalpartiallifecycle renderedCallback() (js); handler show not mechanically convertible (js); handler hide not mechanically convertible (js); handler handleDialogClose not mechanically convertible (js) — +3 more
navigationItemsflaggedJS service module (no template — not a rendered component) (template)
newProgramEngagementflaggedlightning module import (lightning/navigation) (js); lightning module import (lightning/uiObjectInfoApi) (js); import from c/util (js); @salesforce/apex import (ProgramController.getProgramCohortsFromProgramId) (js) — +26 more
newServiceScheduleflaggedimport from c/util (js); lightning module import (lightning/uiRecordApi) (js); lightning module import (lightning/platformResourceLoader) (js); @salesforce/apex import (ServiceScheduleCreatorController.getDayNum) (js) — +26 more
participantAdderpartialimport from c/util (js); lightning module import (lightning/uiRecordApi) (js); @salesforce platform import (@salesforce/apex) (js); lightning module import (lightning/platformShowToastEvent) (js) — +13 more
participantSelectorflaggedimport from c/util (js); @salesforce platform import (@salesforce/apex) (js); @salesforce/apex import (ServiceScheduleCreatorController.getSelectParticipantModel) (js); @salesforce/apex import (ServiceScheduleCreatorController.getActiveStages) (js) — +39 more
picklistflagged@api get/set picklist with side-effecting setter (js); handler setOptions not mechanically convertible (js); handler handleChange not mechanically convertible (js); handler handleMultiSelectClick not mechanically convertible (js) — +1 more
progressStepsflaggedJS service module (no template — not a rendered component) (template)
pubsubflaggedlightning module import (lightning/navigation) (js); @wire CurrentPageReference (js); lifecycle connectedCallback() (js); handler dispatchGlobalEvent not mechanically convertible (js) — +2 more
recentSessionsflagged@salesforce/apex import (RecentServiceSessionController.getServiceSessionsByStartDate) (js); @salesforce/apex import (RecentServiceSessionController.getServiceSessionStatusBuckets) (js); @salesforce/apex import (RecentServiceSessionController.getMenuOptions) (js); lightning module import (lightning/platformResourceLoader) (js) — +18 more
reviewSessionsflaggedimport from c/util (js); @salesforce/apex import (ServiceScheduleCreatorController.processSchedule) (js); @salesforce/apex import (ServiceScheduleCreatorController.createSession) (js); @salesforce platform import (@salesforce/i18n/timeZone) (js) — +23 more
scopedNotificationflaggedstyle attribute (React needs a style object, LWC uses a string) (template)
sectionpartiallifecycle connectedCallback() (js); handler handleFocus not mechanically convertible (js)
serviceDeliveryDefaultsflaggedlightning module import (lightning/uiRecordApi) (js); @salesforce/apex import (FieldSetController.getFieldSetForLWC) (js); @wire getRecord (js); handler setUnitOfMeasurement not mechanically convertible (js) — +7 more
serviceDeliveryDeleterpartialimport from c/util (js); lightning module import (lightning/platformShowToastEvent) (js); @salesforce platform import (@salesforce/apex) (js); @salesforce/apex import (ServiceDeliveryController.deleteServiceDeliveriesForSession) (js) — +7 more
serviceDeliveryModalpartialimport from c/pubsub (js); lightning module import (lightning/navigation) (js); @wire CurrentPageReference (js); lifecycle connectedCallback() (js) — +5 more
serviceDeliveryRowflaggedimport from c/util (js); lightning module import (lightning/uiRecordApi) (js); import from c/pubsub (js); lightning module import (lightning/navigation) (js) — +36 more
serviceScheduleCreatorflaggedlightning module import (lightning/navigation) (js); lightning module import (lightning/platformShowToastEvent) (js); import from c/util (js); import from c/progressSteps (js) — +33 more
serviceScheduleCreatorModalflaggedlightning module import (lightning/modal) (js); lightning module import (lightning/navigation) (js); handler handleNavigate not mechanically convertible (js); base component <lightning-modal-header> (template) — +1 more
serviceScheduleCreatorWrapperpartiallightning module import (lightning/navigation) (js); import from c/serviceScheduleCreatorModal (js); lifecycle connectedCallback() (js); handler openSSModal not mechanically convertible (js) — +2 more
serviceScheduleReviewflaggedimport from c/util (js); @salesforce platform import (@salesforce/i18n/timeZone) (js); field timeZone initializer not mechanical (js); @api get/set serviceScheduleModel with side-effecting setter (js) — +9 more
sessionCardflaggedlightning module import (lightning/navigation) (js); @salesforce platform import (@salesforce/i18n/timeZone) (js); @salesforce platform import (@salesforce/i18n/locale) (js); handler processFields not mechanically convertible (js) — +4 more
skipLinkspartialhandler handleSkipToEndClick not mechanically convertible (js); handler handleSkipToStartClick not mechanically convertible (js); handler handleSkipToStartKeyboard not mechanically convertible (js); handler handleSkipToEndKeyboard not mechanically convertible (js)
utilflaggedlightning module import (lightning/platformShowToastEvent) (js); JS service module (no template — not a rendered component) (template)

3 of 37 LWC (8.1%) convert to a compiling React .tsx deterministically; 11 convert their template only (behavior stubbed for a person); 23 need a full manual rewrite. All 6 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. 7 of 12 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.

PageTypeObjectVerdictWhy it needs a person
AttendanceAppPageneeds a person
+ 1 org-wide blocker(s): attendance (see below)
Bulk_Service_DeliveriesAppPageneeds a person
custom LWC/Aura c:bulkServiceDeliveryUI needs rewrite as an owned React component (see Components section).
Contact_Record_PageRecordPageContactcovered (layout semantics)
Program_Cohort_Record_PageRecordPageProgramCohort__ccovered (layout semantics)
Program_Engagement_Record_PageRecordPageProgramEngagement__cneeds a person
runtime_sales_pathassistant:pathAssistant — Salesforce Path guidance: SF-proprietary runtime, no owned equivalent; product decision.
Program_Management_HomeHomePageneeds a person
desktopDashboards:embeddedDashboard — unrecognized 'desktopDashboards:' namespace, treated as platform-coupled (fail-closed); a person must classify it.
runtime_sales_activities:todayTaskContainer — Salesforce-managed runtime component (runtime_sales_activities: namespace), no owned equivalent; needs a person.
custom LWC/Aura c:recentSessions needs rewrite as an owned React component (see Components section).
Program_Record_PageRecordPageProgram__ccovered (layout semantics)
Service_Delivery_Record_PageRecordPageServiceDelivery__ccovered (layout semantics)
Service_Participant_Record_PageRecordPageServiceParticipant__ccovered (layout semantics)
Service_Record_PageRecordPageService__ccovered (layout semantics)
Service_Schedule_Record_PageRecordPageServiceSchedule__ccovered (layout semantics)
Service_Session_Record_PageRecordPageServiceSession__cneeds a person
+ 1 org-wide blocker(s): attendance (see below)

Org-wide recurring blockers

A component placed on more than one page is shown once here with its affected pages, instead of repeating the identical reason on every row.

ComponentClassPagesWhy / affected pages
attendancecustom2custom LWC/Aura c:attendance needs rewrite as an owned React component (see Components section).
Pages: Attendance, Service_Session_Record_Page

7 covered (layout semantics) · 5 needs a person · 12 page(s) total.

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 config10
Quick-create actions → create forms12
External-URL links → link config0
Flagged (need a person)6

Flagged UI actions — per-item reason

ItemKindWhy it needs a person
LogACallquickActionLogACall action "LogACall" — logs a standard Activity/Task against the host record; the activity subsystem is not in a pipeline yet.
ProgramEngagement__c.Add_to_Program_CohortquickActionUpdate action "ProgramEngagement__c.Add_to_Program_Cohort" — edits the host record in place with a curated field subset; the generated record page already edits fields inline, but wiring this quick-edit panel to its host layout needs a person.
ServiceSchedule__c.Add_More_ParticipantsquickActionCustom component action "ServiceSchedule__c.Add_More_Participants" — invokes a LightningComponent; covered by the LWC/Aura rewrite surface, not this config pass.
ServiceSchedule__c.Add_More_SessionsquickActionCustom component action "ServiceSchedule__c.Add_More_Sessions" — invokes a LightningComponent; covered by the LWC/Aura rewrite surface, not this config pass.
ServiceSchedule__c.Delete_Future_SessionsquickActionCustom component action "ServiceSchedule__c.Delete_Future_Sessions" — invokes a LightningComponent; covered by the LWC/Aura rewrite surface, not this config pass.
ServiceSession__c.Delete_All_Service_DeliveriesquickActionCustom component action "ServiceSession__c.Delete_All_Service_Deliveries" — invokes a LightningComponent; covered by the LWC/Aura rewrite surface, not this config pass.

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 files109
  classes / triggers / interfaces / enums107 / 2 / 0 / 0
Code lines (of 23,166 total)18,711
Methods (parsed)938
Deterministically translatable files (no LLM)0
Callout / async / @AuraEnabled / test classes1 / 7 / 9 / 53
SOQL — total / deterministic / flagged229 / 205 / 24
DML statements84
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.
151,530
STANDARD
ordinary business logic between the mechanical and complex boundaries.
183,178
MECHANICAL
small and bounded — few methods and SOQL, no callouts, async, or dynamic SOQL; a low-branching translation.
23771
TEST
regenerated as a parity harness, not translated line-for-line.
5313,232

Largest classes (by code lines)

ClassKindBucketCode lines
ServiceScheduleService_TESTclassTEST1,031
ServiceService_TESTclassTEST758
RollupRecord_TESTclassTEST727
ServiceScheduleCreatorController_TESTclassTEST652
FeatureParametersclassCOMPLEX644
FeatureParameters_TESTclassTEST630
MonthlyIterable_TESTclassTEST620
ServiceDeliveryController_TESTclassTEST449
ServiceDeliveryService_TESTclassTEST426
ServiceDeliveryTriggerHandler_TESTclassTEST412

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

Reports9
  auto-translatable to SQL1
  refused (see reasons below)8
Dashboards2
  fully rendered (every panel)0
  panels rendered0
  panels refused (see reasons below)0

Report refusal reasons

ConstructReports
unknown field1
unknown report object7

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)2
Flagged (outside the supported subset)11

13 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 modeled12
Roles0
Role hierarchy depth0
Sharing rules modeled0
Constructs flagged / not modeled14

OWD mix

Org-wide defaultObjects
Private4
ReadWrite8

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
Objects12
Fields105
Validation rules13
Record types0
List views10
Search layouts6
Permission sets6
Page layouts13
Profiles0
Flows0
Apex classes107
Apex triggers2
Apex source lines23,166
SOQL statements (measured)229
SOQL translating deterministically today205 (89.5%)
Workflow rules0
Email templates0
Reports9
Other: .asset2
Other: .asset-meta.xml2
Other: .compactlayout-meta.xml7
Other: .css5
Other: .dashboardfolder-meta.xml1
Other: .featureparameterinteger-meta.xml11
Other: .fieldset-meta.xml10
Other: .fieldtranslation-meta.xml951
Other: .flexipage-meta.xml12
Other: .group-meta.xml1
Other: .json108
Other: .labels-meta.xml1
Other: .md-meta.xml4
Other: .navigationmenu-meta.xml1
Other: .network-meta.xml1
Other: .objecttranslation-meta.xml130
Other: .pathassistant-meta.xml1
Other: .quickaction-meta.xml18
Other: .reportfolder-meta.xml1
Other: .reporttype-meta.xml1
Other: .resource-meta.xml1
Other: .sharingset-meta.xml1
Other: .site-meta.xml1
Other: .tab-meta.xml10
Other: .translation-meta.xml9
Total files scanned1,886