FormsRefresh

For consultancies that migrate Oracle Forms applications

Behaviour proven identical to the original, on a modern interface

A Forms migration is accepted today on manual testing and trust. FormsRefresh runs the original application, records what it does on screen and in the database, and replays the same steps against the replacement. Acceptance becomes a recorded, repeatable check that lists every difference.

The check in three and a half minutes: what FormsRefresh is, then the retail demo app on Oracle Forms and as native APEX, and a defect it catches that a database comparison misses. Synthetic voice.
71 of 71scenarios at parity in four migrated apps
0defects left, after one or two repair rounds per app
167 of 175Forms triggers and program units covered
3 runsbyte-identical records and diffs for every scenario
1854defect values found in the first conversions

Four migrated applications, running live

Retail order system

6 Forms modules: orders with lines, a list of values and alerts, four maintenance forms.

Original Oracle Forms screen, scenario order-two-lines
Original: Oracle Forms
Migrated web app, same step
Migrated: .NET and PostgreSQL
  • 17 of 17 scenarios at parity
  • 0 defects
  • 60 of 60 triggers and units covered

HR application

3 Forms modules on Oracle's HR schema: login, console, employees on tab pages.

Original Oracle Forms screen, scenario employees-open
Original: Oracle Forms
Migrated web app, same step
Migrated: .NET and PostgreSQL
  • 17 of 17 scenarios at parity
  • 0 defects
  • 24 of 24 triggers and units covered

CareWell clinic

5 Forms modules, a menu module and a PL/SQL library: patients, appointments, billing.

Original Oracle Forms screen, scenario appointments-book
Original: Oracle Forms
Migrated web app, same step
Migrated: .NET and PostgreSQL
  • 22 of 22 scenarios at parity
  • 0 defects
  • 58 of 65 triggers and units covered

Student forms

3 Forms modules: courses, instructors with four windows and a list of values, sections.

Original Oracle Forms screen, scenario form2-courses
Original: Oracle Forms
Migrated web app, same step
Migrated: .NET and PostgreSQL
  • 15 of 15 scenarios at parity
  • 0 defects
  • 25 of 26 triggers and units covered

The live demos share one database per app: visitors see each other's changes, and the data resets to the scenario fixture every night.

What the check caught

Every conversion below was written by a coding agent and checked against the running original.

ConversionCaught that the agent had missedRepair
Retail: the agent's .NET/PostgreSQL build, once it had passed the independent database and API checks9 defects, 71 values, in the first scenario checked1 round
Retail: the same build with those 9 repaired, all 17 scenarios403 values in 164 groups, 12 causes1 round
HR: written from the Forms source alone73 values in 13 of 17 scenarios: 52 misses, 21 now waivers1 round
CareWell: written from the Forms source alone244 values in 22 of 22 scenarios: 81 misses, 163 now waivers1 round
Student forms: written from the Forms source alone1134 values in all 15 scenarios, 12 causes2 rounds
Angular front ends of the four appsretail, CareWell and student nothing; HR: the page rendered nothingHR: 1 fix
Oracle data layer of the four apps (the database kept)retail and HR nothing: 17 of 17 each on the first run; CareWell: tied rows, a localised error; student: the row orderCareWell: 2 fixes; student: 1 fix
Restyle and navigation rewrites of both appsnothing: diffs byte-identicalnone

These are small sample apps, of 6, 3, 5 and 3 forms, and agents still missed behaviour like this. A large application maintained for many years carries far more of it, undocumented and on nobody's list; that is where checking against the running original pays off. The causes and their evidence.

1:1 behaviour, new interface

A proven 1:1 conversion is the safe first step of a modernisation, and it does not tie the new application to the old screens. The contract is behaviour, not pixels. What is compared is what the user and the database see: the value in each field, the messages and alerts, where the cursor goes, and every row and sequence value written. A mapping ties each Forms item (ORDERS.CUSTOMER_ID) to its element in the new interface, so a redesigned screen, with new layout, styling and navigation, is checked as strictly as a pixel-faithful clone.

Nothing about the old screen is dropped silently. A Forms element the new screen does not have is listed in every diff as unmapped, and behaviour the customer chooses to change becomes an explicit waiver with its reason and the exact values it covers. Modernise freely and keep the proof.

FormsRefresh: proof that a migrated Oracle Forms application behaves like the original

FormsRefresh is for consultancies that migrate Oracle Forms applications. A migration is accepted today on manual testing and trust. FormsRefresh runs the original application, records what it does on screen and in the database, and replays the same steps against the replacement, so acceptance becomes a recorded, repeatable check that lists every difference.

Coding agents convert a Forms application fast; proving the result is the hard part. FormsRefresh is that proof, and its classified diff is what the agent repairs from: both demo applications reached full parity after one repair round. A proven 1:1 conversion is the safe first step of a modernisation, and because the check compares behaviour through a mapping rather than pixels, a later redesign of the interface stays under the same proof. The database changes are compared as well as the screens, so the check covers a move of the data layer (both demos went from Oracle to PostgreSQL, and both also run on their original Oracle schema) and of the platform (Forms to a .NET web application, with a plain JavaScript or an Angular front end). The migration trails list what is proven and what plugs in. Every number below links to its evidence on formsrefresh.com.

