Skip to content
🚧 Early alpha — building the foundation. See the roadmap →

v0.1.4 — Junction notes + crosswalk edges

Updated

Wire the two non-concept-note Tier 1 shapes — junction notes (evidence links, 13-field schema per Ch 07 synthesis) and crosswalk edges (between two concepts in different ontologies, with STRM predicate vocabulary + SSSOM-shaped envelope) — into the generation engine. After this milestone, the plugin produces complete Tier 1 vaults that capture concepts, evidence, and crosswalks together.

✅ Done (2026-05-05). Recipe schema extended with kind: concept | junction-note | crosswalk-edge on layout entries (default concept, backwards-compatible). render() emits kind discriminator into Address.frontmatter when non-default. New native-recipe entry point generateFromRecipe() + plugin.runImportFromRecipe() runs render() against any Ch 22 recipe, validates against spec/tier1.schema.json pre-write (STRM predicate enforcement happens here), writes spec-conformant Tier 1 output. Three starter recipes shipped: CSF→800-53 crosswalk, ISO 27001→800-53 crosswalk, evidence junction-notes — plus a recipes/starter/README.md documenting that the recipe shape is generic over framework pairs (CIS↔800-53, MITRE↔800-53, CRI↔NIST CSF, etc., all use the same template; only ontology slugs + folder paths change).

Blocks: v0.1.5 needs all three frontmatter shapes for Tier 2 SQL projection; v0.1.7 needs crosswalk edges for STRM TSV / OSCAL exports

In:

  • Junction-note generation as a new code path — non-destructive, git-history-preserving (per Ch 08 audit-trail synthesis)
  • Crosswalk-edge generation when sources have crosswalk columns (e.g., NIST CSFNIST 800-53 mapping spreadsheet from the NIST OLIR registry)
  • STRM predicate vocabulary enforcement (closed enum: is_equivalent_to, is_broader_than, is_narrower_than, is_approximate_to, intersects_with, no_relationship)
  • SSSOM-shaped fields on crosswalk edges (match_type, match_confidence, mapping_justification, mapping_provider, creator_id)
  • Recipe support for junction-note + crosswalk-edge “kinds” — recipe specifies kind: junction-note or kind: crosswalk-edge in its layout (per Ch 22 synthesis)

Out:

  • Junction-note UI (read/write evidence-link form) — that’s a wizard feature; defer to v0.2
  • Auto-suggested crosswalks (LLM-assisted) — community phase
  • Multi-source crosswalk derivation (chain rules) — Tier 2 sidecar concern, v0.1.5+
  • Extend recipe schema (spec/recipe.schema.json) — target.layout[].kind field accepting concept | junction-note | crosswalk-edge (default concept)
  • Extend render() — when kind: junction-note, produce a junction-note Address; when kind: crosswalk-edge, produce a crosswalk-edge Address
  • Junction-note frontmatter writer — emits the 13-field schema; includes subject, predicate, object, coverage, reviewer, review_date, status, confidence, scope, expires_at, notes, tags, _crosswalker
  • Crosswalk-edge frontmatter writer — emits subject_id, predicate_id (STRM enum-validated), object_id, match_type, match_confidence, mapping_justification, mapping_provider, mapping_date, creator_id, review_status, _crosswalker
  • Add a NIST-CSF-to-800-53 starter recipe in recipes/starter/ — produces concept notes for both ontologies + crosswalk edges between them
  • Add a crosswalk fixture CSV to tools/fixtures/synthetic/ — small subset of CSF→800-53 mappings; bun run fixtures:crosswalks (or extend the existing fixtures script)
  • Tests against the new starter recipe + fixture — verify CIDs are stable across runs; verify STRM enum validation rejects bad predicates
  • Running the CSF→800-53 starter recipe produces concept notes for CSF + 800-53 + crosswalk-edge notes between them, all validating against spec/tier1.schema.json
  • STRM predicate vocabulary is enforced — invalid predicate_id rejected at validation
  • Junction notes carry the full 13-field schema with all required fields populated
  • Re-running the recipe produces byte-identical output (deterministic)
  • spec/recipe.schema.json — add kind field to LayoutEntry
  • src/render/mechanisms/file.ts (or new kinds/junction-note.ts, kinds/crosswalk-edge.ts)
  • src/generation/generation-engine.ts — kind-aware dispatch
  • recipes/starter/nist-csf-to-800-53.json (or .yaml) — new starter recipe
  • tools/fixtures/synthetic/csf-800-53-crosswalk.csv — new fixture
  • tests/generation/junction-notes.test.ts — new
  • tests/generation/crosswalk-edges.test.ts — new
  • Recipe kind field — should it default to concept (least surprise) or be required (explicit)? Lean toward default concept
  • Crosswalk edges as separate .md files vs. embedded as wikilinks in concept-note frontmatter — recipe author’s choice, but what’s the v0.1 default?
  • Where to host the starter recipe library — recipes/starter/ at repo root, or move to its own GitHub repo per the marketplace pattern?

Concept pages:

Agent context:

  • v0.1 schema spec — junction_note_frontmatter, crosswalk_edge_frontmatter $defs
  • Vision — open-ecosystem + standards-aligned vocabulary (STRM/SSSOM)
  • Tradeoffs — closed predicate vocabulary vs. open-ended

Design decisions (synthesis logs):

Research deliverables:

Spec & schema files:

Registry references:

Starter recipes shipped:

Other milestones: