Retail order system
6 Forms modules: orders with lines, a list of values and alerts, four maintenance forms.
- 17 of 17 scenarios at parity
- 0 defects
- 60 of 60 triggers and units covered
For consultancies that migrate Oracle Forms applications
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.
6 Forms modules: orders with lines, a list of values and alerts, four maintenance forms.
3 Forms modules on Oracle's HR schema: login, console, employees on tab pages.
5 Forms modules, a menu module and a PL/SQL library: patients, appointments, billing.
3 Forms modules: courses, instructors with four windows and a list of values, sections.
The live demos share one database per app: visitors see each other's changes, and the data resets to the scenario fixture every night.
Every conversion below was written by a coding agent and checked against the running original.
| Conversion | Caught that the agent had missed | Repair |
|---|---|---|
| Retail: the agent's .NET/PostgreSQL build, once it had passed the independent database and API checks | 9 defects, 71 values, in the first scenario checked | 1 round |
| Retail: the same build with those 9 repaired, all 17 scenarios | 403 values in 164 groups, 12 causes | 1 round |
| HR: written from the Forms source alone | 73 values in 13 of 17 scenarios: 52 misses, 21 now waivers | 1 round |
| CareWell: written from the Forms source alone | 244 values in 22 of 22 scenarios: 81 misses, 163 now waivers | 1 round |
| Student forms: written from the Forms source alone | 1134 values in all 15 scenarios, 12 causes | 2 rounds |
| Angular front ends of the four apps | retail, CareWell and student nothing; HR: the page rendered nothing | HR: 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 order | CareWell: 2 fixes; student: 1 fix |
| Restyle and navigation rewrites of both apps | nothing: diffs byte-identical | none |
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.
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 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.
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).
| 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 |
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.
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 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.
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.
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.
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.