Context
Every BSFG fact is anchored by a subject. Subject identity must be stable across replay, compact enough to live comfortably in message metadata, and flexible enough to represent both single-site and multi-site deployments.
The subject grammar must also avoid collapsing distinct concerns into one token. In particular:
- subject identity should describe what the fact is about
- zone routing should remain in envelope fields such as
from_zoneandto_zone - policy treatment should remain in
labels - business meaning beyond identity should remain in
predicateandobject_json
Options Considered
| Option | Description | Benefits | Drawbacks |
|---|---|---|---|
| Opaque UUID only | Use a globally unique identifier with no kind prefix or readable structure. |
- simple uniqueness model
- easy to generate mechanically
|
- poor readability
- weak partitioning ergonomics
- kind must be carried somewhere else anyway
| | Hierarchical path with mandatory full scope | Encode full site, area, line, and object path inside the subject string. |
- high descriptive power
- can reflect physical structure
|
- brittle when topology changes
- subjects become long and policy-laden
- identity is coupled to mutable organization
|
| Kind plus opaque ID only | Always use kind:id with no scope capability. |
- simple and compact
- readable
|
- insufficient for multi-site collisions
- forces external disambiguation everywhere
|
| Kind with optional scope (Selected) | Use kind:id by default, with optional kind:scope/id where multi-site or namespace disambiguation is required. |
- compact default
- multi-site safe when needed
- keeps scope separate from zone routing
- supports stable partitioning by kind
|
- requires naming discipline
- scope vocabulary must remain governed but loosely interpreted
|
Decision
BSFG subject identity uses the following grammar:
kind:id
kind:scope/id
Rules:
kindis a stable, lower-case domain noun such asbatch,asset,lot,recipe, ordocumentidis an opaque producer-owned identifierscopeis optional and used only when disambiguation across sites or namespaces is required- BSFG treats
scopeas a namespace component, not as transport routing metadata
Examples:
batch:B1042
asset:FILLER-07
batch:PlantA/B1042
asset:PlantB/FILLER-07
lot:PlantA/RM-8821
document:QMS/SOP-123.v4
Subjects must not absorb unrelated concerns such as priority, retention, network lane, or approval state. Those belong elsewhere in the model.
Consequences
Benefits:
- subjects stay compact and readable
- single-site deployments are not forced into unnecessary ceremony
- multi-site deployments can disambiguate safely when needed
- partitioning by kind remains straightforward
Tradeoffs:
- scope usage must be governed consistently across producers
- the same business entity must not appear under conflicting subject conventions
- downstream consumers must not infer too much semantics from scope text alone