Skip to content

Commit 4749646

Browse files
docs(adr): 0004-octad-ontology — concerns octad is canonical (#92)
Closes #19. Two different "octads" lived in the repo: the **modalities octad** (graph/vector/tensor/…) in the README, and the **concerns octad** (data/metadata/provenance/…) in code, manifest, CLI, and ADR-0003. A reader couldn't answer "what does an octad-augmented entity look like?" without picking one. Both had Temporal and Provenance entries with different meanings. ADR-0004 picks the **concerns** octad as canonical: Data · Metadata · Provenance · Lineage · Constraints · AccessControl · Temporal · Simulation Rationale: 1. The codebase has already committed to it across `abi::`, `manifest::`, `codegen::`, `tier1::`, CLI, manifest schema, and ADR-0003's drift categories. Reversing would touch every module. 2. Each concern is a question the system answers ("when did this change?", "who saw this?"). Modalities answer the same questions only obliquely. 3. ADR-0003's drift categories are themselves concerns-shaped — structural/semantic/statistical/referential drift are violations of the *Constraints* concern across modalities. Inverting the relationship makes the catalogue harder to motivate. The modalities octad isn't deleted — it's demoted to Tier 2 *overlays* (`Tier2Config { graph, vector, tensor, semantic, document, spatial }`). Storage shapes you can additionally project into; not the top-level identity. Also updates README's "Eight Modalities" primary table to the concerns octad with explanatory pointer to the ADR. The earlier section's broader rewrite (recasting the eight drift categories as symptoms-of-Constraints-violation) is left to V-L1-A2 (#20). Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent a42cd6c commit 4749646

2 files changed

Lines changed: 144 additions & 13 deletions

File tree

README.adoc

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,27 @@ therefore split into two tiers:
2626
storage alongside your database. These are honest about being "VeriSimDB
2727
with your database as one backend" rather than pretending to be invisible.
2828

29-
== VeriSimDB's Octad: Eight Modalities
29+
== VeriSimDB's Octad: Eight Concerns
3030

31-
Each entity in VeriSimDB exists simultaneously across up to 8 representations:
31+
Each entity in a VeriSimDB-augmented database is enriched along 8
32+
concerns — properties you want to know or enforce about the data,
33+
independent of how it is stored. (Per `docs/decisions/0004-octad-ontology.adoc`.
34+
The earlier "Eight Modalities" framing — graph, vector, tensor, …
35+
— is reframed as a set of *Tier 2 overlays*, not the top-level
36+
identity; see "Tier 2" below.)
3237

33-
[cols="1,2,1,1"]
38+
[cols="1,3,1"]
3439
|===
35-
| Modality | Purpose | Storage | VeriSimiser Tier
36-
37-
| **Graph** | RDF triples and property graph edges | Pure Rust | Tier 2
38-
| **Vector** | Embeddings for similarity search | HNSW | Tier 2
39-
| **Tensor** | Multi-dimensional numeric data | ndarray/Burn | Tier 2
40-
| **Semantic** | Type annotations and CBOR proof blobs | CBOR | Tier 2
41-
| **Document** | Full-text searchable content | Tantivy | Tier 2
42-
| **Temporal** | Version history and time-series | chrono | Tier 1 ✓
43-
| **Provenance** | Origin tracking and transformation chain | SHA-256 hash-chain | Tier 1 ✓
44-
| **Spatial** | Geospatial coordinates and geometries | R-tree | Tier 2
40+
| Concern | What it answers | VeriSimiser Tier
41+
42+
| **Data** | The original rows in your database. | Always on (your DB)
43+
| **Metadata** | Schema and type information. | Always on (introspection)
44+
| **Provenance** | "Who did what, when, and how?" — SHA-256 hash-chained audit. | Tier 1 ✓
45+
| **Lineage** | "Where did this come from?" — DAG of data derivations. | Tier 1 ✓
46+
| **Constraints** | "Does this still hold?" — invariant enforcement across concerns. | Tier 1 ✓
47+
| **AccessControl** | "Who is allowed to see/change this?" — row/column policies. | Tier 1 ✓
48+
| **Temporal** | "What did this look like at time T?" — version history + point-in-time queries. | Tier 1 ✓
49+
| **Simulation** | "What if we changed this?" — sandbox branches that do not touch the main data. | Tier 2
4550
|===
4651

4752
== Tier 1: True Piggybacks
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
= Architecture Decision Record: 0004-octad-ontology
2+
<!-- SPDX-License-Identifier: PMPL-1.0-or-later -->
3+
<!-- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk> -->
4+
5+
# 4. Canonical octad: concerns, not modalities
6+
7+
Date: 2026-05-14
8+
9+
## Status
10+
11+
Accepted
12+
13+
## Context
14+
15+
Two different "octads" lived in the repo under the same name.
16+
17+
**Modalities octad** (`README.adoc` §"VeriSimDB's Octad: Eight
18+
Modalities"): Graph · Vector · Tensor · Semantic · Document ·
19+
Temporal · Provenance · Spatial. These are *representations*
20+
shapes that the same entity is materialised in.
21+
22+
**Concerns octad** (`src/abi/mod.rs::OctadDimension`,
23+
`src/manifest/mod.rs::OctadConfig`, `src/main.rs::print_octad`):
24+
Data · Metadata · Provenance · Lineage · Constraints ·
25+
AccessControl · Temporal · Simulation. These are *aspects*
26+
properties of the entity you want to know or enforce.
27+
28+
Both ontologies have a Temporal and a Provenance entry but with
29+
different meanings; a reader could not tell which was meant
30+
without context. Tier 2 module names (`graph`, `vector`,
31+
`tensor`, …) reach for the modalities octad; the CLI's
32+
`octad` subcommand, the manifest's `[octad]` section, and
33+
ADR-0003's eight drift categories reach for the concerns octad.
34+
The two ontologies were interleaved but never reconciled.
35+
36+
## Decision
37+
38+
**The concerns octad is canonical.** Data · Metadata ·
39+
Provenance · Lineage · Constraints · AccessControl · Temporal ·
40+
Simulation is what verisimiser's top-level identity is. Every
41+
manifest field, CLI subcommand, public type, and ADR-0003 drift
42+
category refers to *this* octad.
43+
44+
The modalities octad is demoted to **Tier 2 overlays**: graph,
45+
vector, tensor, semantic, document, spatial are storage shapes
46+
the user *can additionally project an entity into*, gated by
47+
`Tier2Config`. They are not the top-level model.
48+
49+
### Alternative considered
50+
51+
Promote the modalities octad and rewrite `abi::OctadDimension`,
52+
the manifest fields, `print_octad`, and integration tests to
53+
enumerate Graph · Vector · Tensor · Semantic · Document ·
54+
Temporal · Provenance · Spatial. Filed as the hypothetical
55+
V-L1-A3.
56+
57+
This was rejected because:
58+
59+
1. The codebase has already committed to the concerns octad
60+
across `abi::`, `manifest::`, `codegen::`, `tier1::`,
61+
CLI, manifest schema, and ADR-0003. Reversing would touch
62+
every module.
63+
2. The concerns framing scales: each octad entry is a question
64+
("when did this change?", "who saw this?", "what derived
65+
from this?"). The modalities framing answers the same
66+
questions only obliquely.
67+
3. The drift categories defined in ADR-0003 are themselves
68+
concerns-shaped — Structural, Semantic, Statistical,
69+
Referential drift are violations of the *Constraints*
70+
concern across modalities. Inverting the relationship makes
71+
the drift catalogue harder to motivate, not easier.
72+
73+
The honest case for modalities-as-top-level: it matches the
74+
upstream VeriSimDB framing (per the README link), and "your
75+
table is also a graph index" sells more easily to a database
76+
engineer than "your table also has a Lineage concern." That
77+
argument loses to the implementation reality above.
78+
79+
## Consequences
80+
81+
### Positive
82+
83+
* One octad in the public-API surface, no ambiguity. Any future
84+
field added to manifest/CLI/codegen knows where it belongs.
85+
* `[octad]` manifest section, `verisimiser octad` subcommand,
86+
`OctadDimension` enum, `OctadConfig` struct, ADR-0003 drift
87+
categories, V-L1-B1 threat-model citations, and `[retention]`
88+
per-dimension config (V-L2-P1) all refer to the same thing.
89+
* `Tier2Config` (with `graph/vector/tensor/semantic/document/
90+
spatial` flags) is now unambiguously about *overlays*, not
91+
about top-level identity.
92+
93+
### Negative
94+
95+
* The README's prominent "VeriSimDB's Octad: Eight Modalities"
96+
section is misleading and must be rewritten under V-L1-A2
97+
(issue #20). The section currently presupposes the rejected
98+
ontology, which is the second-worst place a reader can land.
99+
* Anyone who learned verisimiser via the modalities framing has
100+
to relearn it. Cross-reference text in the rewritten README
101+
needs to explain why modalities are demoted to Tier 2.
102+
103+
### Neutral
104+
105+
* `Tier2Config` exists already and is internally consistent;
106+
this ADR just relabels the conceptual frame, not the code.
107+
* The modalities octad isn't deleted from the world — it stays
108+
alive as Tier 2 overlays, just with a clearer scope.
109+
110+
## Follow-ups
111+
112+
* **V-L1-A2 (issue #20)** unblocked: rewrite the README around
113+
the concerns octad; recast the eight drift categories as
114+
symptoms-of-Constraints-violation across modalities.
115+
* **V-L1-A3** (hypothetical, never filed because modalities lost)
116+
is closed by construction.
117+
* `src/main.rs::dimension_description` already aligns with this
118+
ADR; no code change is required as part of this ADR.
119+
120+
## Cross-references
121+
122+
* ADR-0001 — adopts RSR template (predates this decision).
123+
* ADR-0003 — drift categories (built on the concerns octad).
124+
* V-L1-B1 — provenance threat model (cites concerns octad).
125+
* `src/abi/mod.rs::OctadDimension` — canonical enum.
126+
* `src/manifest/mod.rs::OctadConfig` — manifest mapping.

0 commit comments

Comments
 (0)