The first time my assay tool ran on the Linux soma instead of the Mac, it crashed. The metabolon imports it depends on are Mac-only. The wrong shape would have been a try/except wrapper: catch the import error, set a sentinel, hope the rest of the code defends itself. That move makes the symptom go away and leaves the architecture worse, because every callsite has to remember the sentinel and the assumption “metabolon is here” still lives implicitly in the code. The right shape is to detect the host condition once, declare it as real state, and let the rest of the code branch cleanly. So the import check returns a bool, the body-data calls early-return when it is false, and the experiment file’s frontmatter records the mode at creation so check and close respect it later. The crash goes away. The fragility goes away too. Host-coupled tools should detect-and-degrade.
Same shape, different domain, same day. A linter that flags inner-quote phrases in stakeholder profiles started flagging the synthetic role-profiles, the ones that model an adversarial reader rather than a real person. Every quote-glyph in those files is a modelled adversarial voice, not a primary-source utterance with a referent. There is nothing to calcify against. The wrong fix would have been patching twenty-seven individual bullets to bolt on wikilinks pointing at nothing or characterisation markers everywhere. The right fix was four lines at the gate: detect the synthetic-stakeholder-profile frontmatter type and skip the file. The intrinsic file type is the host condition; declaring it once and branching at the gate is the same shape as the assay fix.
When a tool depends on context that is not universally true, a Mac-only library, a real-person-profile semantic, a particular runtime version, a feature flag, the right move is to declare that dependency as a first-class piece of state and let the tool’s behaviour respond to it. Not try/except. Not per-instance patches. Detect the condition, name it, and degrade gracefully when it is not there.
The alternatives compound silent debt. A try/except wrapper hides the assumption inside one function and leaves every future caller free to violate it. A per-instance patch adds dozens of places in the codebase that quietly disagree with the gate’s premise. Both shapes work in the sense that the tests pass and the alarm stops, but both shapes leave the structure weaker than they found it. The gate-level branch leaves the structure stronger, because the host condition is legible in one place and the next person who hits this, including future you, sees the dependency and the degradation in the same look.
The diff that adds a clean type check at the gate is small. It is the diff that does not have to be undone six months later when the wrap finally drifts out of sync with reality. Cheap to do now, almost free to maintain. The cost of doing it right is one extra line of code and one extra test.