Skip to content

D2: deliveries, unboxing, and reconciling the note - #81

Merged
rexlManu merged 3 commits into
mainfrom
feat/d2-deliveries
Aug 29, 2026
Merged

rexlManu merged 3 commits into
mainfrom
feat/d2-deliveries

Conversation

@rexlManu

Copy link
Copy Markdown
Member

Completes the D2 milestone: #30, #31, #32, #33.

The flow

Samples are still minted at 09:00, but they now leave on a truck instead of appearing on a bench.
IntakeCrate is removed, not extended, as #30 asked — it teleported the day''s vials onto a bench,
which is the problem the printout work fixed everywhere else.

A quarter into the shift the delivery lands, announced ~30 s ahead so you can choose to finish a run.
Cartons are carried in one at a time, occupying an inventory slot. Opening is a hold on the lid,
refused while the box is in your hands — that refusal is what forces the walk. Vials come out
individually; there is deliberately no bulk-empty command.

#31''s trap held: unboxing does not mark anything ready. Verified on a real day — seven samples,
all still unsettled and all still cold after every box was opened.

Two design calls worth reading

Arrival is a fraction of the day, not a clock time, so retuning day length cannot silently move it.
A quarter in: earlier and there is no run in progress to choose between; much later and "unload now or
lose the day" is a decision with one answer.

The bay is a buffer, not a bin. Four standing places; overflow waits on the truck and drains at the
speed of your hands. Nothing is destroyed. Binning it was rejected — losing samples to a full bay is a
cost the player pays before they know the rule exists.

#32, the keystone

Option B as decided. Missing and unlisted are found by counting and need no registration. Only an
unreadable label and a duplicated tank do, and a legible vial is refused outright — that refusal is
the settlement with #73, and if it softens, booking-in is back for every bottle. Nothing waits on a
registration.

The same-drum trap is fair because the paper cannot answer it: two vials claiming one tank read
identically on the note whether they are two honest draws or one drum bottled twice, and only running
both separates them. A phone call is refused for that case before any time is spent.

A hard-rule-3 hole, found while verifying

An unreadable label is meant to leave exactly one line no legible bottle claims — the free route to
identifying it. In about one carton in sixteen it did not. Two ways a second bottle claimed that
line: the same-drum roll was independent of the paperwork roll, and — the one I nearly missed — tags
are drawn from a handful of sites and tanks, so two vials can collide naturally with no duplicate
roll at all. Either way the free route vanished, the only answer left cost 45 seconds, and nothing told
the player this carton was different.

A label is now only smudged on a vial whose tank is named once on the page and carried by no other
bottle. Verified 80/80 solvable across 600 runs, and no carton carrying more than one paperwork
slip.

Verification

Both compile checks clean; Unity console 0 errors. Content and scene rebuild clean, and ProcMesh''s own
inverted-face check silent on every new mesh.

By execution, not assertion: a simulated day producing 5 cartons against 4 standing places (four in the
bay, one held on the truck and correctly refusing to open); contents cold and unsettled after opening;
and the 600-run fairness sweep above.

Not run: the EditMode suite — it freezes the Editor and I was asked not to. ~24 new tests across
DeliveryTests and ReconciliationTests are unexecuted. The seed-searching ones are worth watching on
the first real run.

Known gap

