Foundation Specifications
This page is normative
This page is considered a core part of the Vultron Protocol. This is a normative section of the documentation.
Rules Vultron inherits from the standards beneath it: ActivityStreams 2.0, ActivityPub, and HTTP.
They cover addressing and delivery, HTTP status codes, and rules that only restate ActivityStreams, such as every object ID being an IRI.
Each requirement carries a tag that names its standard: as2, activitypub, or http.
Where Vultron requires one form among several that a standard allows, the rule is a Protocol requirement, not a foundation one.
An implementer reads this page together with the Protocol page.
Behavioral Specifications
The following specifications define Event-Condition-Action (ECA) behavioral requirements with typed preconditions, ordered steps, and postconditions.
Actor Knowledge Model
Defines the Actor Knowledge Model: a Vultron Actor's knowledge of the world is strictly bounded by the ActivityStreams 2.0 activities it has received. Actors must not assume recipients hold objects that were not explicitly included in prior activities; DataLayer access is private and non-shareable, and all inter-Actor communication occurs exclusively through the AS2 wire protocol.
File ID: AKM
Actor Addressing and Discovery
Agentic Readiness
Requirements for API and CLI design that enable reliable interaction by automated agents and AI systems. Covers machine-parseable interfaces, structured response formats, and observable behavior that supports agentic workflows.
File ID: AR
Actor Discovery Profile
Code Style Specifications
Defines code formatting, import organization, and coding style standards for Python code in the Vultron project.
File ID: CS
Datetime and Timezone Conventions
| ID | Priority | Requirement | Related |
|---|---|---|---|
CS-13-006 |
MUST | Wire-format datetime fields MUST serialize as RFC 3339 date-times with an explicit offset; a naive or offset-free value MUST NOT reach the wire. ActivityStreams 2.0 requires every date-time value to follow RFC 3339's date-time form, whose offset is mandatory. An explicit offset is what makes timestamps comparable as instants. Split from CS-13-005 (MS-12-010), which keeps Vultron's rules on which offset a timestamp carries. |
Constrains: CS-13-005 — split from it (MS-12-010); CS-13-005 picks which offset, within this rule |
HTTP Protocol Requirements
HTTP protocol requirements for the Vultron API, covering status codes, headers, and content negotiation.
File ID: HTTP
Content-Type Validation
HTTP Status Codes
The status codes HTTP itself defines for each outcome, which Vultron inherits (foundation, http). Where HTTP leaves the choice open, as with 422 for a schema failure, the code is this codebase's choice and the spec is project.
Idempotency
Requirements for handling duplicate activity submissions gracefully, ensuring repeated identical requests produce the same outcome without unintended side effects.
File ID: ID
Activity ID Uniqueness
Inbox Endpoint
The inbox endpoint is the primary entry point for actor-to-actor communication in Vultron. It receives ActivityStreams activities via HTTP POST, validates them, and queues them for asynchronous processing.
File ID: IE
Endpoint Configuration
| ID | Priority | Requirement | Related |
|---|---|---|---|
IE-02-001 |
MUST | The endpoint URL MUST be discoverable from actor profile ActivityPub requires every actor object to carry its inbox property, so a peer finds the endpoint from the profile rather than by a URL convention, which also leaves each deployment free to place it. |
|
IE-02-002 |
MUST | The endpoint MUST accept activities delivered to it by HTTP POST. ActivityPub delivers an activity to an inbox by HTTP POST. Vultron inherits the rule. That POST is the only method the inbox serves is this codebase's choice (IE-02-005). |
|
IE-02-003 |
MUST | The endpoint MUST reject non-POST requests with HTTP 405 The inbox is a delivery target, not a mailbox other actors may read: ActivityPub grants an inbox read only to the actor's own authenticated owner, and Vultron has no authentication, so a GET here would open another actor's mail. The 405 covers both trailing-slash forms, and it does not fall out of having no GET route: the profile route is a path catch-all ( /{actor_id:path}) that answers 404 to an unrouted GET, so the inbox path needs its own method refusal declared ahead of it. |
Depends on: HTTP-03-001 |
Request Handling
| ID | Priority | Requirement | Related |
|---|---|---|---|
IE-03-001 |
MUST | The endpoint MUST validate Content-Type header | Depends on: HTTP-01-001 |
IE-03-003 |
MUST | Requests exceeding the maximum request body size MUST be rejected with HTTP 413. Rejecting oversized payloads with an explicit 413 prevents resource exhaustion and signals the limit violation to the sender. |
Refines: IE-03-002 Depends on: HTTP-02-001 — HTTP-02-001's default limit decides when this 413 applies; HTTP-02-001 keeps only the limit, and the 413 answer stays here (MS-12-010) |
Error Responses
| ID | Priority | Requirement | Related |
|---|---|---|---|
IE-07-001 |
MUST | The endpoint MUST answer with the status code HTTP defines for each transport failure: HTTP 400 for a malformed request, HTTP 405 for a method other than POST, and HTTP 413 for a request body over the size limit. | Depends on: HTTP-03-001 |
Message Validation
Requirements for validating ActivityStreams 2.0 activities at the inbox handler boundary, covering ActivityStreams structure and semantic validation. Invalid activities are rejected with appropriate error responses before dispatch.
File ID: MV
Activity Structure Validation
| ID | Priority | Requirement | Related |
|---|---|---|---|
MV-01-001 |
MUST | Incoming payloads MUST conform to ActivityStreams 2.0 structure |
URI Validation
Object ID
Requirements for the format and handling of object identifiers throughout the Vultron system. Establishes full-URI IDs as the canonical form for all ActivityStreams objects and DataLayer records.
File ID: OID
ID Format
| ID | Priority | Requirement | Related |
|---|---|---|---|
OID-01-001 |
MUST | All ActivityStreams object IDs MUST use full URI form ActivityPub requires every object it distributes to carry a publicly dereferenceable URI as its identifier, which a relative or bare identifier is not. ActivityStreams 2.0 alone only says relative references SHOULD NOT be used. Vultron inherits the ActivityPub rule. |
Implements: VP-16-002 Implements: VP-16-003 |
OID-01-002 |
MUST | IDs MUST be unique within the issuing actor's deployment; cross-deployment uniqueness is achieved by requiring full URI form (OID-01-001) with a deployment-controlled authority component. Restates ActivityPub's identifier rule: an object's URI has an authority belonging to the server that originated it, so that server keeps it unique and uniqueness across deployments follows from the full URI form. |
Outbox
Requirements for actor outboxes, which hold response activities generated by handlers. Covers outbox structure, population, delivery, local and federated dispatch, idempotency, outbound reference dehydration, and outbox addressing rules.
File ID: OX
Outbox Population
| ID | Priority | Requirement | Related |
|---|---|---|---|
OX-02-002 |
MUST | Each outbox activity MUST conform to ActivityStreams 2.0 structure |
Outbox Delivery
Response Format
The Vultron protocol uses ActivityStreams activities for both requests and responses. When handlers process inbound activities, they generate response activities (Accept, Reject, Update, etc.) sent to the originating actor or other participants.
File ID: RF
Response Activity Structure
| ID | Priority | Requirement | Related |
|---|---|---|---|
RF-01-001 |
MUST | Response activities MUST conform to ActivityStreams 2.0 |
Response Delivery
Semantic Extraction
The inbox handler extracts semantic meaning from ActivityStreams activities by matching activity type and object type patterns. This semantic type determines which handler function processes the activity.
File ID: SE
Pattern Matching
| ID | Priority | Requirement | Related |
|---|---|---|---|
SE-01-002 |
MUST | A receiver MUST cope with an object given either inline or as a URI reference, as ActivityStreams 2.0 allows. |
Vocabulary Model
Requirements governing how ActivityStreams 2.0 vocabulary types are defined, registered, configured, and deserialized in the Vultron wire layer. The vocabulary model is the foundation of the inbound pipeline: every activity must be deserialized into a known vocabulary type before semantic extraction can assign it a domain meaning.
File ID: VM
Serialization Rules
| ID | Priority | Requirement | Related |
|---|---|---|---|
VM-07-002 |
MUST | Serialized messages MUST use the ActivityStreams 2.0 property names, which are camelCase, never another spelling such as Python snake_case field names. |