Skip to content
Hanna.
← All work

Procurement · offline app to back-office web · 2026

Moving a module off the offline app, with no specification to work from

No specification existed, only flows shaped by an offline device. Porting them faithfully would have carried offline assumptions into a place where they are wrong, so the workflows were re-decided at the pace of a migration.

How it was reported

Procurement should live in the web app, not on the vessel.

What it actually was

Nothing was written down. The specification was the existing flows, and those had been shaped by an offline device — draft-first, one user at a time, sync-aware.

Office staff online do not have those constraints, and they do have ones the mobile flows never handled: several people in one document, and real concurrency. A faithful port would have carried offline assumptions somewhere they are wrong and reproduced the collisions instead of removing them.

So it was not a migration in the mechanical sense. It was re-deciding what the flows should be, at the pace of one.

What shipped

  • ~1,100 files across the web app and the API, in < 4 weeks, as an explicitly AI-assisted workstream — then hardened by an audit-and-refactor pass across both surfaces.
  • Workflows redesigned for online multi-user use rather than ported, with every deliberate divergence recorded in a decision record so a later reader can tell a decision from an accident.
  • Cutover data operations run as executable runbooks: dry-run defaulting to true, numbered stop conditions, idempotent upserts, one-way markers, and a written result per run — so a migration against a live customer database is reviewable and repeatable rather than a one-off session.

Evidence

files across web and API
~1,100
elapsed
< 4 weeks

The release gate, the permission matrix and the documentation contract all existed before any agent ran through them. It was fast because the acceptance criteria were written first.

  • Next.js
  • NestJS
  • TypeScript
  • Playwright
  • agent runbooks