Three apps, three domains, one abstract method — and the implementation is a refusal every time.
The same shape in three vocabularies
Read these three sentences in a row and the pattern is unmistakable:
- The portfolio app observes, never recommends a trade.
- The health engine observes, never diagnoses.
- The valuation engine assays value, never advises.
This is inheritance in the sense that matters — not a shared base class in code, since these are separate applications with separate databases, but a genuinely shared abstraction with three domain-specific overrides. The abstract method is something like what does this app do when it knows enough to have an opinion? and all three override it with the same answer, expressed in their own nouns.
Why these three domains and not others
The image generator has no such invariant. The music engine has none. That is not an oversight — it is the pattern telling you where it applies.
All three refusal-apps share two properties. First, the domain has professional gatekeeping for a reason: financial advice and medical diagnosis are regulated acts, and both are regulated because the consequences of confident wrongness fall on someone other than the person who was confident. Second, and more subtly, the data is intimate. These apps hold real family holdings, real health measurements, real watchlists. An app that knows that much about you and also tells you what to do is a different kind of object from an app that generates a picture.
What each override does with the boundary
The overrides are not identical, and the differences are instructive. The portfolio app's boundary is about initiation — it will answer a direct question with full judgement, but volunteers nothing. The health engine's is about vocabulary — it may surface patterns and raise questions, but may not name a diagnosis, because the naming is itself the regulated act. The valuation engine's is about framing — it may show any number it has, at full precision, with its whole history, so long as the framing is positional rather than directional.
Same abstraction, three different places to draw the line, each one drawn where that domain's harm actually lives. That is what a good override looks like: not a copy of the parent's rule, but the parent's intent re-derived in local terms.