Jared Gorbahn
Menu

Personal build / Inbound prototype

Warehouse Management System

Receiving and directed putaway in .NET, React, and SQL Server. An actual synthetic-data walkthrough verifies that exact retries preserve one inventory outcome.

Design and implementation of an independent project · Updated 2026-09-11

Problem
Retries must not turn one physical receiving action into duplicate inventory.
My contribution
Designed and implemented the inbound slice, transaction boundaries, operator workbench, and verification workflow.
Current scope
Receiving and directed putaway prototype. Outbound workflows and physical-scanner acceptance remain ahead.
Evidence & limits
Fresh browser receipt and putaway, followed by exact API retries: one receipt, one move, 240 EACH in reserve, zero reconciliation differences. Physical-scanner and operator UAT remain open.

Actual application / Synthetic data

Receive. Retry. Reconcile.

One pallet moves from receiving to reserve. The receipt and putaway each commit once, even when their exact requests are replayed.

Actual WMS inventory screen showing 1 PALLET, 240 EACH base units, at A-01-01 with zero reconciliation differences.
Actual local application capture, 2026-09-12 UTC. All facility, item, handling-unit, and location identifiers were created for this synthetic run. The facility UUID is a prototype UI limitation.
Receive + exact API replay1 receipt1 receiving event
Putaway + exact API replay1 move1 completed task · 0 open
Read-only API / SQL checks240 EACH0 reconciliation differences
See the receiving and putaway screens
Actual receiving form confirms 1 PALLET was received into RCV-01.
1. Submit the receipt through the UI. The following API replay returns its original receipt, event, and task IDs.
Actual putaway screen showing no open work after the verified move.
2. After confirming source, handling unit, and destination through the UI, no putaway work remains open. The exact API replay returned the original move event.

Workbench

Receive inventory

Facility + command ID
Normalised payload

.NET API + SQL transaction

Lock this facility / command pair

New command

Domain change + inventory event + command receipt.

Existing command

Same fingerprint: saved response.
Changed fingerprint: conflict.

Commit together · Roll back together

Response

Accepted or replayed

One stored outcome for an identical command.

Original diagram of the reviewed command executor. This lock covers one command identity; domain rules must also handle competing identities. Physical-scanner and representative-operator UAT remain open.

Context

Receiving one pallet twice because a request was retried is a correctness failure. This inbound prototype covers facility configuration, packaging, expected receipts, receiving, directed putaway, inventory, and reconciliation. Outbound work remains future scope.

Architecture

A React workbench calls a .NET API organised into configuration, catalogue, inbound, inventory, and work modules. SQL Server holds operational records and immutable inventory events. The modular monolith keeps related changes within one application and transaction boundary; facility context accompanies each command.

Engineering Decisions

The architecture above keeps the command receipt and domain change in one transaction. An exact retry returns the recorded response; a changed payload under the same identity conflicts. Different command IDs still need domain validation.

Corrections append events instead of rewriting history. Balances can then be reconciled against the ledger. Splitting these modules into services would add coordination costs before the current slice needs independent deployment.

How It Breaks

Repeated submission, wrong facility context, unit mismatch, and confirmation at the wrong location can all produce a plausible response with an incorrect physical outcome. Checks must inspect resulting inventory, not just HTTP status.

The July 28 browser record exposed Enter-key submission failures despite component checks. Visible buttons completed that journey. The fresh capture also uses buttons; it does not close the scanner or keyboard acceptance gap.

Testing & UAT

The new walkthrough started with one open synthetic expectation and no inventory. Receiving and putaway completed through the real UI. Exact API replays reused each browser-generated command identity and payload; both returned the saved result. Subsequent read-only API and SQL checks found the counts shown above.

Representative warehouse operators still need to exercise uncertain submission status, corrections, facility changes, and physical scanners. A controller-driven browser run verifies a workflow; it cannot establish usability on a warehouse floor.

AI: Now / Future

The operational boundary stays the same whether a person or an assistant proposes the next action.

Now

No runtime AI feature is established in the reviewed operational implementation. AI-assisted development is separate from AI making warehouse decisions.

Future · Proposed

Start with read-only investigation of discrepancies, citing inventory events and exposing uncertainty. Stock movements would require a separately designed approval and verification path.

Observability & Measurements

Command and correlation IDs connect requests to stored outcomes. The current evidence checks event counts, saved responses, task state, and ledger-to-balance reconciliation. Latency, contention, operator completion time, and load limits have not been measured for this case study.

What Changed After Testing

Earlier verification changes required proof of open work before the browser journey and tied final assertions to that preparation. This prevents an already completed API run from masquerading as a new UI journey.

The fresh run confirms button-driven completion and replay invariants. It also makes two interface limits visible: operators select a facility by UUID, and there is no transaction-history screen. Those remain work to validate with users.

What I’d Change at 10× Scale

With ten times the concurrent operators, I would measure contention around receiving, putaway, and replay, including conflicting commands with different IDs. Keep checking the same inventory invariants. A new service boundary would follow a measured bottleneck rather than the size of the roadmap.

← All projects