SeamCapabilities
A fabric's declared behaviour against the us.tractat.kuilt.core.Seam contract.
Not every fabric can honor every corner of the contract — a plaintext fabric isn't encrypted on the wire, and a relay-only fabric never delivers peer-to-peer. Rather than let each conformance test carry its own bespoke @Ignore, a fabric declares one SeamCapabilities value and the shared suite consults it to skip only the specific assertions that don't apply — everything else still runs.
The nine flags cover the historical @Ignore escape hatches (terminatesIncomingOnClose, staysTornAfterClose, throwsOnSendToTorn) — WebRTC #335 and Multipeer/Gossip #1390, both since fixed — that motivated making capabilities explicit, so a future fabric with a real gap in one of those dimensions can declare it without inventing a bespoke @Ignore, plus the remaining dimensions (reportsPeerLoss, supportsSendTo, securesTransport, meshDelivery, reportsLiveCapability, collapsesPeersOnTear) fabrics already vary on.
Two kinds of flag, and the one that was neither (#2304)
Publishing a value here subscribes the fabric to every suite case selected on it, so a flag earns its place only if some property reads it. Two shapes qualify:
a gated obligation — a property early-returns on
false, and the shortfall is made loud by SeamConformanceSuite.everyFalseCapabilityDeclaresAGap demanding a tracking URL. All of terminatesIncomingOnClose, staysTornAfterClose, throwsOnSendToTorn, supportsSendTo, reportsPeerLoss and collapsesPeersOnTear are this;a selector — the flag picks which assertion applies and never skips (reportsLiveCapability).
ordersDelivery ("FIFO to a single collector") was neither, and was deleted here. No property read it, while the obligation it named — SeamConformanceSuite.incomingPreservesSendOrderToSingleCollector — sat in the ungated core block, whose defining guarantee (pinned by SeamConformanceUngatedCoreTest's hostile harness, which made reading capabilities() throw) is that no flag can suppress it. So the one value the flag existed to express was unreachable: a fabric declaring ordersDelivery = false and supplying a gap URL — the whole documented workflow for a shortfall — was still held to the order property and still failed, while paying the permanently-open-issue toll for the privilege. Of #2304's two options (delete the flag, or move ordering out of core and gate it), deletion is the one that keeps a decision already made: ordering is a contract property of us.tractat.kuilt.core.Seam.incoming, not a transport-shaped limitation a fabric may honestly lack, no in-tree fabric declared it false, and the core/ungated split is deliberate and meta-tested. A fabric that reorders frames is non-conforming, full stop.
Nothing was lost with the flag, and that is enforced rather than argued. The order obligation is unchanged and still runs on every subclass; what the deletion removed was a declaration no property consulted. The receipt is a mutation: adding a bare capabilities() call to SeamConformanceSuite.runIncomingPreservesSendOrder reds SeamConformanceUngatedCoreTest.coreObligationsNeverReadCapabilities, whose harness makes reading the flags throw. So a future edit cannot quietly re-gate ordering on anything — which is also why re-adding this flag would land back in the same contradiction.
securesTransport is a third shape and is documented as such on its own declaration: a standing declaration no property can read, because the suite has no wire tap.
Properties
A us.tractat.kuilt.core.SeamState.Torn seam's us.tractat.kuilt.core.Seam.peers is exactly { selfId } — the collapse obligation stated on Seam.peers (#1816).
Peer-to-peer delivery with no relay hop.
us.tractat.kuilt.core.Seam.capability is driven by a live OS path observer, so its us.tractat.kuilt.core.FabricAvailability tracks the device's real reachability.
Peer-drop reflected in peers/state — a peer that leaves the session must stop being advertised as reachable by the peers that stay.
Encrypted on the wire (honest — see the fabric's own TLS-PSK threat model).
us.tractat.kuilt.core.SeamState.Torn is terminal under churn (hatch 2).
Directed send DELIVERS; an absent peer throws us.tractat.kuilt.core.PeerNotConnected.
incoming completes when the seam goes us.tractat.kuilt.core.SeamState.Torn (was WebRTC's hatch, #335, since fixed).
Sending on a us.tractat.kuilt.core.SeamState.Torn seam throws (was Multipeer/Gossip's hatch, #1390, since fixed).