sillage_drydown
Three pages of French pharmacy printing, drawn on one sheet of aged rag paper: the commission that arrives on the bench, the chromatogram a blotter draws as it dries, and the client's answer written across the same graph.
sillage_drydown — the ink curve, the commission, the verdict
Three pages of French pharmacy printing, drawn on one sheet of aged rag paper: the commission that arrives on the bench, the chromatogram a blotter draws as it dries, and the client's answer written across the same graph.
The graph runs DOWN the page
Time flows from the top of the sheet to the bottom on the logarithmic axis
Core.timeToFraction defines, so the first twenty minutes take 46% of the page
and the last twenty hours take 22%. A perfume's decisions are made in its top
notes; a linear axis crushes them into a hairline, and this one does not.
Intensity grows to the right, in the single unit the sim states: 1.00 is a
full, properly built accord, and a brief's bands are written in the same unit —
which is what lets the player's line and the client's ghosted target share one
scale with no divisor anywhere.
Reading the page, from the bottom of the stack up:
| hairlines | one rule per figure in the time gutter; dotted verticals at fifths of the scale |
| ghost band | the brief's target, printed in Core.ink.ghost and engraved with hairlines |
| family bands | the accord broken into Core.families, stacked left to right, coloured by family |
| ghost edges | the target's edges re-struck over the accord, so a curve that misses is unmistakable |
| the accord | a wet ink line — a soft bleed under a crisp nib stroke — drawn progressively |
| the nib | where the ink is still wet, while the strip is drying |
| lozenges | on the verdict: where each phase actually stood, with a leader back to the band it missed |
The three phases are ruled across the sheet and braced in the right margin, and once the client has answered, each brace carries that phase's mark.
The three pages
| screen | layer | shown when |
|---|---|---|
sillage_brief | 150 | a commission arrives (brief:issued, or screen:changed → brief) |
sillage_graph | 140 | a blotter is struck (strip:struck, or screen:changed → drydown) |
sillage_verdict | 160 | the client answers (verdict:given, or screen:changed → verdict) |
They sit above the standing HUD and the formula card — the drydown and the verdict are modal moments — and below the title and pause screens, which legitimately take the whole frame.
The clock
Whoever strikes the blotter owns the clock. A strip:tick carrying t wins;
Core.state.drydownT is taken as a second opinion; and if neither is moving,
the sheet drives itself over Core.time.drydownSeconds so a struck strip is
never a frozen page. A real tick takes the wheel back the moment it arrives.
A screen change landing mid-strike does not take the graph away half-drawn: the strip holds the page until its 24 hours are up, and the ordinary rule resumes.
The contract
listens brief:issued · strip:struck · strip:tick · strip:done
verdict:given · screen:changed
reads Core.state.brief · .curve · .verdict · .drydownT · .commission
emits drydown:dismissed — the player closed the verdict sheet
writes nothing. It draws what the sim decided.
From a Brief it reads n, client, title, blurb, signoff, bands,
phaseWords, require, forbid, fee, budget. From a Curve,
samples[i].minutes, .norm (falling back to .total), .byFamily, plus
peak and notes. From a Verdict, phases[i].phase/score/remark/measured/ min/max, score, outcome, remarks. Everything is read defensively: a
field that is not there costs that one mark on the page, never the page.
Putting a page up directly
local Drydown = require("ui.sillage_drydown")
Drydown.preview(brief, nil, nil) -- the commission card
Drydown.preview(brief, curve, nil, 0.4) -- the graph, frozen 40% down
Drydown.preview(brief, curve, verdict) -- the client's answer
Drydown.page() -- which page is up, or nil
Drydown.progress() -- 0..1 down the sheet
Useful for staging a shot, and for looking at a page without waiting out a strike.
Scoped to this part · feeds back into the world's score.