A plain object passed across the codebase; the agent reading any consumer must inspect every other consumer to learn what shape the record actually has.
The record is a class with accessors; the agent reasons about its shape, invariants, and behavior in one definition.
Before the refactoring
const org = { name: 'Acme', country: 'US' };console.log(org.name);
After the refactoring
class Org {constructor({ name, country }) { this._name = name; this._country = country; }name() { return this._name; }country() { return this._country; }}console.log(new Org(org).name());
Field changes ripple through every consumer; the agent must coordinate updates and verify each consumer respects the (implicit) contract.
Wrapping every record adds construction ceremony at every entry; for records without invariants or behavior to attract, the agent gains nothing for the per-call cost.
Field accesses run through named methods; a field rename touches one class definition without changing any caller, and invariants enforced in those methods catch invalid combinations the field-level access would otherwise let through.
Wrapping records on principle without invariants or behavior to add creates classes the agent must instantiate everywhere with no encapsulation gain.