Frame the contract boundary

The supplied object and null pages are shared official guidance; they should not be counted as separate corroboration. Use them to distinguish JSON Schema semantics from the application rules that sit around a contract.

A JSON object is a string-named mapping. Listing a name in properties alone does not force that name to appear; required carries that presence rule. Missing a member is not the same JSON state as giving that member null.

The proposed architecture is to make stable, high-confidence fields part of a closed core and to reserve a clearly named extension object for approved evolving fields. Closing, naming, ownership, migration timing, preservation, and review routing are application choices in this article, not provider-prescribed implementation rules.

Choose between an open core and a bounded extension path

An open core can suit exploratory payloads or contracts where producers legitimately add fields without coordination. An object can accept unmatched members when no rule disallows them, while a restriction can constrain unmatched members. The trade-off is that an unexpected spelling can look like an allowed addition rather than a contract defect.

For a stable interface, prefer a closed core when field names carry business meaning and unknown names require review. Place sanctioned evolution beneath a designated extension object, give that object its own value rules, and assign an owner to approve additions. This is a recommended operating model, not a claim that JSON Schema mandates it.

Be deliberate with composition. In a composed design, an additional-property restriction recognizes declarations in its own subschema; a member introduced elsewhere can therefore be treated as extra. Confirm the chosen arrangement with the governing dialect and validator before adopting it.

Apply the four-case decision table

This table separates documented validation effects from proposed handling. “Owner” and “action” cells deliberately state local policy rather than a JSON Schema guarantee.

Core-boundary decisions for a proposed contract policy
CaseInstance shapeDocumented schema effectOpen-core outcomeClosed-core outcomeExtension-boundary decisionInference to rejectContract ownerBounded application-owned action
declared core property presentA declared member has a value, such as status: "ready".The member value is checked using its declared value rule.Accept when that value rule succeeds.Accept when that value rule succeeds.Keep the field in the core when it is stable and owned.Do not infer that every future field belongs in the core.Core contract owner.Process the record; propose new fields through contract review.
declared optional core property omittedThe declared member is absent.Absence is allowed unless the name is included in required.Accept the omission.Accept the omission if it is not required.Do not use extensions merely to disguise a missing stable field.Do not infer a null value from absence.Core contract owner.Apply the documented local default or represent the field as unavailable.
declared core property explicitly nullThe member is present with null as its value.A value rule must admit null; a string-only rule rejects it.Accept only if the member value schema allows null.Accept only if the member value schema allows null.Keep null semantics with the declared field rather than moving them to extensions.Do not infer that null means omission.Core contract owner.Record the explicit-null state and apply the application’s defined meaning.
undeclared property received at the core boundaryAn unrecognized member arrives, such as stauts: "ready".Whether it is accepted depends on the policy for unmatched members.It may remain valid as an extra member.Reject it when the core rule bars unmatched members.Accept only approved evolving fields under the designated extension object and its value rules.Do not infer that an unknown core member is an approved extension.Core contract owner, with extension owner approval where applicable.Preserve the failed payload, route it for review, and return a bounded contract error.

Walk through the misspelled-member failure

This is an explicitly hypothetical scenario, not an observed incident. A producer sends stauts where the intended stable field is status. Under an open contract that merely declares status, the misspelled member can pass as an unmatched extra. A consumer may then treat the absent intended member as an intentional optional omission. The supplied guidance supports the validation possibility, not that downstream inference or any operational response.

The corrective policy is bounded: retain the rejected payload for diagnosis, keep absence distinct from explicit null, reject unknown names at the stable core boundary, and accept approved change only within the designated extension object. Route the review to the named contract owner, who can decide whether the producer must correct a typo, whether a new extension field is appropriate, or whether a future core migration is justified.

Set ownership and limits

Write down who owns the stable core, who approves extension names and value rules, and how long a migration remains supported. An alternative is to keep the entire object open, but then consumers need compensating controls for unknown names and must not equate silence with intentional omission.

This article is limited to the supplied JSON Schema object and null excerpts. It does not establish behavior for a particular implementation, define a migration period, or prescribe a schema-composition layout. Validate the selected dialect and validator, then document the application decisions that the schema alone cannot make.