Skip to content

v2.21.0

v2.21.0 — the shortage gets a name, the pick gets a witness

Fourteen sprints, four additive migrations. A line that cannot be found is closed short with a reason instead of hanging, the desktop pick is verified by scan, and the reconciliation number stops counting noise as a discrepancy.

Fourteen sprints, four additive migrations, every one PO-smoked before merge. Four agents ran in parallel for the first time, on disjoint files.

Shipped

PICK-SHORT-01 (#303) and PICK-SHORT-02 (#166): a line that cannot be found is closed short from the floor and from the packing bench, with a named reason — not found, damaged, location empty, or other with a note. The remainder goes back to available stock in the same transaction as the line, the shortage stays named on the order, and the task completes instead of hanging open.

B2B-PICK-01 (#165): the desktop wholesale pick verifies the way the bench already did. The location is scanned first, then the product; a wrong product is refused by name; and the confirm records who verified the line, when, and that it was by scan, written in the same transaction as the quantity. The desktop wholesale pick list is explicitly B2B — the warehouse floor never sees a consumer order.

A correction shipped with it (#356): closing a line short no longer requires scanning the product, on either floor. You close a line short because the product is not there, so requiring its scan made “not found” and “location empty” unreachable. The location scan stays required when the line names a bin. The handheld had carried that defect since the sprint before.

PURGE-COMPLETENESS-01 (#207): the tenant purge knows every table — a hundred and thirteen steps derived from the schema itself, with a build guard that fails when a new table is not on the list.

CSV-UOM-01 (#304): the file decides the case. An import row is all or nothing, and a case quantity comes from the file rather than a guess.

UX-IMPORT-01 (#307): the import says how far it is. An audit found why the bar had never moved in production — the progress reporter sat after a line that skipped it on every created row.

PICK-ENTITY-01 (#308): a select of fifteen hundred customers becomes a search. Typed, debounced, at most twenty rows, the choice painted as a chip you can clear. A failed search says it failed instead of claiming nothing matched.

RECON-REPORT-01 (#309): a warning is not a discrepancy. Reconciliation counted every row alike, so the number the first-client gate depends on was mostly noise: policy findings and real ledger mismatches were billed the same. Discrepancies are now errors and criticals only, warnings are counted separately, and any disagreement between the ledger and the snapshot is a discrepancy regardless of size. Rows name the SKU instead of an internal id.

Also: a heartbeat that measures life rather than work (#318), one log file per sprint, the shared test lane fixed as isolation rather than longer timeouts (#342, #357), and the desktop pack list made explicitly wholesale (#167).

Website

Three commercial pages and two glossary terms: order orchestration, fulfillment management, fulfillment intelligence. Twenty-two glossary terms, seventy-five URLs. Each page names what is not finished as plainly as what is.

Known and open

The first reconciliation run under the new count reports nine products whose on-hand the movement ledger cannot explain — in every one, more stock than the movements account for. They had been hidden inside the old count for weeks. The cause is not yet known, it is tracked as LEDGER-DRIFT-01 (#355), and the first-client gate stays shut until it is named.

Migrations: four, all additive — the close-short reason and its enum, the pick verify witness, the warning count, and one new severity value.

Rollback: return to v2.20.0. Every added column is nullable or defaulted and no enum value is removed, so the previous build ignores them.

Other releases

See how DockingWare handles this →