Repository navigation
D2: deliveries, unboxing, and reconciling the note - #81
Merged
Merged
Conversation
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.
IntakeCrateis 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 owninverted-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
DeliveryTestsandReconciliationTestsare unexecuted. The seed-searching ones are worth watching onthe 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