The problem

A Forms migration is accepted when the customer believes the new application does what the old one did. Conversion is becoming cheap; showing equivalence is not. It is usually shown with hand-written tests and user acceptance testing, and those tests are written from what people think the old system does.

The behaviour that breaks is the kind nobody writes down. When a sequence value is drawn. Which column a form inserts as NULL. When a trigger computes a total. Which alert follows a commit, and where the cursor goes after Tab. Database checks and API tests see the stored rows, and only for the inputs someone thought of. They do not see what the user saw, in which order, or what the form refused to save. On the sample rebuild shown here, an independent database and API evaluation passed most of its checks, and the first recorded scenario still found nine defects that the evaluation had not reported (evidence).

Migration trails

Trail Status
Forms to .NET web on PostgreSQL proven with evidence, live demos
Oracle stays: Forms to .NET web on the original Oracle schema proven with evidence (not deployed)
Angular front end on the same back end proven with evidence, live
React, Blazor or APEX front end adapter plug point documented
SQL Server on request

Setup

The runner connects to the original Forms application in the customer's own licensed environment: their Forms Services, their database, one test schema and a client host. FormsRefresh installs no Oracle software.

A small Java agent in the Forms client reads the client's component tree, in which Forms names every item BLOCK.ITEM. The runner finds each element by that name and sends real keystrokes and clicks to it, so input passes through format masks, KEY- triggers, enabled and disabled items, lists of values and alerts as a user's would. It never uses screen coordinates or image matching.

Scenarios

An LLM agent reads the Forms source (the XML export of each module and the PL/SQL) and writes scenarios: business-level steps that address items by name. It keeps writing them until every trigger, program unit and branch is exercised.

Each scenario starts from a restored database baseline. The runner records a golden record for it: after every step, every item on the canvas, the focus, the message line, open alerts and lists of values, and at the end the full database change set (rows inserted, updated and deleted, and every sequence value drawn). Values that depend on the clock or the run date are masked, so a golden record is the same in every run, on any day.

Coverage is measured, not guessed. Forms Runtime Diagnostics shows which triggers and program units fired, and DBMS_PLSQL_CODE_COVERAGE shows the database PL/SQL blocks that ran. Every trigger, unit and branch ends up covered, unreachable (a candidate for retirement before anyone converts it) or blocked with a stated reason.

Conversion

Conversion is done by ordinary coding agents or by the consultancy's own team, on whatever target stack the customer chooses. FormsRefresh is not a converter and produces no target code.

Validation

The same scenarios replay against the new application through an adapter for its stack: the web adapter used here drives the browser and reads the PostgreSQL database. Every recorded value is classified:

A repair agent fixes the defects from the diff and the golden records alone, without the Forms source, and the scenarios run again. Source behaviour that the customer chooses not to keep, such as a debugging message left in a trigger, becomes an explicit waiver with its reason. Each waiver is pinned to the values it covers and is listed in every diff with the number of values it applied to, so nothing is waived silently.

Value

Measured on two public Forms applications, a retail order system (6 modules) and an HR application (3 modules):

Measure Retail HR
Coverage of Forms triggers and program units 60 of 60 24 of 24
Decision branches classified 18: 14 covered, 2 unreachable, 2 blocked 32: 24 covered, 4 unreachable, 4 blocked
Scenarios, each repeating byte for byte in three runs 17 17
Defects found in the first conversion 403 values in 16 scenarios; 1 of 17 at parity 73 values in 13 of 17 scenarios
Repair rounds to parity on all 17 scenarios 1 (19 min of agent repair, 4 files changed) 1 (about 4 min, 58 lines changed)
Waivers proposed for the customer's decision 10 2

Both first conversions were written by ordinary coding agents; FormsRefresh found the defects and the repair agents fixed them from the diffs.

Onboarding a new application: the HR application took 2 h 39 min of one agent from receiving the source to a passing coverage report, with a full recording loop of 169 seconds per scenario on average. Converting it to .NET took one coding agent about 20 minutes.

Both migrated applications run on this site with the original Forms source linked next to them: retail and HR.

Going forward

What a consultancy gets. For every migrated screen: the scenarios, the golden records, a coverage line and a classified diff the customer can check. A defect list a developer or a repair agent can act on without reading Forms code. Unreachable code listed before anyone pays to convert it. Source quirks turned into explicit waiver decisions for the customer instead of silent fixes.

The limits today.

A clean diff means no difference in the behaviour the scenarios exercise under the agreed policy. It does not mean the applications are equivalent in every respect.

Choosing the next target platforms. Each target stack needs its own adapter and mapping; scenarios and golden records are written once and replay against any of them. Partners choose the next targets from the stacks their customers are moving to (APEX, Java, .NET, others). The natural first engagement is a joint pilot on one module of a real customer application, on that customer's client version, which builds the adapter for the partner's stack and retires the two largest open questions: client versions and scale.