Strata¶
Submissions as immutable layers
Tier: Record ยท Requirement module: Submission Portal ยท Status: ๐ก Designed
Purpose¶
Strata holds what firms filed. Every submission is a layer: immutable once submitted, addressable forever, and never overwritten by an amendment or a resubmission. The name is the model โ layers of record laid down in order, readable in cross-section.
This engine makes the second law true.
Scope¶
| Capability | Status | Notes |
|---|---|---|
| Draft return | ๐ก | Mutable until submitted; pinned to a template version |
| Import from Excel/CSV | โฌ | Maps to template fields and rejects on mismatch โ never coerces |
| Pre-submission validation | ๐ก | Same Assay rules the supervisor will run |
| Internal maker-checker | ๐ก | Certifier must differ from preparer, enforced at the API |
| Certification declaration | โ | Electronic declaration recorded with actor and timestamp |
| Submit to supervisor | ๐ก | Freezes the version, seals it, emits the event |
| Resubmit with response | โ | New version; the prior version and the query it answers both persist |
| Submission receipt | โฌ | Signed PDF with the submission hash โ the firm's proof of filing |
| Version comparison | ๐ก | Field-level diff between any two versions |
The version model¶
obligation: R02 ยท licence 873390 ยท Q2 2026
โ
โโโ v1.0 submitted 2026-08-11 ยท certified T. Ncube ยท sealed
โ โโโ rejected 2026-08-12 ยท reason cited ยท M. Okonjo
โ
โโโ v1.1 submitted 2026-08-19 ยท amendment responding to Q-1
โ โโโ accepted 2026-08-21 ยท M. Okonjo โโโ current
โ
โโโ current pointer โโโบ v1.1
Rules of the model:
- A draft is mutable and belongs to the firm. It is not a version.
- Submission freezes the document, assigns a version, and seals it. From that moment it is immutable.
- An amendment is a new version against the same obligation, always carrying a reason and, where it answers one, the query reference.
- The current pointer identifies the operative version. Moving it is itself a sealed event.
- Deleting a version is not implementable. There is no endpoint and no code path.
Storage shape¶
A submission document is jsonb keyed by template field id, validated against its template
version on write. The argument for this shape โ and the alternatives rejected โ is set out in the
stack.
{
"obligationId": "OBL-873390-R02-2026Q2",
"version": "1.1",
"templateCode": "R02",
"templateVersion": "2.4",
"submittedAt": "2026-08-19T14:22:00Z",
"preparedBy": "user:j.moyo",
"certifiedBy": "user:t.ncube",
"amendmentOf": "1.0",
"respondsTo": "Q-1",
"values": {
"R02-X01": 512760000,
"R02-X03": 192787505,
"R02-X08": 0.83
},
"documentHash": "sha256:9f2cโฆ"
}
Values for derived fields are rejected, not ignored. A document that tries to supply
R02-X07 fails conformance and the submission does not happen.
Owns¶
- Drafts, submissions, and their versions
- The current-version pointer per obligation
- Certification records (preparer, certifier, declaration, board approval date)
- Attachment references and checksums
- Version diffs
Does not own¶
- Validation results โ Assay produces them; Strata stores the reference
- Review decisions โ Bench
- The audit chain โ Seal
- Obligation state โ Cadence, which Strata notifies by event
Open questions¶
- Draft template migration. A draft pinned to v2.3 when v2.4 takes effect: the firm sees a diff and accepts the migration. Unresolved whether a supervisor can force it mid-period, and what happens to values in fields the new version removed.
- Partial submission. Large returns filed section by section over days. Currently out of scope โ a submission is atomic โ but firms filing R19 daily trading data may need streaming instead.
Related¶
- Assay โ validates on write
- Bench โ decides on what Strata holds
- Submission lifecycle โ the whole flow end to end