Research deliverables
What’s here
Section titled “What’s here”Long-form research deliverables produced by fresh-agent research sessions (“deep research” Claude sessions) and cited in the decision logs. Each deliverable is preserved verbatim so the original recommendation, citations, and tradeoff analysis stay intact for future reference.
These are not Crosswalker decisions. They are inputs to decisions — the same way research challenges are briefs for research, these pages are the outputs of that research.
How to use these
Section titled “How to use these”- Citing a deliverable from a log: link to the deliverable URL; the content is stable
- Spinning up a follow-on research session: hand the brief URL plus the deliverable URL to a fresh agent; it has the predecessor context without needing the full chat history
- Re-running a challenge with different assumptions: the original deliverable + the corresponding challenge brief lets a fresh agent re-attack the question with a clear delta
Multi-deliverable convention
Section titled “Multi-deliverable convention”Some challenges produce multiple independent fresh-agent deliverables (different agents attacking the same brief from slightly different angles). Multi-deliverable challenges are named deliverable-a, deliverable-b, etc. — preserving all runs gives the convergence-evidence value (when 2-of-2 or 3-of-3 independent agents reach the same conclusion, that is much stronger evidence than a single deliverable).
The deliverables
Section titled “The deliverables”| Deliverable | Date | Recommendation | Decision log it fed | Follow-on |
|---|---|---|---|---|
| Ch 06 — Pairwise vs synthetic spine | 2026-05-01 | Hybrid: pairwise-first + optional inheritable pivot (SCF default) | 05-01 §2.1 | None — direction committed |
| Ch 08 — Git history audit-trail tenability | 2026-05-02 | Augment, not replace: TSA + WORM + cert-export at Tier 1 | 05-02 §2.1 | Ch 13 — modern attestation primitives |
| Ch 09 — UUID/CWUUID identifier strategy | 2026-05-02 | UUIDv7 + sha256 CIDs + CURIEs (ORCID for SSSOM authors); CWUUID is display-only | 05-02 §2.2 | None — substantively complete |
| Ch 10 — Graph→tabular bridging engine | 2026-05-02 | Hybrid 3-tier: materialized folders + DuckDB-WASM + Apache AGE | 05-02 §2.3 | Ch 11, Ch 12 |
| Ch 11a — Engine survey (TerminusDB-as-Tier-3 emphasis) | 2026-05-02 | Keep DuckDB-WASM Tier 2; drop AGE; adopt TerminusDB as default Tier 3. Includes Grafeo follow-up. | 05-02 §2.4 | Ch 14 — missed engines |
| Ch 11b — Engine survey (layered Tier 2 stack) | 2026-05-02 | Layer Tier 2: DuckDB-WASM + Oxigraph + Nemo. Apache AGE remains optional Tier 3. | 05-02 §2.4 | Ch 14 — missed engines |
| Ch 11c — Engine survey (layered + OSCAL/FedRAMP angle) | 2026-05-02 | Layered Tier 2 (DuckDB+Oxigraph+Nemo) + AGE+Jena Fuseki Tier 3. FedRAMP RFC-0024 (Sept 2026) makes OSCAL native support a 10× value-multiplier. | 05-02 §2.4 | Ch 14 — missed engines |
| Ch 12a — Datalog vs SQL (focused fork-in-the-road) | 2026-05-02 | Hybrid: rules expressed as Datalog DSL, executable via either Datalog engine (Nemo) or compiled to SQL recursive CTEs (DuckDB-WASM). Validated against OxO2 architecture. | 05-02 §2.5 | None — direction set |
| Ch 12b — Beyond the known engine landscape (long-horizon) | 2026-05-02 | Long-horizon: LinkML as canonical schema substrate; IPLD content-addressed crosswalks; Tier 1.5 compilation pipeline; engines absent from prior surveys (Stoolap, Minigraf, HelixDB, Comunica, sqlite-vec, cr-sqlite). | 05-02 §10 (long-horizon) | Ch 14 — missed engines |
| Ch 13 — Modern attestation primitives | 2026-05-02 | Confirm Ch 08 Tier 1 stack; ADD in-toto attestations (mandatory); offer Sigstore/gitsign as configurable alternative; SLSA L1→L2→L3 progression; skip OpenTimestamps for Tier 1; drop AWS QLDB (dead 2025-07-31). | 05-02 §2.6 | Ch 15 — non-git audit-trail alternatives |
| Ch 14 — Missed engines evaluation | 2026-05-02 | Keep Ch 11 layered Tier 2 stack as production. ADD Tier 2-Lite (sqlite-wasm + sqlite-vec + simple-graph + recursive-CTE) for Obsidian Mobile / low-end. ADD Comunica + N3 + HDT as opt-in federation layer. Track Grafeo and Minigraf with falsifiable migration triggers. Reject SurrealDB (BSL + 12.6 MB), cr-sqlite (stalled), CozoDB (no release since v0.7). | 05-02 third-wave §2 | None — direction set |
| Ch 15 — Audit-trail alternatives without external git tooling | 2026-05-02 | Adopt 4-tier model (T0/T1/T2/T3). New default: T2 with OpenTimestamps .ots on signed chain checkpoints. Reposition the Ch 08+13 git+RFC3161+S3-Object-Lock+FRE 902 stack as one of three T3 options (others: eIDAS QTSA + W3C VC for EU; Sigstore Rekor v2 + in-toto for supply-chain). Crypto-agile PQC migration plan 2026→2032. Single audit-ready badge UX with progressive disclosure. | 05-02 third-wave §4 | None — direction set |
| Ch 16 — Tier 3 stack reconsideration | 2026-05-02 | Demote Apache AGE from Tier 3 default to optional fallback. Promote Apache Jena Fuseki as default; document oxigraph-server as the lighter same-API alternative (architectural symmetry with Tier 2). Layered Fuseki + DuckDB-on-server as power-user upgrade path. TerminusDB v12 as opt-in vault-mirror with small-vendor (DFRNT) risk flagged. Watch but do not adopt: HelixDB, ArcadeDB, SurrealDB. | 05-02 third-wave §3 | Reframed by v0.1 stack pivot — Tier 3 not in v0.1 build target |
| Ch 18 — Tier 2-Lite SSSOM rule subset and scale ceiling | 2026-05-02 | Confirms sqlite-wasm + sqlite-vec + simple-graph + recursive-CTE Tier 2-Lite stack is comfortably viable up to ~100K mappings (well above realistic GRC vault upper bound). Rule expressivity matrix (4 ✅ / 4 ⚠️ / 1 ❌). Engineering scale model + measured anchors. Migration trigger spec. Round-trip data-loss analysis. User-facing scope statement. | v0.1 stack pivot §3 + §5 — adopted as default-bundled v0.1 Tier 2 sidecar | None — direction set |
| Ch 19 — Over-engineering stress test | 2026-05-02 | Adversarial verdict: radically simplify with narrow tiered escape hatch. Five arguments: competitive landscape hides complexity from users; SSSOM has zero GRC adoption; audit trail over-specified vs FRE 902 / SOC 2 / ISO 27001 actual requirements; 5 MB three-engine bundle is 10–50× Obsidian median and overkill for the data volume; concrete simple-default proposal (markdown + YAML STRM + git + Dataview + STRM-TSV/OSCAL export, under 500 KB). | v0.1 stack pivot — direction adopted with calibrations (Tier 2 sidecar bundled, SSSOM/STRM hybrid, Junction Notes kept) | None — direction set |
| Ch 20a — T1TMA (Tier-1 Term-Map Algebra) | 2026-05-03 | YARRRML retargeted to Tier-1; 6 primitives (ITERATE, REFERENCE, TEMPLATE, BIND, JOIN, INVERT) over closed slot vocab; JSONata + CSVW; MTT-justified, lens-contracted; ~480 KB bundle; concrete NIST 800-53 r5 worked example. | 05-03 import-primitive synthesis — Layer B (transformation algebra), convergent with Ch 20c | None — synthesized |
Ch 20b — Boundary semantics (ref/resolve/bind/seal) | 2026-05-03 | 4-primitive boundary contract: typed reference + sandboxed resolve + named bind + sealed manifest. Backpack-style holes/fills + Nix content addressing + sheaf-theoretic gluing + Merkle provenance + capability-typed effects. Three-layer syntax. Operates upstream of any transformation algebra. | 05-03 import-primitive synthesis §5 — Layer A (boundary semantics), complementary to Layer B | None — synthesized |
| Ch 20c — 5+4 primitive set (RML retargeted) | 2026-05-03 | 5 import primitives (Source, Term, Map, Join, Function) producing into 4 output sinks (path, frontmatter, body, wikilink). RML/YARRRML algebraic core + FNML transforms + SSSOM/T filter→action overlay; theoretical justification via s-t tgds, MTT, functorial data migration. Convergent with Ch 20a. | 05-03 import-primitive synthesis §4 — Layer B (transformation algebra), convergent with Ch 20a | None — synthesized |
| Ch 20 dialog — ETL + fundamental forms | 2026-05-03 | Two user questions and agent responses that crystallized two architectural insights: (1) Crosswalker is graph-aware semantically-constrained format-diverse ETL, distinct from generic tabular ETL; (2) data has finite fundamental forms; tables and graphs are special cases of labeled trees; ETL is tree-to-tree transformation; MTTs are the irreducible primitive; ChunkyCSV is a tree transducer specialized for table↔tree depth crossing. User arrived at insight #2 from first-principles intuition; literature converges from theoretical direction. | 05-03 import-primitive synthesis §3 — preserved as architectural rationale | None — preserved verbatim |
| Ch 23 — Bundle engine language | 2026-05-04 | Path A (Pure TS in-plugin) for v0.1, Path C (Hybrid: optional external producer) reserved for v0.5+. Rejects Path B (Python as core) / D (Rust→WASM) / E (Go→WASM) / F (JVM). Two irreversible constraints force the answer: mobile-Obsidian portability + small-OSS contributor pool. Empirical bundle figures: ~480 KB realistic for the JSONata + AJV + papaparse + js-yaml + nanoid stack with tree-shaken SheetJS; under 300 KB without XLSX. 9 specific v0.1 commitments. Reconciles Ch 20-A (pure TS assumption) and Ch 21 (external Python assumption) as sequencing, not architecture. | 05-04 bundle engine language synthesis — adopts 8 of 9 commitments; Bun-stays disagreement explicitly recorded | None — direction set |
| Ch 24 — Turso / libSQL evaluation | 2026-05-04 | REJECT all three Qs. Q1 (Tier 2 substrate migration to libSQL-WASM) — reject; stay on @sqlite.org/sqlite-wasm + sqlite-vec. Q2 (Turso Cloud as Tier 3 documented option) — reject for v1.0; substrate mismatch with canonical Tier 2 + governance flux. Q3 (Limbo / Turso Database) — watch but do not adopt; pre-1.0 beta; review at v1.0 + 12 months. Key signals: Turso publicly de-prioritized libSQL (“new features developed in Turso [Database]”); @libsql/libsql-wasm-experimental at v0.0.3; Bambini benchmark Aug 2025 showed libSQL DiskANN unbounded build time on 100K × 384-dim vectors. Deepest insight: vector-layer portability — sqlite-vec is decoupled from substrate, libSQL native vector is not. Five explicit migration triggers locked. | 05-04 Tier 2 substrate synthesis — adopts all three rejections; elevates vector-layer-decoupled-from-substrate as modularity commitment | None — direction set; long-horizon watch register added per Q3 |
| Ch 22 — Target-structure expressivity | 2026-05-04 | Closed grammar of FIVE mechanisms (`folder | file | heading |
| Ch 27a — Crosswalker-specific framing | 2026-05-07 | Hybrid (Option 3) — Bases as default + CrosswalkRepository (Repository + Query Object + Specification) as escape hatch. Hexagonal/Ports-and-Adapters macro layout. Stage migration: lock schema → ship registerBasesView custom view types → keep internal Repository for queries Bases can’t express. Crosswalk mappings as their own notes (edge-as-note). TaskNotes v4 cited as canonical in-house precedent (deleted thousands of lines of bespoke filter UI; preserved service layer). Reasoned from adjacent context — challenge page not retrievable. | TBD — pending synthesis log (planned after Ch 28 lands) | Ch 28 stress-test |
| Ch 27b — First-principles vault-as-database stack | 2026-05-07 | Four-layer stack: schema (versioned, enforced) → storage (atomic Markdown + edge-notes) → query/index (Bases default + Datacore/SQLite/embeddings escape hatches) → views/automation (.base files + custom views + HTTP API + MCP servers + LLM agents). CQRS write/read split. Three-stage rollout (Foundation → Scale & agents → Index & federate). Vault-federation ceiling identified at 100-500k notes. Reasoned from adjacent context — challenge page not retrievable. | TBD — pending synthesis log | Ch 28 stress-test |
| Ch 27c — Materialization + crosswalker-query codeblock (Pattern B+D) | 2026-05-07 | Pattern B+D: SQL produces materialized junction-note frontmatter that Bases renders natively + plugin-rendered crosswalker-query codeblock for queries Bases can’t express. Closes the gaps A and B left thin: 20-question query-routing matrix (~13 Bases / 6 SQL / 1 hybrid); junction-note-subject-string resolution → metadataCache.resolvedLinks; concrete recipe-emission YAML descriptor (id/tier/inputs/output.kind/sql); 5k×8×30k vault performance worked example; concrete v0.1.6 in/out/deferred lists. SQLSeal cited as in-Obsidian SQL-codeblock precedent. Accessed primary sources (Obsidian Help via DeepWiki, SQLSeal repo). | TBD — pending synthesis log | Ch 28 stress-test |
| Ch 28a — Bases-first hybrid with opt-in materialization | 2026-05-07 | ”Bases-first, codeblock-second, materialization-third” — engages all 7 brief investigation areas. CQRS framing: query layer (Bases + codeblock + sqlite-wasm sidecar) and snapshot layer (materialization command + OpenTimestamps + git) are SEPARATE concepts. Materialization at Reports/_generated/<recipe>/<view>/<timestamp>.md, opt-in command-only, gitignored by default, hand-edit prevention via timestamped-new-file + .latest.md alias-pointer. Mobile/Publish parity table; deterministic Markdown writer spec; recipe lifecycle with user_edited:true row-flag + three-way merge. Most-detailed of the three Ch 28 deliverables. | TBD — pending synthesis log | Possibly absorb into v0.1.6 + v0.1.8 design |
| Ch 28b — Stress-test matrix (S/M/Q/L/C/R series, brief misinterpretation) | 2026-05-07 | Misinterpreted “stress test” as DB load testing rather than architectural-decision stress testing. Produced 6-axis matrix (Scale/Malformed/Query/Live-mutation/Concurrency/Regression), TypeScript synthetic-vault generator (~100K notes), Node benchmark harness with NDJSON output, SLO scoreboard template (p95<250ms@50K, cold start <10s @100K, mobile parity within 3x desktop). Useful for v0.2+ performance testing; not directly responsive to Ch 28’s architectural questions. Preserved per multi-deliverable convention; informs that the brief’s “stress test” framing was ambiguous. | Not directly relevant to v0.1.6 architectural decision | Future v0.2 perf-testing material |
| Ch 28c — Narrow v0.1.6 hard; defer materialization to v0.1.8 | 2026-05-07 | Most conservative of the three. Hold Ch 27 hybrid but narrow v0.1.6 to a SINGLE registerBasesView (crosswalkerCoverageMatrix) as the only default; defer materialization-to-Markdown ENTIRELY to v0.1.8 (audit-trail milestone owns lifecycle). _crosswalker/views/ underscore folder convention (Obsidian doesn’t index dot-folders). Mobile/Publish parity as binding constraint (sqlite-wasm + OPFS unavailable on Obsidian Mobile via Capacitor; codeblock processors never execute on Publish). Manifest-first audit model — one OpenTimestamps proof per snapshot manifest, not per row. Junctions = audit truth; matrices = caches. Adversarial-by-design — explicitly more conservative than Ch 27’s three convergent deliverables. | TBD — pending synthesis log | Probable adoption for v0.1.6 scope minimization |
| Ch 31a — Shape-dispatched data-only schema | 2026-05-08 | Recipe query: block as data-only schema (no inline SQL/SPARQL/Bases-DSL); oneOf+const discriminator over 6 view shapes (table/list/pivot/graph/hierarchy/timeline); unevaluatedProperties: true at root for forward-compat; additionalProperties: false inside primitive sub-blocks; SchemaVer (MODEL.REVISION.ADDITION) versioning. Closed aggregation enum (count, count_distinct, sum, avg, min, max, density, first, last) + x_* extensible namespace. JSON Schema 2020-12 with full $defs for OntologyRef, ConceptRef, EdgePredicate, FieldSelector, Filter, Sort, Projection, Traversal, Aggregate, Join, GroupBy, Param, Provenance, Output, ViewOptions, and per-shape primitives. 5 worked reference recipes. Datasette PR #2191 cited as cautionary tale against code-with-fences. | Synthesis log §2 D8 — confirms locked verdict | Implementation can pick this schema OR equivalent from B |
| Ch 31b — JSONata typed tree | 2026-05-08 | Recipe query: block as data-only typed tree; if/then/else discriminator pattern (vs A’s oneOf+const); explicit JSONata as the ONLY string-typed expression language allowed in the schema; Tier 2 helper compile path explicit (crosswalkBetween, closureFromConcept, getConceptsByOntology plus 2 new helpers densityBetween + bucketEvents); 3-way merge as single typed sub-tree; ROBOT/OBO Foundry cited as the most architecturally relevant precedent (verbs over snippets); 5 worked reference recipes (different shape than A’s recipes — equivalent semantics). | Synthesis log §2 D8 — confirms locked verdict | Implementation can pick this schema OR equivalent from A |
| Ch 32a — Hybrid Pattern D + materialization-folder spec | 2026-05-08 | Adopt hybrid “Recipe Picker → Wizard → YAML” pattern; ship picker + cookbook in v0.1.6 (defer wizard to v0.2+). Wrap Bases UI rather than fighting it. Materialization opt-in command-driven export to _crosswalker/ folder with YAML banner, cssclasses, folder README, Iconic-style colored folder icon, “Re-materialize” command. Click behavior defaults to Live Preview (read-only via crosswalker-generated: true frontmatter + CSS class hook). Recommends “no materialization” as the default for browsing — embedded \“base` code blocks; reserve materialization for share-with-auditor / Publish parity case. Crosswalker SKILL.md modeled on kepano/obsidian-skills/obsidian-bases is the v0.1.6 minimum-viable agent surface. | Synthesis log §2 D1 — refines D1 verdict | Locks v0.1.6 milestone scope tightening |
Ch 32b — Embedded base blocks no-mat default | 2026-05-08 | Hybrid Pattern D Metabase-shape; architectural split between browsing and sharing — default browsing path uses embedded \“basecode blocks inside ordinary query notes (live, in canonical user files); materialization reserved for explicit "share with auditor / Publish parity" viaCrosswalker: Materialize current querycommand. Shipcrosswalker/SKILL.md` (modeled on kepano/obsidian-skills) in v0.1.6 as MVP — promotes from v0.2+ to v0.1.6 because it deflates “expert-friendly, not intuitive” criticism. Tightens v0.1.6 milestone scope rather than expanding: drop full wizard / marketplace / recommendation engine / staleness watcher / SSSOM-TSV; ship picker + inline + opt-in materialize + 5-8 canonical recipes + cookbook + SKILL.md. | Synthesis log §2 D1 — refines D1 verdict | Confirms tighter v0.1.6 scope |
| Ch 29 — 8-primitive Layer A vocabulary validation | 2026-05-09 | Adversarial validation of the candidate 7-primitive set against SPARQL 1.1, Codd, Datalog, OLAP, GQL ISO/IEC 39075:2024, SSSOM, SKOS, NIST OLIR/IR 8477. Verdict: REVISE to 8 primitives. Drops standalone closure (folds into parameterized traverse(depth=*) — same shape as SPARQL property paths / Cypher var-length / Datalog recursion); demotes pivot to Layer B (presentation, not value-producing); adds bind (computed columns; required for evidence-freshness queries), set-op (∪/∩/⊖; required for framework-overlap), and diff (versioned ontology delta; uniquely Crosswalker-essential for v0.1.8 audit-trail). Anchored to ontology-web standards, not GRC-coded. Cross-reference matrix across 9 standards. Primitive × Standard table, real Crosswalker query decomposition (10 queries), Layer A/B boundary ruling. Out of scope: OWL-DL reasoning, full SPARQL federation, CONSTRUCT graph-output. | Synthesis log §1 #14 + #15 | 8-primitive set locked; concept page rewrite needed |
| Ch 30 — View shape taxonomy: 5 v0.1 first-class shapes | 2026-05-09 | Survey of 16 ontology UIs (BioPortal, OLS4, Protégé, OntoBrowser, TopBraid EDG, VocBench, PoolParty, Skosmos, SKOS Play, Stardog Studio, Stardog Explorer, GraphDB Workbench, Cytoscape, Apache Jena Fuseki UI, Annif/Finto AI, OntoloViz/d3-hierarchy). Verdict: REFINE provisional 6-shape catalog. v0.1 first-class = 5 shapes (Pivot custom + Table/List/Cards Bases-native; Hierarchy graduates v0.1.7-v0.1.8 as 2nd custom view). Defer Graph→v0.2 (Cytoscape.js integration is multi-week), Timeline→v0.2+ (Bases roadmap should ship). Heatmap/sunburst/treemap/sankey/circle-packing are render options of Pivot or Hierarchy, not separate shapes. Search = Layer A filter+rank composition. Comparison = composition of two Tables. Dashboard = recipe-layer concern. TaskNotes v4 is the canonical Obsidian-plugin precedent for registerBasesView. Mechanism rule: prefer Bases-native > registerBasesView > codeblock > snapshot; every shape that needs to render on Obsidian Publish requires a materialized snapshot fallback. | Synthesis log §1 #2 (refined) | 5-shape v0.1 catalog locked |
| Ch 33 — Multi-modal substrate audit: REAFFIRM sqlite-wasm | 2026-05-09 | Engine survey of 16 candidates (DuckDB+DuckPGQ, Polars, Cozo, Oxigraph-WASM, Stardog, RDF4J, Jena/Fuseki, Materialize, Datomic, ClickHouse, LanceDB, TerminusDB, Neo4j, GraphDB, HelixDB, SurrealDB) × 8 dimensions. Verdict: REAFFIRM @sqlite.org/sqlite-wasm. Mobile (Capacitor: no SAB, no OPFS sync handles) is the binding constraint, not scale. No surveyed engine simultaneously satisfies (a) Capacitor mobile, (b) small WASM bundle, (c) permissive license. Decoupled vector layer (sqlite-vec) survives with known static-link packaging cost. New trigger #6 added: sqlite-vec-wasm packaging stability. Tier 3 reframed: Oxigraph-CLI sidecar > Apache Jena Fuseki for new deployments. Scale × engine matrix (small/medium/large/ontology-web). 16-engine survey verifies anti-pattern compliance (license/vendor concentration). | Synthesis log §1 #16 + #18 | Substrate locked through v0.1.x |
| Ch 35 — Graph→tabular bridging rerun (Ch 10) at ontology-web scale | 2026-05-09 | REAFFIRM Tier 1 + Tier 2; REVISE Tier 3 (Apache AGE → Oxigraph + Fuseki). Every production ontology-web system materializes precomputed pairwise crosswalk tables — UMLS RRF subsets, BioPortal’s 100M-mapping table, OxO/OxO2 SSSOM crosswalks, NIST OLIR DRM. None compute N×N at query time. BioPortal 2025 figures: 1,549 ontologies / 15.3M terms / 100M+ mappings; UMLS 2025AB: 3.49M concepts / 17.4M atoms. Pivot scale ceiling: 10¹² cells with <0.001% density — infeasible. UI rule: force pair-selection before pivot; sparse-pivot guard at >100K cells. Five non-GRC archetypes all reduce to existing helpers (crosswalkBetween + closureFromConcept); no new primitives. Substrate-neutrality audit checklist. Recommends moving SSSOM TSV import + materialized closure-table from v0.1.8 to v0.1.6 (locked 2026-05-09 per user direction). | Synthesis log §1 #16 + §2 D1 nuance | Tier 3 reframed; v0.1.6 scope expanded |
| Ch 36 — Query language rerun (Ch 12): compositional stack | 2026-05-09 | REVISE Ch 12 narrowly. Adopt compositional language stack: YAML recipes (Layer C) → SQL recursive CTE (Layer A, sqlite-wasm) → JSON view-specs (Layer B) → Bases YAML for vault-scoped views. Datalog stays internal-only as a YAML rules: sub-DSL. No Crosswalker-invented DSL — rejecting the “fourth-language” anti-pattern. Anchored by LLM-friendliness benchmarks: SM3-Text-to-Query zero-shot accuracy SQL ≈ 47%, Cypher ≈ 34%, MQL ≈ 22%, SPARQL ≈ 3%. Industry precedent: dbt, OpenRewrite, Argo Workflows, Kubernetes. Bases is a vault-scoped expression DSL (right surface for filtering/presentation, NOT for ontology-web reasoning). SQL recursive CTEs cover closure/path/anti-join/pivot/aggregation. SPARQL property paths cleaner but ~3MB WASM and SPARQL evaluation in Oxigraph “in heavy development.” Datalog better for SSSOM rules but worse for everything else. GQL/Cypher right standard 5-10 years out, no production WASM today. GraphQL wrong category. OxO2 (Nemo Datalog materialized at release time) validates the layered approach. | Synthesis log §1 #17 | Compositional stack locked |
| Ch 37 — Tier 2 scale rerun (Ch 18): per-query working-set ceiling | 2026-05-09 | REAFFIRM ~100K mapping ceiling, reframed as per-query working-set (not database size). Reference dataset sizes (GO/HPO/ChEBI/SNOMED/UMLS/BioPortal/OBO/NIST OLIR). sqlite-wasm performance characteristics. Memory ceilings (V8 pointer compression cage 4GB; Crosswalker realistic budget ~500MB-1GB desktop, ~150-300MB mobile). 5-tier threshold matrix (Green ≤50K concepts/250K edges; Yellow 50-250K; Orange 250-500K Tier 3 recommended; Red >500K Tier 3 only; Mobile = ÷5 of desktop). 4 closure cache strategies analyzed. Industry pattern: partition by ontology, query a subgraph, never materialize the world. New triggers #6 (closure cache memory budget), #7 (per-query 1M-row ceiling). v0.1.7 deliverables: per-ontology partitioning + tripwire estimation + bounded LRU closure cache + mobile-mode constraints. Tier 3 referral mechanism for queries that exceed local budget. Anti-recommendations locked: don’t preemptively migrate, don’t load full BioPortal/UMLS, don’t add vector layer in v0.1.x, don’t assume desktop budgets on mobile. | Synthesis log §1 #18 | Scale ceiling reaffirmed; v0.1.7 scope set |
| Ch 38a — Same-name folder note (Layout B′) | 2026-05-18 | Recommends Layout B′: _crosswalker/queries/<slug>--<id8>/<slug>--<id8>.md (same-name folder note) + view.base sibling + reserved derivative subfolders. Rejects user’s literal index.md proposal because vanilla Obsidian wikilinks resolve by filename, not folder (![[csf-coverage]] would NOT resolve to csf-coverage/index.md without LostPaul Folder Notes plugin — violates Commitment #3 mobile parity). Slug-collision policy: opaque query_id is canonical identity; folder name always <slug>--<id8>; collisions structurally impossible. Migration via one-shot command before Phase 5. Five non-regenerable artifact types mapped (user annotations, audit snapshots, overrides, exports, snapshots) to sibling slots. Steelman “no folder” rejected on Phase 5+ scaling grounds + Commitments #2/#5. | Synthesis log Ch 38 | Query state location locked (variant B+ adopted) |
| Ch 38b — Query-pack folder (Layout B+) | 2026-05-18 | Recommends Layout B+: _crosswalker/queries/<slug>/index.md (canonical) + view.base sibling + reserved snapshots/ / materialized/ / exports/ subfolders + optional README.md for user annotations. Embed via explicit ![[<slug>/view.base]] (NOT ![[<slug>]]) — folder-note magic is not core Obsidian behavior. Slug-collision policy: refuse-and-prompt on user create (modal: Open existing / Pick new name / Force suffix); opaque -<4hex> suffix on programmatic/agent create. query_id is durable key; slug rename-safe via Obsidian’s auto-update-links. Migration via Crosswalker: Migrate queries to folder layout (~½ day). Layout C (hybrid back-pointer) rejected; steelman “no folder” rejected on Phase 5+ derivative-home grounds. | Synthesis log Ch 38 | Query state location locked (B+ adopted) |
Convention notes
Section titled “Convention notes”- Filename:
YYYY-MM-DD-challenge-NN-<slug>.md. Date is the day the deliverable landed; challenge number matches the brief - Format: plain markdown (
.mdnot.mdx) — these are dense long-form documents and we don’t want to deal with MDX parsing edge cases for tables, code blocks, em-dashes, or special characters in tables - Preservation: deliverables are not edited after publication except for typo/formatting fixes that don’t change content. Any commentary or critical assessment lives in the corresponding decision log
- Pre-publication drafts still live in the gitignored
.workspace/per the convention inCLAUDE.md; deliverables are moved here only after they’re accepted as input to a decision