Contents — find the section you need
CEA recovered lots — traceability after mixing and system isolation
Mixing does not average away provenance
The two-ledger guide separated nutrient state from sanitation state. This guide follows recovered lots through a mix. EC can be averaged for lots A and B, but a concern associated with A does not disappear. The mixed liquid must remain traceable to both A and B.
UVM Extension explains that circulating nutrient solution connects surfaces and can spread a problem from one location through the system. Its produce-safety resource supports recording a mix as a new lot with inherited history, not as a clean reset.
Fields inherited by a mixed lot
| Field | Example | Purpose |
|---|---|---|
| New lot ID | M-2026-09-14-01 | Unique reference after mixing |
| Parent lots and amounts | A: 6 L, B: 4 L | Trace ancestry and contribution |
| Touched systems | Root chamber 2, return pipe, isolation vessel | Reverse lookup of scope |
| Time and operator | UTC time and operation ID | Fix the sequence |
| Test/treatment state | Untested, treated, held | Support reuse decisions |
If one parent is held, the child remains held. Do not ignore a small parent because most of the volume was acceptable. This is a traceability rule, not a pathogen concentration model.
Preserve shared systems as a graph
Represent tanks, pumps, filters, nozzle rows, root chambers and recovery vessels as nodes, with liquid movement as directed edges. Traversing edges backward from a concerned lot enumerates candidate systems for isolation.
def ancestors(lot, parents):
seen = set()
stack = [lot]
while stack:
current = stack.pop()
if current in seen:
continue
seen.add(current)
stack.extend(parents.get(current, ()))
return seen
parents = {"M-01": ("A-01", "B-01"), "M-02": ("M-01", "C-01")}
print(sorted(ancestors("M-02", parents)))
The output is ['A-01', 'B-01', 'C-01', 'M-01', 'M-02']. seen also stops cycles. This finds lot ancestry; it does not estimate microbial transport probability or the actual contamination boundary.
Define release conditions before lifting isolation
When an anomaly is detected, record the lot, shared tank, return pipe and root chambers it touched, then remove them from the normal reuse loop. Release should link test results, treatment history, residual checks, completed cleaning/sanitizing and an accountable approval. Moving an untested liquid to another tank expands scope rather than lifting isolation.
When recovered solution can contact harvested produce or food-contact surfaces, agricultural-water and produce-safety requirements may apply. VCE's food-safety guide explains that management changes depending on whether nutrient solution contacts produce. VCE guidance is context, not a legal release decision.
Scope
This guide covers mixed-lot ancestry, shared paths and isolation records. Pathogen assays, contamination probabilities, sanitizer doses and legal release decisions remain outside scope. Next is comparing designs that avoid mixing recovered liquids and use zone-specific drainage and treatment paths.
Zone isolation — separate drainage and treatment paths
Separate pipes as well as records
Recovered-lot traceability preserved parent lots after mixing. To limit scope further, consider zone-specific tanks, return lines, recovery vessels and treatment destinations so routine operation does not mix them.
UVM Extension explains that circulating water connects surfaces and can spread a problem from one location. The UVM resource motivates applying that idea to physical path separation. This does not eliminate pathogens; it defines smaller units for isolation and tracing.
Give each zone four paths
| Path | Zone A | Zone B | Why separate |
|---|---|---|---|
| Supply | Tank A → pump A | Tank B → pump B | Preserve supply history |
| Return | Root chamber A → recovery A | Root chamber B → recovery B | Avoid sharing an anomalous lot |
| Drain | Isolated drain A | Isolated drain B | Distinguish discharge records |
| Treatment | Filter/treatment A | Filter/treatment B | Avoid treatment-state confusion |
Even with shared source water, record the boundary before source water enters each zone. A shared header, filter or floor drain means naming zones separately does not create isolation.
Enumerate isolation scope as a graph
def connected(start, edges):
seen, stack = set(), [start]
while stack:
node = stack.pop()
if node in seen:
continue
seen.add(node)
stack.extend(edges.get(node, ()))
return seen
edges = {
"tank-A": ("root-A", "drain-A"),
"root-A": ("tank-A",),
"tank-B": ("root-B", "drain-B"),
"root-B": ("tank-B",),
"drain-A": ("treatment-A",),
"drain-B": ("treatment-B",),
}
print(sorted(connected("tank-A", edges)))
The output is ['drain-A', 'root-A', 'tank-A', 'treatment-A']. Whether an anomaly in A should stop B depends on shared connections and the operating procedure. A graph cannot infer connections that were never recorded.
Separate drains without assuming more treatment capacity
Zone drains distinguish volume and lot, but one treatment unit operated sequentially does not gain capacity. Record container IDs, start/end, rinse and residual checks before and after each batch. If treatment is shared, retain the originating zone ID.
When drainage rises, distinguish pump malfunction, root-chamber leakage, a full recovery vessel and stopped treatment. Moving drainage to another tank does not resolve its original anomaly.
Scope
This guide covers zone paths and record boundaries. Pipe sizes, valves, pathogen assays, treatment products and legal release decisions remain outside scope. Next comes aquaponics, where fish, microbial and plant water-quality boundaries change the accounting.

Comments
Please log in to post a comment
No comments yet.