Application Modernization
V.Two Evolve modernizes business platforms with AI. Faster than a rewrite. Safer than a lift-and-shift. Priced so the risk sits with us, not you
Why now
01
Every year, more of your budget goes to keeping old platforms alive. The gap compounds
02
Traditional rewrites run long and get cancelled, because they depend on humans re-reading millions of lines of code by hand
03
AI can read, map, and help regenerate codebases at speeds no human team can match; firms that apply it with discipline modernize in months, not years
The framework, the runtime, or the on-prem system underneath it is going unsupported, and the clock is ticking
The people who wrote them are gone. Nobody can say exactly what the system does anymore, only that it can't break
Going dark for a year and betting the business on one big cutover is not a plan anyone wants to sign
Shipping anything means touching fragile code, and hiring for the aging stack keeps getting harder
The approach
Instead of a risky big-bang rewrite, we grow a modern system around your live one and switch it over a piece at a time. Your users never notice. Your business never stops
Clean interface
Your existing interface stays unchanged
Modern
Legacy
Rebuilt
Rebuilt
Migrating
Legacy
Legacy
Legacy
Each module is verified against the extracted user stories and business rules, and validated on the running system, before the legacy version is retired
A working, deployed product at the end of every single phase
Inside the work
Most firms show you a deck. Here is how the method actually runs, and how we prove every increment holds up before it ships
Every engagement runs the same defined path, each stage with its own inputs, review gate, and deliverables. The application stays live the entire time
01
Discovery & assessment
Architecture analysis
Dependency & risk
Business-rule extraction
02
Target Architecture Blueprint
Phased Conversion Roadmap
Part-by-part decomposition
PRDs + implementation plans
03
Module rebuild via Claude Code
Verification against stories & rules
Deployment readiness
Documentation & handoff
Nothing legacy is switched off until its modern replacement is verified against the extracted user stories and business rules, and validated on the running system. Every increment clears five gates before it ships:
✓Behavior verified against the extracted stories & rules
✓Conforms to house patterns
✓Security clean
✓No duplicate logic or types
✓Scope limited to the slice
Passing unit tests is not the bar. Verifying each increment against the documented stories and rules, and validating it on the running system, is what lets us retire legacy code without holding our breath
Discovery output
Two artifacts, one lineage. Every route, job, and workflow in your codebase becomes a user story your team recognizes. Every rule those stories run on is recovered, cited, and anchored back to the story that produces it. Nothing orphaned. Nothing guessed
User stories, grouped by domain
A full set of user stories, grouped by the domain entity they act on, recovered from a real production codebase
Every story, in your team's vocabulary
Expand any domain to see every CRUD story, verb, and short narrative in the same view
Business rules, anchored to their stories
Rules grouped by the story that produces them, with rule-kind pills for validation, authorization, and business logic
The rules your business runs on are buried in legacy code, undocumented, and often known to no one. Here is the actual pipeline: AI reads the code, we recover each rule into a plain-language spec you own, with a citation to the exact source, so the modern rebuild can be validated against the original behavior
server/src/routes/classes.ts
Source
router.post('/classes', async (req, res) => {
const { classroomNumber, teacherId } = req.body;
// strip anything that isn't
// alphanumeric before persisting
const clean = classroomNumber
.replace(/[^a-zA-Z0-9]/g, '');
const cls = await db.class.create({
data: { classroomNumber: clean, teacherId },
});
res.json(cls);
});business-rules.yaml
Recovered · owned by you
rule_id: BR-Class-Create-SanitizeClassroomNumber
rule_kind: validation
trigger: When a class is created
condition: classroomNumber contains
non-alphanumeric characters
action: Strip non-alphanumeric
characters before persisting
rationale: Classroom numbers must be
sortable and comparable across records
sources:
- file: server/src/routes/classes.ts
start_line: 42
end_line: 58
confidence: 0.92
provenance: original
parent_story_id: US-Class-Createcoverage-check
Anchored to stories
total_stories: 83 total_rules: 412 orphan_rules: 0 stories_without_rules: 0 # Every rule anchored to a story. # Every story has explicit rules. # Nothing lost between extraction # and specification.
The export format is a machine-checkable schema, so every recovered rule is validated, cited, and reviewed and curated by your domain experts before it drives a single line of the rebuild. You end up owning a complete, plain-language specification of a system that used to live only in code
Extracting the obvious rules is easy. The value is in the rules that are conditional, date-sensitive, or quietly special-cased. The ones that pass a rewrite's unit tests and still get month-end billing wrong. Take tax:
server/src/lib/tax.ts
Source
export function computeTax(invoice) {
const taxable = invoice.lines
.filter(l => l.isTaxable)
.reduce((sum, l) => sum + l.total, 0);
// rate as of the invoice date,
// NOT today's rate
const rate = rateOn(invoice.date);
return round2(taxable * rate);
}business-rules.yaml
Needs domain sign-off
rule_id: BR-Invoice-Tax-DateScopedRate
rule_kind: business_logic
trigger: When an invoice is finalized
condition: invoice contains lines where
isTaxable = true
action: Sum taxable-line totals and
multiply by the rate in effect on the
invoice date; return 0.00 (not null)
when no lines are taxable
rationale: Back-dated invoices must use
the historical rate, not today's rate
sources:
- file: server/src/lib/tax.ts
start_line: 40
end_line: 77
confidence: 0.71
provenance: inferred
parent_story_id: US-Invoice-FinalizeA rewrite that “looks right” would use today's tax rate and return null for an untaxed invoice. Both are wrong, and both are invisible until a client's month-end. Because these rules are inferred, not certain, we flag them for the domain owner to confirm before the rebuild starts
The rules that govern authority and approval flows are where the real risk lives, and they are almost never written down. We recover those too
validation
authorization
business_logic
data_integrity
workflow
other
authorization rule
Who can do what
rule_id: BR-Billing-WriteOffWip-AuthorizedRoles
rule_kind: authorization
trigger: When a user attempts to write
off WIP on a matter
condition: actor.role in
[ResponsiblePartner, BillingManager]
AND amount <= actor.approvalLimit
AND matter.status != 'locked'
action: Allow the write-off; otherwise
reject with a permission error
rationale: Locked matters block all
write-offs, and delegated authority
expires with the delegation, not the
matter
sources:
- file: server/src/routes/billing.ts
start_line: 112
end_line: 149
confidence: 0.68
provenance: inferred
parent_story_id: US-Billing-WriteOffWipworkflow rule
Approval flow
rule_id: BR-Bill-Finalize-PartnerApprovalChain
rule_kind: workflow
trigger: When a draft bill is submitted
for finalization
condition: bill.state transitions across
draft → pending → approved → final;
bills over matter.threshold require a
second approver
action: Advance the bill through the
approval chain; a rejected bill returns
to draft (not pending) and the chain
resets; approvals are voided if the
total changes after sign-off
rationale: Approval authority is scoped
to the amount at time of sign-off
sources:
- file: server/src/lib/bill-workflow.ts
start_line: 64
end_line: 120
confidence: 0.74
provenance: inferred
parent_story_id: US-Bill-FinalizeThese are the rules a rewrite gets subtly wrong: an approval that should have reset, a delegated authority that should have expired, a threshold that quietly moved. Every one is recovered, cited, and reviewed against the running system before the rebuild ships
How we work
Evolve is two things: a Discovery product that reads your codebase, and a delivery method for the modern rebuild
Modernization at this pace was not possible three years ago. Large language models, agent workflows, AST parsing, and semantic search over code have changed what a small, senior team can hold in view at once. Evolve is how we put those capabilities to work, on real production systems, with humans in the loop where it matters
The human + AI craft. Architects who know how to prompt, review, and steer LLMs against a real codebase — deep familiarity with legacy patterns and a working taste for what to preserve versus rewrite. The AI is the leverage; the judgment is ours
How we gather what the model needs to be useful. Code, via tree-sitter AST parsing and dependency graphs. Prior architectural decisions, via the ADR log. People, via SME interviews. AI lets a small team hold all of that in view at once — the thing no human team could do by hand
The repeatable AI-driven techniques. Rule extraction with two-pass LLM synthesis. Semantic search across the codebase via embeddings. Architect-in-the-loop code generation. Incremental cutover paths that let old and new run side by side. Governed end to end by the V.Two AI SDLC
V.Two Evolve is the application-modernization edge of V.Two's Digital Transformation practice
Why V.Two
Plenty of firms will quote you a modernization project. Here is why clients pick us
SEE OUR WORK AT V.TWO →Application modernization with AI is not a side practice for us. It is the work. V.Two Evolve exists because we have done this on real platforms, refined the method each time, and codified what works
Free assessment. Fixed-fee pilot. Fixed-fee build. You know every price before you commit, and overruns are our problem, not yours. No firm billing by the hour can say that
We have shipped modernization work for real clients on real production systems. Our references speak to delivery, not decks
Client references available on request
Deliverables
Not just working software, but a documented, understood platform your team owns. Every engagement produces:
✓Application Assessment Report
✓Architecture, data-source & coverage maps
✓Dependency & Risk Register
✓Target Architecture Blueprint & ADRs
✓Phased Conversion Roadmap & Estimate
✓Business-Rule Specifications you own
✓Modernized codebase, delivered incrementally
✓Acceptance Criteria & Rule Evidence
✓Deployment Runbook & Rollback Procedure
✓Handoff Package & Knowledge Transfer
FAQ
What platforms and languages do you work with?
⌄
Today, V.Two Evolve supports JavaScript, TypeScript, and PHP (Laravel). The method itself is language-agnostic — additional stacks (Java, .NET, COBOL) are added per engagement
Is our code used to train AI models?
⌄
No. We operate under enterprise agreements with no training on client data. Every engagement includes review gates and access controls
What if the pilot does not deliver?
⌄
Then you found out early, with hard benchmarks, instead of discovering it two years into a rewrite. The pilot is deliberately small and fixed-scope so that is a cheap lesson, not an expensive one
How is this different from a big consultancy?
⌄
Consultancies sell hours, so longer projects pay them more. V.Two sells fixed-fee outcomes, so speed pays V.Two
1
Talk to us
30-minute call
2
Free assessment
Codebase scan and roadmap
3
Pilot in weeks
Fixed-fee, judge us on shipped code