Every user action creates or updates one signed event family. Files stay files, standards stay standards, and the workflow is the deterministic graph that links them.
Contents
Layer model
The system has four layers. Keeping them separate is the main design rule: a bug in the web client must not change the standards profile, and a file upload must not pretend to be a BCF topic.
| Layer | Owns | Examples | Implementation output |
|---|---|---|---|
| Standards | Versioned semantics | IFC 4.3.2.0, BCF 3.0, IDS 1.0, ISO 19650 | Docs, validators, value lists |
| Files | Binary artifacts | IFC, BCFZIP, snapshot PNG, IDS XML, PDF | kind:1063 file metadata + storage URL |
| Events | Signed workflow records | Project, topic, comment, audit, approval | Nostr events on project relays |
| Interfaces | User interaction | BCF form, thread view, project admin | Browser clients using NIP-07 |
Standards profile -> constrains project extensions and validators Files -> get hash, URL, MIME type, size -> become kind:1063 records Signed events -> link to files through e-tags -> link to project through a-tags -> link to people through p-tags Interfaces -> create, read, validate and render those events
Roles and responsibilities
The process uses two role axes: discipline and authority. Discipline says what a person knows; authority says what they may change.
| Role | Typical authority | Can create | Can approve |
|---|---|---|---|
| Appointing party / client | appointing-party | PIR, approval requests, formal decisions | Published state, phase gate |
| Information manager | info-manager | Project extensions, role mapping, validation rules | Shared gate, CDE export |
| Lead appointed party | lead-appointed | BEP/BAP, coordination topics, model packages | Discipline package release |
| Task team member | appointed | Comments, viewpoints, model file references | Own task output only |
| Reviewer / checker | reviewer | IDS results, BCF comments, issue decisions | Review status, not client publication |
| CDE admin | cde-admin | Relay/storage configuration, export authorization | Technical export, not technical content |
State machine
ISO 19650 gives the container states. BCF gives issue status. The workflow keeps both: container state tells whether an information container may be relied on; BCF status tells what happened to a coordination problem.
| Transition | Required event | Validation gate | Failure mode |
|---|---|---|---|
| WIP to Shared | kind:30970 approval or package release | File hash, schema, required metadata | Package remains WIP |
| Shared to Published | kind:30970 formal approval | Open critical BCF topics, IDS result, signer policy | Publication blocked |
| Published to Archive | Archive manifest | All referenced files reachable and hash-valid | Archive incomplete |
| Published correction | New revision + audit | Reason, affected files, approval chain | No silent overwrite |
End-to-end happy path
This is the theoretical baseline that each implementation slice should follow. If an interface cannot support one step yet, it must not fake it; it should emit the events it can and leave the rest explicit. The same flow is shown with people and payload examples in Alice, Bob, Max.
| Step | User action | Events/files | Checks |
|---|---|---|---|
| 1 | Create project | kind:30902 | Unique d, extension lists present |
| 2 | Add members and roles | Updated 30902, optional NIP-29 events | Each p has discipline + authority |
| 3 | Define requirements | 30880 PIR/EIR, 30810 IDS, 30811 LOIN | Requirement IDs stable, language tags set |
| 4 | Upload model/file | 1063 file metadata, 30904 IFC file reference | Hash, MIME, schema, MVD, discipline |
| 5 | Validate delivery | 1180 IDS validation result | Report hash, result, failed requirements |
| 6 | Create coordination issue | 1063 snapshot, 30901 viewpoint, 30900 topic | BCF GUIDs, IFC GUIDs, status list |
| 7 | Discuss and update | 1170 comments, 1171 audit, replacement 30900 | Status changes never happen without audit |
| 8 | Resolve issue | Replacement 30900, 1171 audit | Assignee, reason and affected model version known |
| 9 | Approve package | 30970 approval | Signer policy, open critical topics, validation status |
| 10 | Export to BCF/CDE/archive | BCFZIP, Documents API upload, archive manifest | Round-trip and hash checks pass |
BCF issue loop
The issue loop is the first workflow to prove because it covers the core architecture: a normal browser can create a standards-compatible coordination object without owning the whole CDE.
create viewpoint -> kind:1063 snapshot file metadata -> kind:30901 immutable viewpoint create topic -> kind:30900 current BCF topic comment -> kind:1170 append-only comment change status / assignee / priority -> kind:1171 audit event -> new kind:30900 with same d-tag close -> kind:1171 audit event -> new kind:30900 status Resolved or Closed
| Rule | Reason | Implementation implication |
|---|---|---|
| Topic current state is replaceable | BCF topics change over time | Query latest 30900 per d |
| Comments are append-only | Authorship must remain visible | Edit means replacement comment, not mutation |
| Viewpoints are immutable | BCF API treats them as frozen context | Any camera/selection change creates new 30901 |
| Status changes need audit | Current state alone is not evidence | UI must create 1171 before or with replacement topic |
| Files are hash-bound | Snapshots and IFC files need integrity | Always create 1063 for binary artifacts |
Approval and publication loop
Publication is not a button that changes a label. It is a signed decision that references the information containers being published.
package selected -> collect IFC file refs, IDS results, unresolved BCF topics preflight check -> no critical open topics -> required IDS checks passed or explicitly waived -> all file hashes available approval -> kind:30970 with signer policy -> optional OpenTimestamps proof publication -> update container state on relevant file/document records -> archive export manifest
| Approval target | References | Minimum metadata |
|---|---|---|
| Model package | 30904 IFC refs, 1180 validations | Stage, discipline, revision, signer policy |
| BCF decision | 30900 topic, 1170 final comment | Decision text, status, responsible signer |
| Phase gate | All package refs in the gate | Target ISO state, target stage, signers |
| External export | Documents API target, BCFZIP, IFC files | Remote CDE, export reason, hashes |
Import/export loops
Interoperability is a hard requirement. The event graph must be able to import and export normal openBIM artifacts without losing meaning.
| Direction | Input | Output | Loss rule |
|---|---|---|---|
| BCFZIP to events | .bcfzip | 30902, 30900, 30901, 1170, 1063 | Unknown BCF extensions go to content JSON |
| Events to BCFZIP | Project event graph | .bcfzip | Nostr-only metadata becomes extension data or export note |
| IFC upload | .ifc | 1063 + 30904 | No model mutation, metadata only |
| IDS validation | 30904 + 30810 | 1180 + report file | Validator must sign tool identity |
| CDE export | Event package | Documents API upload or BCF API calls | Remote IDs stored as tags, not as canonical IDs |
Implementation order
The implementation should follow dependency order, not UI excitement. Each step produces a testable event corpus for the next one.
- Schema constants. Define event kinds, required tags, value lists and JSON content schemas.
- Project admin. Create
30902, members, roles and extension lists. - File records. Create
1063and30904from referenced files. - BCF form. Create minimal
30900topics with valid tags. - Viewpoint support. Add snapshot/file metadata and immutable
30901records. - Thread view. Query topic, comments, audit, viewpoint and snapshot together.
- Status transitions. Add
1171audit plus replacement topic state. - BCFZIP import/export. Prove round-trip with fixture files.
- IDS validation. Attach requirements and results to model packages.
- Approval gate. Add
30970and publication/export preflight.
Acceptance criteria
This is the practical checklist for deciding whether the theory is clear enough to implement.
| Question | Must be answerable from the event graph |
|---|---|
| Who owns this project? | 30902 project event and member p tags |
| Which standards profile applies? | Project extension lists and standards profile links |
| Which model file is being discussed? | 30904 file reference from topic/viewpoint |
| Which IFC elements are affected? | ifc tags and viewpoint component selection |
| What is the current issue status? | Latest 30900 for the topic d |
| Who changed the status and why? | 1171 audit event with signer and reason |
| What was approved? | 30970 references to topics, files and validations |
| Can this leave the system? | BCFZIP export and hash-valid files without hidden state |
Read on
- Alice, Bob, Max — concrete data-sharing story
- BCF to Nostr events — detailed event mapping and examples
- Kind mapping — complete kind registry
- BCF primer — coordination model before event mapping
- ISO 19650 — process states and roles