research-document
D. Compatibility Report
D. Compatibility Report
What must keep working, what may change, and what the change costs.
D.1 Corpus compatibility — can existing ROS research be used unchanged?
Answer: yes, and it must be.
OBSERVED: every construct in the corpus is machine-readable today; the current engine simply declines to read most of it. Nothing in the corpus is malformed in a way that requires editing:
- 117 authored docs: 116 have YAML front matter, 1 does not (archived duplicate)
- 49/49 authored IDs unique; 520/520 frontier IDs unique; zero collisions
- 878 canonical relationship instances resolve
- 9 dangling references — legitimate research states, to be warned not fixed
The required change is entirely in the parser, per §1.2. Specifically vNext must read, without any file edits:
| Must read | Because |
|---|---|
document_type and artifactType |
49 vs 4 files |
both - and _ casings of every type value |
experiment_report and experiment-report both exist |
related_documents and relatedDocuments |
23 vs 1 files |
| file-relative and repo-root-relative paths | 18 vs 22 values |
| free-text values in link fields, as non-links | 8 values |
research_area and researchArea |
6 vs 8 files |
superseded_by, source_rep, evidence_level, author_agent, related_projects |
currently discarded |
date / created / updated as alternates |
three competing keys, 38 files each |
abstract and summary |
26 vs 19 files |
absent id |
68 of 117 authored docs |
| absent front matter | 1 file |
Target: zero manual migrations. Any valid existing artifact that vNext cannot represent is a design defect (§1.2).
D.2 URL compatibility
OBSERVED current scheme:
/research/<slug>/ ~700 pages
/collections/<facet>/<value>/ 175 pages
The uncomfortable finding
slug = slugify(id ? ${id}-${title} : title).
For the 68 of 117 authored documents with no id, the URL is a function of
the title. These URLs are already unstable: any retitling silently breaks
them, and has presumably done so historically.
INFERENCE: "preserve existing URLs" is therefore a weaker obligation than it first appears. There is no guarantee that today's URLs match yesterday's for the majority of documents.
Proposed compatibility posture
| Class | Count | Posture |
|---|---|---|
| ID-bearing documents | 49 authored + 520 frontier | Preserve exactly. These slugs are ${id}-${title} derived but ID-anchored; keep a permanent alias. |
| Title-derived documents | 68 authored | Preserve current slug as a redirect, but mint a new stable, path-derived URL as canonical. |
| Collection pages | 175 | Preserve /collections/<facet>/<value>/. Cheap to keep, and they are the only working navigation today. |
Emit a redirects.json (and GitHub Pages-compatible HTML redirect stubs)
mapping every currently published URL to its vNext canonical URL. Build should
fail if a previously published URL disappears without a redirect entry
(see L, regression tests).
D.3 Machine-readable contract compatibility
OBSERVED current published contracts:
| Artifact | Version | Consumers known |
|---|---|---|
data/research-catalog.json |
schemaVersion: 1.1 |
the Astro site; "future external consumers" per the architecture doc |
data/research-graph.json |
schemaVersion: 1.0 |
site graph feature |
data/research-collections.json |
— | site |
data/build-diagnostics.json |
schemaVersion: 1.0 |
CI |
research/frontier/frontier-index.json |
— | frontier tooling |
research/frontier/frontier-graph.json |
— | frontier tooling |
INFERENCE: no external consumer is demonstrable from the repositories inspected. The architecture document (Hypothesis 6) asserts the catalog is "a first-class artifact and should remain versioned", which is a stated intent rather than an observed dependency.
PROPOSAL: keep emitting research-catalog.json at schemaVersion: 1.1
with its current record shape for one release as a compatibility shim, while
publishing the new bounded contracts (see K) alongside. Retire it only after a
release in which nothing reports breakage.
Note the defect to not carry forward: the current catalog inlines 4.0 MB of rendered HTML into a 6.3 MB metadata file. The vNext contract must separate metadata from content.
D.4 ROS contract compatibility
DOCUMENTED ROS RULE: ROS owns ros.json, registries/, .ros/,
schemas/, and the work protocol. The publisher must not write into any of
them.
OBSERVED: the current publisher does not read ROS at all — no registry, no
ros.json, no .ros/. vNext should read ros.json (for canonicalRoots
and project identity) and the registries (as an authoritative artifact list),
but must remain read-only with respect to ROS state.
OBSERVED constraint: the VE research corpus lives under content/projects/**,
which is outside the canonical roots ROS declares in research-publisher's
own ros.json (research/journals, research/packages, research/theories,
research/evidence). vNext cannot assume ROS canonical roots locate the
corpus; discovery must stay configuration-driven.
D.5 Build and deployment compatibility
OBSERVED: GitHub Actions → GitHub Pages; dist/ committed to the
repository (1,776 tracked files).
Constraints vNext inherits:
- Static hosting only; no server-side request handling.
- GitHub Pages serves
/path/→/path/index.html; no rewrite rules, so client-side routing needs a 404 fallback (one already exists:dist/404.html). - A committed
dist/means build output diffs land in review. vNext should keep output deterministic so diffs are meaningful — the current build stampsgeneratedOn, which the vNext contract should move out of content-addressed files.
D.6 What must remain stable — summary
| Contract | Stability |
|---|---|
| ROS Markdown as canonical source | Absolute. Never written by the publisher. |
/collections/<facet>/<value>/ URLs |
Preserve. |
| ID-anchored document URLs | Preserve, with permanent aliases. |
| Title-derived URLs | Redirect to new stable URLs. |
research-catalog.json v1.1 |
One-release shim, then retire. |
frontier-index.json / frontier-graph.json |
Not the publisher's to change; consume read-only. |
| GitHub Pages static hosting | Preserve. |