FormsLang 2.1.0
FormsLang 2.1 makes the project workflow useful before a target technology
is chosen: understand what a Forms estate contains, find what deserves
architectural attention, and record decisions against saved evidence.
Everything in 2.0.0 is kept, and Oracle APEX 26.1 / APEXlang remains the only
implementation target.
Understand first. Modernize second.
Estate Intelligence
- Hotspot candidates derived from the saved Blueprint: possible API
bypass, duplicated business-rule candidate and global state coupling.
Each candidate lists its evidence, its severity rule and what that evidence
cannot establish. Candidates are not verdicts. - Start Here orders the items that deserve attention first and says why.
- Estate Intelligence is a projection over the saved assessment. It never
re-analyzes source, and its identities are SHA-256 digests that are stable
across runs andPYTHONHASHSEEDvalues.
System Map
- A module-level map of Forms, program units, packages, tables and views, with
separate budgets for nodes, relationships and the focus selector, so a large
estate stays readable. - Same-named packages from different source roots stay separate nodes.
- Project search is bounded and covers the saved assessment only.
Modernization Planning
- Suggested investigation groups collect related candidates for one
architectural conversation. - Decision records separate what a person recorded from what the engine
PROPOSED. Engine recommendations stay proposed until a person decides. - Not in this release: migration waves, dependency-ordered plans, and cost,
schedule or ROI estimates. FormsLang does not invent them.
Target Strategy
- Analyze my Forms estate creates a project with no implementation target
(UNSELECTED) from the UI, HTTP API or CLI. Analysis, review, the System Map
and reports all work without a target. - A target-neutral assessment package ("Generic Modernization") is a
non-code deliverable. It contains the assessment, not generated code. - Oracle APEX 26.1 / APEXlang is the only code-generation target.
- The target choice is validated on the server and survives reopening the
project. An unsupported target profile is rejected. Generation fails closed
for an unselected target, and an unselected target never resolves to the
target-neutral package.
Delivery Integrity
- The target-neutral package and every report are built from one reviewed,
revision-fenced snapshot. The output is deterministic, and an internal
manifest hashes every member. - A source or review change during an export rejects the "current" claim
instead of mixing revisions. - Executive and technical assessment reports carry the same findings, risks,
review states and human decisions as Review. Source bodies, view SQL and
private notes are excluded unless explicitly requested. When they are
included, the file name says-sensitive.
Reliability and Safety
- Disclosure fix. In 2.0.0, a finding named after a
HOST, URL or
USER_EXITliteral kept that literal in the exported reports and package.
Such a literal can hold a connect string with a password. In 2.1, delivery
packages and reports replace those names with a neutral label and a stable
reference. The authorized local UI still shows the real name, which the
user can already read in their own source. - Project lock contention fixed. Opening a project briefly took its
exclusive worker lock on every request, even when no interrupted job needed
recovery. Concurrent requests could then fail with Another project operation
is active. Recovery now takes the lock only when an interrupted job exists. - A project job now reports a terminal status only after its worker has
released the project, so the next operation does not collide with it. - The Workbench conversion job persists its final run record before it stops
reportingrunning. - Experimental adapters fail closed. Missing inputs raise before anything is
written, and an unavailable validator reportsNOT_VALIDATED.
Upgrade Notes
- Projects created by 2.0.0 open unchanged. Opening one with 2.1 rewrites no
historical row and does not change the project descriptor. The only new row
is the job record of any new operation you run. - To move from a 2.0.0 installation, install the 2.1.0 Windows installer over
it. Existing projects, reviews and artifacts are kept. - Reports exported by 2.0.0 are historical files and are not changed. Export
them again with 2.1 if they may contain integration literals. See
Reliability and Safety. - The modernization IR, architecture policy and target adapter registry are
experimental library code with no product surface.
Validation
Release commit a74e66f6aab0bb859c60081a47b7a5983857abce, the same SHA as the tested candidate (main fast-forwarded).
- CI 35868718443: 13/13 green. It covers ruff, the deterministic showcase export, SQLcl
apex validate(no database), Workbench and corporate project browser acceptance (Edge), and pytest on ubuntu and windows for Python 3.10–3.13. Ubuntu: 1761 passed, 5 skipped (Windows-only tests). Windows: 1766 passed. The Windows py3.12 job was cancelled once by mistake while still passing (93%, no failure) and re-run on the same SHA. mainCI 35882935833: 13/13 green on the first attempt.- Installer acceptance 35868719888: upgrade 2.0.0 → 2.1.0 passed for both MSI and NSIS. The run covers a clean install, the project workflow, uninstall and reinstall with preserved state, and the native desktop window and engine.
- Local: 1761 passed, 5 skipped (symlink privileges). Ruff is clean. Corporate Edge acceptance passed 4/4 consecutive runs and Workbench Edge 101/101. SQLcl offline validate OK. Same-session re-export is byte-identical.
- Compatibility: 4 real projects created by v2.0.0 passed 46/46 checks under 2.1.0, with no historical row, descriptor or file changed.
- Disclosure: a connect-string probe was exported in 22 formats with no leak in content, file names or archive metadata.
- The frozen modernization benchmark (24 blobs) is identical to v2.0.0.
Full record: docs/quality-acceptance.md.
Assets
| File | Size (bytes) | SHA-256 |
|---|---|---|
FormsLang_2.1.0_x64-setup.exe |
14,679,067 | 5060dec0eefa2a6af7c6fd126a372eb686647e2b5fd9ae4675aedd8737396440 |
FormsLang_2.1.0_x64_en-US.msi |
15,790,080 | db8e6c6ab4743784d890996c2c696ec8e8c1e5f5101ddc87ddf983350cdf2dbe |
The installers are unsigned and are exactly the CI artifacts the installer acceptance tested.
Known follow-ups:
- an intermittent Windows
database is lockedfailure intest_project_descriptor_concurrency, which predates 2.1; - code signing;
- a recoverable 409 when Reports is opened during a freshness job.
Full changelog: CHANGELOG.md · v2.0.0...v2.1.0