Module inventory with dependency risk.
Every AngularJS 1.8.3 module enumerated, scored, and tagged with blockers before any change is planned.
Grayhaven works across legacy frontend, .NET, Java, Rails, WCF, spreadsheet, and workflow systems. We do not start by choosing a replacement framework. We start by proving what the current system does.
Every engagement follows the same sequence, regardless of stack.
The first public system we used to show the protocol end to end: system map, behavior map, harness starter, migration sequence, first proof increment, and executive memo. The point is not Angular. The point is the artifact chain.
Download the sample PreflightEvery AngularJS 1.8.3 module enumerated, scored, and tagged with blockers before any change is planned.
A Playwright test locks in the user-list state machine and API contract before the migration begins.
test("user list loads", async ({ page }) => {
await page.route("/api/users", (r) =>
r.fulfill({ json: USERS }));
await page.goto("/users");
await expect(page.getByRole("status"))
.toHaveText("Loading");
await expect(page.getByRole("list"))
.toContainText(USERS[0].name);
});Snapshot diff between the AngularJS render and the React render under the same API response.
{ users: 12, loading: false }{ users: 12, loading: false }angular.module('app').component('userList', {
template: require('./user-list.html'),
controller: function ($http) {
var ctrl = this;
ctrl.loading = true;
ctrl.users = [];
ctrl.$onInit = function () {
$http.get('/api/users').then(function (res) {
ctrl.users = res.data;
ctrl.loading = false;
});
};
},
});import { useEffect, useState } from 'react';
export function UserList() {
const [users, setUsers] = useState<User[]>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch('/api/users')
.then((res) => res.json())
.then((data) => {
setUsers(data);
setLoading(false);
});
}, []);
return <UserListView users={users} loading={loading} />;
}AngularJS component to React function component. Same endpoint, same loading transition, same view contract. Behavior preserved either side — verified by the harness before the migration ships.
We are deliberately slow to take on engagements. If we are not the right fit, we will say so on the first call.
Contact
Show us the system your team cannot safely change. We’ll tell you whether a Preflight makes sense, what boundary we would inspect first, and whether a first verified increment is realistic with the access and domain knowledge available. If we’re not the right team, we’ll say so.