## Purpose Defines how the event graph carries application-defined payloads: a content type tag byte that separates RLN payloads from application payloads in the static DAG, and a leading tag byte that discriminates darkirc rotating-DAG content types without trial deserialization, while leaving RLN semantics unchanged. ## ADDED Requirements ### Requirement: Static-DAG content discrimination by tag byte Static-DAG event content SHALL be discriminated by its first byte. Content whose encoding begins with an RLN payload (first byte `0x00` or `0x01`, matching the two RLN node variant encodings) MUST be processed by the existing RLN admission pipeline with unchanged semantics. Any other first byte identifies an application payload. #### Scenario: RLN registration still admitted - **WHEN** a node receives a static event containing an RLN registration or slash in the existing encoding - **THEN** the event is verified, committed, and relayed exactly as before this change, and the RLN identity state is updated accordingly #### Scenario: Application payload never touches RLN state - **WHEN** a node receives a static event whose content tag identifies an application payload - **THEN** the event is admitted or rejected by application-payload rules and the RLN identity tree, identity state, and historical roots are not modified ### Requirement: Application payload admission to the static DAG A static event carrying an application payload SHALL be admitted when it passes the existing structural validation for static events (non-empty content, content hash matching the header, well-formed parents, parents present in the static DAG) and its content length is within a defined bound. Admission MUST NOT depend on RLN being enabled or disabled: both modes apply the same structural rules. Semantic validity (e.g. signatures, chain links) is resolved by the consuming application after admission, not at admission time. #### Scenario: Admitted on an RLN-enabled node - **WHEN** a structurally valid, correctly tagged application payload arrives at a node with RLN enabled - **THEN** the event is stored in the static DAG and relayed to peers #### Scenario: Admitted on an RLN-disabled node - **WHEN** the same payload arrives at a node with RLN disabled - **THEN** the event is stored and relayed under the same structural rules #### Scenario: Oversized payload rejected - **WHEN** an application payload exceeds the defined content bound - **THEN** the event is rejected and not relayed ### Requirement: RLN state rebuild skips application payloads Any rebuild or audit of RLN state from persisted static-DAG events MUST skip application payloads deterministically, producing the same identity tree as a node that never saw them. #### Scenario: Rebuild after mixed history - **WHEN** a node rebuilds RLN state from a static DAG containing both RLN events and application payloads - **THEN** the resulting identity tree and historical roots are identical to a rebuild from the RLN events alone ### Requirement: Unknown or malformed content is skipped without penalty Content that a node cannot interpret — an unknown rotating tag, or an application payload that fails structural parsing — MUST be skipped without striking, banning, or crashing, and without affecting other events in the same batch or relay path. #### Scenario: Unknown rotating tag skipped - **WHEN** a rotating event's first byte is a tag the client does not know - **THEN** the event is skipped and the peer suffers no penalty #### Scenario: Malformed application static payload skipped - **WHEN** an app-tagged static event fails structural parsing - **THEN** the event is skipped and the peer suffers no penalty ### Requirement: Rotating-DAG darkirc content tag byte All darkirc content in rotating DAGs SHALL begin with a tag byte identifying the content type; no untagged form exists. The tag set MUST include Privmsg (with optional signer key and signature fields) and hide action. Relay paths MUST dispatch on the tag byte instead of attempting deserialization of each known type in turn. #### Scenario: Dispatch by tag - **WHEN** a client relays a rotating event whose first byte is a known tag - **THEN** the content is decoded as the type named by the tag without attempting other decodings #### Scenario: Unknown tag skipped - **WHEN** a rotating event's first byte is a tag the client does not know - **THEN** the event is skipped without error propagation ### Requirement: Tag byte must not leak encryption target The tag byte MUST NOT distinguish an encrypted channel message from an encrypted direct message. Identifying the encryption target of an encrypted payload remains a local decryption attempt, so observers of the DAG learn only the content type, never the message category. #### Scenario: Encrypted payloads share one tag - **WHEN** two encrypted messages are published, one to a channel and one as a direct message - **THEN** their event content begins with the same tag byte and an observer cannot distinguish their category from the DAG