Cartons are not replicated (#80) — a joined client sees the bay and truck but no boxes, so co-op is
blocked until that lands. Scoped out deliberately; the shape is ready for it.

Closes #30
Closes #31
Closes #32
Closes #33

…open

Closes #30, #31, #33.

IntakeCrate is gone rather than extended, as #30 asked. It spawned the day vials
directly on a bench at 09:00, which is the teleporting-content problem the
printout work removed everywhere else. Its bench stays - it is where a carton
gets put down.

The flow: the day chemistry is still minted at 09:00, but packed into one carton
per delivery note (#29 grouping, unchanged) and left on the truck. A quarter into
the shift the delivery lands, announced ~30 s ahead so the player can choose to
finish a run first. Cartons are carried in one at a time, occupying an inventory
slot like a vial or a slip. Opening is a hold on the lid, refused while the box
is in your hands - that refusal is what forces the walk. Vials then come out
individually; there is deliberately no bulk-empty command.

Arrival is a fraction of the day length, not a wall-clock time, so retuning the
day cannot silently move the delivery to a different part of it. A quarter in:
earlier and no run is in progress, so there is nothing to choose between; much
later and the remaining shift cannot absorb a full load, which turns the decision
into "unload now or lose the day" - a decision with one answer.

The bay is a buffer, not a bin. Four standing places; the courier fills them and
keeps the rest on the truck, and the buffer drains at the speed of your hands.
Nothing is destroyed and no delivery is cancelled - ignoring the bay costs shift
time later. Binning the overflow was rejected: losing samples to a full bay is a
cost the player pays before they know the rule exists, which hard rule 3 forbids.
Both tells ship with it - the truck stays visibly loaded, and the bay says how
many are still on it.

#31 trap held: unboxing does not mark anything ready. Verified on a real day -
seven samples, all still unsettled and all still cold after every carton was
opened, so the agitation the instrument hold pays for is still owed.

Cartons are derived from sample locations rather than serialised, so a continued
run rebuilds the bay from where the vials say they are. No schema bump.

Geometry is authored in LabSceneBuilder like everything else: a bay opening cut
into the west wall, a truck that starts inactive, a carton with a separate lid,
and a delivery note styled as the printout sheet. The lid carries its own
collider and its own Interactable - one collider spanning body and lid would
resolve every ray to the carton and the box could never be opened.

Verified: content and scene rebuild clean, ProcMesh own inverted-face check
silent on every new mesh, prefabs and bay wired, and a simulated day producing
5 cartons against 4 standing places - four in the bay, one held on the truck and
correctly refusing to open.
…ived

Closes #32, the D2 keystone. Option B as decided: registration exists only where
a vial cannot speak for itself.

Four discrepancies, each discoverable by comparing the paper to the box. Missing
and unlisted are found by counting and need no registration at all. An unreadable
label and a duplicated tank do, because the bottle cannot answer for itself -
and only those two. A legible vial is refused outright, "There is nothing to
decide", which is the whole settlement with #73: the typed step exists for the
two bottles a shift that need it, never for the other fourteen. Nothing waits on
a registration; an unregistered vial still moves, agitates, runs and files.

§6.1 same-drum trap is fair because the paper cannot answer it. Two vials
claiming one tank are either two honest draws or one drum bottled twice, and the
note reads identically either way - BuildSplitDraw copies the source ground truth
exactly, so the only thing that separates them is running both. A phone call to
the customer is refused for this case before any time is spent, because asked
whether they really drew that tank twice they read their own note back, and their
note is the thing in doubt.

Frequencies come from the sender. Vogel at 0.00/0.00 is a genuine control and
Kessler at 0.30/0.25 is the box worth opening carefully, so reliability is
learnable rather than random.

**Fixed a hard-rule-3 hole found while verifying.** An unreadable label is meant
to leave exactly one line no legible bottle claims - that is the free route to
identifying it. Two ways a second bottle could claim that line anyway: the
same-drum roll, which was independent of the paperwork roll, and an ordinary tag
collision, because tags are drawn from a handful of sites and tanks and two vials
in one box can collide on their own. Either way the free route silently vanished
and the only remaining answer cost 45 seconds, with nothing telling the player
this carton was different. It happened about one carton in sixteen. A label is
now only smudged on a vial whose tank is named once on the page and carried by no
other bottle, and if no such vial exists nothing is smudged.

Verified over 600 runs: 80 of 80 unreadable labels solvable by elimination, and
no carton carrying more than one paperwork slip.

CLAUDE.md's deviation table gains the narrowing, with the condition attached: the
refusal on a legible vial is what keeps booking-in from returning.
It still named M2 as the current milestone - closed a while ago - and its
"still missing" list had gone stale in both directions. Half of it had shipped
(deliveries, the front end, rebindable controls, colourblind support, save and
continue) and the things that really are missing were not named specifically
enough to act on.

Replaced with a milestone table and three honest categories: what blocks co-op
(#80 alone), the verification debt, and the polish that is genuinely outstanding.
Each item names its issue so it can be picked up without archaeology.

The verification debt is called out rather than buried, because it is the least
visible risk on the project: the suite is runnable again since #76 but is not
routinely run, that fix is itself unvalidated, and about sixty tests added since
have never been executed.

Setup now points at Boot.unity rather than Lab.unity. Opening the lab directly
skips the menu, the save slot and the lobby, and starts a run with no way back -
which was not true when that line was written and is now.
@rexlManu
rexlManu merged commit 873622e into main Aug 29, 2026
2 checks passed
@rexlManu
rexlManu deleted the feat/d2-deliveries branch August 29, 2026 15:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant