Overall readiness for an exit onto owned code, scored from your metadata.
High readiness
Most of this org converts automatically to code you own.
This score is coverage of auto-transcription: the share of inventoried items that convert deterministically today, with no AI in the loop. Validation-rule formulas outside the deterministic subset are counted against it, so the number is honest rather than flattering.
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) | 3 |
| Fields → typed columns | 93 |
| Validation rules → Zod validators (formula subset) | 0 |
| Record types → per-variant schemas | 0 |
| List views → table configs + SQL filters | 19 |
| Search layouts → Postgres full-text indexes | 3 |
| Permission sets → RBAC policies + row security | 0 |
| Page layouts → React detail + edit views | 12 |
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 | 0 |
| Apex classes 0 lines, 0 SOQL statements | 0 |
| Apex triggers | 0 |
| Flows | 0 |
| Workflow rules | 0 |
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 | 0 |
| Dashboards not fully rendered | 0 |
| Integration points (named credentials, connected apps, remote sites) | 0 |
| Sharing metadata (roles, sharing rules files) | 0 |
| Custom UI components (LWC/Aura) | 0 |
| Other metadata files (see inventory) | 28 |
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) | 3 |
| Typed columns | 93 |
| Validators (Zod) 0 of 0 formulas need manual/LLM translation | 0 |
| Access policies (RBAC + row security) | 0 |
| Generated views (React detail/edit + list views) | 43 |
| Full-text search indexes | 3 |
| Flows to translate 0 elements total | 0 |
| Apex classes to translate 0 source lines, 0 SOQL statements — 0 → SQL deterministically today | 0 |
| Apex triggers to translate | 0 |
| Seats | 80 |
| Current per-seat cost | $175/user/mo |
| Annual license spend — recurring every year | $168,000/yr |
| Agentforce-era add-on exposure at renewal $125–$550/user/mo add-ons (published 2026 list) — range shown, not a prediction | $120,000–$528,000/yr additional |
A migration is a one-time conversion of the bill of materials above into code you own — after which the per-seat line item is $0 and the recurring cost is your own hosting and maintenance. This report does not estimate the conversion price; it scopes exactly what the conversion consists of.
Every figure below is computed from this org's measured cost exposure. Assumptions (tunable per deal): one-time conversion = 1.25× current annual license; aftercare = 12%/yr of former spend (flat, not per-seat); Salesforce escalation 8%/yr; all-in TCO 1.5× license.
| Line | Stay on Salesforce (5 yr) | Own it with OpenForce (5 yr) |
|---|---|---|
| License (with 8%/yr escalation) | $985,589 | — |
| All-in TCO (1.5× license) | $1,478,383 | — |
| Agentforce add-on (if adopted) | $600,000 – $2,640,000 | — |
| One-time conversion (1.25× annual) | — | $210,000 |
| Aftercare (12%/yr, flat) | — | $80,640 |
| 5-year total | $1,478,383 – $4,118,383 | $290,640 |
Net saved: $1,187,743 (up to $3,827,743 if they adopt Agentforce) · Payback ≈ 15 months · then you own the code, forever.
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 |
|---|---|
| None found | 0 |
0 integration point(s) total — 0 mapped to an owned-stack equivalent, 0 flagged for human design work.
LWC/Aura bundles found on disk — inventoried and scoped, not auto-converted.
Custom UI (Lightning Web Components / Aura). There is no trustworthy automated LWC/Aura→React translator — faking one would ship silently-wrong UI. Every component here needs a human rewrite; the value is precise scoping (public API, data dependencies, events), not a fabricated conversion.
| Components found | 0 |
| LWC | 0 |
| Aura | 0 |
| Simple (display-only) | 0 |
| Moderate (one data dependency) | 0 |
| Complex (imperative calls / events / multiple dependencies) | 0 |
No custom UI components found.
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 | 0 |
| auto-translatable to SQL | 0 |
| refused (see reasons below) | 0 |
| Dashboards | 0 |
| fully rendered (every panel) | 0 |
| panels rendered | 0 |
| panels refused (see reasons below) | 0 |
Computed fields, classified by the owned-stack construct each becomes.
Computed fields, split by the owned-stack construct they become: a same-object formula becomes a Postgres GENERATED ALWAYS AS column; a cross-object formula becomes a query-time resolver (generated columns can't reference another table's row); a roll-up summary becomes a trigger-maintained aggregate. Anything outside that subset is flagged, never guessed.
| Generated columns (same-object formulas) | 0 |
| Rollup triggers (roll-up summaries) | 0 |
| Query-time resolvers (cross-object formulas) | 0 |
| Flagged (outside the supported subset) | 0 |
0 computed field(s) classified total.
Everything found in the metadata snapshot, by type — the raw counts behind the readiness score above.
| Metadata | Count |
|---|---|
| Objects | 3 |
| Fields | 93 |
| Validation rules | 0 |
| Record types | 0 |
| List views | 19 |
| Search layouts | 3 |
| Permission sets | 0 |
| Page layouts | 12 |
| Profiles | 0 |
| Flows | 0 |
| Apex classes | 0 |
| Apex triggers | 0 |
| Apex source lines | 0 |
| SOQL statements (measured) | 0 |
| SOQL translating deterministically today | 0 |
| Workflow rules | 0 |
| Email templates | 0 |
| Reports | 0 |
| Other: .app-meta.xml | 26 |
| Other: .weblink-meta.xml | 2 |
| Total files scanned | 156 |