Consumer / route matrix (DM-06)
Honest capability map for package model JSON/TTL, legacy commissioning RDF, and
SPARQL. Update when routes land. Tip authority: Wave S2 ADR
../architecture/ADR_data_model_graph.md.
| Consumer | Surface | Auth | Product status (Wave S2) | Notes |
|---|---|---|---|---|
| SPA Mapping | GET /api/csv/import/package/mapping?building_id= |
JWT + building scope | Shipped | Inventory JSON; stamped types (DM-04); parent_ahu only when the package map names parentAhu |
| SPA Mapping TTL | GET /api/csv/import/package/mapping/ttl?building_id= |
JWT + building scope | Shipped | Prefix urn:openfdd:ns#; dual TS/Rust exporters; skips parent_ahu_source=inferred |
| SPA Mapping export | browser download of same JSON/TTL | JWT | Shipped | Building membership checked; hub-root storage (see tenant storage honesty) |
| Central package RDF dataset | GET /api/csv/import/package/mapping/haystack-dataset?building_id= |
JWT + building scope | Shipped (C4 H8) | Derived from committed semantic_meta + pinned defs (ofdd_haystack_central_dataset_v1); not edge prototype graph |
| Central SPARQL | POST /api/model/sparql |
JWT + building scope | Shipped (C4 H9 templates) | Server query_id templates → ofdd_haystack_typed_bindings_v1; free-form query rejected; consumers (H10+) still required to close #1002 |
| Central SPARQL consumers | POST /api/model/sparql/consumers |
JWT + building scope | Shipped (C4 H10/H11) | FDD role_map + history approved provider/series + ECM plan; no arbitrary URL fetch |
| Central SPARQL catalog | GET /api/model/sparql/predefined |
JWT | Shipped (C4 H9) | Lists template ids / SELECT bodies over package RDF |
| Legacy edge | edge model SPARQL (+ predefined) | JWT (edge) | Legacy / edge path | Prefix https://open-fdd.dev/model#; Oxigraph; not the package TTL dataset |
| MCP | openfdd_model_sparql / _catalog |
JWT → OPENFDD_API_BASE |
Advertised; fails closed on 404/501 | Must not claim package TTL/dataset is the MCP query engine |
| Graph store (process) | in-process Oxigraph on edge | N/A | Legacy | Global data/model/* — not MT ACL (DM-05 honesty) |
| Dataset registry | GET/DELETE /api/datasets |
JWT + building scope | Shipped (3.5.31) | Foreign building_id → 403 |
| Session / roles | /api/fdd/session-config |
JWT + building scope | Shipped | Wave O ACL |
| Model/ECM stress gate | 36_model_ecm_qualification.sh |
stress profile | Wired (CI/smoke); FQ on S4 | See gate script + Wave S4 MEGA |
| Strict Haystack TTL | GET /api/csv/import/package/mapping/haystack.ttl?building_id= |
JWT + building scope | Shipped (C3) | Profile haystack-rdf-profile.md; requires semantic_meta.json |
| Strict Haystack projection JSON | GET /api/csv/import/package/mapping/haystack-projection?building_id= |
JWT + building scope | Shipped (C3) | Turtle + omission report (ofdd_haystack_projection_report_v1) |
| Native semantic meta JSON | GET /api/csv/import/package/mapping/semantic-meta?building_id= |
JWT + building scope | Shipped (C3) | openfdd_semantic_meta_v1 export; empty when absent |
| Haystack RDF C1/C3 fixtures | scripts/fixtures/haystack_rdf/ |
repo | Shipped (docs/tests) | Synthetic only; independent expected answers |
Capability honesty rules
- Central package SPARQL is template-only (
query_id). Empty bindings are not a feature PASS; #1002 still needs H10+ consumers. Legacy edge SPARQL ≠ package dataset. - Downloaded package TTL /
haystack-dataset(urn:openfdd:…) is the H8/H9 graph source; MCP must call central templates, not assume edge prototype SPARQL. - SCAFFOLD docs in
docs/mcp-agents/roles/package-mapping.mdstay labeled until tools are live against central. - Declaring
@prefix hs:on native package TTL does not mean Haystack interoperability — see JSON/RDF crosswalk. - Gate 36 evaluator gaps for Haystack qualification are tracked in gate 36 gap list (C5).
Smoke (operator)
TOKEN=… # admin JWT
# Catalog + template bindings (free-form query → 400 rejected):
curl -sS -H "Authorization: Bearer $TOKEN" \
"$OPENFDD_API_BASE/api/model/sparql/predefined" | jq '.status,.queries|length'
curl -sS -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"building_id":"SITE","query_id":"fdd_role_candidates"}' \
"$OPENFDD_API_BASE/api/model/sparql" | jq '.schema,.ok'
curl -sS -H "Authorization: Bearer $TOKEN" \
"$OPENFDD_API_BASE/api/csv/import/package/mapping/haystack-dataset?building_id=SITE"