case study · check-in 01shipped

Handoff: a take-home, taken seriously

How a Principal PM take-home became a working operations prototype in seven days, and why the most important commits deleted code.

next.jsreactai toolingproduct
project
Handoff
published
2026-07-27

In June 2026 I took a Principal PM take-home: design a maintenance-operations experience for connected fleet assets. Instead of a slide deck, I shipped a working prototype in seven days and sixteen commits, live at /hand-off: a fleet supervisor's operating layer called Handoff, built with Claude Code on Next.js. It's ~9,200 lines of TypeScript driven by a single pure reducer, deliberately has no database, no auth, and no real integrations, and four of its sixteen commits made the product better by removing things. This article is the story of the decisions; later check-ins will go deeper on specific ones.

Why a prototype and not a deck

The assignment asked for product thinking about connected asset maintenance: how a fleet keeps trucks moving when work orders, faults, inspections, parts, and vendors all live in different objects. My bet was that the strongest way to show product thinking is to make the thinking operable: put a real supervisor scenario on screen and let the reviewer click through the decisions rather than read about them.

One framing decision shaped everything: the prompt described a daily plan built at shift start. I deliberately built a live operating layer instead. Actionable at 10:42 AM mid-shift, not a plan you lock in at 7:00 and watch decay. Every item resolves to one current state, one owner, one next action; tags can overlap, state cannot.

The architecture in one breath

  • Next.js 15 App Router + React 19 + TypeScript strict + Tailwind, deployed on Vercel.
  • The entire app is one pure useReducer state machine (1,052 lines). The UI is a deterministic projection of state, so "Reset demo" is just a fresh seed.
  • Time is an integer "minutes since midnight", with no Date.now() and no Math.random(), so the demo renders identically on server and client and every review sees the same 10:42 AM.
  • ~1,300 lines of hand-authored seed data model a real morning at a Phoenix yard: 19 work items across six states, eight action flows, an 11-step guided walkthrough.
  • Mock API routes exist to demonstrate a real request/response cycle, and nothing more.

The commits that deleted code

The git log tells the honest version of the design process. Thirty minutes after the first commit, the first refinement took a feature away: "Since last review", plausible and unneeded. Two and a half hours in, "Inbox" became "Workboard", the naming decision that reframed the whole product from a message metaphor to an operations one, made on day one in code rather than in a doc. A modal that had grown action buttons was demoted to read-only in a commit that deleted forty lines and added one. Four of sixteen commits were net-negative in lines. The refinement arc of this prototype was subtractive, and I think that's what made it feel finished.

What I deliberately didn't build

The strongest tradeoff in the project is the one that's invisible. There is no dispatching. Assignment in Handoff is a lightweight queue-position choice, next or end of queue, because full dispatching drags in technician calendars, drag-and-drop scheduling, and workforce balancing, which would broaden the problem far beyond the workflow being validated and quietly turn a maintenance layer into a scheduling product. Also deliberately absent: persistence, auth, multi-tenancy, real-time sync. The README calls it a "product/UX prototype on mocked data" out loud, because a prototype that pretends to be production architecture is lying about both.

Where the AI helped, and where it didn't

I used AI end to end. Research and prompt-shaping first, then Claude Code from product framing to working prototype. I directed the state model, the interaction design, and every product tradeoff; the AI made implementation and refactoring fast enough that subtraction was cheap.

As an experiment, I also handed the same assignment to an autonomous coding agent with no product direction at all, and shipped its unmodified output alongside mine ("Project Sans Human," on the same page). Its build is genuinely nice to look at, cleaner than mine, but its loudest button points at the wrong first move, and it took the "daily plan" prompt literally where a PM's job was to read past it. That gap, between a plausible artifact and a correct one, is the clearest picture I have of where human product judgment still lives.

Current state

Shipped and stable since mid-June 2026. The series continues as I fold this work into the site's V2 as its first case study.

← all Handoff check-ins