Contents
3. Document container
The top-level value is a JSON object:
{
"format": "open-loom",
"version": "2.0",
"exportedAt": "2026-07-08T21:14:00Z",
"generator": { "name": "Aspen Grove", "version": "0.9.0" },
"trees": [ /* one or more Tree objects, § 4 */ ],
"agents": { /* optional shared agent registry, § 4.5 */ },
"extensions": {}
}
| Field | Type | Req | Notes |
|---|---|---|---|
format |
string | MUST | Literal "open-loom". Primary detection signal. |
version |
string | MUST | "<major>.<minor>". See § 3.1. |
exportedAt |
timestamp | SHOULD | See § 3.2. |
generator |
object | SHOULD | name + optional version, free-form. |
trees |
Tree[] | MUST | One or more. A single-tree export is a one-element array. |
agents |
map | MAY | Document-level agent registry shared across trees. |
extensions |
object | MAY | § 7. |
3.1 Versioning policy
- Minor bumps add optional fields only. An importer for 2.0 MUST accept any 2.x document, ignoring fields it doesn't know.
- Major bumps may change structure. Importers SHOULD refuse majors they don't understand, with a clear message.
- Exporters MUST write the lowest version that expresses their content.
3.2 Timestamps, IDs, and text
- Timestamps are ISO-8601 strings with timezone (UTC
Zpreferred), millisecond precision allowed:"2026-07-08T21:14:00.123Z". - IDs are opaque non-empty strings, unique within their scope (nodes and edges share a tree-wide scope; trees and agents are document-scoped). ULIDs are RECOMMENDED for new IDs. Importers MUST treat IDs as opaque — no format may be assumed — and MUST remap on collision with local data.
- All text is UTF-8. Node text SHOULD be treated as Markdown-compatible plain text; importers MUST NOT require it to parse as Markdown.
