Overall readiness for an exit onto owned code, scored from your metadata.
Significant custom logic
Plan for guided translation — the deterministic core is smaller in this org.
This score is coverage of auto-transcription: the share of inventoried items that convert deterministically today, with no AI in the loop. Validation-rule formulas outside the deterministic subset are counted against it, so the number is honest rather than flattering.
Category-by-category, in the Readiness-Report rhythm: what is ready, what needs attention, what is blocked. Each metadata item weighs 1. Validation rules whose formulas fall outside the deterministic subset are counted against today’s coverage — they were flagged by running the actual generator on your rules.
Transcribed today — deterministic transcription, running now, no AI in the loop.
| Artifact | Count |
|---|---|
| Objects → PostgreSQL tables (Prisma models) | 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, 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 |
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 |
| 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 |
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,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 / 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. |
.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. |
.compactlayout-meta.xml | 7 | CompactLayout — highlights-panel field ordering; the generated record UI derives its own layout, so there is no data or logic to migrate. |
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 classes to translate 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.
| 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 |
| Unhandled metadata (needs a person) | 468 h | 156 item(s) × 3 h |
| Data-migration dry-runs | 48 h | 12 object(s) × 4 h |
| Build subtotal | 2,058.9 h | sum of workstreams |
| Code review (15% of build) | 308.8 h | on the build critical path |
| QA (40% of build) | 823.6 h | parallel stream, 30% lag |
| Total man-hours (pre-buffer) | 3,191.3 h | build + 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 lag | 236.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.
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 |
| External-URL links → link config | 0 |
| Flagged (need a person) | 6 |
| 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. |
ProgramEngagement__c.Add_to_Program_Cohort | quickAction | Update 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_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) | 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.
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 |