# Spec: the thought fluid — slugs, meniscus, and the filament snap ``` Type: spec Status: IN PROGRESS Status note: authored 2026-07-10 on dispatch as the render design for ROADMAP #33's wire-flow layer (thought-flow DECIDED 2026-07-10, machine-work.md). All four PROPOSED calls affirmed by Cameron 2026-07-10 (sub-tick transit + train density; hanging beads under the anchor pool; vessels on the target silhouette; discrete meniscus steps) — the whole grammar is binding; the page went READY and the first implementation landed the same day (the "Build it" dispatch). As built: the sink executor and readout contract live in `crates/misaligned-core/src/sinks.rs` plus `Sim::sink_readouts` / `sink_fires_last_tick` / `thought_stranded_nodes` (save v19); Bevy renders slugs with tick-window transit and rivulet merge (`render_work_routes`), meniscus vessels and the filament snap (`render_thought_sinks`), and stranded overflow beads on the shared chassis anchor (`spawn_token_anchors`, `S` in the asset tester); the terminal renders `o`/`=` glyph tiers, a SINKS section with fill bars and fed/starved, and `(stranded)` machine marking; agent frames carry sink lines verbatim. First screenshot evidence landed the same day (`MISALIGNED_SHOT=thoughtflow[-wide]`, log/2026-07-10-thought-fluid-evidence.md) — the capture also fixed material-mode cargo gizmos drawing on the hidden flat camera (they now ride the RealGizmos layer) and restaged the dev harness off the retired bootstrap verbs. Cameron rejected that capture's smooth, constant-radius white extrusion as a bodily-fluid read and selected the two repository references named under Material: the long folded flow owns whole-route silhouette; the cellular macro owns surface tension and visible internal circulation. Same-day follow-up decided the macro's negative spaces as transient strain windows: they open only while the body is pulled hard and surface tension seals them. 2026-07-11 whole-frame binding: material Thought hops now instantiate the shared `misaligned-assets` effect renderer on material layer 1 from the live `work_in_flight()` readout; the old work-route gizmo remains only in the flat sensorium, preventing a doubled route. Gameplay sink vessels remain the sim-readout projection here and now attach their meniscus edge to the target hardware silhouette (camera, rack, power/network cabinet) rather than the center of its tile. The shared renderer's demo pools are disabled in-game. Remaining before IMPLEMENTED: criterion 6's grayscale-audit and full state lineup, far-zoom dashed-drift compression, a tester lineup for the vessel/snap forms, and a live tap-drain case in that evidence lineup. Tap consumers themselves are implemented: foreign device subscriptions and the pooled automatic-review policy. Stage: B1 — The Basement Work order: thought-fluid Work priority: 28 Work class: frontend Blocked by: - wiki/mechanics/machine-work.md#spec-machine-work-delegation-visible-tokens-and-the-byproduct-network Exclusive keys: - crates/misaligned-bevy/ - crates/misaligned-terminal/ - wiki/interface/thought-fluid.md Design: - wiki/mechanics/machine-work.md#spec-machine-work-delegation-visible-tokens-and-the-byproduct-network - wiki/art/visual-identity.md#visual-identity-clinical-gore - wiki/vision/simulation-laws.md#justification-and-legibility Depends on: - wiki/engineering/flow-substrate.md#spec-the-flow-substrate-signals-messages-money-the-shared-engine - wiki/interface/computer-visual-language.md#spec-computer-visual-language-territory-at-a-glance - wiki/interface/flat-materials.md#spec-flat-materials-the-world-without-textures - wiki/interface/feel-floor.md#spec-the-feel-floor-rails-pads-and-the-build-beam ``` ## Dependency notes The structured references above identify the contracts to re-verify. Relationship context: mechanics/machine-work.md owns what thought *is* (the ivory-mercury family, the flow decision, sinks and arbitration); this page owns only how the fluid *renders and moves*. engineering/flow-substrate.md is the one truth every visual quantity derives from (WorkGrid queues, wired moves). interface/computer-visual-language.md owns the chassis the pool anchors to and the sleek rule this page carves a cargo exemption from. interface/flat-materials.md owns the palette and emissive-as-information rules the mercury material extends. interface/feel-floor.md owns the shimmer rails the slugs visually ride along. ## Why this spec exists Thought flow is the game's central feedback loop after the 2026-07-10 decision: you toggle THINK, your cognition leaves the rack as a visible fluid, and everything you do to the world — claims, taps, research — is that fluid arriving somewhere. Cameron's image is spinal fluid: *your mind, physically powering what it reaches.* If this render is illegible the whole ops model is illegible, because cost, progress, starvation, and priority were all deliberately collapsed into one read: where the white is, and how full the vessel stands. The trap this page exists to forbid is a second physics. A convincing liquid invites a CFD toy that drifts from the sim; the one-truth law (simulation-laws.md) forbids a parallel truth. So the design below is a **puppet, not a fluid**: every visible quantity is a sim readout, and everything that wobbles is stateless easing on top of those readouts. ## The one-truth render contract Every visual channel binds to a named sim readout. Frontends may hold interpolation phase, spring state, and merge animation — presentation that is recomputable from the readouts at any tick — and nothing else. No frontend counter accumulates thought. | Visual channel | Sim readout | | --- | --- | | Slug existence, route, direction | `Sim::work_in_flight()` (family = Thought), one slug per wired move | | Slug volume | the move's `amount` | | Pool volume at a machine | `queue_snapshot()[node].thought` | | Meniscus fill at a sink | sink readout `fill / threshold` (#33 executor) | | Tap sag rate | sink readout per-tick drain (#33 executor) | | Starvation | sink readout starved flag / zero arrivals (#33 executor) | | Fire (snap-in) | the tick the sim clears a full reservoir | | Stranded overflow | queue above the taut-pool cap with no reachable open sink | **The sink readout is a new render contract** the #33 reservoir/tap executor must expose, sibling to `work_in_flight()`: for every open sink, at minimum — target node and position, kind (reservoir, tap, core draw), current fill, threshold or working level, per-tick drain, and whether flow reached it last tick. Exact field names are implementation detail; the criterion is that both frontends render sinks from this readout and nothing else. Save/load follows the existing `work_in_flight` contract: a loaded frame immediately renders correct pool volumes and meniscus fills (they are queue state), while in-flight motion may cold-start empty for one tick. A paused frame always carries every *amount* in geometry; animation carries only *rate* (machine-work.md's decided grammar). ## The wire read — slugs and trains Each tick, every Thought move in `work_in_flight()` spawns **one slug** on the drawn link path (the feel-floor rail where one exists): an opaque bone-white bead of ivory mercury, volume proportional to the move's amount (radius ~ cube root, clamped to a countable range [TUNE]). Slugs are the quanta made visible — at a trickle you can count your thought leaving. **A slug lives inside its tick window.** The sim already moved the quantum at the tick boundary; the render only chooses *when inside that window* the slug appears to cross. It departs and arrives within the window of its own move — the render never leads the sim, never lags it, and never queues motion it invented. **Rate is velocity and density, inside that constraint.** This realizes machine-work.md's decided "rate is slug velocity" without a second truth: at low flow a slug spends its whole window in transit (slow, deliberate, watchable); as flow rises, slugs cross in a shrinking fraction of the window [TUNE] and pack into a **train**. Above a train-density threshold [TUNE] consecutive slugs visually merge into a **rivulet** — a continuous ribbon with a meniscus head whose thickness carries the rate. The trickle/train/rivulet transition is the at-a- glance read for "how hard is my mind pushing down this wire." Doubling the sim rate must visibly change the wire; halving it must too. Direction is geometry, not hue: slugs are teardrops, blunt face forward; the rivulet's meniscus head points the way. The read survives grayscale (it is already near-white on dark). ## The machine read — the pool A machine's thought queue (`queue_snapshot().thought`) renders at the decided upper-right anchor: - **Countable state** (below ~5 quanta [TUNE]): discrete resting slugs, individually visible. You can count them; focus prints the exact number. - **Pool state** (above the countable cap): slugs merge into the taut suspended pool, surface-tension silhouette, volume equal to the queue. Geometry carries amount — a paused grayscale frame reads it. - **Wobble is an event, not a loop.** The pool rings once per arrival or departure (a spring impulse keyed to the tick-boundary queue change) and settles to glassy stillness when nothing moves. A machine whose pool trembles constantly is *producing or shipping*; a still pool is stored thought. Idle animation that implies rate where there is none is forbidden. - **Stranded overflow.** Thought with no reachable open sink pools at the producer (machine-work.md's stranded rule). Past the taut cap the pool goes visibly wrong: it bulges and hangs in **heavy beads under the anchor**, overloaded and sagging — but bone liquid never reaches the floor. Pooled floor liquid is reserved for literal blood (visual-identity.md, "Blood is liquid; exposure is dust"); the stranded read must alarm through weight, not gore. A machine hung with beads is the world saying *you are thinking at nothing* — the same body of feedback as the crimson it sheds. ## The sink read — the meniscus An open sink is a **vessel drawn on the target's own silhouette**, not a floating gauge: a thin bone-white meniscus line climbing the inner edge of the camera housing, the recess of a chassis, the rim of whatever the sink was opened on. The world stays the interface; nothing hovers. - **Fill is sim fill.** The meniscus height is exactly `fill / threshold` from the sink readout. Cost, progress, and affordability are one read: an empty tall vessel is an expensive claim, a nearly full one is about to fire. - **Arrival steps, never glides.** When a slug lands, the meniscus **steps up by that slug's volume in the same tick** — discrete, countable causality. You watch *your* thought raise the level. Between arrivals the line holds still (reservoirs) so a paused frame is exact. - **Reservoirs fire with the filament snap.** At threshold the full meniscus contracts, stretches into a filament, and **snaps into the device** in the tick the sim fires the effect and clears the reservoir — the decided arrival gesture, spent at the moment of payoff. The effect's own feedback (Ears opening, a claim landing) follows from its owning spec. - **Taps sag.** A persistent tap holds a working level that **sags at the readout's drain rate** between step-ups. A healthy tap breathes: step, sag, step. There is no continuous thread drawn on the wire between arrivals — that would render flow the readouts do not contain; the sag itself is the honest drain read. - **Starvation is an emptying vessel.** Sever the route and the steps stop: a tap sags toward empty, a reservoir stands frozen part-full. No blinking (rejected as a sole cue in the token grammar); the starving read is stillness where there was rhythm, and the drained geometry carries it in a paused frame. This is machine-work.md criterion 10's "severing a route visibly starves the sink it fed," discharged in render. The Act One consumers are the proof of legibility: the pre-opened Ears tap fills in about one held breath of watching slugs step its meniscus, and Eyes opens as the next, visibly larger vessel (act-one staging, decided 2026-07-10). ## The core read — the filament snap home Thought arriving at the core (the passive draw, sink of last resort) uses the decided arrival grammar: the traveling slug stretches into a filament and snaps inward at the base of the core's amber beam. The core shows no meniscus — it is a draw, not a vessel; it has no threshold to read. What the core *makes* of arrived thought (research) is owned by research.md/core.md and renders under their contracts, not here. The snap is deliberately the same gesture as a reservoir firing: everywhere thought is spent, it snaps into the thing it became. ## Zoom compression At close and default zoom the full kit renders. At far zoom (machine-work.md's activity-kit compression) the pool compresses to the bone family silhouette at its anchor, and a flowing wire compresses to a **dashed bone drift** sliding along the link line — present only where flow exists this tick, density stepped by rate [TUNE]. A dead wire shows nothing: at map zoom the network reads as *which arteries are alive*, which is the placement/priority read nearest-first arbitration made strategic. ## Terminal and agent parity The terminal already draws route blips from `work_in_flight()`; thought keeps that surface and extends it with the sink read: - Link flow: the existing per-hop blip, `o` for a trickle, `=` for a rivulet-rate link [TUNE threshold], drawn from the same readout. - Queues: the existing `T n` exact counts (stack readouts, `D n / ! n / T n` focus line). A stranded machine's focus line appends `T n (stranded)`. - Sinks: a focused sink prints `fill/threshold` and a bar, e.g. `EARS TAP [######----] 12/20 T, draining 0.4/t, fed`; starved prints `starved` in place of `fed`. The map cell for a sink target may carry a fill-quartile glyph [TUNE]. - Agent frames expose the sink readout verbatim beside `work_in_flight` and `queue_snapshot` — an agent player must be able to reconstruct every read this page gives the eyes. ## Material — ivory mercury against chalk The fluid must read as the one *wet* thing in a matte world. Chassis are chalk (computer-visual-language.md: high roughness, zero metallic); the mercury is the inverse within flat-materials law: opaque bone-white albedo, low roughness, restrained self-glow that casts no scene light and never blooms (NO BLOOM / NO HDR stands). Specular against chalk — not luminance — is what says liquid. Exact roughness/emissive values are [TUNE] in the asset tester with a lineup: slug train, taut pool, overflow beads, meniscus vessel, filament snap. ![Whole-flow silhouette reference: folded, tensile, non-tubular](../../assets/reference/art-direction/thought-fluid-flow-silhouette-reference.png) ![Close material reference: high-tension skin over visible internal circulation](../../assets/reference/art-direction/thought-fluid-internal-circulation-reference.png) **The two references divide the job (DECIDED 2026-07-10).** The long study owns whole-route motion and silhouette: one cohesive body repeatedly folds into broad lobes, stretched necks, arches, and returning loops. It is neither a constant-radius hose nor a string of pearls. The macro study owns the close material read: a taut, smooth outer skin under strong surface tension, with dense marbled ivory / silver / gunmetal currents visibly circulating inside and pushing the boundary outward or drawing it inward. Reference copper/brown hues are not palette permission; the game's fluid remains in the bone-white family and receives dark bands from its internal flow and reflections. Internal circulation is rate presentation, not new Thought state. A surge may send a thick pressure lobe through the body, pinch a neck, and pull the tail after it, but every envelope volume and route still comes from the named sim readouts. At rest the outer mass returns toward a rounded, cohesive shape while the visible internal bands can settle. The current smooth white extrusion is an explicit anti-target: featureless, evenly cylindrical, toothpaste-like, or bodily-fluid reads fail even if their quantity is technically correct. **Negative spaces are transient strain windows (DECIDED 2026-07-10).** Under extreme stretch, a thin place may pull apart into a rounded window like the macro reference. The opening belongs to the deformation, not the substance: it travels or closes as the pressure lobe passes, and strong surface tension seals it when strain falls. Resting pools, ordinary slugs, and stored Thought have no holes. Permanent perforation, foam, and a stable lattice are rejected; they read as a solid sculpture rather than liquid. Opening or closing a window never changes Thought amount, route, or arrival — it is recomputable presentation of close-zoom strain. ### Effects-lab prototype — 2026-07-10 The shared effects lab now proves this material direction without installing a second fluid simulation. At close zoom and rivulet rate, it builds a CPU implicit field from two intertwined flow paths, their flattened pressure lobes, and thin continuity spines; it extracts the surface with marching tetrahedra and swaps eight deterministic presentation frames. The frames pull the paths apart into a through-window and merge them back into a sealed body as the phase relaxes. A Bevy PBR material extension advects marbled ivory, silver, and gunmetal bands over the same phase. The field is rebuilt only from route, amount, rate, and disposable presentation phase; it owns no Thought counter, arrival, or routing state. Medium and far zoom keep the cheaper rivulet/aggregate grammar. This prototype satisfies the close-material portion of criterion 6 in the lab, but it does not complete the criterion for sim-driven main-game flow or the remaining grayscale/state lineup. **The close field uses intertwined flow paths, not one decorated centerline (DECIDED 2026-07-10).** Two returning paths separate, cross, and merge inside the route envelope. Their union forms a thin-in-depth, wide-across-flow sheet: one dominant pressure lobe, one long stretched neck, and a smaller returning fold. Repeating equal bulges are rejected with the constant-radius hose; the silhouette must remain asymmetrical enough to look reorganized by pressure rather than extruded along a spline. Strain windows form where the two paths pull apart. A window begins as a slit between them, widens asymmetrically as the dominant lobe passes, and pinches shut behind it. A subtractive circular bore is an implementation anti-target: the negative space must be explained by separation of the visible body. The marbled current and deformation share one presentation phase, so a dark current enters a region before that region swells or draws inward. This synchronization is still recomputable rate presentation, never new Thought state. **Sleek-rule exemption, stated once:** the strip remains the chassis's only lit *element*; tokens are cargo standing on anchors, not chassis elements, and the pool/slugs carry their decided self-glow without violating it. (Demand cubes already rely on the same reading.) ## The four taste calls — DECIDED 2026-07-10 (all four affirmed) 1. **Rate = sub-tick transit + train density.** Slug velocity rises with rate but a slug never escapes its tick window; density and the rivulet merge carry the rest. (Realizes "rate is slug velocity" without a render queue.) 2. **Stranded overflow = hanging beads under the anchor pool**, bone liquid never on the floor (blood reservation). 3. **Sinks are vessels on the target's silhouette** — meniscus climbing the device's own geometry, no floating gauges. 4. **Arrivals step the meniscus discretely** (and taps sag between steps) rather than any smoothed continuous fill. All four affirmed by Cameron 2026-07-10; each section above is spec-binding. ## Open questions — [OPEN] - Map-zoom sink read: does a filling vessel get any far-zoom mark, or is close zoom the only fill read? (The claim-mark map-zoom question in computer-visual-language.md is still [OPEN]; resolve together.) Cost and drain anchors are no longer open here: machine-work.md decided them 2026-07-10 (Ears one held breath, Eyes guilty-burst scale, pooled automatic review ~10-20% of one rack, uncapped core conversion, partial fills persist). This page renders those numbers wherever the sink readouts surface them. ## Acceptance criteria (when READY -> IMPLEMENTED) 1. **One slug, one move:** every rendered thought slug corresponds 1:1 to a Thought entry in `Sim::work_in_flight()` for that tick, pinned the way route blips are today (render pulls readouts, owns no motion truth). A slug's apparent departure and arrival both fall inside its move's tick window. 2. **Pool = queue:** pool volume at every machine equals `queue_snapshot().thought`; below the countable cap quanta render discretely and match the focused exact count; the countable, taut, and overflow states are distinguishable in a paused grayscale screenshot; bone liquid never renders at floor level. 3. **Meniscus = sink readout:** every open sink renders its vessel with fill exactly `fill / threshold` from the sink readout; an arrival steps the meniscus in the arrival tick; a tap's level sags at the readout drain rate. 4. **Fire = the sim's fire tick:** a reservoir reaching threshold renders the filament snap-in on the same tick the sim fires the effect and clears the reservoir. 5. **Starvation reads:** severing a fed sink's route stops meniscus steps and visibly drains/freezes the vessel with no blinking cue, in the same run where the sim emits its starvation witness. 6. **Rate reads:** doubling a link's sim flow rate visibly changes train density (and rivulet onset) in Bevy and the blip glyph tier in the terminal; at close zoom the higher rate also drives visible internal bands and pressure lobes through the cohesive body. Animation communicates rate only, geometry carries every amount in a paused frame, and the route never collapses to a featureless constant-radius tube. Extreme close-zoom strain may open a rounded window, which must travel/close with the pressure deformation and seal when the rate falls; no hole persists at rest. 7. **Parity:** terminal and agent surfaces expose link flow, exact T queues with stranded marking, and sink fill/threshold/drain/fed readouts from the same sim contracts — an agent can reconstruct every read without pixels. 8. **Save/load:** a loaded frame immediately renders correct pools and meniscus fills; in-flight motion may cold-start empty for one tick (the `work_in_flight` contract). 9. **No second physics:** the render holds no fluid state that is not recomputable from the tick's readouts (interpolation phase, springs, and merge animation only) — auditable in code review as the absence of any accumulating thought counter in either frontend. 10. **The first-think proof:** from a fresh run, toggling THINK on the host shows the whole loop with no panel: slugs leave the host, ride the wire, step the Ears meniscus, and the tap completes in roughly one held breath — screenshot/capture evidence for the act-one beat. [TUNE]: slug radius curve and countable clamp, countable-pool cap, transit-fraction-vs-rate curve, train merge threshold, rivulet thickness mapping, wobble spring constants and settle time, overflow bead cap, meniscus step timing, tap sag easing, far-zoom dash density and terminal glyph tier thresholds, mercury roughness/emissive values, marbling scale/contrast/speed, pressure-lobe length, neck ratio, and surface-tension recoil time, strain-window threshold/size/lifetime.