Overall readiness for an exit onto owned code, scored from your metadata.
Moderate readiness
A solid deterministic core, with custom logic to translate and parity-verify.
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.
Composition: 157 of the 376 ready-today item(s) (41.8%) are custom labels — each copied verbatim into the app's typed i18n catalog. Every label is a real migrated unit, but it is also the cheapest one, so the share is stated here rather than carried silently in the headline.
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) | 12 |
| Fields → typed columns | 105 |
| Validation rules → Zod validators (formula subset) 8 formula(s) outside the deterministic subset counted below | 5 |
| Record types → per-variant schemas | 0 |
| List views → table configs + SQL filters | 10 |
| Search layouts → Postgres full-text indexes | 6 |
| Permission sets → RBAC policies + row security | 6 |
| Page layouts → React detail + edit views | 13 |
| 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, quick-update actions, external-URL links) 10 field set(s), 12 quick-create action(s), 1 quick-update 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, +15 more | 23 |
| Custom labels — shipped as the app's i18n message catalog each label copied verbatim (NOT transpiled) into web/src/i18n/labels.ts — a typed catalog + t() accessor proven to pass the app's strict tsc — transcribe emits the same file | 157 |
| Compact layouts → record highlights panel (default assignment honored) each object's default compact layout parsed by the real parser and its field order rendered into the generated record's highlights chips by app-shell — ProgramCohort__c, ProgramEngagement__c, Program__c, ServiceDelivery__c, ServiceSchedule__c, ServiceSession__c, Service__c | 7 |
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 | 8 |
| Apex classes 23,166 lines, 229 SOQL statements — 205 (89.5%) already translate to SQL deterministically | 107 |
| Apex triggers | 2 |
| Flows | 0 |
| Workflow rules | 0 |
| 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 |
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 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 |
| 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. — 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 |
| 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. | 2 |
| 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. | 2 |
| Not yet pipelined · DashboardFolder (.dashboardfolder-meta.xml) Dashboard folder — a container that groups dashboards and carries folder-level access (folderShares). On the owned stack it becomes a registry grouping plus access rules that grant the folder's Group/Role principals (reusing the sharing/group work); the folder converter is planned, so it stays counted against readiness. | 1 |
| Not yet pipelined · Group (.group-meta.xml) Public group — a named set of users/roles used as a sharing principal (referenced by sharing rules' sharedTo.group). On the owned stack it becomes a team principal in row-level security; the group→principal pipeline lands separately, so it stays counted against readiness (live membership is a data-migration step). | 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 · 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. | 1 |
| Not yet pipelined · PathAssistant (.pathassistant-meta.xml) Path assistant — the guided per-stage path (key fields + guidance text) shown on a record's highlights. On the owned stack it becomes a stage-config the record UI reads; the path converter is planned, so it stays counted against readiness. | 1 |
| Not yet pipelined · ReportFolder (.reportfolder-meta.xml) Report folder — a container that groups reports and carries folder-level access (folderShares). On the owned stack it becomes a registry grouping plus access rules that grant the folder's Group/Role principals (reusing the sharing/group work); the folder converter is planned, so it stays counted against readiness. | 1 |
| Not yet pipelined · ReportType (.reporttype-meta.xml) Custom report type — defines the base object, its joins, and the columns a report can draw from. On the owned stack it becomes a report-source definition (base + joins + column set) the report generator reads; the report-type parser is planned, so it stays counted against readiness. | 1 |
| 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. | 1 |
| Not yet pipelined · SharingSet (.sharingset-meta.xml) Sharing set — grants Experience/portal users access to records related to their own account/contact. On the owned stack it becomes a row-level-security rule keyed to the user's linked account; the sharing-set pipeline is planned, so it stays counted against readiness. | 1 |
| 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. | 1 |
| Custom Metadata records — namespace-tokenized placeholders / package-build variants ___NAMESPACE___FeatureGate.___NAMESPACE___ServiceDeliveriesToContact.md-meta.xml — namespace-tokenized package-build duplicate of FeatureGate.ServiceDeliveriesToContact (which transcribes cleanly) — an unbuilt managed-package build variant, not a separate org record; counted against readiness, fail-closed · ___NAMESPACE___FeatureGate.___NAMESPACE___ServiceDeliveriesToProgramEngagement.md-meta.xml — namespace-tokenized package-build duplicate of FeatureGate.ServiceDeliveriesToProgramEngagement (which transcribes cleanly) — an unbuilt managed-package build variant, not a separate org record; counted against readiness, fail-closed · ___NAMESPACE___FeatureGate.___NAMESPACE___ServiceDeliveriesToService.md-meta.xml — namespace-tokenized package-build duplicate of FeatureGate.ServiceDeliveriesToService (which transcribes cleanly) — an unbuilt managed-package build variant, not a separate org record; counted against readiness, fail-closed · ___NAMESPACE___FeatureGate.___NAMESPACE___ServiceDeliveriesToServiceSession.md-meta.xml — namespace-tokenized package-build duplicate of FeatureGate.ServiceDeliveriesToServiceSession (which transcribes cleanly) — an unbuilt managed-package build variant, not a separate org record; counted against readiness, fail-closed | 4 |
| Quick actions — need a person LogACall, 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 | 5 |
| 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 |
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.
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) | Files | Recognized metadata inside (count only) |
|---|---|---|
robot/ | 62 | no recognized metadata types |
metadeploy/ | 10 | no recognized metadata types |
.github/ | 9 | no recognized metadata types |
scripts/ | 9 | no recognized metadata types |
orgs/ | 8 | no recognized metadata types |
datasets/ | 4 | no recognized metadata types |
lib/ | 2 | no recognized metadata types |
data/ | 1 | no recognized metadata types |
push/ | 1 | no recognized metadata types |
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,111 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 / family | Files | Why there is nothing to migrate |
|---|---|---|
.fieldtranslation-meta.xml | 951 | Localized 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.xml | 130 | Localized object-label translation — display strings only, no schema or logic; relevant only for multi-language UI. |
.featureparameterinteger-meta.xml | 11 | FeatureParameter (Integer) — an ISV managed-package telemetry value (dataflowDirection SubscriberToLmo, verified in corpus) reported from a subscriber org back to the package's License Management Org. Salesforce documents FeatureParameter as exclusive to ISV package developers with no inherent CRM runtime behavior, so a self-hosted CRM reproduces nothing — there is nothing to migrate. |
.tab-meta.xml | 10 | CustomTab — a navigation container only; app navigation is regenerated from CustomApplication, and a tab carries no data or logic of its own. |
.translation-meta.xml | 9 | Org-wide UI translation (labels/picklist/report labels) — display strings only; relevant only for multi-language UI. |
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
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) | 12 |
| Typed columns | 105 |
| 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 indexes | 6 |
| Flows to translate 0 elements total | 0 |
| Apex types to translate (classes / enums / interfaces) 23,166 source lines, 229 SOQL statements — 205 → SQL deterministically today | 107 |
| Apex triggers to translate | 2 |
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.
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.
| Workstream | Man-hours | Basis (quantity × rate) |
|---|---|---|
| Apex translation | 984.9 h | COMPLEX 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 h | 11 partial × 6 h + 29 flagged × 16 h (3 auto-converted × 0) |
| Integration re-implementation | 12 h | 1 endpoint(s) × 12 h |
| Report / dashboard rebuild | 16 h | 8 refused × 2 h |
| Not yet pipelined — identified, with porting path (needs a person today) | 429 h | 143 item(s) × 3 h |
| Data-migration dry-runs | 48 h | 12 object(s) × 4 h |
| Build subtotal | 2,019.9 h | sum of workstreams |
| Code review (15% of build) | 303 h | on the build critical path |
| QA (40% of build) | 808 h | parallel stream, 30% lag |
| Total man-hours (pre-buffer) | 3,130.9 h | build + review + QA |
| Schedule (parallel QA, critical path over 3) | Value |
|---|---|
| Build calendar (build ÷ team) | 774.3 h |
| QA calendar (QA ÷ team) | 269.3 h |
| QA start lag | 232.3 h |
| Critical path = max(build, lag + QA) | 774.3 h |
| Calendar (+20% buffer) | 31 weeks ≈ 7.1 months |
Budget: $563,565 = 3,757.1 h (incl. 20% buffer) × $150/h.
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 |
|---|---|
apexCallout | 1 |
1 integration point(s) total — 0 mapped to an owned-stack equivalent, 1 flagged for human design work.
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 found | 43 |
| LWC / Aura | 37 / 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 |
| Component | Verdict | Blockers (construct + phase) |
|---|---|---|
__tests__ | flagged | JS service module (no template — not a rendered component) (template) |
accordionSection | partial | import from c/util (js); lifecycle connectedCallback() (js); getter classes not mechanically convertible (js); handler open not mechanically convertible (js) — +4 more |
attendance | flagged | import from c/util (js); lightning module import (lightning/navigation) (js); lightning module import (lightning/platformResourceLoader) (js); lightning module import (lightning/uiRecordApi) (js) — +27 more |
attendanceRow | flagged | import 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 |
bulkServiceDeliveryUI | partial | lightning 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 |
formattedField | flagged | @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 |
futureSessionDeleter | partial | import from c/util (js); lightning module import (lightning/platformShowToastEvent) (js); @salesforce/apex import (ServiceScheduleCreatorController.deleteSessionsAfter) (js); @salesforce/apex import (ServiceScheduleCreatorController.getToday) (js) — +5 more |
groupServiceDeliveries | flagged | import from c/progressSteps (js); import from c/navigationItems (js); handler handleOption1 not mechanically convertible (js); handler handleOption2 not mechanically convertible (js) — +7 more |
listViewSelector | flagged | lightning 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 |
loadingStencil | partial | lifecycle renderedCallback() (js); handler setOpacity not mechanically convertible (js) |
modal | partial | lifecycle renderedCallback() (js); handler show not mechanically convertible (js); handler hide not mechanically convertible (js); handler handleDialogClose not mechanically convertible (js) — +3 more |
navigationItems | flagged | JS service module (no template — not a rendered component) (template) |
newProgramEngagement | flagged | lightning module import (lightning/navigation) (js); lightning module import (lightning/uiObjectInfoApi) (js); import from c/util (js); @salesforce/apex import (ProgramController.getProgramCohortsFromProgramId) (js) — +26 more |
newServiceSchedule | flagged | import from c/util (js); lightning module import (lightning/uiRecordApi) (js); lightning module import (lightning/platformResourceLoader) (js); @salesforce/apex import (ServiceScheduleCreatorController.getDayNum) (js) — +26 more |
participantAdder | partial | import from c/util (js); lightning module import (lightning/uiRecordApi) (js); @salesforce platform import (@salesforce/apex) (js); lightning module import (lightning/platformShowToastEvent) (js) — +13 more |
participantSelector | flagged | import from c/util (js); @salesforce platform import (@salesforce/apex) (js); @salesforce/apex import (ServiceScheduleCreatorController.getSelectParticipantModel) (js); @salesforce/apex import (ServiceScheduleCreatorController.getActiveStages) (js) — +39 more |
picklist | flagged | @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 |
progressSteps | flagged | JS service module (no template — not a rendered component) (template) |
pubsub | flagged | lightning module import (lightning/navigation) (js); @wire CurrentPageReference (js); lifecycle connectedCallback() (js); handler dispatchGlobalEvent not mechanically convertible (js) — +2 more |
recentSessions | flagged | @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 |
reviewSessions | flagged | import 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 |
scopedNotification | flagged | style attribute (React needs a style object, LWC uses a string) (template) |
section | partial | lifecycle connectedCallback() (js); handler handleFocus not mechanically convertible (js) |
serviceDeliveryDefaults | flagged | lightning module import (lightning/uiRecordApi) (js); @salesforce/apex import (FieldSetController.getFieldSetForLWC) (js); @wire getRecord (js); handler setUnitOfMeasurement not mechanically convertible (js) — +7 more |
serviceDeliveryDeleter | partial | import from c/util (js); lightning module import (lightning/platformShowToastEvent) (js); @salesforce platform import (@salesforce/apex) (js); @salesforce/apex import (ServiceDeliveryController.deleteServiceDeliveriesForSession) (js) — +7 more |
serviceDeliveryModal | partial | import from c/pubsub (js); lightning module import (lightning/navigation) (js); @wire CurrentPageReference (js); lifecycle connectedCallback() (js) — +5 more |
serviceDeliveryRow | flagged | import from c/util (js); lightning module import (lightning/uiRecordApi) (js); import from c/pubsub (js); lightning module import (lightning/navigation) (js) — +36 more |
serviceScheduleCreator | flagged | lightning module import (lightning/navigation) (js); lightning module import (lightning/platformShowToastEvent) (js); import from c/util (js); import from c/progressSteps (js) — +33 more |
serviceScheduleCreatorModal | flagged | lightning 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 |
serviceScheduleCreatorWrapper | partial | lightning module import (lightning/navigation) (js); import from c/serviceScheduleCreatorModal (js); lifecycle connectedCallback() (js); handler openSSModal not mechanically convertible (js) — +2 more |
serviceScheduleReview | flagged | import 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 |
sessionCard | flagged | lightning 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 |
skipLinks | partial | handler handleSkipToEndClick not mechanically convertible (js); handler handleSkipToStartClick not mechanically convertible (js); handler handleSkipToStartKeyboard not mechanically convertible (js); handler handleSkipToEndKeyboard not mechanically convertible (js) |
util | flagged | lightning 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.
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.
| Page | Type | Object | Verdict | Why it needs a person |
|---|---|---|---|---|
Attendance | AppPage | — | needs a person | + 1 org-wide blocker(s): attendance (see below) |
Bulk_Service_Deliveries | AppPage | — | needs a person | custom LWC/Aura c:bulkServiceDeliveryUI needs rewrite as an owned React component (see Components section). |
Contact_Record_Page | RecordPage | Contact | covered (layout semantics) | — |
Program_Cohort_Record_Page | RecordPage | ProgramCohort__c | covered (layout semantics) | — |
Program_Engagement_Record_Page | RecordPage | ProgramEngagement__c | needs a person | runtime_sales_pathassistant:pathAssistant — Salesforce Path guidance: SF-proprietary runtime, no owned equivalent; product decision. |
Program_Management_Home | HomePage | — | needs 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_Page | RecordPage | Program__c | covered (layout semantics) | — |
Service_Delivery_Record_Page | RecordPage | ServiceDelivery__c | covered (layout semantics) | — |
Service_Participant_Record_Page | RecordPage | ServiceParticipant__c | covered (layout semantics) | — |
Service_Record_Page | RecordPage | Service__c | covered (layout semantics) | — |
Service_Schedule_Record_Page | RecordPage | ServiceSchedule__c | covered (layout semantics) | — |
Service_Session_Record_Page | RecordPage | ServiceSession__c | needs a person | + 1 org-wide blocker(s): attendance (see below) |
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.
| Component | Class | Pages | Why / affected pages |
|---|---|---|---|
attendance | custom | 2 | custom 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.
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 config | 10 |
| Quick-create actions → create forms | 12 |
| Quick-update actions → edit forms | 1 |
| External-URL links → link config | 0 |
| Flagged (need a person) | 5 |
| Item | Kind | Why it needs a person |
|---|---|---|
LogACall | quickAction | LogACall action "LogACall" — logs a standard Activity/Task against the host record; the activity subsystem is not in a pipeline yet. |
ServiceSchedule__c.Add_More_Participants | quickAction | Custom 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_Sessions | quickAction | Custom 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_Sessions | quickAction | Custom 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_Deliveries | quickAction | Custom component action "ServiceSession__c.Delete_All_Service_Deliveries" — invokes a LightningComponent; covered by the LWC/Aura rewrite surface, not this config pass. |
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 files | 109 |
| classes / triggers / interfaces / enums | 107 / 2 / 0 / 0 |
| Code lines (of 23,166 total) | 18,711 |
| Methods (parsed) | 938 |
| Deterministically translatable files (no LLM) | 0 |
| Callout / async / @AuraEnabled / test classes | 1 / 7 / 9 / 53 |
| SOQL — total / deterministic / flagged | 229 / 205 / 24 |
| DML statements | 84 |
| Parse failures (method count unknown, flagged) | 0 |
| Bucket | Files | Code lines |
|---|---|---|
| COMPLEX carries real risk — callouts, async (@future / Queueable / Batchable / Schedulable), dynamic SOQL, or large / high-method. | 15 | 1,530 |
| STANDARD ordinary business logic between the mechanical and complex boundaries. | 18 | 3,178 |
| MECHANICAL small and bounded — few methods and SOQL, no callouts, async, or dynamic SOQL; a low-branching translation. | 23 | 771 |
| TEST regenerated as a parity harness, not translated line-for-line. | 53 | 13,232 |
| Class | Kind | Bucket | Code lines |
|---|---|---|---|
ServiceScheduleService_TEST | class | TEST | 1,031 |
ServiceService_TEST | class | TEST | 758 |
RollupRecord_TEST | class | TEST | 727 |
ServiceScheduleCreatorController_TEST | class | TEST | 652 |
FeatureParameters | class | COMPLEX | 644 |
FeatureParameters_TEST | class | TEST | 630 |
MonthlyIterable_TEST | class | TEST | 620 |
ServiceDeliveryController_TEST | class | TEST | 449 |
ServiceDeliveryService_TEST | class | TEST | 426 |
ServiceDeliveryTriggerHandler_TEST | class | TEST | 412 |
LLM assessment: not run (key-gated per engagement).
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 | 9 |
| auto-translatable to SQL | 1 |
| refused (see reasons below) | 8 |
| Dashboards | 2 |
| fully rendered (every panel) | 0 |
| panels rendered | 0 |
| panels refused (see reasons below) | 0 |
| Construct | Reports |
|---|---|
| unknown field | 1 |
| unknown report object | 7 |
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) | 4 |
| Rollup triggers (roll-up summaries) | 0 |
| Query-time resolvers (cross-object formulas) | 2 |
| Flagged (outside the supported subset) | 7 |
13 computed field(s) classified total.
Everything found in the metadata snapshot, by type — the raw counts behind the readiness score above.
| Metadata | Count |
|---|---|
| Objects | 12 |
| Fields | 105 |
| Validation rules | 13 |
| Record types | 0 |
| List views | 10 |
| Search layouts | 6 |
| Permission sets | 6 |
| Page layouts | 13 |
| Profiles | 0 |
| Flows | 0 |
| Apex classes | 107 |
| Apex triggers | 2 |
| Apex source lines | 23,166 |
| SOQL statements (measured) | 229 |
| SOQL translating deterministically today | 205 (89.5%) |
| Workflow rules | 0 |
| Email templates | 0 |
| Reports | 9 |
| Other: .asset | 2 |
| Other: .asset-meta.xml | 2 |
| Other: .compactlayout-meta.xml | 7 |
| Other: .css | 5 |
| Other: .dashboardfolder-meta.xml | 1 |
| Other: .featureparameterinteger-meta.xml | 11 |
| Other: .fieldset-meta.xml | 10 |
| Other: .fieldtranslation-meta.xml | 951 |
| Other: .flexipage-meta.xml | 12 |
| Other: .group-meta.xml | 1 |
| Other: .json | 108 |
| Other: .labels-meta.xml | 1 |
| Other: .md-meta.xml | 4 |
| Other: .navigationmenu-meta.xml | 1 |
| Other: .network-meta.xml | 1 |
| Other: .objecttranslation-meta.xml | 130 |
| Other: .pathassistant-meta.xml | 1 |
| Other: .quickaction-meta.xml | 18 |
| Other: .reportfolder-meta.xml | 1 |
| Other: .reporttype-meta.xml | 1 |
| Other: .resource-meta.xml | 1 |
| Other: .sharingset-meta.xml | 1 |
| Other: .site-meta.xml | 1 |
| Other: .tab-meta.xml | 10 |
| Other: .translation-meta.xml | 9 |
| Total files scanned | 1,886 |