jonnify·bcs /bcs/ideas/system-substrate/ownership-on-the-beam

B1.1 · dive — ownership on the BEAM

The VM holds the boundary.

Ownership is a process property: the table is :private, created in init, its identifier never returned from any call. The BEAM refuses outside reads at the VM layer — the same mechanism that enforces memory safety.

Source: content/bcs1.1.md · How (Elixir, as built) and Decisions. Surfaces verified in lib/echo_data/bcs/property_store.ex; the table is created as :ets.new(:bcs_props, [:ordered_set, :private]).

Who reaches the table. Four attempts; the readout reports the recorded outcome.
owner process EchoData.Bcs.PropertyStore :bcs_props :ordered_set, :private outside process no table identifier lookup / insert × ArgumentError info metadata returned: protection: :private
readout · Select an attempt. Static outcomes, per the transcript's G1: outside lookup and insert refuse with ArgumentError; outside info returns full metadata — protection: :private included.
§1

The private table

content/bcs1.1.md · How + Decisions

The table is created in init as :ordered_set, :private; its identifier never leaves the process. There is no API surface to bypass — outside reads are refused by the virtual machine itself, which is the same mechanism that enforces memory safety on the BEAM.

bcs_rung_1_1_check.out · the G1 line, verbatimfrozen
G1 reach-through ok -- outside lookup -> ArgumentError, insert -> ArgumentError; info reports protection: :private (metadata visible, data refused)

The recorded correction: the draft expected :ets.info on a private table to refuse outsiders alongside lookup; the platform returned full metadata — protection: :private included — to a process that cannot read one row. The spec was amended first, the gate rewritten as a positive assertion, and the clause came out sharper: a system's state is unreachable from outside; a system's existence is nobody's secret. The BEAM guards data, not existence, and hiding metadata would cost supervisors and telemetry their visibility for nothing.

§2

Order without a clock

content/bcs1.1.md · How

Ordering costs nothing: :ordered_set sorts by Erlang term order, binaries compare bytewise, and byte order on branded ids is mint order. page_desc is a prev walk from :ets.last — no clock anywhere in the process. The G4 line, verbatim: page_desc(2000) == byte-sort desc over 2000 minted ids; store holds no clock.

Byte order is mint order. Six BRL ids, minted in sequence by the contract's minter for this page. Run either operation; the readout shows the computed list.
…PRv5VY …UBQK0G …Yw3x1E …dnnYHo …iWjaWO …nH5cPI :ets.last ← prev ← prev ← prev ← prev ← prev — the page_desc walk, newest first
readout · The fixed dataset, oldest first: BRL0NtMkPRv5VY · BRL0NtMkUBQK0G · BRL0NtMkYw3x1E · BRL0NtMkdnnYHo · BRL0NtMkiWjaWO · BRL0NtMknH5cPI. Run an operation to compare byte order with mint order.

The store performs no timestamp comparison and stores no timestamp column — the chronology is carried inside the key, and the table's own comparison order reads it back out.

§3

The init gate, and no second parser

content/bcs1.1.md · How + Decisions

init runs the canon's self_check! and aborts on mismatch — a store that cannot prove its codec refuses to start:

bcs_rung_1_1_check.out · the G6 line, verbatimfrozen
G6 canon ok -- self_check! -> {:ok, :native} (init gates on the same check)

And the gate adds no second parser: BrandedId.parse/1 returns {:ok, ns, snow} or :error, so classification beyond the namespace collapses to :invalid by design. The rung refused to reimplement parsing to refine the taxonomy. If the taxonomy ever sharpens on the BEAM, it sharpens in BrandedId, once.

§4

References

sources · related

Sources

Related