Article chapter 06 of 08
Keep contracts and language consistent across the product
Have a look at the language used across your APIs, events, reports and user interfaces. Teams often use different names for one concept, or reuse one name for concepts that behave differently, and every new dependency makes the mismatch harder to fix.
I'd start a small glossary for the terms that carry product behaviour. Words like account, member, owner, active, cancelled, completed and archived only need defining where they have a shared meaning. If a misleading synonym keeps causing errors, list it as one to avoid. The glossary should point to whatever defines lifecycle and permissions instead of copying every rule.
For shared data, name the source of truth and the copies that are allowed. One service might own the current subscription state while other components keep a read model. Write down how the copies update, how stale data is handled and which system wins when they disagree. Otherwise every copy slowly starts acting like the authority.
Version contracts when consumers can't all change at once. Database migrations, APIs and events need a period where deployment order won't corrupt or misread data. Where you can, go additive first: add the new field or event, update the consumers, check they're using it, then remove the old form later as its own decision.
Check behaviour as well as the schema. An API can return the same fields while changing when a status becomes final. A background task can publish the same event after it's been moved earlier in a transaction. Consumers can depend on timing and guarantees nobody wrote into the schema.
User-facing wording needs the same attention. If one part of the product calls a state "paused" and another calls the same state "inactive", people will expect different things about access and recovery. Product copy should follow the shared meaning, and if an audience genuinely needs different wording, document that exception.
Schema validation, consumer tests, migration tests and shared fixtures will catch incompatible shapes and state transitions. Whether a changed concept is the right change is still for the decision record and a human reviewer to work out.
When a team finds an existing inconsistency, I'd hold off on a broad cleanup until there's an inventory. Find every use, pick the intended meaning, plan for compatibility and give operators a way to reconcile old records. Renaming a value in the code doesn't fix the data or anything downstream that relied on it.