research-document
G. SDE / Ordo State Model
G. SDE / Ordo State Model
Follows .sde/method/CONSTRUCTION-METHOD.md (greenfield workflow) and
.sde/architecture/FOUR-TIER-ARCHITECTURE.md. Per §1.3 this is a real state
model, not enums named "state".
G.1 Tier mapping
| SDE tier | Research Publisher vNext |
|---|---|
| 1 — Semantic Model | Artifact, Edge, Relation, StatusReading, ReferenceValue (F) |
| 2 — State Transition / Domain Execution | corpus lifecycle (G.2), artifact lifecycle (G.3), obligation evaluation |
| 3 — Application / Projection / Orchestration | index generation, view projections, URL minting, search-index construction |
| 4 — Host / External Effects | filesystem reads, dist/ writes, GitHub Pages publication, log emission |
Dependency direction is inward: tier 4 may call tier 3, never the reverse. The browser (Limen) consumes tier-3 projections only.
G.2 Corpus states
Chosen to reflect the real process, which has a discovery stage the current engine treats as implicit, and a publishable-with-warnings stage that the corpus genuinely requires (9 dangling references are legitimate).
Unloaded
│ discover
▼
RootsResolved ───(no roots match)──▶ NothingToPublish (terminal, not a failure)
│ parse
▼
Parsed ──────────(any Blocking parse finding)──▶ Unpublishable
│ resolve references
▼
Linked
│ evaluate obligations
▼
Assessed
├── no findings ──────────────▶ Publishable
├── warnings only ────────────▶ PublishableWithWarnings
└── any Blocking obligation ──▶ Unpublishable
│ project
▼
Projected (indexes + pages generated, nothing written yet)
│ emit
▼
Emitted (dist/ written)
│ deploy [external effect]
▼
Published / DeploymentFailed
Invalid states — unrepresentable by construction:
LinkedwithoutParsed(reference resolution needs an artifact set)PublishedfromUnpublishableProjectedwith unresolved blocking obligations- an
EdgewhoseFromis not inCorpus.Artifacts
G.3 Artifact states
Per-artifact, independent of corpus state:
Discovered → Read → FrontMatterSplit → BodyParsed → Typed → Linked → Projected
│ │ │
│ │ └─▶ TypeUnknown (publishable)
│ └─▶ NoFrontMatter (publishable; 1 observed)
└─▶ MalformedFrontMatter (quarantined, reported, not fatal)
An artifact that fails does not fail the corpus. It is quarantined and reported — §28 forbids silently modifying malformed research, and failing the whole build would make one bad file block all publication.
G.4 Capabilities
A capability is available only in the states where it is meaningful:
| Capability | Requires | Notes |
|---|---|---|
Discover |
Unloaded |
config-driven; ROS roots are a hint, not a constraint (D.4) |
Parse |
RootsResolved |
|
ResolveReference |
Parsed |
needs the full artifact set to resolve IDs |
Validate |
Linked |
|
Project |
Publishable | PublishableWithWarnings |
|
Emit |
Projected |
first filesystem write |
Deploy |
Emitted |
external effect |
Navigate / Search / InspectSource |
browser-side, on Published output |
see H |
G.5 Obligations
An obligation is an unmet condition attached to a state. Which obligations block is the key policy decision, and the corpus dictates the answer: almost nothing blocks, because real research is legitimately incomplete.
Blocking
| Obligation | Rationale |
|---|---|
Duplicate ArtifactId |
two artifacts cannot share a URL; currently zero occurrences, so cost is nil |
| Duplicate published URL | same |
| Unreadable source file | cannot publish what cannot be read |
| Output path escapes the output root | path-traversal guard |
| A previously published URL disappears with no redirect | protects D.2 |
Warning — never blocking
| Obligation | Observed count |
|---|---|
| Dangling reference | 9 |
| Bare-filename reference | 6 |
Artifact with no id |
68 of 117 |
| Artifact with no declared type | 49 of 117 lack document_type |
| Orphan (no canonical edges) | large |
researchArea holding a list |
1 |
| Unknown front-matter key | many — informational, never an error |
Explicitly not an obligation
supersedes: null, status: …-pending, status: Open, a REP with no
experiment yet. These are research states, not defects (C.7).
G.6 Policies
| Policy | Value | Source |
|---|---|---|
| Publication inclusion | config globs; ROS registries as a cross-check | D.4 |
| Draft exclusion | drafts: false; frontier tooling already excludes 8 statuses |
B.3 |
| Fabrication | forbidden — absent data stays absent | E.3 |
| Derived-relationship labelling | every derived edge tagged derived: true in output |
§9 |
| Determinism | no wall-clock timestamps inside content-addressed artifacts | D.5 |
G.7 Evidence required for transitions
| Transition | Evidence |
|---|---|
Parsed → Linked |
every reference classified into one ReferenceValue case |
Linked → Assessed |
every obligation evaluated and recorded, including the ones that passed |
Assessed → Projected |
zero blocking obligations, recorded as a signed assessment |
Projected → Emitted |
output manifest with a content hash per file |
Emitted → Published |
deployment receipt (Actions run id) |
G.8 Version checks
- Parser profile: each artifact records which profile parsed it (B.5).
- Output contract version: each emitted index carries
schemaVersion. - Engine version: recorded once in the corpus manifest.
- On reading an artifact declaring a
ros_formatnewer than the engine knows: warn and parse with the newest known profile — do not fail. A future authoring convention must not take the site offline.
G.9 External effects (§13, explicit)
| Effect | Tier | When |
|---|---|---|
| filesystem read of the corpus | 4 | Discover, Parse |
read of ros.json, registries/*.json |
4 | Discover (read-only, D.4) |
write to dist/ |
4 | Emit only — nothing writes earlier |
| GitHub Pages publication | 4 | Deploy |
| log/diagnostic emission | 4 | all states |
No network access during build. No writes outside the configured output root.