Architecture Decision Record

ADR-0021: Predicate Vocabulary Uses Stable Relation Names

Status: Accepted · Date: 2026-03-06

Status: Accepted

Date: 2026-03-06

Context

In BSFG, a fact is represented as:

fact = (subject, predicate, object_json)

The subject identifies what the fact is about. The object carries structured payload. The predicate therefore carries the relationship that the fact asserts.

Predicate design affects:

The architecture needs a predicate style that is stable, compact, and expressive without turning predicates into sentence fragments or domain-specific mini-protocols.

Options Considered

Option Description Benefits Drawbacks
Free-form text predicates Allow arbitrary natural-language predicate phrases.

|

| | Noun-only property names | Use property-style names such as status, owner, or attachment. |

|

| | Predicates embedded into subject | Encode relation meaning inside the subject namespace rather than as a separate predicate field. |

|

| | Stable lower_snake_case relation names (Selected) | Use compact relation names as predicates, organized by meaning rather than by transport mechanics. |

|

|

Decision

BSFG predicates use stable lower_snake_case relation names.

The predicate expresses the relation asserted about the subject, while detailed parameters remain inside object_json.

subject   = batch:PlantA/B1042
predicate = step_completed
object    = { "step": "sterile_filter", "result": "ok" }

Predicates should be concise relation names, not sentence fragments and not encoded summaries of the whole payload.

Predicate families include:

BSFG does not enforce a closed global predicate list, but predicate names must remain stable within a bounded context and should be curated to avoid synonym drift.

Consequences

Benefits:

Tradeoffs: