The framing shift
When end users see internal vocabulary on the screen — protocol identifiers, infrastructure nouns, raw IDs — the instinct is to fix the copy. Renameunit to prompt. Hide the strat:// URI behind a tooltip. Soften the technical labels.
That treats the symptom. The disease is structural: the surface is sitting on the substrate without a translation layer, and the substrate’s vocabulary bleeds through every join.
Why “fix the copy” fails
Three reasons.- Every new feature relapses. Add a feature → it passes the existing data model → the data model contains protocol nouns → the new feature renders them. The fix has to be re-applied each time.
- The error messages give it away. Even if the happy path is clean, a 422 response or a network error surfaces the underlying field names. End users see them at exactly the worst moment.
- Marketing cannot describe the product. If the team’s working vocabulary is the technical model, the home-page copy collapses into the same vocabulary by gravity. You cannot sell “sessions with audit-trailed gates” to a domain professional who came to “review a contract.”
The architectural fix
Three layers, machine-enforced:- Single chokepoint package that translates outcome calls → protocol calls and returns redacted DTOs (e.g.
OutcomeReportstripsledgerRef,fingerprint,blake3substrings). - Static boundary script in CI blocking forbidden imports from the surface app’s source.
- DOM-purity Playwright spec asserting the rendered HTML never contains the forbidden tokens.