Water Rail V1
implemented unverified
Vertical Farm Pack (tilted flush row canon): the Base Water Rail — a level 248x248 module that transports and constrains a transient water pulse, never stores it. The open U-channel is cut from the SEAT FLOOR at CONSTANT depth: the rail itself is horizontal; the drainage slope comes from mounting the whole row on a standard straight 2020/3030 aluminum profile at 1.0-2.0 deg (assembly mount_context), never from the geometry. Modules sit FLUSH (dZ = 0, controlled 0.3-0.6 face gap) and hand water to each other over a lap-flow joint: a lip continuing the channel floor plane lands in the neighbour's through open-bottom receiver; the tip slot is a deliberate, visible, cleanable leak path — the seam is never the primary water path. A recessed drop-in seat carries any cassette honoring the Cassette Interface Standard. The body is a lightweight dry shell (param-gated): large smooth open-bottom windows between the channel and the profile bands — the profile carries the row, plastic pays for water, cassette and positioning. Optional sealed magnet pockets in both +-Y faces align neighbouring modules and NOTHING else — never a seal, never a support. Flow axis Y: inlet back (+Y), outlet front (-Y); prints flat, channel up, no supports in the wet path.
Built from a real example — orbit to inspect.
Declaration example
A minimal product declaration for this archetype — exposed parameters at
their defaults. Validate and build it with
forge validate / forge build.
schema: product/v1
id: my_water_rail
archetype: water_rail_v1@2
params:
module_l: 205mm
module_w: 205mm
channel_w: 16mm
face_gap: 0.4mm
lightweight: True
under_cassette: skeleton
magnet_enabled: False
endcap_dock: none
endcap_dock_style: top
profile: 2020 Parameters
| parameter | type | default | range | role | |
|---|---|---|---|---|---|
module_louter module size along the line axis X. Default 205 keeps the printed rail (~209 with the tongue) well clear of a 256 bed's exclusion zones (P1S/X1); raise toward 250 only on a printer with a clean edge. ~200 is the design floor — below it the full-width collector no longer fits between the root troughs and the profile band | length | 205mm | 200mm … 250mm | functional | exposed |
module_wouter module size along the flow axis Y (see module_l) | length | 205mm | 200mm … 250mm | functional | exposed |
body_hrail body height; the seat and channel nest inside it | length | 30mm | 24mm … 60mm | structural | |
channel_wwater channel width — wide enough for a brush | length | 16mm | 12mm … 20mm | functional | exposed |
channel_dchannel depth — CONSTANT end to end; the mount supplies the slope | length | 5mm | 4mm … 8mm | functional | |
channel_bottom_rrounded channel floor corners — cleanable, no crud line | length | 1.2mm | 0.8mm … 2mm | manufacturing | |
face_gapcontrolled gap between neighbouring module faces — flush means one plane, not contact; row pitch = module_w + face_gap | length | 0.4mm | 0.3mm … 0.6mm | assembly | exposed |
lip_lenlap lip protrusion past the outlet face — also the drip edge air gap on the last module of a row | length | 4mm | 3mm … 6mm | functional | |
lip_tlap lip thickness — its TOP is the channel floor plane | length | 1.4mm | 1.2mm … 1.6mm | functional | |
lap_pocket_lenthrough open-bottom lap receiver length in the inlet floor | length | 6mm | 5mm … 8mm | functional | |
lap_side_clearanceper-side clearance of the neighbour's lip in the receiver | length | 0.4mm | 0.3mm … 0.5mm | manufacturing | |
cassette_lshared cassette envelope X — the Cassette Interface Standard | length | 177mm | 160mm … 236mm | assembly | |
cassette_wshared cassette envelope Y | length | 177mm | 160mm … 236mm | assembly | |
seat_depthhow deep the cassette sits in the rail | length | 14mm | 10mm … 20mm | structural | |
seat_clearanceper-side drop-in clearance around the cassette | length | 0.75mm | 0.5mm … 1mm | assembly | |
module_pitchnominal grid pitch between module origins along the LINE axis X | length | 207mm | 200mm … 300mm | assembly | |
corner_r | length | 4mm | 2mm … 8mm | aesthetic | |
lightweightopen-skeleton windows on (reversible: false = solid slab); through cuts — no bridges by construction; the aluminum profile is the structural member | bool | True | — | structural | exposed |
lw_ribcross-rib width between windows | length | 2mm | 1.8mm … 3mm | structural | |
under_cassetteunder-cassette volume: skeleton (-45% plastic, overflow drips through) | root_chamber (blind bottom contains overflow + open-top root troughs drained forward by the mount) — VF-5 | choice | skeleton | skeleton | root_chamber | structural | exposed |
trough_wroot trough width (root_chamber) — cassette spans it. Default 18 keeps the outer trough clear of the profile band on a ~205 module so the full-width collector's side wall still fits between them | length | 18mm | 18mm … 40mm | functional | |
trough_ribrib between root troughs (cassette support) | length | 6mm | 4mm … 10mm | structural | |
trough_depthroot trough depth — the root zone; blind bottom below it | length | 12mm | 8mm … 13mm | functional | |
magnet_enabledoptional d6x2 alignment magnets in sealed dry pockets — alignment only, never a seal, never a support | bool | False | — | assembly | exposed |
magnet_x_offsetmagnet pocket centers at +-x_offset on both +-Y faces. On a small root_chamber module the solid band between the root troughs and the profile is too narrow for a d6 magnet, so sit them OUTSIDE the profile band (~95 on a 205 module, between the profile and the rail edge) — clear of both the troughs and the profile slot; the magnet checks enforce dry | length | 60mm | 40mm … 106mm | assembly | |
magnet_fitdiametral press-fit of the d6x2 magnet in its dry pocket — pushes in from the mating face, a drop of CA recommended | length | 0.2mm | 0.1mm … 0.3mm | manufacturing | |
endcap_dockVF-6 endcap docking magnets on the END(s): front (outlet, collector) / back (inlet, cap) / both. Only the terminal modules of a row need it — the collector/cap arm docks onto it | choice | none | none | front | back | both | assembly | exposed |
endcap_dock_styledock pocket placement: top (UP Z pockets on the wall top, collector) or face (Y pockets in the end FACE, VF-9 support-free cap hook). Match the docking endcap's style | choice | top | top | face | assembly | exposed |
dock_xdock magnet centers at +-dock_x in the dry perimeter wall (clear of channel and root troughs); the endcap uses the same value | length | 22mm | 14mm … 40mm | assembly | |
dock_insetdock pocket step inboard from the end face — under the endcap arm footprint, ahead of the seat wall | length | 7mm | 4mm … 12mm | assembly | |
profilealuminum profile the module drops onto | choice | 2020 | 2020 | 3030 | assembly | exposed |
profile_clearance | length | 0.2mm | 0.1mm … 0.5mm | manufacturing | |
profile_depth | length | 6mm | 4mm … 10mm | structural | |
profile_insetprofile slot centerline distance from the +-X edges | length | 24mm | 16mm … 60mm | assembly | |
tongue_w | length | 6mm | 4mm … 10mm | assembly | |
tongue_h | length | 4mm | 3mm … 8mm | assembly | |
tongue_lentongue protrusion past the +X face | length | 3.6mm | 2mm … 6mm | assembly | |
edge_clearanceper-side tongue/groove clearance — aligns, never binds | length | 0.4mm | 0.3mm … 0.5mm | assembly | |
tongue_z0 | length | 4mm | 2mm … 12mm | assembly | |
tongue_bottom_marginextra groove depth so the tongue never bottoms | length | 0.4mm | 0.3mm … 1mm | assembly |
Regions
-
water_channeltransient water path -
lap_liptransient water path -
lap_receivertransient water path -
cassette_seat_wallsinterface keepout -
tongue_edgeinterface keepout -
groove_edgeinterface keepout -
profile_seat_einterface keepout -
profile_seat_winterface keepout -
dry_zone_backmounting surface
Contract
Guarantees
must-have features and invariants — verified on every build
constant_depth_water_channellap_flow_handovercassette_seatface_gap >= 0.3 and face_gap <= 0.6lip_len >= 3.0 and lip_len <= 6.0seat_clearance >= 0.5 and seat_clearance <= 1.0edge_clearance >= 0.3 and edge_clearance <= 0.5
Will refuse
explicit prohibitions — the engine refuses to build these
closed_water_reservoirdead_water_pocketsecondary_water_channelhidden_wet_cavity
Not claimed
what passing validation does not mean
- Provided “as is” under Apache-2.0 — no warranty of fitness for a particular purpose.
Built from operations
water_rail_bodylap_outlet_liplap_inlet_receiveredge_magnet_pocketsendcap_dock_pocketsprofile_seat_slottongue_groove_edges
Subscribed validators (29)
interface.frame_existsinterface.frame_orthonormalinterface.normal_points_outwardinterface.up_consistentinterface.keepouts_preservedform.water_channel_constant_depth_okform.water_channel_dims_okform.drainage_requires_mountform.lap_joint_geometry_okform.lap_slot_leak_path_controlledform.lap_receiver_has_floorform.lap_receiver_residual_volume_okform.rail_universal_inlet_accepts_cap_and_lapform.lightweight_windows_dry_okform.cassette_support_span_okform.root_chamber_okform.magnet_pockets_outside_water_zoneform.magnet_pockets_do_not_break_wallform.dock_pockets_dryform.no_standing_water_irform.no_secondary_water_channelform.cassette_seat_fit_okform.tongue_groove_profile_okform.profile_seat_dry_oktopology.water_channel_opentopology.water_channel_floor_solidtopology.single_connected_solidtopology.cutout_presenttopology.ribs_present