Neo4j projection: assets, tags, domains, promoted claims, ClaimKind facets, and v0 Technology / Risk catalog nodes (when Bolt is enabled and synced). With DARKHERD_LOCKDOWN_HTML, use the Sign in link on the denied page (it carries /admin?next=… so you return here after login — P1av).
The insights portal footer also lists one-click /graph presets (archived corpus, 2D, slim canvas, active + slim — P1am+P1ba; P1bb discoverability).
Machine-readable route hints: GET /api/v1/meta → endpoints.page_analytical_graph, endpoints.page_dashboard, endpoints.page_portal (same explorer on /dashboard; P1be).
Orchestration readiness (read-only): GET /api/v1/orchestration/status — GET /api/v1/meta → endpoints.orchestration_status (P4ao).
Supervisor invoke prerequisites (read-only, P4db · P4de — same fields as /portal P4dc): GET /api/v1/insights/summary includes supervisor_wired, supervisor_graph_invoke_enabled, and p4db matching GET /api/v1/orchestration/status (P4cz) and top-level GET /api/v1/meta (P4da).
Bound-tool governance (read-only, P4dh · P4de · P4dj — /portal Summary strip, meta P4di): GET /api/v1/insights/summary includes supervisor_bound_tools, supervisor_mutating_bound_tool_job_classes, p4bc, and p4cb matching GET /api/v1/orchestration/status (P4bc/P4cb); the same bundle is top-level on GET /api/v1/meta (P4di).
Analytical refresh policy (read-only, P4cq — Vision §5.2): GET /api/v1/insights/summary and GET /api/v1/orchestration/status both include the same analytical_refresh_policy JSON (scheduled_full_rebuild_interval_days, max_active_corpora_assets_hint from constitution/invariants.json); top-level GET /api/v1/meta mirrors it as P4cr; GET /api/v1/orchestration/tool-adapters-status keeps P4cs parity. Schedule global Louvain / rebuild jobs with external cron or /admin queue cards (runbook 9f, P5cw) — this JSON does not enqueue by itself.
Autoschedule metrics (read-only, P3dv · P3ds · P3dr · P4de): GET /api/v1/insights/summary includes p3ds_global_refresh_autoschedule_metrics (outcomes, tick_exceptions_total) — process-local parity with GET /metrics; /portal Summary renders P3dq/P3dp/P3do + P3ds; /admin loads raw JSON (P3du).
SQL engine dialect (read-only, P7zaoi · P4de): GET /api/v1/insights/summary includes database_dialect + p7zaoi — parity GET /api/v1/ready (P7zaoe) + GET /metrics darkherd_database_up (P7zaoh); /portal Summary strip matches this cue.
Worker job queue depth (read-only, P7zkk · P7zki · P4de): GET /api/v1/insights/summary includes worker_jobs_rows_by_status + p7zki — SQLite counts by status, JSON parity darkherd_worker_jobs_rows on GET /metrics (P7zf); /portal Summary renders the P7zkk strip; when worker_jobs_rows_by_status.failed > 0, it appends P7zfq → /admin#p7-worker-queue.
P2 staging + extract queue + corpus-sweep batches (read-only, P2zy + P2zb + P2vdi · P4de): GET /api/v1/insights/summary includes staging_claims_rows_by_status + p2zy, extract_claims_staging_worker_jobs_rows_by_status + p2zb, and extract_claims_corpus_sweep_pages_total + p2vdi — JSON parity darkherd_staging_claims_rows + darkherd_extract_claims_staging_worker_jobs_rows + darkherd_extract_claims_corpus_sweep_pages_total on GET /metrics (P7zf); /portal Summary renders the strips; when staging_claims_rows_by_status.failed > 0, it appends P2vft → /admin#p2-staging-claims.
Recent jobs (read-only cue, P7zak — same story as lockdown 403 HTML and P7zaj on admin_gate): on signed-in /admin (HyperCharts /darkherd/admin, P7xq), Recent jobs uses btn-jobs → GET /api/v1/admin/jobs (HyperCharts GET /api/darkherd/admin/jobs, P7zai) with P7zah lines for incremental_ingest detail.tag_overlap_followup (P7zac / P7zag / P7zae).
Ontology patch lifecycle (P4l / P5a–P5d): use DarkHerd POST/GET /api/v1/orchestration/… paths documented on GET /api/v1/meta (e.g. endpoints.orchestration_validate_ontology_patch, endpoints.orchestration_simulate_ontology_patch, endpoints.orchestration_ontology_patch_head, endpoints.orchestration_apply_ontology_patch, endpoints.orchestration_facets_catalog_status). These are not same-origin proxied via HyperCharts the way /api/darkherd/orchestration/status is (P4ar only). Repo INTEGRATION.md / README.md (P5 boundary).
Graphiti bridge health (read-only): GET /api/v1/graphiti/status — GET /api/v1/meta → endpoints.graphiti_status; HyperCharts same-origin proxy /api/darkherd/graphiti/status (P6b).
Graphiti temporal search (POST, lockdown-gated like /api/v1/chat): POST /api/v1/graphiti/search — GET /api/v1/meta → endpoints.graphiti_search; body {"query":"…","max_facts":24}; HyperCharts POST /api/darkherd/graphiti/search (P6d).
Analytical ontology facets v0 (read-only): GET /api/v1/graph/ontology-facets-v0 — GET /api/v1/meta → endpoints.graph_ontology_facets_v0; HyperCharts /api/darkherd/graph/ontology-facets-v0 (P6o; P6r ontology_bundle_roles; P6s ontology_narrative_template_meta when manifest valid).
Graphiti episode ingest is server-side only (upstream POST …/messages): GET /api/v1/meta → endpoints.graphiti_episodes; staging emit + incremental graphiti_episode_replay (P6e). Episode bodies append ontology/facets_v0.json fingerprint lines (P6g); this footer echoes that operator cue (P6h). Bodies start with darkherd_episode_v0 JSON (structured_episode_envelope_v0 in graphiti_episodes.py; P6i) including ontology_facets_v0_fp (P6k) plus optional ontology_template_id / ontology_catalog_sizes (P6m); ontology/manifest_v0.json → episode ontology_bundle_version|ontology_bundle_fp + GET /api/v1/graph/ontology-facets-v0 ontology_bundle_manifest (P6p); this footer echoes that cue too (P6j+P6q+P6r ontology_bundle_roles+P6s ontology_narrative_template_meta).
Client module /static/graph_snapshot_panel.js (P3be) — same strip on /dashboard. From GET /api/v1/graph/summary, GET /api/v1/graph/claim-kinds?limit=24, and GET /api/v1/graph/ontology-facets-v0 (seeded :Technology / :Risk names). When the summary shows claims > 0, the panel also requests GET /api/v1/analytics/neo4j/claim-kind-facet-counts?limit=12 for a second HAS_KIND histogram (same auth rules as other analytics when HTML lockdown is on). When assets or claims are > 0, it additionally loads the global P3aq–P3at ontology histogram endpoints (compact tables — P3au) and the P3av / P3aw Technology×Risk pair rollups (second section — P3ax). When claims are > 0, third and fourth blocks load P3ay / P3az (P3ba) and P3bb / P3bc distinct-asset rollups (P3bd). Per-fetch gates: GET /api/v1/meta → endpoints.page_dashboard / endpoints.page_analytical_graph (P1be).
Uses SQLite tags for every deployment; when NEO4J_URI is set and assets are synced, domains, promoted claims (:Claim via SUPPORTS_CLAIM), claim kinds (:ClaimKind via HAS_KIND), and Technology / Risk catalog facets linked from claims (INVOLVES_TECHNOLOGY / EXPOSES_RISK, P1ap) appear too.
3D view: drag to rotate, scroll to zoom. Click an asset to collapse to its neighbourhood (hops below); click a tag for a star view.
Deep-links: ?center_asset_id=123 (SQLite asset id; aliases asset_id, center) focuses that asset after overview. ?tag=defi (aliases tag_focus, tags) opens tag-focus unless center_asset_id is set (centre wins).
Overview sizing (optional query, clamped to API bounds): asset_limit (15–1200), tag_limit (30–600), source (auto | neo4j | sqlite) — passed to /api/v1/graph/viz/overview on each load / reset.
Corpus scope (corpus_scope=active default or all): passed to viz/overview and, from the client, to viz/neighbourhood and viz/tag-focus so the SQLite fallback ranked pool matches (archived assets can appear as co-tag neighbours / tag carriers when all); alias include_archived=true when corpus_scope is omitted. Asset nodes include corpus_tier; archived assets use a muted slate node colour and show tier in tooltips / selection.
Neighbourhood / tag-focus caps: nb_hops or hops (1–3, seeds the hops slider), nb_max_assets (8–120), nb_max_tags (15–220), tf_max_assets (5–100 for tag-focus). source from overview also applies to these viz calls.
Viz layers (optional): include_claims=false omits Claim and ClaimKind nodes (Neo4j :Claim; SQLite P1vfw staging_claims rows). include_ontology_facets=false drops all Technology/Risk facet nodes in the payload (including P1ar :Asset→catalog edges from tag sync). When claims are off but ontology is on, asset-tag catalog facets can still appear if Bolt has INVOLVES_TECHNOLOGY/EXPOSES_RISK from sync_graph. Aliases viz_claims / viz_ontology_facets. Passed to viz/overview, viz/neighbourhood, and viz/tag-focus.
Client corpus filter (P1au): viz_asset_tier=all (default), active (hide archived :Asset nodes after fetch), or archived (only archived assets). Alias kg_asset_tier. Prunes incident links client-side; does not change API responses. If an archived asset is the URL centre but viz_asset_tier=active, the centred node may be filtered out — use all for that case.
Client domain/tag layers (P1ay): viz_show_domains=true|false and viz_show_tags=true|false (defaults true; aliases kg_show_domains, kg_show_tags) hide domain or tag nodes after each viz response. Chained with P1au; not sent to the viz APIs.
Client claim / catalog nodes (P1az): viz_show_claim_nodes=true|false (hides :Claim and :ClaimKind viz nodes; aliases kg_show_claim_nodes) and viz_show_catalog_nodes=true|false (hides Technology/Risk facet nodes; aliases kg_show_catalog_nodes). Defaults true. Independent of server include_claims / include_ontology_facets — you can fetch full payload then simplify the canvas client-side (P1aq vs P1az).
View mode: viz_mode=2d or 3d (aliases dim, kg_dim) selects the force-graph renderer before the first load.
Viz fetch errors (P1ver / P1veq): if overview / neighbourhood / tag requests fail (timeout, HTTP errors), click Reset overview (id="kg-reset") — /static/graph_explorer.js also appends this retry hint on failures (P1veq).
…