{"service":"darkherd","version":"1.0.0","suggested_refresh_seconds":300,"worker_job_kinds":["append_rollback_checkpoint","backfill_cmc_market_fields","dedupe_coingecko_cmc","extract_claims_staging","incremental_ingest","invalidate_analytics_cache","neo4j_sync_archived_assets","neo4j_sync_graph_assets","neo4j_sync_graph_constraints","neo4j_sync_tag_overlap_run","rebuild_tag_overlap_full","reconcile_cmc_inactive_archive","reconcile_coingecko_stale_archive","refresh_tag_overlap_communities","repair_asset_tag_ontology_edges","repair_claim_ontology_edges","repair_whitepaper_gaps","set_corpus_tier","summarize_tag_overlap_communities","tag_overlap_publish_pipeline"],"worker_job_kinds_count":20,"analytical_refresh_policy":{"scheduled_full_rebuild_interval_days":7,"max_active_corpora_assets_hint":10000,"config_source":"invariants","autoschedule_enqueue_pipeline_wired":false,"description":"Vision §5.2 — operator-tunable hint for scheduled global community/summary passes over the active analytical corpus (~10k ceiling); enforce with external cron + queue_worker (**P7k**) jobs (e.g. tag_overlap_publish_pipeline). Optional **P3do**: when autoschedule_enqueue_pipeline_wired is true and DARKHERD_GLOBAL_REFRESH_AUTOSCHEDULE_ENABLED runs in the API process, DarkHerd may enqueue tag_overlap_publish_pipeline on cadence — still drained by queue_worker."},"supervisor_wired":true,"supervisor_graph_invoke_enabled":true,"p4da":true,"global_refresh_autoschedule_enabled":false,"global_refresh_autoschedule_tick_s":3600,"global_refresh_autoschedule_bootstrap":false,"p3do_autoschedule_effective":false,"claim_extraction":{"max_asset_limit":500,"max_chunks_per_asset":24,"max_asset_offset":50000,"max_chunk_rank_offset":200,"max_chunk_sweep_passes":200,"max_chunk_rank_cursor":50000,"max_corpus_sweep_pages":5000,"scan_cap_asset_multiplier":8,"min_scan_cap":200,"config_source":"invariants"},"supervisor_mutating_bound_tool_job_classes":["dirty_community_refresh","manual_admin","scheduled_full_rebuild"],"p4cb":true,"supervisor_bound_tools":{"refresh_tag_overlap_communities":{"wired":true,"dry_run_default":true,"max_assets_cap":2000},"ontology_patch_draft_and_simulate":{"wired":false,"dry_run_default":true},"enqueue_worker_job":{"wired":false,"dry_run_default":true,"allowed_kinds":["append_rollback_checkpoint","backfill_cmc_market_fields","dedupe_coingecko_cmc","extract_claims_staging","incremental_ingest","invalidate_analytics_cache","neo4j_sync_archived_assets","neo4j_sync_graph_assets","neo4j_sync_graph_constraints","neo4j_sync_tag_overlap_run","rebuild_tag_overlap_full","reconcile_cmc_inactive_archive","reconcile_coingecko_stale_archive","refresh_tag_overlap_communities","repair_asset_tag_ontology_edges","repair_claim_ontology_edges","repair_whitepaper_gaps","set_corpus_tier","summarize_tag_overlap_communities","tag_overlap_publish_pipeline"],"allowed_kinds_count":20}},"p4bc":true,"p4di":true,"endpoints":{"assets":"/api/v1/assets?limit=&offset=&q=","stats":"/api/v1/stats","costs_summary":"/api/v1/costs/summary?window_hours=24&include_mistral=false — P7b SQLite usage proxy (staging/admin/audit + model rollups); optional include_mistral=true calls Mistral beta observability chat-completion search for in-window token totals (not invoice billing); JSON adds provider_export_hints (**P7jb**) mistral_api_key_configured|openai_api_key_configured|anthropic_admin_api_key_configured|deepseek_api_key_configured|openrouter_api_key_configured|stability_api_key_configured|replicate_api_token_configured|hf_token_configured|darkherd_sqlite_export_available (local flags for GET /api/v1/costs/provider-export?provider= parity; no live provider HTTP); portal.html ``btn-portal-costs-hints`` loads this JSON on ``/portal`` (read-only **P7jb** beside **P7jc**/**P7jd**); **P7jn** portal.html ``btn-portal-costs-export-*`` + ``wirePortalCostsProviderExport`` loads capped ``GET /api/v1/costs/provider-export?window_hours=24`` (**P7jj** read-only previews on ``/portal``); HyperCharts GET /api/darkherd/costs/summary (P7i companion proxy)","costs_provider_export":"/api/v1/costs/provider-export?window_hours=24&provider=mistral|openai|darkherd|anthropic|deepseek|openrouter|stability|replicate|huggingface — P7j Mistral provider-native billing/export (default mistral) + P7y provider=openai provider-native organization completions usage (OPENAI_API_KEY + optional DARKHERD_OPENAI_ORGANIZATION_ID) + P7zc provider=darkherd SQLite usage proxy + P7zd provider=anthropic GET /v1/organizations/usage_report/messages (ANTHROPIC_ADMIN_API_KEY Admin key; DARKHERD_ANTHROPIC_USAGE_* bounds) + **P7jl** provider=deepseek GET /user/balance (DEEPSEEK_API_KEY; point-in-time account balance — not windowed token buckets) + **P7zal** provider=openrouter GET /credits (OPENROUTER_API_KEY; OpenRouter data.total_credits / data.total_usage snapshot — not windowed token buckets) + **P7zas** provider=stability GET /v1/user/balance (STABILITY_API_KEY; Stability ``credits`` field snapshot — not windowed token buckets) + **P7zat** provider=replicate GET /v1/account (REPLICATE_API_TOKEN; Replicate account ``type``/``username``/``name`` snapshot — not windowed token buckets) + **P7zau** provider=huggingface GET /api/whoami (HF_TOKEN / ``HUGGINGFACE_HUB_TOKEN``; Hub ``name``/``type``/``id`` identity snapshot — not windowed token buckets); **P7jg** admin.html btn-costs-export-darkherd + admin_gate.html btn-gate-costs-export-darkherd + hyperdata/web/templates/index.html link preview provider=darkherd (same-origin HyperCharts GET /api/darkherd/costs/provider-export); **P7jj** portal.html wirePortalCostsProviderExport(btn-portal-costs-export-mistral|openai|anthropic|deepseek|openrouter|stability|replicate|huggingface|darkherd) (**P7jn** read-only /portal parity) + admin.html wireAdminCostsProviderExport(btn-costs-export-mistral|openai|anthropic|deepseek|openrouter|stability|replicate|huggingface + **P7jg** btn-costs-export-darkherd) + admin_gate.html wireGateCostsProviderExport(btn-gate-costs-export-mistral|openai|anthropic|deepseek|openrouter|stability|replicate|huggingface + **P7jg** btn-gate-costs-export-darkherd) + index.html same-origin anchors mistral|openai|anthropic|darkherd|deepseek|openrouter|stability|replicate|huggingface; **P7jk** darkherd/README.md checklist **3** static contracts + hyperdata/README_STARTUP.md companion api_darkherd_* roster cite api_darkherd_costs_provider_export (Vision §9 parity); HyperCharts GET /api/darkherd/costs/provider-export forwards query string","asset_tags":"/api/v1/assets/{id}/tags","whitepaper_file":"/api/v1/assets/{asset_id}/whitepapers/{wp_id}/file","tags_aggregate":"/api/v1/tags/aggregate?top=50","analytics_tag_mcap_rollup":"/api/v1/analytics/tags/mcap-rollup?top_tags=40&min_assets=2","analytics_co_tag_pairs":"/api/v1/analytics/tags/co-occurrence?max_pairs=200","analytics_tag_mcap_correlation":"/api/v1/analytics/tags/mcap-correlation?top_tags=40&min_assets=5 — P7 scale correlation slice: point-biserial correlation of tag presence vs latest USD market cap (active assets)","analytics_tag_mcap_multifactor_surface":"/api/v1/analytics/tags/mcap-multifactor-surface?top_tags=40&min_assets=5 — P7 multi-factor correlation surface: tag presence vs mcap/log-mcap/inverse-rank (+ optional log10 circulating supply)","analytics_staging_claim_kind_counts":"/api/v1/analytics/staging/claim-kind-counts?limit=60&include_pending=false","analytics_mcap_histogram_usd":"/api/v1/analytics/mcap/histogram-usd","analytics_mcap_cmc_rank_deciles":"/api/v1/analytics/mcap/cmc-rank-deciles","analytics_communities_tag_overlap_runs":"/api/v1/analytics/communities/tag-overlap-runs?limit=40","analytics_communities_tag_overlap_mcap":"/api/v1/analytics/communities/tag-overlap-mcap?limit_communities=80","analytics_communities_mcap_dislocation_signals":"/api/v1/analytics/communities/mcap-dislocation-signals?min_community_assets=5&max_rows=120 — P7 dislocation signal slice: asset deviation vs persisted community median/mean mcap","analytics_communities_tag_overlap_staging_claims":"/api/v1/analytics/communities/tag-overlap-staging-claims?limit_communities=80&include_pending=false","analytics_communities_tag_overlap_staging_claim_kinds":"/api/v1/analytics/communities/tag-overlap-staging-claim-kinds?top_communities=24&top_kinds_per_community=12&include_pending=false","analytics_communities_tag_overlap_tags":"/api/v1/analytics/communities/tag-overlap-tags?top_communities=24&top_tags_per_community=24","analytics_communities_tag_overlap_louvain":"/api/v1/analytics/communities/tag-overlap-louvain?max_assets=2000&resolution=1&tag_fanout_cap=80","analytics_communities_tag_overlap_leiden":"/api/v1/analytics/communities/tag-overlap-leiden?max_assets=2000&resolution=1&tag_fanout_cap=80 — Leiden on SQLite tag overlap (P3ag; read-only)","analytics_neo4j_communities_tag_overlap_louvain":"/api/v1/analytics/neo4j/communities/tag-overlap-louvain?max_assets=2000&resolution=1&tag_fanout_cap=80","analytics_neo4j_communities_tag_overlap_leiden":"/api/v1/analytics/neo4j/communities/tag-overlap-leiden?max_assets=2000&resolution=1&tag_fanout_cap=80 — Leiden on Bolt HAS_TAG overlap (P3ag; read-only)","analytics_communities_tag_overlap_summaries":"/api/v1/analytics/communities/tag-overlap-summaries?run_id=&limit=200","analytics_neo4j_domain_tag_crosstab":"/api/v1/analytics/neo4j/domain-tag-crosstab?top_domains=24&top_tags_per_domain=20","analytics_neo4j_domain_asset_technologies":"/api/v1/analytics/neo4j/domain-asset-technologies?top_domains=24&top_technologies_per_domain=24 — per-domain top :Technology by distinct :Asset via INVOLVES_TECHNOLOGY (P1ar; P3ai)","analytics_neo4j_domain_asset_risks":"/api/v1/analytics/neo4j/domain-asset-risks?top_domains=24&top_risks_per_domain=24 — per-domain top :Risk by distinct :Asset via EXPOSES_RISK (P1ar; P3aj)","analytics_neo4j_domain_claim_technologies":"/api/v1/analytics/neo4j/domain-claim-technologies?top_domains=24&top_technologies_per_domain=24 — per-domain top :Technology on :Claim via INVOLVES_TECHNOLOGY (P1ao; P3ak)","analytics_neo4j_domain_claim_risks":"/api/v1/analytics/neo4j/domain-claim-risks?top_domains=24&top_risks_per_domain=24 — per-domain top :Risk on :Claim via EXPOSES_RISK (P1ao; P3al)","analytics_neo4j_domain_claim_kind_crosstab":"/api/v1/analytics/neo4j/domain-claim-kind-crosstab?top_domains=20&top_kinds_per_domain=16","analytics_neo4j_domain_claimkind_facet_crosstab":"/api/v1/analytics/neo4j/domain-claimkind-facet-crosstab?top_domains=20&top_kinds_per_domain=16","analytics_neo4j_tag_claim_kind_crosstab":"/api/v1/analytics/neo4j/tag-claim-kind-crosstab?top_tags=30&top_kinds_per_tag=12","analytics_neo4j_tag_claimkind_facet_crosstab":"/api/v1/analytics/neo4j/tag-claimkind-facet-crosstab?top_tags=30&top_kinds_per_tag=12","analytics_neo4j_tag_claim_technologies":"/api/v1/analytics/neo4j/tag-claim-technologies?top_tags=30&top_technologies_per_tag=24 — per-tag top :Technology on :Claim via INVOLVES_TECHNOLOGY (P1ao; P3am)","analytics_neo4j_tag_claim_risks":"/api/v1/analytics/neo4j/tag-claim-risks?top_tags=30&top_risks_per_tag=24 — per-tag top :Risk on :Claim via EXPOSES_RISK (P1ao; P3an)","analytics_neo4j_tag_asset_technologies":"/api/v1/analytics/neo4j/tag-asset-technologies?top_tags=30&top_technologies_per_tag=24 — per-tag top :Technology by distinct :Asset via INVOLVES_TECHNOLOGY (P1ar; P3ao)","analytics_neo4j_tag_asset_risks":"/api/v1/analytics/neo4j/tag-asset-risks?top_tags=30&top_risks_per_tag=24 — per-tag top :Risk by distinct :Asset via EXPOSES_RISK (P1ar; P3ap)","analytics_neo4j_tag_pairs_claim_assets":"/api/v1/analytics/neo4j/tag-pairs-claim-assets?max_pairs=200","analytics_neo4j_tag_overlap_community_claims":"/api/v1/analytics/neo4j/tag-overlap-community-claims?limit_communities=80","analytics_neo4j_tag_overlap_community_mcap":"/api/v1/analytics/neo4j/tag-overlap-community-mcap?limit_communities=80","analytics_neo4j_tag_overlap_community_claim_kinds":"/api/v1/analytics/neo4j/tag-overlap-community-claim-kinds?top_communities=24&top_kinds_per_community=12","analytics_neo4j_tag_overlap_community_claimkind_facet_crosstab":"/api/v1/analytics/neo4j/tag-overlap-community-claimkind-facet-crosstab?top_communities=24&top_kinds_per_community=12","analytics_neo4j_tag_overlap_community_tags":"/api/v1/analytics/neo4j/tag-overlap-community-tags?top_communities=24&top_tags_per_community=24","analytics_neo4j_tag_overlap_community_domains":"/api/v1/analytics/neo4j/tag-overlap-community-domains?top_communities=24&top_domains_per_community=16","analytics_neo4j_tag_overlap_community_technologies":"/api/v1/analytics/neo4j/tag-overlap-community-technologies?top_communities=24&top_technologies_per_community=24 — asset :Technology rollups per persisted tag-overlap community (P1ar INVOLVES_TECHNOLOGY; P3ac)","analytics_neo4j_tag_overlap_community_risks":"/api/v1/analytics/neo4j/tag-overlap-community-risks?top_communities=24&top_risks_per_community=24 — asset :Risk rollups per persisted tag-overlap community (P1ar EXPOSES_RISK; P3ad)","analytics_neo4j_tag_overlap_community_claim_technologies":"/api/v1/analytics/neo4j/tag-overlap-community-claim-technologies?top_communities=24&top_technologies_per_community=16 — :Claim INVOLVES_TECHNOLOGY per community (P1ao; P3ae)","analytics_neo4j_tag_overlap_community_claim_risks":"/api/v1/analytics/neo4j/tag-overlap-community-claim-risks?top_communities=24&top_risks_per_community=16 — :Claim EXPOSES_RISK per community (P1ao; P3af)","analytics_neo4j_tag_overlap_community_claim_technology_risk_triples":"/api/v1/analytics/neo4j/tag-overlap-community-claim-technology-risk-triples?limit=60 — (community_id,technology,risk) on same :Claim + asset tag_overlap_community_id (P3bn rollup_scope=tag_overlap_community_asset)","analytics_neo4j_tag_overlap_community_asset_claim_technology_risk_triples":"/api/v1/analytics/neo4j/tag-overlap-community-asset-claim-technology-risk-triples?limit=60 — (community_id,technology,risk) distinct claim hosts + tag_overlap_community_id (P3bz rollup_grain=distinct_asset rollup_scope=tag_overlap_community_asset; P3bn×9b)","analytics_neo4j_tag_overlap_community_domain_claim_technology_risk_triples":"/api/v1/analytics/neo4j/tag-overlap-community-domain-claim-technology-risk-triples?limit=60 — (community_id,domain,technology,risk) on same :Claim + tag_overlap_community_id + tag→Domain (P3bq rollup_scope=tag_overlap_community_domain_tag_paths; P3bj×9b)","analytics_neo4j_tag_overlap_community_domain_asset_claim_technology_risk_triples":"/api/v1/analytics/neo4j/tag-overlap-community-domain-asset-claim-technology-risk-triples?limit=60 — (community_id,domain,technology,risk) distinct claim hosts + tag_overlap_community_id + tag→Domain (P3bx rollup_grain=distinct_asset rollup_scope=tag_overlap_community_domain_tag_paths; P3bq×9b)","analytics_neo4j_tag_overlap_community_domain_claimkind_technology_triples":"/api/v1/analytics/neo4j/tag-overlap-community-domain-claimkind-technology-triples?limit=60 — (community_id,domain,claim_kind,technology) on same :Claim + tag_overlap_community_id + tag→Domain (P3bs rollup_scope=tag_overlap_community_domain_tag_paths; P3bf×9b)","analytics_neo4j_tag_overlap_community_domain_claimkind_risk_triples":"/api/v1/analytics/neo4j/tag-overlap-community-domain-claimkind-risk-triples?limit=60 — (community_id,domain,claim_kind,risk) on same :Claim + tag_overlap_community_id + tag→Domain (P3bs rollup_scope=tag_overlap_community_domain_tag_paths; P3bg×9b)","analytics_neo4j_tag_overlap_community_domain_asset_claimkind_technology_pairs":"/api/v1/analytics/neo4j/tag-overlap-community-domain-asset-claimkind-technology-pairs?limit=60 — (community_id,domain,claim_kind,technology) distinct-asset rollup + tag_overlap_community_id + tag→Domain (P3bv rollup_grain=distinct_asset rollup_scope=tag_overlap_community_domain_tag_paths; P3bf×9b)","analytics_neo4j_tag_overlap_community_domain_asset_claimkind_risk_pairs":"/api/v1/analytics/neo4j/tag-overlap-community-domain-asset-claimkind-risk-pairs?limit=60 — (community_id,domain,claim_kind,risk) distinct-asset rollup (P3bv; P3bg×9b)","analytics_neo4j_tag_overlap_community_tag_claimkind_technology_triples":"/api/v1/analytics/neo4j/tag-overlap-community-tag-claimkind-technology-triples?limit=60 — (community_id,tag,claim_kind,technology) on same :Claim + tag_overlap_community_id + HAS_TAG (P3bt rollup_scope=tag_overlap_community_has_tag_paths; P3bh×9b)","analytics_neo4j_tag_overlap_community_tag_claimkind_risk_triples":"/api/v1/analytics/neo4j/tag-overlap-community-tag-claimkind-risk-triples?limit=60 — (community_id,tag,claim_kind,risk) on same :Claim + tag_overlap_community_id + HAS_TAG (P3bt rollup_scope=tag_overlap_community_has_tag_paths; P3bi×9b)","analytics_neo4j_tag_overlap_community_tag_asset_claimkind_technology_pairs":"/api/v1/analytics/neo4j/tag-overlap-community-tag-asset-claimkind-technology-pairs?limit=60 — (community_id,tag,claim_kind,technology) distinct-asset rollup + tag_overlap_community_id + HAS_TAG (P3bw rollup_grain=distinct_asset rollup_scope=tag_overlap_community_has_tag_paths; P3bh×9b)","analytics_neo4j_tag_overlap_community_tag_asset_claimkind_risk_pairs":"/api/v1/analytics/neo4j/tag-overlap-community-tag-asset-claimkind-risk-pairs?limit=60 — (community_id,tag,claim_kind,risk) distinct-asset rollup (P3bw; P3bi×9b)","analytics_neo4j_tag_overlap_community_tag_claim_technology_risk_triples":"/api/v1/analytics/neo4j/tag-overlap-community-tag-claim-technology-risk-triples?limit=60 — (community_id,tag,technology,risk) on same :Claim + tag_overlap_community_id + HAS_TAG (P3br rollup_scope=tag_overlap_community_has_tag_paths; P3bk×9b)","analytics_neo4j_tag_overlap_community_tag_asset_claim_technology_risk_triples":"/api/v1/analytics/neo4j/tag-overlap-community-tag-asset-claim-technology-risk-triples?limit=60 — (community_id,tag,technology,risk) distinct claim hosts + tag_overlap_community_id + HAS_TAG (P3by rollup_grain=distinct_asset rollup_scope=tag_overlap_community_has_tag_paths; P3br×9b)","analytics_neo4j_tag_overlap_community_asset_technology_risk_triples":"/api/v1/analytics/neo4j/tag-overlap-community-asset-technology-risk-triples?limit=60 — (community_id,technology,risk) on same :Asset + tag_overlap_community_id (P3bo rollup_scope=tag_overlap_community_asset; P3av)","analytics_neo4j_tag_overlap_community_domain_asset_technology_risk_triples":"/api/v1/analytics/neo4j/tag-overlap-community-domain-asset-technology-risk-triples?limit=60 — (community_id,domain,technology,risk) on same :Asset + tag_overlap_community_id + tag→Domain (P3bp rollup_scope=tag_overlap_community_domain_tag_paths; P3bl×9b)","analytics_neo4j_domain_tag_overlap_communities":"/api/v1/analytics/neo4j/domain-tag-overlap-communities?top_domains=24&top_communities_per_domain=16","analytics_neo4j_tag_overlap_community_domain_mcap":"/api/v1/analytics/neo4j/tag-overlap-community-domain-mcap?limit_pairs=200","analytics_neo4j_claim_kind_counts":"/api/v1/analytics/neo4j/claim-kind-counts?limit=60","analytics_neo4j_claim_kind_facet_counts":"/api/v1/analytics/neo4j/claim-kind-facet-counts?limit=60","analytics_neo4j_claim_technology_counts":"/api/v1/analytics/neo4j/claim-technology-counts?limit=60 — global :Technology histogram on promoted :Claim via INVOLVES_TECHNOLOGY (P1ao; P3aq)","analytics_neo4j_claim_risk_counts":"/api/v1/analytics/neo4j/claim-risk-counts?limit=60 — global :Risk histogram on promoted :Claim via EXPOSES_RISK (P1ao; P3ar)","analytics_neo4j_asset_technology_counts":"/api/v1/analytics/neo4j/asset-technology-counts?limit=60 — global :Technology histogram on :Asset via INVOLVES_TECHNOLOGY (P1ar; P3as)","analytics_neo4j_asset_risk_counts":"/api/v1/analytics/neo4j/asset-risk-counts?limit=60 — global :Risk histogram on :Asset via EXPOSES_RISK (P1ar; P3at)","analytics_neo4j_asset_technology_risk_pairs":"/api/v1/analytics/neo4j/asset-technology-risk-pairs?limit=60 — (:Technology,:Risk) pairs on same :Asset (P1ar; P3av)","analytics_neo4j_claim_technology_risk_pairs":"/api/v1/analytics/neo4j/claim-technology-risk-pairs?limit=60 — (:Technology,:Risk) pairs on same :Claim (P1ao; P3aw)","analytics_neo4j_claim_claimkind_technology_pairs":"/api/v1/analytics/neo4j/claim-claimkind-technology-pairs?limit=60 — (:ClaimKind,:Technology) pairs on same :Claim via HAS_KIND+INVOLVES_TECHNOLOGY (P1v+P1ao; P3ay)","analytics_neo4j_claim_claimkind_risk_pairs":"/api/v1/analytics/neo4j/claim-claimkind-risk-pairs?limit=60 — (:ClaimKind,:Risk) pairs on same :Claim via HAS_KIND+EXPOSES_RISK (P1v+P1ao; P3az)","analytics_neo4j_asset_claimkind_technology_pairs":"/api/v1/analytics/neo4j/asset-claimkind-technology-pairs?limit=60 — (claim_kind,technology) ranked by distinct :Asset hosting a matching :Claim (P1v+P1ao; P3bb rollup_grain=distinct_asset)","analytics_neo4j_asset_claimkind_risk_pairs":"/api/v1/analytics/neo4j/asset-claimkind-risk-pairs?limit=60 — (claim_kind,risk) distinct-asset rollup (P1v+P1ao; P3bc)","analytics_neo4j_tag_overlap_community_asset_claimkind_technology_pairs":"/api/v1/analytics/neo4j/tag-overlap-community-asset-claimkind-technology-pairs?limit=60 — (community_id,claim_kind,technology) distinct-asset rollup on claim hosts with tag_overlap_community_id (P3bu rollup_scope=tag_overlap_community_asset; P3bb×9b)","analytics_neo4j_tag_overlap_community_asset_claimkind_risk_pairs":"/api/v1/analytics/neo4j/tag-overlap-community-asset-claimkind-risk-pairs?limit=60 — (community_id,claim_kind,risk) distinct-asset rollup (P3bu rollup_scope=tag_overlap_community_asset; P3bc×9b)","analytics_neo4j_domain_claimkind_technology_pairs":"/api/v1/analytics/neo4j/domain-claimkind-technology-pairs?limit=60 — (domain,claim_kind,technology) triples on same :Claim with HAS_KIND+INVOLVES_TECHNOLOGY+asset tag→Domain paths (P1y×P3ay; P3bf rollup_scope=domain_tag_paths)","analytics_neo4j_domain_claimkind_risk_pairs":"/api/v1/analytics/neo4j/domain-claimkind-risk-pairs?limit=60 — (domain,claim_kind,risk) triples with HAS_KIND+EXPOSES_RISK+tag→Domain (P1y×P3az; P3bg)","analytics_neo4j_tag_claimkind_technology_pairs":"/api/v1/analytics/neo4j/tag-claimkind-technology-pairs?limit=60 — (tag,claim_kind,technology) triples with HAS_KIND+INVOLVES_TECHNOLOGY+asset HAS_TAG (P1z×P3ay; P3bh rollup_scope=asset_has_tag_paths)","analytics_neo4j_tag_claimkind_risk_pairs":"/api/v1/analytics/neo4j/tag-claimkind-risk-pairs?limit=60 — (tag,claim_kind,risk) triples with HAS_KIND+EXPOSES_RISK+HAS_TAG (P1z×P3az; P3bi)","analytics_neo4j_domain_claim_technology_risk_triples":"/api/v1/analytics/neo4j/domain-claim-technology-risk-triples?limit=60 — (domain,technology,risk) on same :Claim + tag→Domain (P1y×P3aw; P3bj rollup_scope=domain_tag_paths)","analytics_neo4j_tag_claim_technology_risk_triples":"/api/v1/analytics/neo4j/tag-claim-technology-risk-triples?limit=60 — (tag,technology,risk) on same :Claim + HAS_TAG (P1z×P3aw; P3bk rollup_scope=asset_has_tag_paths)","analytics_neo4j_domain_asset_technology_risk_triples":"/api/v1/analytics/neo4j/domain-asset-technology-risk-triples?limit=60 — (domain,technology,risk) on same :Asset + tag→Domain (P1y×P3av; P3bl rollup_scope=domain_tag_paths)","analytics_neo4j_tag_asset_technology_risk_triples":"/api/v1/analytics/neo4j/tag-asset-technology-risk-triples?limit=60 — (tag,technology,risk) on same :Asset + HAS_TAG (P1z×P3av; P3bm rollup_scope=asset_has_tag_paths)","analytics_neo4j_tag_claim_exposure":"/api/v1/analytics/neo4j/tag-claim-exposure?top_tags=40","graph_status":"/api/v1/graph/status","graph_summary":"/api/v1/graph/summary — … involves_technology/exposes_risk totals + involves_technology_from_claim|involves_technology_from_asset_tag|exposes_risk_from_claim|exposes_risk_from_asset_tag (P1at split; P1ao/P1ar)","cli_repair_claim_kind_graph":"python -m app.jobs.repair_claim_kind_graph --help","cli_repair_claim_ontology_edges":"python -m app.jobs.repair_claim_ontology_edges — refresh Claim→Technology/Risk edges from ontology/facets_v0.json (P1ao)","cli_repair_asset_tag_ontology_edges":"python -m app.jobs.repair_asset_tag_ontology_edges [--limit N] [--include-archived] — refresh Asset→Technology/Risk from SQLite tags + facets_v0 (P1ar/P1as)","cli_reconcile_coingecko_stale":"python -m app.jobs.reconcile_coingecko_stale [--limit N] [--asset-offset N] [--neo4j-sync] — **P1bn** CoinGecko /coins/{id} probe; archive active source=coingecko rows on HTTP 404 (public API; rate limits may stop batch)","cli_neo4j_sync_archived":"python -m app.jobs.neo4j_sync_archived [--limit N] [--asset-offset N] — **P1bq** bounded SQLite corpus_tier=archived slice → Neo4j sync_assets_by_ids (NEO4J_URI + driver)","cli_append_rollback_checkpoint":"python -m app.jobs.append_rollback_checkpoint [--label …] [--state-digest …] [--correlation-id …] [--capture-ontology-facets-v0-fp] [--capture-ontology-facets-v0-snapshot] — **P4cd**/**P4bh**/**P4cj** bounded SQLite ``orchestration_rollback_checkpoints`` row (same gates as POST …/rollback-checkpoint-append; **P7k** kind ``append_rollback_checkpoint``)","graph_domains":"/api/v1/graph/domains","graph_claim_kinds":"/api/v1/graph/claim-kinds?limit=500","graph_ontology_facets_v0":"/api/v1/graph/ontology-facets-v0 — seeded :Technology / :Risk names (ontology/facets_v0.json); optional JSON ontology_template_id|ontology_template_label + ontology_catalog_sizes{technologies,risks} + ontology_facets_v0_fp disk sidecar (P6m; mirrors Graphiti envelope template fields); optional ontology_bundle_manifest from ontology/manifest_v0.json files[] with file_fp per listed path (P6p); optional ontology_bundle_roles sorted unique files[].role strings (P6r; mirrors structured_episode_envelope_v0 JSON); optional ontology_narrative_template_meta from first manifest files[].role episode_narrative_template row + bounded file preview (P6s; mirrors structured_episode_envelope_v0 ontology_narrative_template_* keys); scripts/smoke_darkherd.sh jq asserts technologies|risks|ontology_template_id|ontology_catalog_sizes|ontology_facets_v0_fp + ontology_bundle_manifest bundle + ontology_bundle_roles array + ontology_narrative_template_meta object (P6n+P6p+P6r+P6s; runbook 8c); HyperCharts GET /api/darkherd/graph/ontology-facets-v0 (P6o; same-origin graph proxy as /api/darkherd/graph/<path>); P6q portal/graph/dashboard/admin/gate HTML + lockdown 403 echo P6p bundle fields alongside P6m|P6j|P6r|P6s; GET /api/v1/meta|HyperCharts GET /api/darkherd/meta exposes endpoints.operator_readme_startup (§9 README_STARTUP + README Execution progress checklist 2 smoke-header README checklist 3; matches endpoints.page_portal)","search_chunks":"/api/v1/search/chunks?q=","search_semantic":"/api/v1/search/semantic?q=","graphiti_status":"/api/v1/graphiti/status — graphiti_enabled, graphiti_server_reachable, detail; HyperCharts GET /api/darkherd/graphiti/status (P6a); P6b HTML + page_* meta echoes on /graph /dashboard /admin + admin_gate; P6c lockdown 403 _html_lockdown_denied + html_lockdown_signin_next meta echo; P6f extends P6c lockdown HTML + html_lockdown_signin_next with endpoints.graphiti_episodes + POST /messages ingest cue; sibling POST /api/v1/graphiti/search (endpoints.graphiti_search, P6d); sibling meta endpoints.graphiti_episodes for server-side POST /messages ingest (P6e); P6h operator HTML + lockdown 403 echo P6g facets_v0 episode fingerprint; P6j same surfaces echo P6i darkherd_episode_v0 JSON prefix; P6k ontology_facets_v0_fp inside envelope JSON (facets_v0_fingerprint_for_episodes); P6m optional ontology_template_id + ontology_catalog_sizes (+ ontology_template_label) in same envelope from ontology/facets_v0.json + endpoints.graph_ontology_facets_v0 HTTP sidecar; P6p optional ontology_bundle_version + ontology_bundle_fp from ontology/manifest_v0.json (ontology_bundle_revision_for_episodes); P6q portal/graph/dashboard/admin/gate HTML + lockdown 403 + page_* meta echo P6p bundle fields; P6r ontology_bundle_roles on GET ontology-facets-v0 + envelope JSON; P6s optional ontology_narrative_template_id|ontology_narrative_template_fp|ontology_narrative_template_preview in envelope JSON + GET ontology-facets-v0 ontology_narrative_template_meta; P6t structured_episode_envelope_v0 drops optional envelope keys in order then trims ontology_bundle_roles tail so the JSON line stays within cap without mid-string truncation; upstream Graphiti /healthcheck when enabled; GET /api/v1/meta|HyperCharts GET /api/darkherd/meta exposes endpoints.operator_readme_startup (§9 README_STARTUP + README Execution progress checklist 2 smoke-header README checklist 3; matches endpoints.page_portal)","graphiti_search":"endpoints.graphiti_search — POST /api/v1/graphiti/search — JSON {query, max_facts?}; returns graphiti_enabled, detail, facts[] (Graphiti POST /search; P6d); same lockdown gate as POST /api/v1/chat (require_admin_when_lockdown); HyperCharts POST /api/darkherd/graphiti/search (authenticated); GET /api/v1/meta|HyperCharts GET /api/darkherd/meta exposes endpoints.operator_readme_startup (§9 README_STARTUP + README Execution progress checklist 2 smoke-header README checklist 3; matches endpoints.page_portal)","graphiti_episodes":"endpoints.graphiti_episodes — no DarkHerd browser route: DarkHerd server POSTs Graphiti upstream POST /messages (group_id + messages[]) via graphiti_http.post_messages + graphiti_episodes.py (202 Accepted worker queue). Emitted on ingest (asset/snapshot/whitepaper paths) + staging promote when emit_graphiti; optional replay POST /api/v1/admin/ingest/incremental graphiti_episode_replay (P6e); P6l GET /api/v1/meta endpoints.admin_incremental_ingest documents replay JSON post_ingest.graphiti.episodes_replayed vs skip; episode bodies start with JSON envelope structured_episode_envelope_v0 schema darkherd_episode_v0 + episode_kind + ontology_facets_v0_fp from facets_v0_fingerprint_for_episodes (P6i structured episodes; P6k ontology revision in JSON; P6m optional ontology_template_id + ontology_catalog_sizes + ontology_template_label from ontology/facets_v0.json; P6p optional ontology_bundle_version + ontology_bundle_fp from ontology/manifest_v0.json); episode bodies append ontology/facets_v0.json fingerprint (facets_v0_fingerprint_for_episodes in ontology_facets_v0.py; P6g temporal↔analytical correlation); P6h portal/graph/dashboard/admin/gate HTML + lockdown 403 fourth paragraph echo P6g for operators; P6j same operator HTML + lockdown 403 echo P6i JSON prefix + P6k envelope field; P6q same surfaces echo P6p ontology_bundle_version|ontology_bundle_fp + GET ontology-facets-v0 ontology_bundle_manifest; P6r optional ontology_bundle_roles in envelope + GET ontology-facets-v0; P6s optional ontology_narrative_template_id|ontology_narrative_template_fp|ontology_narrative_template_preview in envelope + GET ontology-facets-v0 ontology_narrative_template_meta; P6t envelope compaction (800-char cap) drops optional keys in fixed order before last-resort slice; vision P6 structured episodes","milestone_v1_release_gate":"scripts/v1_release_gate.sh — **P7zaqd** local runner for **plan/MILESTONE_V1_SCOPE.md** V1.0 exit checks: **`--pytest-only`** (**P7zaqh**) runs `PYTHONPATH=. pytest -q` alone (no Docker/kubeconform bootstrap; incl. **P7zaqg** `bash -n` on every `scripts/*.sh`). **`--pytest-milestones-only`** (**P7zasz**) runs `pytest -q` on `tests/test_milestone_v*_gate_*.py` only (§10.1 HTTP milestone gates **P1vca**…**P7vca** — faster operator slice; **not** a substitute for **§1** full suite or **P7zaqg**). Full gate: `pytest` + the same `docker compose … config -q` merges as CI **compose-validate** via **`--compose-only`** (**P7zaqe** — incl. **P7zaoz** queue-worker + postgres merge + **graphiti**) + **`kubeconform`** on **`deploy/kubernetes/`** (**P7zaqo** — offline schema; default **KUBECONFORM_KUBERNETES_VERSION** **1.31.0**; bootstrap via **curl**/**tar** to `.cache/` when **kubeconform** not on PATH); CI **kubernetes-validate** uses **`--kubernetes-only`** (**P7zaqf** — **P7zanw**/**P7zanx**/**P7zanz**/**P7zaob**/**P7zaoc** sample tree); optional `--with-docker` runs `docker compose build darkherd` with `GIT_COMMIT`/`BUILD_DATE` and **jq** OCI label assertions (**P7zapa**/**P7zapb**). **`--help`** / **`-h`** prints the same operator-facing usage (stdout, exit 0 — **P7zaqr**). **P7zasv** — milestone doc **Shipment discipline**: tagging **`v1.0.x`** follows binary **P7zaqc** criteria (roadmap **Partial** ≠ blocking backlog). Not an HTTP route — discoverability via this `endpoints.*` string on `GET /api/v1/meta` only.","insights_summary":"/api/v1/insights/summary — portal JSON; **P7zaoi** ``database_dialect`` + ``p7zaoi`` (SQLAlchemy engine name — parity **P7zaoe** ``GET /api/v1/ready`` ``checks.database.dialect`` + **P7zaoh** ``GET /metrics`` ``darkherd_database_up{dialect}``); domains_source neo4j_cypher|graphiti_search|sqlite_tag_themes|none (label UI panels; neo4j_domains rows may be Bolt Cypher, Graphiti /search, or SQLite themes — P3cb); direct Graphiti fact retrieval also POST /api/v1/graphiti/search (endpoints.graphiti_search, P6d); GET /api/v1/meta → endpoints.graphiti_episodes documents Graphiti POST /messages server episode ingest (distinct from graphiti_search facts; P6f complements P6e; P6m optional ontology_template_id|ontology_catalog_sizes in darkherd_episode_v0 envelope + endpoints.graph_ontology_facets_v0; P6p optional ontology_bundle_version|ontology_bundle_fp + ontology_bundle_manifest cross-ref; P6q+P6r+P6s operator HTML+403 echo ontology_bundle_roles + ontology_narrative_template_meta); legacy neo4j_enabled = Bolt driver present; tag_overlap_community_latest_run_id|persisted_at|assets_in_run|summaries_stored (P3ca+P3cc); **P4ci** orchestration_rollback_readiness (p4cg + supervisor_enqueue_append_rollback_checkpoint — parity **P4ch**/**P4cg**); **P4cm** same object adds p4cj_snapshot_wired + p4cj_restore_http_wired (parity **GET …/rollback-checkpoints-status** **P4cj** gates); **P4cq** analytical_refresh_policy (Vision §5.2 ``scheduled_full_rebuild_interval_days`` + ``max_active_corpora_assets_hint`` from ``constitution/invariants.json`` — parity **GET …/orchestration/status**); **P4db** ``supervisor_wired`` + ``supervisor_graph_invoke_enabled`` + ``p4db`` (parity **GET …/orchestration/status** **P4cz** / **P4ay** invoke prerequisites); **P4dh** ``supervisor_bound_tools`` + ``supervisor_mutating_bound_tool_job_classes`` + ``p4bc`` + ``p4cb`` (parity **GET …/orchestration/status** **P4bc**/**P4cb** — bound-tool governance for **P4ba**/**P4bb**); optional **P5cj** ontology_patch_graph_followup when latest ontology.patch.applied wrote facets_v0 (graph_followup_hint parity **P5c**); GET /api/v1/orchestration/status mirrors **P5co**/**P5cn** for the same two optional keys; optional **P5cm** ontology_patch_neo4j_followup_auto_enqueue (newest ontology.patch.neo4j_followup_auto_enqueued audit — **P5ck**/**P5cl** jobs[] echo + **P5cq** enqueue_neo4j_sync_graph_constraints|enqueue_neo4j_sync_graph_assets|enqueue_repair_claim_ontology_edges booleans); **P7kg** ``analytical_global_refresh_admin_job_runs`` newest bounded ``AdminJobRun`` rows for Vision §5.2 global refresh kinds (``refresh_tag_overlap_communities``, ``summarize_tag_overlap_communities``, ``tag_overlap_publish_pipeline``, ``rebuild_tag_overlap_full``) — **/portal** Summary table on load + **/admin** ``btn-p7kg-refresh-trace`` JSON panel (same field; ``sameOriginApiPath`` **P7xq** on HyperCharts); **P7zki** ``worker_jobs_rows_by_status`` + ``p7zki`` (SQLite ``worker_jobs`` counts by ``status`` — JSON parity ``darkherd_worker_jobs_rows`` on ``GET /metrics`` **P7zf**); **P7zfq** ``/portal`` Summary appends ``/admin#p7-worker-queue`` when ``failed>0`` (pairs **P7zkk**); **P2zy** ``staging_claims_rows_by_status`` + ``p2zy`` (SQLite ``staging_claims`` counts by ``status`` — JSON parity ``darkherd_staging_claims_rows`` on ``GET /metrics`` **P7zf**); **P2vft** ``/portal`` Summary appends ``/admin#p2-staging-claims`` when ``staging_claims_rows_by_status.failed>0`` (pairs **P2zy**); **P2zb** ``extract_claims_staging_worker_jobs_rows_by_status`` + ``p2zb`` (``worker_jobs`` depth for ``kind=extract_claims_staging`` — JSON parity ``darkherd_extract_claims_staging_worker_jobs_rows`` on ``GET /metrics`` **P7zf**); **P2vdi** ``extract_claims_corpus_sweep_pages_total`` + ``p2vdi`` (**P2vdh** **P2vcz** corpus-sweep batches — process-local JSON parity ``darkherd_extract_claims_corpus_sweep_pages_total`` on ``GET /metrics`` **P7zf**); **P7zkk** ``/portal`` Summary ``p7zkiStrip`` (beside **P3ds** — **P4de** parity **/graph**/**/dashboard** footers); **P3ds** ``p3ds_global_refresh_autoschedule_metrics`` (**P3dr** outcome + tick-exception totals — JSON parity ``GET /metrics``); **P4dc** ``/portal`` footer + Summary ``load()`` strip surfaces **P4db** supervisor invoke booleans (parity **P4cz**/**P4da**) + **P4dj** bound-tool strip for **P4dh**/**P4di**; **P5ct** portal.html ``btn-portal-p5-graph-followup-echo`` compares ``ontology_patch_graph_followup`` JSON between this GET and ``GET /api/v1/orchestration/status`` (**P5cj** vs **P5co**/**P5cn**, mirrors /admin **P5cr** neo4j slice); HyperCharts GET /api/darkherd/insights/summary (P3cb proxy); GET /api/v1/meta|HyperCharts GET /api/darkherd/meta exposes endpoints.operator_readme_startup (§9 README_STARTUP + README Execution progress checklist 2 smoke-header README checklist 3; matches endpoints.page_portal)","operator_readme_startup":"endpoints.operator_readme_startup — hyperdata/README_STARTUP.md optional DarkHerd paragraph for HyperCharts Gunicorn operators (Vision §9 item 6 cross-service operator docs); **Smoke script header** + **Runbook spine (§6)** parity with scripts/smoke_darkherd.sh (plan/EXECUTION_PROGRESS.md deployment **2c** (**P7zko**) + 8c/10/10l + README.md checklist item 4 — **P7zkp** Meta discoverability: **P7kd** drainer required; **P7zn**–**P7zx** /admin + **P7zki** read-only depth beside **P7zkm**); **P7zkv**/**P7zkw**/**P7zkx**/**P7zky** Vision §5.4 read scaling — plan/EXECUTION_PROGRESS.md runbook **2d** + endpoints.read_scaling + scripts/bench_read_paths.sh + plan/DEVELOPMENT_PROCESS.md §9 read-scaling gate (not Vision §9 protocol) + INTEGRATION.md *Endpoints to wire* + hyperdata/README_STARTUP.md **Meta discoverability** + smoke jq lock; pairs README.md Operator verification (DarkHerd + HyperCharts spine) + INTEGRATION.md Operator smoke and plan runbooks; README.md **Execution progress** — checklist **2** smoke-header **README checklist 3** forward pointer; Vision §9 operator checklist **2** bridge; EXECUTION_PROGRESS 8c/10/10l Operator spine rows + smoke header append INTEGRATION Endpoints GET /api/darkherd/meta after verbatim Cross-read (Vision §9 item 6; pairs VISION §9 static checks + INTEGRATION Operator smoke + README Execution progress + hyperdata/web/app.py Cross-read docstrings); INTEGRATION *Endpoints* GET /api/darkherd/meta table row + Flask hyperdata/web/app.py api_darkherd_* **P0** test_execution_progress_meta_operator_readme_startup_artifact_row_documents_runbook_meta_bridge (plan/EXECUTION_PROGRESS.md Meta operator_readme_startup vs live; companion tests/test_meta_viz_hints.py::test_meta_operator_readme_startup_mentions_section_9 for live JSON); Vision §9 Primary operator entry points: INTEGRATION Operator smoke + README_STARTUP Meta discoverability (**P4dj** HTML strips on /portal Summary + /graph + /dashboard + lockdown 403 echo **P4dh** insights + **P4di** meta-first **P4bc**/**P4cb** beside **P4db**; **P3dv**/**P3dw**/**P3ds**/**P3dr**/**P3du** autoschedule metrics p3ds_global_refresh_autoschedule_metrics + GET /metrics + admin — **P4de**; **P7zki**/**P7zkk**/**P7zkl** worker queue depth on GET /api/v1/insights/summary (worker_jobs_rows_by_status + p7zki — parity darkherd_worker_jobs_rows on **P7zf** GET /metrics; **P7zkk** /portal + /graph + /dashboard; **P7zkl** lockdown 403 html_lockdown_signin_next smoke jq — **P4dd**)) + README Execution progress checklist 2/4 echo (hyperdata/web/darkherd_proxy.py module doc + scripts/smoke_darkherd.sh header #); **P7zani** — **P7zang**/**P7zangh**/**P7zand**/**P7zane**: ``endpoints.rate_limit_policy`` + optional ``DARKHERD_RATE_LIMIT_TRUST_FORWARDED_FOR`` + HyperCharts ``darkherd_proxy`` forwards bounded ``X-Forwarded-For`` so **P7a** client keys reflect trusted reverse-proxy hops; default limit paths include **GET** ``/api/v1/insights/summary`` (**P7zand**); HyperCharts ``GET /api/darkherd/insights/summary`` proxy docstring (**P7zane**); **P7iy** mirrors **P7ix**: HyperCharts index.html DarkHerd tab same-origin /darkherd/admin-gate + /darkherd/admin (endpoints.hypercharts_admin_console meta spine; smoke jq P7iy+P7ix+index.html+P7iz); **P7iz** same tab adds GET /api/darkherd/meta (HyperCharts JSON index; smoke jq locks P7iz on operator_readme_startup + hypercharts_admin_console). **P7je** cost-hints meta bridge: cites **P7jc** admin.html btn-costs-hints + **P7jd** admin_gate.html btn-gate-costs-hints + portal.html btn-portal-costs-hints + portal.html btn-portal-orchestration-status (**P7jo** GET /api/v1/orchestration/status snapshot) + btn-portal-tool-adapters-status (**P7jp** GET /api/v1/orchestration/tool-adapters-status **P4q**/**P4cs** registry snapshot) + btn-portal-ready-shallow + btn-portal-ready-deep (**P7jq** GET /api/v1/ready shallow + **P7ze** deep=true Bolt probe when configured) + btn-portal-rollback-checkpoints-status (**P7jr** GET /api/v1/orchestration/rollback-checkpoints-status **P4v**/**P4bh**/**P4cg**) + btn-portal-rollback-checkpoints-list (**P7ju** GET /api/v1/orchestration/rollback-checkpoints **P4bk**) + portal-rb-cp-id + btn-portal-rollback-checkpoint-get (**P7ju** GET /api/v1/orchestration/rollback-checkpoints/{checkpoint_id} **P4bl**) + btn-portal-health + portal-health-msg + portal-health-out (**P7jv** GET /health **P7zz**) + btn-portal-metrics + portal-metrics-msg + portal-metrics-out (**P7jv** GET /metrics **P7zf**/**P7zg**) + btn-portal-meta + portal-meta-msg + portal-meta-out (**P7jw** GET /api/v1/meta full JSON **P7iz** ``GET /api/darkherd/meta`` companion) + btn-portal-supervisor-smoke / btn-portal-supervisor-tool-round-smoke / btn-portal-dry-run-apply-preview / btn-portal-routing-preview / btn-portal-routing-preview-p4bn (**P7jt** GET supervisor-smoke + supervisor-tool-round-smoke + dry-run-apply-preview + routing-preview + ``?job_class=wide_restructure`` **P4bn**) + btn-portal-ontology-patch-head / btn-portal-facets-catalog-status (**P7js** GET /api/v1/orchestration/ontology-patch-head + GET /api/v1/orchestration/facets-catalog-status **P5b**/**P5d**/**P5e**/**P4ad**) + **P7jb** GET /api/v1/costs/summary provider_export_hints + same-origin GET /api/darkherd/costs/summary (smoke jq extends operator_readme_startup P7iy block with P7je+P7jc+P7jd); **P7jg** admin.html btn-costs-export-darkherd + admin_gate.html btn-gate-costs-export-darkherd → GET /api/v1/costs/provider-export?provider=darkherd (**P7zc**; HyperCharts GET /api/darkherd/costs/provider-export; index.html DarkHerd tab link); **P7jj** portal.html btn-portal-costs-export-mistral|openai|anthropic|deepseek|openrouter|stability|replicate|huggingface|darkherd (**P7jn** wirePortalCostsProviderExport) + admin.html btn-costs-export-mistral|openai|anthropic|deepseek|openrouter|stability|replicate|huggingface + admin_gate.html btn-gate-costs-export-mistral|openai|anthropic|deepseek|openrouter|stability|replicate|huggingface (**P7j**/**P7y**/**P7zd**/**P7jl**/**P7zal**/**P7zas**/**P7zat**/**P7zau**) + index.html mistral|openai|anthropic|deepseek|openrouter|stability|replicate|huggingface provider-export anchors (wireAdminCostsProviderExport / wireGateCostsProviderExport / wirePortalCostsProviderExport; darkherd buttons remain **P7jg**); **P7jk** README checklist **3** + README_STARTUP companion roster cite ``api_darkherd_costs_provider_export`` beside **P7jj** (``endpoints.costs_provider_export`` meta echoes the same lock); **P7jh** live GET /api/v1/meta (+ HyperCharts GET /api/darkherd/meta) adds top-level worker_job_kinds + worker_job_kinds_count + endpoints.worker_job_kinds_registry (app.schemas.worker_job_payload.WORKER_JOB_KINDS parity with POST …/admin/maintenance/queue-worker-job; smoke jq P7jh); **P7ji** admin.html btn-worker-job-kinds + admin_gate.html btn-gate-worker-job-kinds → GET /api/v1/meta worker_job_kinds (**P7jh**; sameOriginApiPath **P7xq**); hyperdata/web/templates/index.html DarkHerd tab **P7ji** operator cue","page_portal":"/portal — HTML insights; **P7zkz** portal.html ``btn-portal-p7-mcap-correlation`` / ``btn-portal-p7-mcap-multifactor-surface`` / ``btn-portal-p7-mcap-dislocation-signals`` + ``portal-p7-sqlite-analytics-out`` (SQLite tag/community mcap analytics — Vision §1.10); footer links /graph presets (corpus_scope, viz_mode P1am; client slim P1az + active-tier P1au P1ba); /graph + /dashboard hint cross-links for operators (P1bb); /portal footer points to /graph + /dashboard for full URL vocab docs (P1bc); /portal footer bounded Assets maintenance on /dashboard cites P1bn P1bq + endpoints.admin_reconcile_coingecko_stale_archive + endpoints.admin_sync_archived_assets_neo4j + HyperCharts POST companions + P7k enqueue on /admin P1bp+P1bq cards (P1bs); /graph + /dashboard cite GET /api/v1/meta endpoint keys (P1be); /portal footer lists endpoints.page_portal + endpoints.page_analytical_graph + endpoints.page_dashboard (same tokens as /graph + /dashboard — P1bf); **P2vfn** when ``GET /api/v1/insights/summary`` ``staging_claims_rows_by_status.pending>0``, portal Summary appends link ``/admin#p2-staging-claims`` (``admin.html`` h2 id — pairs **P2zy**); **P2vft** when ``staging_claims_rows_by_status.failed>0``, portal Summary appends **Review failed staging claims on /admin** → ``/admin#p2-staging-claims`` (pairs **P2zy**); **P2vfo** when ``extract_claims_staging_worker_jobs_rows_by_status.queued+running>0``, portal Summary appends ``/admin#p2-extract-staging`` (``admin.html`` h3 id — pairs **P2zb**); **P7zfq** when ``worker_jobs_rows_by_status.failed>0``, portal Summary appends ``/admin#p7-worker-queue`` (``admin.html`` h2 id — pairs **P7zki**); footer + this string cite GET /api/v1/orchestration/status + endpoints.orchestration_status on GET /api/v1/meta (P4am); footer cross-links /graph+/dashboard orchestration lines (P4ao) + /admin (P4an) — P4ap; footer cites GET /api/v1/insights/summary + endpoints.insights_summary for domains_source ladder + **P4ci**/**P4cm** orchestration_rollback_readiness (p4cg + p4cj_snapshot_wired + p4cj_restore_http_wired + supervisor_enqueue_append_rollback_checkpoint — parity **P4ch**/**P4cg** + **GET …/rollback-checkpoints-status** **P4cj** with GET /api/v1/orchestration/status) + **P4cq** analytical_refresh_policy (Vision §5.2 — same JSON object as **GET …/orchestration/status**) + **P4db**/**P4dc** ``supervisor_wired`` + ``supervisor_graph_invoke_enabled`` + ``p4db`` on GET …/insights/summary (footer + Summary strip — parity **P4cz**/**P4da**) + **P4dj** Summary ``load()`` strip for **P4dh** bound-tool fields (beside **P4db**; meta **P4di**) + optional **P5cj** ontology_patch_graph_followup (Neo4j materialization hints after **P5e** facets disk apply) + optional **P5cm**/**P5cq** ontology_patch_neo4j_followup_auto_enqueue (**P5ck**/**P5cl** audit echo + enqueue_* booleans) + **P5co**/**P5cn** same two keys on GET /api/v1/orchestration/status + HyperCharts /api/darkherd/insights/summary proxy (P3cb); /portal Summary ``load()`` parallel-fetches ``GET /api/v1/meta`` for **P3dq** **P3dp** autoschedule strip (`global_refresh_autoschedule_enabled`, `global_refresh_autoschedule_tick_s`, `global_refresh_autoschedule_bootstrap`, `p3do_autoschedule_effective` vs constitution ``autoschedule_enqueue_pipeline_wired`` — optional **P3do** API enqueue; **P7k** ``queue_worker`` drains); **P3ds** ``p3ds_global_refresh_autoschedule_metrics`` from ``GET …/insights/summary`` (**P3dr** JSON snapshot); /portal Summary ``load()`` parallel-fetches ``GET /api/v1/meta`` for **P3dq** **P3dp** autoschedule strip (`global_refresh_autoschedule_enabled`, `global_refresh_autoschedule_tick_s`, `global_refresh_autoschedule_bootstrap`, `p3do_autoschedule_effective` vs constitution ``autoschedule_enqueue_pipeline_wired`` — optional **P3do** API enqueue; **P7k** ``queue_worker`` drains); /portal Summary loads **P7kg** ``analytical_global_refresh_admin_job_runs`` bounded table (same JSON field); /admin ``btn-p7kg-refresh-trace`` reloads that slice for operators; **P7zaoi** Summary strip renders ``database_dialect`` (**P7zaoe** ``GET /api/v1/ready`` + **P7zaoh** ``GET /metrics`` ``darkherd_database_up{dialect}``); **P7zkk** Summary strip renders ``worker_jobs_rows_by_status`` (**P7zki** — parity ``darkherd_worker_jobs_rows`` on ``GET /metrics`` **P7zf**); **P2zy** Summary strip renders ``staging_claims_rows_by_status`` (parity ``darkherd_staging_claims_rows`` on ``GET /metrics`` **P7zf**); **P2zb** Summary strip renders ``extract_claims_staging_worker_jobs_rows_by_status`` (**P7p** ``worker_jobs`` kind — parity ``darkherd_extract_claims_staging_worker_jobs_rows`` on ``GET /metrics`` **P7zf**); **P2vdi** Summary strip renders ``extract_claims_corpus_sweep_pages_total`` + ``p2vdi`` (**P2vdh** **P2vcz** — parity ``darkherd_extract_claims_corpus_sweep_pages_total`` on ``GET /metrics`` **P7zf**); /portal section btn-portal-p5-graph-followup-echo compares ontology_patch_graph_followup JSON between GET …/insights/summary and GET …/orchestration/status (**P5ct** — **P5cj**/**P5co**/**P5cn** parity strip, mirrors /admin **P5cr** pattern for neo4j slice); **P7jo** ``btn-portal-orchestration-status`` + ``portal-orchestration-status-out`` one-click ``GET /api/v1/orchestration/status`` JSON (**P4am** read-only snapshot on ``/portal``; ``endpoints.orchestration_status``); **P7jp** ``btn-portal-tool-adapters-status`` + ``portal-tool-adapters-status-out`` one-click ``GET /api/v1/orchestration/tool-adapters-status`` JSON (**P4q**/**P4cs** registry + ``analytical_refresh_policy`` on ``/portal``; ``endpoints.orchestration_tool_adapters_status``); **P7jq** ``btn-portal-ready-shallow`` + ``btn-portal-ready-deep`` + ``portal-ready-out`` one-click ``GET /api/v1/ready`` / ``GET /api/v1/ready?deep=true`` (**P7ze** dependency readiness on ``/portal``; HTTP **503** + ``status:not_ready`` still returns JSON for operators); ``endpoints.ready``; **P7jv** ``btn-portal-health`` + ``portal-health-msg`` + ``portal-health-out`` one-click ``GET /health`` JSON (**P7zz** liveness; ``endpoints.health``) + ``btn-portal-metrics`` + ``portal-metrics-msg`` + ``portal-metrics-out`` one-click ``GET /metrics`` OpenMetrics text (**P7zf**/``endpoints.prometheus_metrics``; **P7zg** HyperCharts scrape parity) on ``/portal``; **P7jw** ``btn-portal-meta`` + ``portal-meta-msg`` + ``portal-meta-out`` one-click ``GET /api/v1/meta`` JSON (full ``endpoints`` index + operator strips; **P7iz** HyperCharts ``GET /api/darkherd/meta`` companion bundle); **P7jr** ``btn-portal-rollback-checkpoints-status`` + ``portal-rb-cp-status-out`` one-click ``GET /api/v1/orchestration/rollback-checkpoints-status`` JSON (**P4v**/**P4bh**/**P4cg** rollback policy + row count + **P4cg** enqueue readiness on ``/portal``; ``endpoints.orchestration_rollback_checkpoints_status``); **P7ju** ``btn-portal-rollback-checkpoints-list`` + ``portal-rb-cp-list-msg`` + ``portal-rb-cp-list-out`` one-click ``GET /api/v1/orchestration/rollback-checkpoints`` JSON (**P4bk** list; ``endpoints.orchestration_rollback_checkpoints``) + ``portal-rb-cp-id`` + ``btn-portal-rollback-checkpoint-get`` + ``portal-rb-cp-get-msg`` + ``portal-rb-cp-get-out`` one-click ``GET /api/v1/orchestration/rollback-checkpoints/{checkpoint_id}`` JSON (**P4bl** detail; ``endpoints.orchestration_rollback_checkpoint_get``) on ``/portal``; **P7jt** ``btn-portal-supervisor-smoke`` + ``portal-supervisor-smoke-out`` one-click ``GET /api/v1/orchestration/supervisor-smoke`` JSON (**P4b**/**P4aj** on ``/portal``; ``endpoints.orchestration_supervisor_smoke``) + ``btn-portal-supervisor-tool-round-smoke`` + ``portal-supervisor-tool-round-smoke-out`` one-click ``GET /api/v1/orchestration/supervisor-tool-round-smoke`` (**P4e**/**P4ak**; ``endpoints.orchestration_supervisor_tool_round_smoke``) + ``btn-portal-dry-run-apply-preview`` + ``portal-dry-run-apply-preview-out`` one-click ``GET /api/v1/orchestration/dry-run-apply-preview`` (**P4f**/**P4y**/**P4bp**; ``endpoints.orchestration_dry_run_apply_preview``) + ``btn-portal-routing-preview`` + ``portal-routing-preview-out`` one-click ``GET /api/v1/orchestration/routing-preview`` (**P4g**/**P4af**/**P4bo**; ``endpoints.orchestration_routing_preview``) + ``btn-portal-routing-preview-p4bn`` + ``portal-routing-preview-p4bn-out`` one-click ``GET /api/v1/orchestration/routing-preview?job_class=wide_restructure`` (**P4bn** job-class preview on ``/portal``); **P7js** ``btn-portal-ontology-patch-head`` + ``portal-ontology-patch-head-out`` one-click ``GET /api/v1/orchestration/ontology-patch-head`` JSON (**P5b**/**P4ad** SQLite patch head singleton on ``/portal``; ``endpoints.orchestration_ontology_patch_head``) + ``btn-portal-facets-catalog-status`` + ``portal-facets-catalog-status-out`` one-click ``GET /api/v1/orchestration/facets-catalog-status`` JSON (**P5d**/**P5e**/**P4ad** catalog/manifest fingerprints on ``/portal``; ``endpoints.orchestration_facets_catalog_status``); **P7jb** ``btn-portal-costs-hints`` + ``portal-costs-hints-status`` + ``portal-costs-hints-out`` loads ``GET /api/v1/costs/summary?window_hours=24`` ``provider_export_hints`` (read-only parity with ``/admin`` **P7jc** ``btn-costs-hints`` and ``admin_gate`` **P7jd** ``btn-gate-costs-hints``; ``endpoints.costs_summary``); **P7jn** ``btn-portal-costs-export-mistral`` ``btn-portal-costs-export-openai`` ``btn-portal-costs-export-anthropic`` ``btn-portal-costs-export-deepseek`` ``btn-portal-costs-export-openrouter`` ``btn-portal-costs-export-stability`` ``btn-portal-costs-export-replicate`` ``btn-portal-costs-export-huggingface`` ``btn-portal-costs-export-darkherd`` (**P7zal**/**P7zas**/**P7zat**/**P7zau** OpenRouter + Stability + Replicate + Hugging Face whoami snapshots) + ``portal-costs-export-status`` + ``portal-costs-export-out`` + ``wirePortalCostsProviderExport`` → capped ``GET /api/v1/costs/provider-export?window_hours=24`` (**P7jj** read-only previews on ``/portal`` — parity with ``/admin``/``admin_gate``; ``endpoints.costs_provider_export``); footer cites GET /api/v1/graphiti/status + endpoints.graphiti_status + HyperCharts /api/darkherd/graphiti/status for temporal bridge health (P6a; P6b echoes on /graph /dashboard /admin + admin_gate HTML and page_analytical_graph + page_dashboard + page_admin + page_admin_gate meta); footer cites POST /api/v1/graphiti/search + endpoints.graphiti_search + HyperCharts POST /api/darkherd/graphiti/search for direct Graphiti /search facts (P6d; same lockdown auth as POST /api/v1/chat); endpoints.graphiti_episodes documents server-side Graphiti POST /messages ingest (promote emit_graphiti + incremental graphiti_episode_replay; P6e, P6h echoes P6g facets_v0 fingerprint + P6j echoes P6i darkherd_episode_v0 JSON prefix + P6k ontology_facets_v0_fp + P6m ontology_template_id|ontology_catalog_sizes + P6p ontology_bundle_manifest|manifest_v0.json bundle + P6q+P6r+P6s operator HTML+lockdown403 echo ontology_bundle_roles + ontology_narrative_template_meta + endpoints.graph_ontology_facets_v0 + HyperCharts GET /api/darkherd/graph/ontology-facets-v0 (P6o graph proxy) in portal HTML/lockdown 403); endpoints.orchestration_status on GET /api/v1/meta includes HyperCharts /api/darkherd/orchestration/status (P4ar); GET /api/v1/meta (HyperCharts GET /api/darkherd/meta) exposes endpoints.operator_readme_startup — Vision §9 README_STARTUP + README Execution progress checklist 2 smoke-header README checklist 3 forward pointer (same app/main.py string as endpoints.operator_readme_startup); portal footer + this meta: HyperCharts POST /api/darkherd/orchestration/simulate-ontology-patch (P5bg P5a) + …/apply-ontology-patch (P5bh P5c) + …/revert-ontology-patch-head (P5f) mirror FastAPI POSTs (optional ``?correlation_id=`` query forwarded on those three when present); same-origin GET /api/darkherd/orchestration/status (P4ar); P4bt adds HyperCharts POST /api/darkherd/orchestration/validate-supervisor-decision|validate-neighborhood-plan|validate-ontology-patch|validate-claim-extraction-batch|validate-apply-plan|validate-wide-restructure-bundle|wide-restructure-staged-preview (read-only parity); README.md INTEGRATION.md; meta keys orchestration_validate_ontology_patch orchestration_simulate_ontology_patch orchestration_ontology_patch_head orchestration_apply_ontology_patch orchestration_facets_catalog_status on GET /api/v1/meta","graph_viz_overview":"/api/v1/graph/viz/overview?asset_limit=70&tag_limit=140&source=auto&corpus_scope=active|all&include_claims=true|false&include_ontology_facets=true|false (example query uses API Query defaults 70/140 **P1veo**; Neo4j: capped :Claim + ClaimKind + Technology/Risk facets from claims P1ao/P1ap and from asset tags P1ar; SQLite **P1vfw**: ranked ``staging_claims`` rows as claim + claim_kind nodes when ``include_claims=true``; P1aq server toggles; /graph|/dashboard client-only post-fetch: viz_asset_tier P1au; viz_show_domains|viz_show_tags P1ay; viz_show_claim_nodes|viz_show_catalog_nodes P1az — not a param on this GET)","graph_viz_neighbourhood":"/api/v1/graph/viz/neighbourhood?center_asset_id=&hops=1&source=auto&corpus_scope=active|all&include_claims=true|false&include_ontology_facets=true|false (Neo4j: P1ap+P1ar facets; SQLite **P1vfw**: ``staging_claims`` in subgraph when ``include_claims=true``; P1aq server toggles; client-only viz_asset_tier P1au; viz_show_domains|viz_show_tags P1ay; viz_show_claim_nodes|viz_show_catalog_nodes P1az on /graph|/dashboard — not a param on this GET)","graph_viz_tag_focus":"/api/v1/graph/viz/tag-focus?tag=&source=auto&corpus_scope=active|all&include_claims=true|false&include_ontology_facets=true|false (Neo4j: P1ap+P1ar facets; SQLite **P1vfw**: ``staging_claims`` on tag hits when ``include_claims=true``; P1aq server toggles; client-only viz_asset_tier P1au; viz_show_domains|viz_show_tags P1ay; viz_show_claim_nodes|viz_show_catalog_nodes P1az on /graph|/dashboard — not a param on this GET)","graph_viz_node_summary":"/api/v1/graph/viz/node-summary/{asset_id}?llm=false","admin_incremental_ingest":"endpoints.admin_incremental_ingest — POST /api/v1/admin/ingest/incremental + HyperCharts POST /api/darkherd/admin/ingest/incremental (**P7xi** Cookie/Authorization forward; **P7xo** same-origin companion; admin session cookie) JSON: max_new, whitepaper_force, post_ingest, graphiti_episode_replay, auto_tags_and_embeddings, ontology_review; **P7zac** optional tag_overlap_followup when ingested_asset_ids is non-empty and constitution incremental_ingest_tag_overlap_followup enables enqueue_refresh_tag_overlap_communities (queues refresh_tag_overlap_communities; Vision §5.2 dirty-community hint; defaults off); when post_ingest and new asset ids exist, detail.post_ingest.graphiti includes healthcheck + replay_ingest_episodes_for_assets output as episodes_replayed[] (per asset_id: profile/snapshot/whitepapers ok+detail) when graphiti_episode_replay true, else episode_replay skipped string, or episodes_replayed_error on failure; Graphiti env off → post_ingest.graphiti.configured false + operator note; cross-ref endpoints.graphiti_episodes for P6i/P6k/P6m/P6p/P6r/P6s episode bodies (P6l operator replay discoverability + /admin incremental card cites this key + Done status summarizes episodes_replayed row count; P6q+P6r+P6s HTML+403 echo ontology_bundle_roles + ontology_narrative_template_meta)","admin_backfill_cmc_market_fields":"POST /api/v1/admin/maintenance/backfill-cmc-market-fields + HyperCharts POST /api/darkherd/admin/maintenance/backfill-cmc-market-fields (**P7xi**; **P7xn**) — JSON: BackfillCmcMarketIn; CMC + CoinGecko listing backfill (P7u; COINMARKETCAP_API_KEY)","admin_repair_whitepaper_gaps":"POST /api/v1/admin/maintenance/repair-whitepaper-gaps + HyperCharts POST /api/darkherd/admin/maintenance/repair-whitepaper-gaps (**P7xi**; **P7xn**) — JSON: WhitepaperGapsRepairIn (P7s)","admin_reconcile_cmc_inactive_archive":"POST /api/v1/admin/maintenance/reconcile-cmc-inactive-archive + HyperCharts POST /api/darkherd/admin/maintenance/reconcile-cmc-inactive-archive (**P7xi**; **P7xn**) — JSON: ReconcileCmcInactiveIn (P7t; COINMARKETCAP_API_KEY)","admin_reconcile_coingecko_stale_archive":"POST /api/v1/admin/maintenance/reconcile-coingecko-stale-archive + HyperCharts POST /api/darkherd/admin/maintenance/reconcile-coingecko-stale-archive (**P7xi**; **P7xn**) — JSON: ReconcileCoingeckoStaleIn (**P1bn**; public CoinGecko /coins/{id} probe; archives on HTTP 404; optional worker kind reconcile_coingecko_stale_archive)","admin_sync_archived_assets_neo4j":"POST /api/v1/admin/maintenance/sync-archived-assets-neo4j + HyperCharts POST /api/darkherd/admin/maintenance/sync-archived-assets-neo4j (**P7xi**; **P7xn**) — JSON: Neo4jSyncArchivedAssetsIn (**P1bq**; bounded ``corpus_tier=archived`` SQLite rows → ``sync_assets_by_ids``; optional worker kind neo4j_sync_archived_assets)","admin_set_corpus_tier":"POST /api/v1/admin/maintenance/set-corpus-tier + HyperCharts POST /api/darkherd/admin/maintenance/set-corpus-tier (**P7xi**; **P7xn**) — JSON: SetCorpusTierIn (P7w)","admin_dedupe_coingecko_into_cmc":"POST /api/v1/admin/maintenance/dedupe-coingecko-into-cmc + HyperCharts POST /api/darkherd/admin/maintenance/dedupe-coingecko-into-cmc (**P7xi**; **P7xn**) — JSON: DedupeCoingeckoIn (dry_run; P7v SQLite-only)","admin_repair_claim_ontology_edges":"/api/v1/admin/maintenance/repair-claim-ontology-edges — JSON {} only; same Bolt refresh as python -m app.jobs.repair_claim_ontology_edges (P1ao/P7x); HyperCharts POST /api/darkherd/admin/maintenance/repair-claim-ontology-edges (P7xi Cookie/Authorization forward)","admin_repair_asset_tag_ontology_edges":"/api/v1/admin/maintenance/repair-asset-tag-ontology-edges — JSON: limit?, include_archived?; same Bolt refresh as python -m app.jobs.repair_asset_tag_ontology_edges (P1as/P7x); HyperCharts POST /api/darkherd/admin/maintenance/repair-asset-tag-ontology-edges (P7xi Cookie/Authorization forward)","admin_extract_claims_staging":"POST /api/v1/admin/maintenance/extract-claims-staging + HyperCharts POST /api/darkherd/admin/maintenance/extract-claims-staging (**P7xi** Cookie/Authorization forward; **P7xm** same-origin companion) — JSON: asset_limit, asset_offset (SQL-level paging before symbol dedup), chunks_per_asset, optional **chunk_rank_offset** (**P2vci** — skip first N ranked chunks per asset before taking ``chunks_per_asset``), optional **chunk_sweep_passes** (**P2vck** — consecutive non-overlapping chunk windows until empty / cursor / cap), optional **include_archived** (**P2vcx** — ranked scan includes ``corpus_tier=archived``; default false), optional **corpus_sweep** + optional **max_corpus_sweep_pages** (**P2vcz** — loop ranked batches until stream end / cap / ``max_asset_offset``), sleep_seconds, optional **queue_to_worker** (**P2vcf**) enqueue ``extract_claims_staging`` on ``worker_jobs`` vs inline Mistral run; response ``result`` includes **next_asset_sql_offset** (**P2vcy**) on single-batch runs — chain as the next ``asset_offset`` (not ``asset_offset + asset_limit``); **P2vcz** ``result`` is a sweep aggregate; effective caps = top-level **P2zz** ``GET /api/v1/meta`` ``claim_extraction`` (same clamps as invariants ``claim_extraction`` + **P2q** job; P2e)","admin_refresh_tag_overlap_communities":"POST /api/v1/admin/maintenance/refresh-tag-overlap-communities + HyperCharts POST /api/darkherd/admin/maintenance/refresh-tag-overlap-communities (**P7xi**; **P7xm**) — JSON: RefreshTagOverlapCommunitiesIn (Louvain persist to SQLite; P3ca)","admin_summarize_tag_overlap_communities":"POST /api/v1/admin/maintenance/summarize-tag-overlap-communities + HyperCharts POST /api/darkherd/admin/maintenance/summarize-tag-overlap-communities (**P7xi**; **P7xm**) — JSON: SummarizeTagOverlapCommunitiesIn (Mistral per community; P3cc)","admin_staging_claims":"GET /api/v1/admin/staging-claims + HyperCharts GET /api/darkherd/admin/staging-claims (**P7xi** Cookie/Authorization + query forward; **P7xp**) ?status=pending&limit=50&offset=0&claim_kind=&include_chunk_preview=true&include_llm_excerpt=true&include_promotion_hints=true&include_total=false (offset P2r; include_total=true → total_filtered P2t, has_more P2v, prev_offset/next_offset P2x)","admin_staging_claims_export":"GET /api/v1/admin/staging-claims/export + HyperCharts GET /api/darkherd/admin/staging-claims/export (**P7xi** Cookie/Authorization + query forward; **P7xp**) ?status=pending&limit=50&offset=0&claim_kind=&include_chunk_preview=false&include_llm_excerpt=false&include_total=false — **P2ca** UTF-8 CSV (BOM) for the same bounded filter window as endpoints.admin_staging_claims (no promotion_hints columns; X-DarkHerd-Export: P2ca). **P2cb** optional include_total=true → X-DarkHerd-Staging-Export-Paging: P2cb + X-DarkHerd-Staging-Total-Filtered / Has-More / Offset / Limit + optional Prev-Offset / Next-Offset (list parity)","admin_staging_claim_revisions":"GET /api/v1/admin/staging-claims/{staging_id}/revisions + HyperCharts GET /api/darkherd/admin/staging-claims/{staging_id}/revisions (**P7xi**; **P7xp**) ?limit=80&include_diff_snippets=true (JSON adds canonical_claim_text P2ab — current SQLite claim text for live diff on /admin)","admin_staging_claim_revision_append":"POST /api/v1/admin/staging-claims/{staging_id}/revisions + HyperCharts POST /api/darkherd/admin/staging-claims/{staging_id}/revisions (**P7xi**; **P7xp**) (JSON: claim_text; optional claim_kind, confidence; sync_neo4j_if_promoted for promoted rows + Neo4j). /admin P2ac: after success, client GETs same revisions as Load revisions (timeline + P2ab baseline) and clears New claim text.","admin_promote_staging_claims":"POST /api/v1/admin/staging-claims/promote + HyperCharts POST /api/darkherd/admin/staging-claims/promote (**P7xi**; **P7xp**); **P7zad** optional response tag_overlap_followup when promoted>0 and constitution staging_promote_tag_overlap_followup enables enqueue_refresh_tag_overlap_communities (queues refresh_tag_overlap_communities for touch asset_ids; Vision §5.2; defaults off)","admin_reject_staging_claims":"POST /api/v1/admin/staging-claims/reject + HyperCharts POST /api/darkherd/admin/staging-claims/reject (**P7xi**; **P7xp**)","admin_bulk_promote_staging_claims_by_filter":"POST /api/v1/admin/staging-claims/bulk-promote-by-filter + HyperCharts POST /api/darkherd/admin/staging-claims/bulk-promote-by-filter (**P7xi**; **P7xp**) (JSON: status, claim_kind?, limit, offset?, dry_run default true, emit_graphiti; offset=P2s; total_filtered=P2u; has_more=P2w; prev_offset/next_offset=P2y); **P7zad** same optional tag_overlap_followup as per-id promote when dry_run false and promoted>0","admin_bulk_reject_staging_claims_by_filter":"POST /api/v1/admin/staging-claims/bulk-reject-by-filter + HyperCharts POST /api/darkherd/admin/staging-claims/bulk-reject-by-filter (**P7xi**; **P7xp**) (JSON: status, claim_kind?, limit, offset?, dry_run default true, reason?, detach_neo4j_if_promoted; offset=P2s; total_filtered=P2u; has_more=P2w; prev_offset/next_offset=P2y)","admin_constitution":"/api/v1/admin/constitution — HyperCharts GET /api/darkherd/admin/constitution (**P7xi** Cookie forward; **P7xs** governance read companion)","admin_audit_events":"/api/v1/admin/audit-events?limit=50 — optional filters (P4i): event_type (exact), event_type_prefix (e.g. orchestration. or ontology.; ignored if event_type set), subject_type, correlation_id; newest-first capped list; orchestration examples event_type=orchestration.tool_probe.executed (P4au) or orchestration.sqlite_noop_touch.executed (P4aw) or orchestration.staged_apply.executed (P4bf+P4bz) or orchestration.rollback_checkpoint.appended (P4bh/P4by) or orchestration.rollback_checkpoint.deleted (P4bm) or orchestration.supervisor_graph.invoked (P4ay) or orchestration.wide_restructure.intake_declined (P4h); ontology governance examples event_type=ontology.patch.simulated (P5a) or ontology.patch.proposed (P5g) or ontology.patch.applied (P5c) or ontology.patch.head_reverted (P5f); HyperCharts GET /api/darkherd/admin/audit-events (**P7xi** query forward; **P7xs** governance read companion)","admin_configured":"/api/v1/admin/configured — returns {admin_auth_configured}; no admin cookie required; HyperCharts GET /api/darkherd/admin/configured (**P7xt** operator wiring probe)","admin_me":"/api/v1/admin/me — returns {admin: true} when session cookie valid else 401; HyperCharts GET /api/darkherd/admin/me (**P7xi** Cookie forward; **P7xt** session probe companion)","admin_whitepapers":"/api/v1/admin/whitepapers?limit=200&view=per_asset&sort=fetched_asc&status= — HyperCharts GET /api/darkherd/admin/whitepapers (**P7xi** query forward; **P7xq** same-origin admin bundle)","admin_login":"POST /api/v1/admin/login + HyperCharts POST /api/darkherd/admin/login (**P7xi** Cookie forward; **P7xq** companion with GET /darkherd/admin admin.html; **P7xr** companion with GET /darkherd/admin-gate admin_gate.html)","admin_logout":"POST /api/v1/admin/logout + HyperCharts POST /api/darkherd/admin/logout (**P7xi**; **P7xq**)","admin_jobs":"GET /api/v1/admin/jobs?limit= + HyperCharts GET /api/darkherd/admin/jobs (**P7xi** query forward; **P7xq** Recent jobs card; **P7zah** admin.html jobs-out appends one line per incremental_ingest row with non-empty detail.tag_overlap_followup via tagOverlapFollowupLine — **P7zac**/**P7zag** parity; **P7zai** INTEGRATION.md *Endpoints to wire* GET row)","admin_worker_jobs_list":"GET /api/v1/admin/maintenance/worker-jobs?limit= + optional kind= (exact WORKER_JOB_KINDS) + optional status=queued|running|done|failed|cancelled (**P7zaa** AND filters; JSON echoes kind_filter/status_filter) + HyperCharts GET /api/darkherd/admin/maintenance/worker-jobs (**P7xi** query forward; **P7xq** queue list card)","hypercharts_admin_console":"HyperCharts Flask GET /darkherd/admin renders darkherd/app/templates/admin.html with fetch rewrite /api/v1/→/api/darkherd/ (**P7xq**) + GET /darkherd/static/<path> for dashboard.css; GET /darkherd/admin-gate renders admin_gate.html with the same companion pattern (**P7xr** lockdown-style sign-in on 8888; ?next= allowlist /graph /dashboard /portal); **P5cx** ``endpoints.page_admin_gate`` + ``admin_gate.html`` operator cue for **P4cu**/**P5cw** enqueue on signed-in ``/darkherd/admin``; **P7zaj** ``admin_gate.html`` header cue for signed-in **Recent jobs** (**P7zah**/**P7zai** ``GET /api/darkherd/admin/jobs``); hyperdata/web/templates/index.html DarkHerd tab links same-origin /darkherd/admin-gate + /darkherd/admin for operators landing on the main HyperCharts UI (**P7ix**; **P7iy** on endpoints.operator_readme_startup echoes the same anchors for meta-first operators; **P7iz** same tab links GET /api/darkherd/meta for endpoints JSON); GET /api/darkherd/admin/constitution + GET /api/darkherd/admin/audit-events mirror governance reads (**P7xs**); GET /api/darkherd/admin/configured + GET /api/darkherd/admin/me mirror auth wiring probes (**P7xt**); admin.html login card calls those GETs via sameOriginApiPath when companion (**P7xu**); admin_gate.html runs the same probe strip on load + after failed login (**P7xv**); lockdown 403 _html_lockdown_denied + html_lockdown_signin_next meta cite HyperCharts GET /darkherd/admin-gate prose for shell-only operators (**P7xw**); DarkHerd DARKHERD_LOCKDOWN_HTML still serves admin_gate.html on GET /admin; admin.html **P7jc** cost wiring card (btn-costs-hints → GET /api/v1/costs/summary provider_export_hints **P7jb**); admin_gate.html **P7jd** cost wiring card (btn-gate-costs-hints → same **P7jb**/**P7xq** path); portal.html **P7jn** ``btn-portal-costs-export-mistral`` ``btn-portal-costs-export-openai`` ``btn-portal-costs-export-anthropic`` ``btn-portal-costs-export-deepseek`` ``btn-portal-costs-export-openrouter`` ``btn-portal-costs-export-stability`` ``btn-portal-costs-export-replicate`` ``btn-portal-costs-export-huggingface`` ``btn-portal-costs-export-darkherd`` + ``wirePortalCostsProviderExport`` (**P7jj** read-only provider-export previews on ``/portal``); portal.html **P7jo** ``btn-portal-orchestration-status`` → ``GET /api/v1/orchestration/status`` JSON snapshot (**P4am** on ``/portal``); portal.html **P7jp** ``btn-portal-tool-adapters-status`` → ``GET /api/v1/orchestration/tool-adapters-status`` JSON (**P4q**/ **P4cs** on ``/portal``); portal.html **P7jq** ``btn-portal-ready-shallow`` / ``btn-portal-ready-deep`` → ``GET /api/v1/ready`` + ``?deep=true`` (**P7ze**; fetch surfaces HTTP **503** ``not_ready`` JSON); portal.html **P7jr** ``btn-portal-rollback-checkpoints-status`` → ``GET /api/v1/orchestration/rollback-checkpoints-status`` JSON (**P4v**/ **P4bh**/ **P4cg** on ``/portal``); portal.html **P7ju** ``btn-portal-rollback-checkpoints-list`` → ``GET /api/v1/orchestration/rollback-checkpoints`` (**P4bk**) + ``portal-rb-cp-id`` + ``btn-portal-rollback-checkpoint-get`` → ``GET /api/v1/orchestration/rollback-checkpoints/{checkpoint_id}`` (**P4bl** on ``/portal``); portal.html **P7jv** ``btn-portal-health`` → ``GET /health`` (**P7zz** JSON) + ``btn-portal-metrics`` → ``GET /metrics`` OpenMetrics (**P7zf**/**P7zg** on ``/portal``); portal.html **P7jw** ``btn-portal-meta`` → ``GET /api/v1/meta`` full JSON (**P7iz** ``GET /api/darkherd/meta`` companion on HyperCharts); portal.html **P7jt** ``btn-portal-supervisor-smoke`` / ``btn-portal-supervisor-tool-round-smoke`` / ``btn-portal-dry-run-apply-preview`` / ``btn-portal-routing-preview`` / ``btn-portal-routing-preview-p4bn`` → matching ``GET /api/v1/orchestration/*`` read-only JSON on ``/portal`` (**P4b**/**P4e**/**P4f**/**P4g**); portal.html **P7js** ``btn-portal-ontology-patch-head`` / ``btn-portal-facets-catalog-status`` → ``GET /api/v1/orchestration/ontology-patch-head`` + ``GET /api/v1/orchestration/facets-catalog-status`` JSON (**P5b**/**P5d**/**P5e**/**P4ad** on ``/portal``); **P7jf** locks **P7je**/**P7jc**/**P7jd** on this bundle vs smoke ``jq`` (P7xq+P7xr block) + ``hyperdata/web/app.py`` ``api_darkherd_costs_summary`` Vision §9 Cross-read; **P7jg** ``btn-costs-export-darkherd`` + ``btn-gate-costs-export-darkherd`` + ``index.html`` provider=darkherd link → ``GET /api/v1/costs/provider-export`` (**P7zc**) + ``api_darkherd_costs_provider_export``; **P7jj** ``btn-costs-export-mistral``/``openai``/``anthropic``/``deepseek``/``stability`` + ``btn-gate-costs-export-mistral``/``openai``/``anthropic``/``deepseek``/``stability`` + ``index.html`` mistral|openai|anthropic|deepseek|stability|openrouter links (**P7jl** + **P7zas** Stability ``GET /v1/user/balance`` + **P7zal** OpenRouter ``GET …/credits``; ``wireAdminCostsProviderExport`` / ``wireGateCostsProviderExport``; darkherd remains **P7jg**; smoke contract ids btn-costs-export-deepseek btn-gate-costs-export-deepseek + btn-costs-export-openrouter + btn-gate-costs-export-openrouter (**P7zal**) + btn-costs-export-stability + btn-gate-costs-export-stability (**P7zas**) + btn-costs-export-replicate + btn-gate-costs-export-replicate (**P7zat**) + btn-costs-export-huggingface + btn-gate-costs-export-huggingface (**P7zau**)); **P7jh** GET /api/v1/meta top-level worker_job_kinds + worker_job_kinds_count + endpoints.worker_job_kinds_registry (same **P7k** WORKER_JOB_KINDS registry as queue-worker-job; smoke jq); **P7ji** admin.html ``btn-worker-job-kinds`` + ``btn-arp-parity`` / ``arp-status`` / ``arp-out`` (**P4ct** ``analytical_refresh_policy`` meta vs tool-adapters; **P4df** **P4db** on ``GET …/insights/summary`` in P4ct card) + ``btn-top-pipeline-enqueue`` (**P4cu** ``tag_overlap_publish_pipeline`` enqueue) + ``btn-top-rebuild-full-enqueue`` (**P5cw** ``rebuild_tag_overlap_full`` / **P5cv**) + ``btn-p5-neo4j-followup-echo`` (**P5cr** insights vs status ``ontology_patch_neo4j_followup_auto_enqueue`` JSON parity **P5cm**/**P5cn**/**P5cq**) + ``btn-p7kg-refresh-trace`` (**P7kg** ``analytical_global_refresh_admin_job_runs`` trace) + ``btn-p3du-autoschedule-metrics`` (**P3du** ``p3ds_global_refresh_autoschedule_metrics`` — **P3ds**/ **P3dr**) + **P5cs** admin_gate.html ``btn-gate-p5-neo4j-followup-echo`` + gate-p5-neo4j-followup-status + gate-p5-neo4j-followup-out (**P5cn** snapshot + optional **P5cm** parity) + admin_gate.html ``btn-gate-p5-graph-followup-echo`` + gate-p5-graph-followup-status + gate-p5-graph-followup-out (**P5cu** **P5co** snapshot + optional **P5cj** parity) + ``btn-gate-p7kg-refresh-trace`` + gate-p7kg-refresh-status + gate-p7kg-refresh-out (**P7kg** ``analytical_global_refresh_admin_job_runs`` gate trace) + ``btn-gate-p3du-autoschedule-metrics`` (**P3du** gate) + admin_gate.html ``btn-gate-worker-job-kinds`` → GET /api/v1/meta ``worker_job_kinds`` (**P7jh**; ``sameOriginApiPath`` **P7xq**) + admin_gate.html ``btn-gate-arp-parity`` + gate-arp-status + gate-arp-out (**P4ct** read-only ``analytical_refresh_policy`` **P4cr** vs **P4cs** on ``GET /api/v1/orchestration/tool-adapters-status``; ``sameOriginApiPath`` **P7xq**); **P2ca**/**P2cb** admin.html ``btn-sc-csv-export`` + ``buildStagingClaimsQueryParams('csv')`` + ``window.open`` on ``GET /api/v1/admin/staging-claims/export`` (``sameOriginApiPath`` **P7xq** → ``/api/darkherd/admin/staging-claims/export``; **P2cb** when Filter total on); meta keys admin_login admin_logout admin_jobs admin_worker_jobs_list admin_whitepapers + worker-jobs GET companions document same-origin parity","chat":"/api/v1/chat","health":"/health — FastAPI root liveness JSON includes ``version`` (**P7zaqk** — ``app.version.DARKHERD_VERSION`` / **P7zaqj**, matches OpenAPI + ``GET /api/v1/meta`` + ``darkherd_build_info``); **P7zaov** ``GET /api/v1/live`` returns the **same** JSON (symmetric ``/api/v1/*`` naming beside ``GET /api/v1/ready`` **P7ze** — sample Kubernetes **livenessProbe**); **P7ke** Compose ``healthcheck`` on service ``darkherd`` curls ``GET /api/v1/live`` (**P7zaox** — same body as ``GET /health``) before ``darkherd-queue-worker`` starts (**P7kd** profile); **P7kf** Compose ``graphiti`` ``healthcheck`` curls ``GET /healthcheck`` and ``darkherd`` ``depends_on: graphiti: service_healthy`` so the API starts after the temporal bridge HTTP server is live; HyperCharts GET /api/darkherd/health (**P7zz**) + GET /api/darkherd/live mirror the same bodies for same-origin edge probes (pairs hyperdata/web/app.py api_darkherd_health / api_darkherd_live); portal.html ``btn-portal-health`` + ``portal-health-msg`` + ``portal-health-out`` one-click ``GET /health`` JSON on ``/portal`` (**P7jv** beside **P7zz**)","ready":"/api/v1/ready?deep=false|true — P7ze dependency readiness: SQL SELECT 1 on the configured engine (**P7zaoe** JSON checks.database.dialect + detail <dialect>_ok — sqlite/postgresql/…); deep=true adds Neo4j verify_connectivity when NEO4J_URI is set (skipped when graph disabled); deep=true adds informational **P7zaos** checks.worker_jobs.pending (queued + running durable jobs — never flips HTTP status); HTTP 503 when a required check fails; portal.html btn-portal-ready-shallow + btn-portal-ready-deep load full JSON on /portal (**P7jq**; fetch shows 503 body); complements /health liveness; HyperCharts GET /api/darkherd/ready forwards query string; HyperCharts GET /api/darkherd/health (**P7zz**) mirrors FastAPI GET /health JSON for same-origin probes without DB/Bolt gates beyond those endpoints (see endpoints.health)","prometheus_metrics":"/metrics — P7zf OpenMetrics-style text scrape (Prometheus): darkherd_build_info{version}, **P7zaoh** darkherd_database_up{dialect} (SQLAlchemy engine name — sqlite/postgresql/…; legacy darkherd_sqlite_up retained), darkherd_worker_jobs_rows{status}, darkherd_extract_claims_staging_worker_jobs_rows{status} (**P2zb** ``extract_claims_staging_worker_jobs_rows_by_status``), darkherd_staging_claims_rows{status} (**P2zy** parity ``GET /api/v1/insights/summary`` ``staging_claims_rows_by_status``); darkherd_extract_claims_corpus_sweep_pages_total (**P2vdh** **P2vcz** corpus-sweep batches — ``app/corpus_sweep_metrics.py`` process-local); **P7zan** counters darkherd_costs_summary_requests_total{include_mistral} + darkherd_costs_provider_export_requests_total{provider,outcome} (``app/cost_metrics.py`` — process-local); **P7zao** counter darkherd_rate_limit_rejected_total{path} for **P7a** optional limiter **429** ``rate_limit_exceeded`` (``app/rate_limit_metrics.py`` — process-local); **P3dr** counters darkherd_global_refresh_autoschedule_outcomes_total{outcome} + darkherd_global_refresh_autoschedule_tick_exceptions_total (``app/global_refresh_autoschedule_metrics.py`` — **P3do** ``try_enqueue_global_refresh_autoschedule`` outcomes; process-local); Content-Type text/plain; version=0.0.4; public scrape path on FastAPI root (not under /api/v1); pair with GET /api/v1/ready for probes; HyperCharts GET /api/darkherd/health (**P7zz**) mirrors GET /health JSON (endpoints.health) for same-origin liveness beside P7zg metrics; P7zg HyperCharts GET /api/darkherd/metrics forwards the same OpenMetrics body (same-origin scrape via hyperdata/web/app.py api_darkherd_metrics); portal.html ``btn-portal-metrics`` + ``portal-metrics-msg`` + ``portal-metrics-out`` one-click ``GET /metrics`` text on ``/portal`` (**P7jv** beside **P7zf**/**P7zg**/**P7zan**/**P7zao**)","rate_limit_policy":"P7 optional fixed-window limiter (disabled by default): when DARKHERD_RATE_LIMIT_ENABLED=true, paths in DARKHERD_RATE_LIMIT_PATHS enforce DARKHERD_RATE_LIMIT_REQUESTS per DARKHERD_RATE_LIMIT_WINDOW_S seconds; 429 detail=rate_limit_exceeded + Retry-After + X-RateLimit-* headers; **P7zam** — default DARKHERD_RATE_LIMIT_PATHS includes /api/v1/costs/summary (**P7b**) and /api/v1/costs/provider-export (**P7j**/**P7y**/…) beside chat/search proxies (operators may override); **P7zand** — default paths include **GET** ``/api/v1/insights/summary`` (**P3cd** heavy operator JSON — aligns **P7zkv** bench); **P7zang** — optional DARKHERD_RATE_LIMIT_TRUST_FORWARDED_FOR=true uses leftmost ``X-Forwarded-For`` IP as the client key when behind a **trusted** reverse proxy (default false — never enable on direct Internet exposure or clients can spoof); **P7zap** — each **429** increments OpenMetrics counter ``darkherd_rate_limit_rejected_total{path}`` on **P7zf** ``GET /metrics`` (**P7zao**; see ``endpoints.prometheus_metrics``)","read_scaling":"P7zkv Vision §5.4 — operator path toward **~1000** concurrent readers (vs Phase 1 ~10 — `plan/VISION_AND_EXECUTION_PLAN.md` §5.4; sizing §6): stateless FastAPI behind LB when DB tier supports multiple API replicas; optional **P7a** ``endpoints.rate_limit_policy`` on hot paths; **P7ze** ``GET /api/v1/ready`` + **P7zf** ``GET /metrics`` observability; analytics cache **P7g**/**P7i**; queue workers separate from read tier (**2b**/**2c**); runbook **2d** in `plan/EXECUTION_PROGRESS.md`; smoke **8c** before load probes; lightweight harness `bash scripts/bench_read_paths.sh` (``BENCH_CONCURRENCY``, ``BENCH_REQUESTS``, ``DARKHERD_BASE_URL``; optional ``BENCH_PRESET=v2_0_0`` — **P7vcb** suggested defaults toward milestone **`v2.0.0`** operator evidence when ``BENCH_*`` unset; optional ``BENCH_SUMMARY_JSON=1`` — **P7zanr** second-line JSON summary for dashboards/CI, requires **python3**); optional ``bash scripts/record_read_scaling_evidence.sh`` (**P7vcc** — **P7vcd** meta tail; tees **P7vcb**/**P7zanr** bench output into ``bench-evidence/read_scaling_evidence_*.log`` + ``*.meta.txt``) — **P7zaot** eight-way rotation (**P7vda** + **P7vce**): **P7zaow** **GET** ``/api/v1/live`` (slot ``i % 8 == 0``; same JSON as ``GET /health`` — **P7zaov**; aligns **P7zkv** bench + sample **Kubernetes livenessProbe** + Docker Compose **healthcheck** (**P7zaox**) — **P7zaoy** pytest ``test_probe_paths_alignment_p7zaoy.py`` locks first-slot path parity) + ``/api/v1/ready?deep=false`` + ``/api/v1/ready?deep=true`` (**P7zaos** ``checks.worker_jobs`` informational depth — expect **503** if Bolt/SQL gates fail when graph tier is required) + ``/api/v1/meta`` + ``/metrics`` + ``/api/v1/insights/summary`` (**P3cd** — **P7zki**/**P2zy**/**P2zb** depth; **DARKHERD_LOCKDOWN_HTML** may **401** insights without admin session) + ``GET /health`` (root liveness JSON — **P7zaov**/**P7zaqk** under concurrent load; pairs **P7vcy** CI) + **GET** ``/api/v1/graph/summary`` (**P7vda** — **P1vcy**/**P4be** analytical counts JSON under concurrent readers). SQLite multi-replica — only with explicit shared-store / locking strategy (default Compose: single API + volume).","request_trace":"P7zh: every HTTP response includes X-Request-ID (echo incoming X-Request-ID or X-Correlation-ID when token matches [A-Za-z0-9._~-]{1,128}; else UUID v4); disable with DARKHERD_REQUEST_ID_ENABLED=false; CORS exposes X-Request-ID for browser clients","analytics_cache_policy":"P7g optional analytics TTL cache: DARKHERD_ANALYTICS_CACHE_ENABLED / DARKHERD_ANALYTICS_CACHE_TTL_S / DARKHERD_ANALYTICS_CACHE_MAX_ENTRIES; P7i optional DARKHERD_ANALYTICS_CACHE_REDIS_URL shares JSON across workers (same hashed keys + TTL; after L1 miss, HIT may set X-DarkHerd-Cache-Detail=redis); heavy analytics routes return X-DarkHerd-Cache as MISS, HIT, or BYPASS and support cache_bust=true; P7h cross-worker invalidation uses DB checkpoint analytics_cache_generation bumped by endpoints.admin_invalidate_analytics_cache; HyperCharts GET /api/darkherd/analytics/<path> forwards /api/v1/analytics/<path> query string","admin_invalidate_analytics_cache":"/api/v1/admin/maintenance/invalidate-analytics-cache + HyperCharts POST /api/darkherd/admin/maintenance/invalidate-analytics-cache (**P7xi** Cookie/Authorization forward) — bumps DB checkpoint analytics_cache_generation for cross-worker cache-key invalidation (P7h) and records admin.analytics_cache.invalidate audit row (same bump as shared service used by P7k worker jobs)","admin_queue_worker_job":"POST /api/v1/admin/maintenance/queue-worker-job + HyperCharts POST /api/darkherd/admin/maintenance/queue-worker-job (**P7xi** Cookie/Authorization forward; same JSON envelope; **P4cv** HTTP 200 echoes ``normalized_payload`` — schema-normalized dict stored on the queued row, or ``null`` for ``invalidate_analytics_cache``) JSON {kind: invalidate_analytics_cache} | {kind: neo4j_sync_graph_constraints, payload: {}} (Bolt DDL + ontology catalog seed only; same as python -m app.jobs.sync_graph --constraints; NEO4J_URI + driver on drain host; P7k+P5 graph follow-up) | {kind: neo4j_sync_graph_assets, payload: {limit: 1..100000, asset_offset?: 0..500000, include_archived?: bool}} (bounded ranked sync_all asset projection; same as sync_graph --limit + optional --asset-offset; NEO4J_URI + driver on drain host; P7k+P5) | {kind: neo4j_sync_archived_assets, payload?: {limit: 1..500, asset_offset?: 0..500000}} (**P1bq**: bounded SQLite corpus_tier=archived ascending-id slice → sync_assets_by_ids; NEO4J_URI + driver on drain host; POST …/sync-archived-assets-neo4j parity) | {kind: append_rollback_checkpoint, payload?: {label?, state_digest?, correlation_id?, capture_ontology_facets_v0_fp?}} (**P4cd**/**P7k**: same bounded SQLite append as POST …/rollback-checkpoint-append / ``python -m app.jobs.append_rollback_checkpoint``; constitution ``checkpoint_sqlite_metadata_wired`` + ``DARKHERD_ORCHESTRATION_ROLLBACK_CHECKPOINT_IO_ENABLED`` on drain host) | {kind: refresh_tag_overlap_communities, payload?: …} | {kind: summarize_tag_overlap_communities, payload?: …} | {kind: neo4j_sync_tag_overlap_run, payload: {tag_overlap_community_run_id, max_assets?}} (Bolt sync for assets carrying that persist run_id; NEO4J_URI + driver on worker host; P7n) | {kind: tag_overlap_publish_pipeline, payload?: {refresh, sync_neo4j, summarize, summarize_*}} (P7o: one job chains Louvain persist → optional sync for new run_id → optional summarize; single AdminJobRun detail.steps) | {kind: rebuild_tag_overlap_full, payload?: {max_assets?, resolution?, tag_fanout_cap?, seed?, summarize?, summarize_max_communities?, summarize_max_symbols?, summarize_max_tags?, summarize_sleep_seconds?, neo4j_sync?}} (**P5cv**: same ``rebuild_tag_overlap_job`` path as ``python -m app.jobs.rebuild_tag_overlap``; optional Mistral summarize + optional Neo4j sync when flags + keys align on drain; ``AdminJobRun`` kind=rebuild_tag_overlap_full) | {kind: extract_claims_staging, payload?: {asset_limit, chunks_per_asset, sleep_seconds, asset_offset}} (P7p: same bounded job as POST …/extract-claims-staging; drain host needs MISTRAL_API_KEY) | {kind: incremental_ingest, payload: {max_new, whitepaper_force?, post_ingest?, graphiti_episode_replay?, ontology_review?, auto_tags_and_embeddings?}} (P7q: same as POST …/ingest/incremental; CMC/CoinGecko + optional tags/embed/post_ingest/ontology; **P7zag** drain logs ``AdminJobRun.detail`` from ``execute_incremental_ingest`` including optional ``tag_overlap_followup`` (**P7zac**) matching HTTP) | {kind: repair_whitepaper_gaps, payload?: {limit?, symbols?, rank_max?}} (P7s: parity POST …/repair-whitepaper-gaps) | {kind: reconcile_cmc_inactive_archive, payload?: {max_map_pages?}} (P7t: parity POST …/reconcile-cmc-inactive-archive; drain host needs COINMARKETCAP_API_KEY) | {kind: reconcile_coingecko_stale_archive, payload?: {limit?, asset_offset?}} (**P1bn**: parity POST …/reconcile-coingecko-stale-archive; CoinGecko public /coins/{id} probe archives on HTTP 404; HTTP 429 stops the batch early with result.stopped_reason=rate_limited) | {kind: backfill_cmc_market_fields, payload?: {limit?}} (P7u: parity POST …/backfill-cmc-market-fields; drain host needs COINMARKETCAP_API_KEY) | {kind: dedupe_coingecko_cmc, payload?: {dry_run?}} (P7v: parity POST …/dedupe-coingecko-into-cmc; SQLite-only) | {kind: set_corpus_tier, payload: {asset_ids, tier, archive_reason?}} (P7w: parity POST …/set-corpus-tier; optional Neo4j sync_assets_by_ids when graph enabled + NEO4J_URI on drain host) | {kind: repair_claim_ontology_edges, payload: {}} (P7k+P5+P1ao: parity POST …/repair-claim-ontology-edges or python -m app.jobs.repair_claim_ontology_edges; refreshes all (:Claim) Technology/Risk facet edges from ontology/facets_v0.json; NEO4J_URI + driver on drain host) | {kind: repair_asset_tag_ontology_edges, payload?: {limit?, include_archived?}} (P7x: parity POST …/repair-asset-tag-ontology-edges / CLI repair_asset_tag_ontology_edges; NEO4J_URI + driver on drain host) — milestones P7k invalidate, P7l refresh persist, P7m summarize, P7n Bolt sync run, P7o publish pipeline, P5cv rebuild_tag_overlap_full, P7p extract staging, P7q incremental ingest, P7r worker_jobs lease (DARKHERD_WORKER_JOB_LEASE_SECONDS; stale running→queued), P7s repair whitepaper gaps, P7t reconcile CMC inactive archive, P1bn reconcile CoinGecko stale archive (404 probe), P7u backfill CMC market fields, P7v dedupe CoinGecko→CMC, P7w set corpus tier, P7x repair asset-tag ontology edges, P7z Postgres parallel claim (FOR UPDATE SKIP LOCKED when DATABASE_URL dialect is postgresql), P7za MySQL/MariaDB parallel claim (SELECT id … FOR UPDATE SKIP LOCKED then UPDATE in one txn when dialect is mysql or mariadb; SQLite unchanged), P7zb optional Redis election (DARKHERD_QUEUE_WORKER_ELECTION_REDIS_URL + DARKHERD_QUEUE_WORKER_ELECTION_TTL_S / KEY) for single active queue_worker, P7zm short-window dedupe (DARKHERD_WORKER_JOB_ENQUEUE_DEDUPE_WINDOW_S; identical queued kind+payload returns deduped=true and existing worker_job_id); enqueue durable SQLite worker_jobs for python -m app.jobs.queue_worker; GET /api/v1/admin/maintenance/worker-jobs?limit= lists newest jobs; audit admin.worker_job.enqueued (or admin.worker_job.enqueue_deduped)","admin_worker_jobs_actions":"GET /api/v1/admin/maintenance/worker-jobs/actions + HyperCharts GET /api/darkherd/admin/maintenance/worker-jobs/actions (**P7xi**; **P7xq**) — P7zv newest-first queue governance actions from system_audit_events (event_type prefix admin.worker_job.) for observe→act→verify loops; includes event_type, subject, and payload snapshots; P7zx optional since_hours rolling window (0 = no cutoff, echoed in JSON)","admin_worker_jobs_actions_summary":"GET /api/v1/admin/maintenance/worker-jobs/actions-summary + HyperCharts GET /api/darkherd/admin/maintenance/worker-jobs/actions-summary (**P7xi**; **P7xq**) — P7zw aggregate digest over recent admin.worker_job.* governance rows (rows_considered, latest_created_at, event_type_counts) for rapid operator triage; P7zx optional since_hours rolling window (0 = no cutoff, echoed in JSON); P7zy limit query allows 1..10000 rows scanned (higher than …/actions 200 cap)","admin_retry_worker_job":"POST /api/v1/admin/maintenance/worker-jobs/{worker_job_id}/retry + HyperCharts POST /api/darkherd/admin/maintenance/worker-jobs/{worker_job_id}/retry (**P7xi**) — P7zi operator retry for failed queue rows only: clones kind+payload into a new queued worker_job, returns retried_from_worker_job_id + new worker_job_id, and records admin.worker_job.retried audit event; P7zl enforces DARKHERD_WORKER_JOB_RETRY_MAX (retry_count metadata in payload/response, 0 disables retries)","admin_cancel_worker_job":"POST /api/v1/admin/maintenance/worker-jobs/{worker_job_id}/cancel + HyperCharts POST /api/darkherd/admin/maintenance/worker-jobs/{worker_job_id}/cancel (**P7xi**) — P7zj operator cancel for queued rows only: flips status to cancelled before claim, sets finished_at, and records admin.worker_job.cancelled audit event","admin_prune_worker_jobs":"POST /api/v1/admin/maintenance/worker-jobs/prune + HyperCharts POST /api/darkherd/admin/maintenance/worker-jobs/prune (**P7xi**) — P7zk bounded cleanup for terminal queue rows only (statuses subset of done|failed|cancelled, older_than_hours cutoff, limit cap); queued/running rows are never pruned; P7zu adds dry_run preview mode (no delete, reports candidate rows, audits admin.worker_job.prune_previewed) alongside execute mode (admin.worker_job.pruned)","admin_worker_jobs_health":"GET /api/v1/admin/maintenance/worker-jobs/health + HyperCharts GET /api/darkherd/admin/maintenance/worker-jobs/health (**P7xi**; **P7xq**) — P7zn queue health snapshot: queue_depth, running_jobs, failed_jobs, cancelled_jobs, stale_running_jobs, oldest_queued_age_s, worker_job_lease_seconds; P7zo adds status=healthy|warn + status_reasons + warn_thresholds from DARKHERD_WORKER_JOB_HEALTH_WARN_QUEUE_DEPTH / DARKHERD_WORKER_JOB_HEALTH_WARN_OLDEST_QUEUED_AGE_S / DARKHERD_WORKER_JOB_HEALTH_WARN_STALE_RUNNING_JOBS; P7zp adds pressure_score + pressure_components (queue/age/stale ratios, threshold-normalized) for alerting; stale-running uses lease expiry semantics from P7r","admin_worker_jobs_health_trend":"GET /api/v1/admin/maintenance/worker-jobs/health-trend + HyperCharts GET /api/darkherd/admin/maintenance/worker-jobs/health-trend (**P7xi**; **P7xq**) — P7zq two-window queue flow trend (created vs finished over bucket_minutes, current+previous windows) for sustained-pressure detection; returns trend=rising|stable|falling with trend_delta and backlog_delta_estimate fields","admin_worker_jobs_slo":"GET /api/v1/admin/maintenance/worker-jobs/slo + HyperCharts GET /api/darkherd/admin/maintenance/worker-jobs/slo (**P7xi**; **P7xq**) — P7zr windowed worker queue SLO snapshot over window_minutes: total_finished, throughput_per_minute, done/failed/cancelled finished counts, and success_rate/failure_rate/cancel_rate ratios","cli_queue_worker":"python -m app.jobs.queue_worker --max-jobs=25 — P7k–P7p–P7q–P7r–P7s–P7t–P7u–P7v–P7w–P7x drain queued worker_jobs (invalidate_analytics_cache, neo4j_sync_graph_constraints, neo4j_sync_graph_assets, neo4j_sync_archived_assets, refresh_tag_overlap_communities, summarize_tag_overlap_communities, neo4j_sync_tag_overlap_run, tag_overlap_publish_pipeline, rebuild_tag_overlap_full, extract_claims_staging, incremental_ingest, repair_whitepaper_gaps, reconcile_cmc_inactive_archive, reconcile_coingecko_stale_archive, backfill_cmc_market_fields, dedupe_coingecko_cmc, set_corpus_tier, repair_claim_ontology_edges, repair_asset_tag_ontology_edges; claim lease + reclaim per DARKHERD_WORKER_JOB_LEASE_SECONDS; P7z when dialect is postgresql, claim uses FOR UPDATE SKIP LOCKED (single UPDATE…FROM); P7za when dialect is mysql or mariadb, claim uses SELECT … FOR UPDATE SKIP LOCKED then UPDATE in one transaction; SQLite unchanged; P7zb optional DARKHERD_QUEUE_WORKER_ELECTION_REDIS_URL SET NX EX leader lease (renew per cycle; release on exit) so only one replica drains; optional --loop --idle-sleep-s=5 for sidecar polling); **P7kd** optional Compose profile ``queue-worker`` — service ``darkherd-queue-worker`` shares ``darkherd_data`` with the API, runs ``python -m app.bootstrap`` then ``python -m app.jobs.queue_worker --loop`` (``docker compose --profile queue-worker up -d``); **P7ke** ``darkherd`` Compose ``healthcheck`` (``GET /api/v1/live`` — **P7zaox**, same JSON as ``GET /health``) + ``darkherd-queue-worker`` ``depends_on: darkherd: service_healthy``; **P7kf** ``graphiti`` Compose ``healthcheck`` (``GET /healthcheck``) + ``darkherd`` ``depends_on: graphiti: service_healthy``","orchestration_status":"/api/v1/orchestration/status — portal.html btn-portal-orchestration-status loads full JSON on /portal (P7jo **P4am** read-only snapshot beside **P5ct** parity); HyperCharts GET /api/darkherd/orchestration/status (P4ar); HyperCharts GET /api/darkherd/orchestration/routing-preview (P4bo; forwards ?job_class= for P4bn); HyperCharts GET /api/darkherd/orchestration/dry-run-apply-preview (P4bp; read-only P4f+P4y stub); HyperCharts GET /api/darkherd/orchestration/supervisor-smoke (P4bq P4b); HyperCharts GET /api/darkherd/orchestration/supervisor-tool-round-smoke (P4bq P4e); HyperCharts GET /api/darkherd/orchestration/tool-adapters-status (P4bq P4q); HyperCharts GET /api/darkherd/orchestration/rollback-checkpoints-status (P4bq P4v+P4bh+P4cg); HyperCharts GET /api/darkherd/orchestration/rollback-checkpoints (P4bk list; forwards query); HyperCharts GET /api/darkherd/orchestration/rollback-checkpoints/<id> (P4bl read); portal.html **P7ju** ``btn-portal-rollback-checkpoints-list`` + ``portal-rb-cp-list-out`` and ``portal-rb-cp-id`` + ``btn-portal-rollback-checkpoint-get`` + ``portal-rb-cp-get-out`` (read-only **P4bk** + **P4bl** beside **P7jr**); HyperCharts GET /api/darkherd/orchestration/ontology-patch-head (P4bq P5b); HyperCharts GET /api/darkherd/orchestration/facets-catalog-status (P4bq P5d); portal.html **P7jt** ``btn-portal-supervisor-smoke`` + ``btn-portal-supervisor-tool-round-smoke`` + ``btn-portal-dry-run-apply-preview`` + ``btn-portal-routing-preview`` + ``btn-portal-routing-preview-p4bn`` (``GET …/routing-preview?job_class=wide_restructure`` **P4bn** preview) one-click GETs on ``/portal`` (read-only **P4b**/**P4aj** + **P4e**/**P4ak** + **P4f**/**P4y**/**P4bp** + **P4g**/**P4af**/**P4bo** beside **P7jp** tool registry); portal.html **P7js** ``btn-portal-ontology-patch-head`` + ``btn-portal-facets-catalog-status`` one-click GETs on ``/portal`` (read-only **P5b**/**P5d**/**P5e** beside **P7jr** rollback envelope); HyperCharts POST /api/darkherd/orchestration/validate-supervisor-decision (P4bt P4j); HyperCharts POST /api/darkherd/orchestration/validate-neighborhood-plan (P4bt P4k); HyperCharts POST /api/darkherd/orchestration/validate-ontology-patch (P4bt P4l); HyperCharts POST /api/darkherd/orchestration/validate-claim-extraction-batch (P4bt P4m); HyperCharts POST /api/darkherd/orchestration/validate-apply-plan (P4bt P4n); HyperCharts POST /api/darkherd/orchestration/validate-wide-restructure-bundle (P4bt P4o); HyperCharts POST /api/darkherd/orchestration/wide-restructure-intake (P4bx P4h); HyperCharts POST /api/darkherd/orchestration/wide-restructure-staged-preview (P4bt P4t); HyperCharts POST /api/darkherd/orchestration/execute-tool-probe (P4av); HyperCharts POST /api/darkherd/orchestration/execute-sqlite-noop-probe (P4ax); HyperCharts POST /api/darkherd/orchestration/staged-apply-preview (P4bs read-only P4p preview); HyperCharts POST /api/darkherd/orchestration/staged-apply-execute (P4bf P4bz P4bg); HyperCharts GET /api/darkherd/orchestration/rollback-checkpoints (P4bk); HyperCharts GET /api/darkherd/orchestration/rollback-checkpoints/<id> (P4bl); HyperCharts DELETE /api/darkherd/orchestration/rollback-checkpoints/<id> (P4bm); HyperCharts POST /api/darkherd/orchestration/rollback-checkpoint-append (P4bi); HyperCharts POST /api/darkherd/orchestration/simulate-ontology-patch (P5bg); HyperCharts POST /api/darkherd/orchestration/apply-ontology-patch (P5bh); HyperCharts POST /api/darkherd/orchestration/revert-ontology-patch-head (P5f); HyperCharts POST /api/darkherd/orchestration/supervisor-graph-invoke (P4az); GET /api/v1/meta|HyperCharts GET /api/darkherd/meta exposes endpoints.operator_readme_startup (§9 README_STARTUP + README Execution progress checklist 2 smoke-header README checklist 3; matches endpoints.page_portal); P4a GET JSON detail includes manifest_v0_disk_fp_sync (P3cd smoke substring; pairs test_orchestration_status_shape); P4a+P4ai: langgraph install probe; p4ai + rollback/rollback_wired/rollback_config_source (P4v policy echo); **P5cn** optional ``ontology_patch_neo4j_followup_auto_enqueue`` (newest ``ontology.patch.neo4j_followup_auto_enqueued`` audit — insights **P5cm** parity + **P5cq** ``enqueue_*`` booleans); **P5co** optional ``ontology_patch_graph_followup`` (qualifying ``ontology.patch.applied`` when **P5e** wrote facets — insights **P5cj** parity); **P4ch**/**P4cp** echo **P4co** readiness (`p4cg`, `p4cj_snapshot_wired`, `p4cj_restore_http_wired`, `supervisor_enqueue_append_rollback_checkpoint`) matching GET …/rollback-checkpoints-status + insights `orchestration_rollback_readiness`; **P4cq** `analytical_refresh_policy` (Vision §5.2 cadence + active-corpus ceiling — `constitution/invariants.json`); supervisor_wired mirrors orchestration_supervisor.supervisor_graph_wired (P4ay minimal LangGraph when true); **P4cz** supervisor_graph_invoke_enabled mirrors DARKHERD_SUPERVISOR_GRAPH_INVOKE_ENABLED (POST supervisor-graph-invoke HTTP 403 when false — beside constitution wiring); P4c: supervisor_budgets + invariants_version from constitution/invariants.json orchestration_supervisor; P4d+P4aj: supervisor-smoke recursion_limit + rollback echo; P4e+P4ak: supervisor-tool-round-smoke + rollback echo; P4f+P4y: dry-run-apply-preview GET (stub + rollback echo); P4g+P4af+P4bn: routing-preview GET (rollback echo; optional ?job_class= adds supervisor_job_class_preview / p4bn — same job_class resolution as P4ay invoke); P4q+P4ag: tool-adapters-status GET (rollback echo); P4v: rollback-checkpoints-status GET; P5b: ontology-patch-head GET (SQLite singleton last_simulated_*; P4ad rollback echo); P5d: facets-catalog-status GET (read-only ontology/facets_v0.json fp; ontology_facets_catalog_executor_wired from invariants P5e; P4ad rollback echo); P4h+P4ah: wide-restructure-intake POST (rollback echo); P4j+P4ab: validate-supervisor-decision POST (schema validate + rollback echo); P4k+P4ac: validate-neighborhood-plan POST (schema validate + rollback echo); P4l+P4ad: validate-ontology-patch POST (schema validate + rollback echo); P5a: simulate-ontology-patch POST (same validators + audit ontology.patch.simulated on valid; optional ?correlation_id=; no facets_v0 apply); P5c+P5e+P6p: apply-ontology-patch POST (valid + dry_run false → audit ontology.patch.applied + ontology_patch_head applied_*; P5e may write ontology/facets_v0.json when executor wired; P6p ontology_bundle_manifest_cache_invalidated + facets_catalog_executor_stats manifest_v0_disk_fp_sync_* + optional on-disk manifest files[].file_fp refresh on repo path; optional ?correlation_id=); P5f: revert-ontology-patch-head POST (latest ontology.patch.applied previous_* → SQLite head applied_*; constitution ontology_patch_head_revert.wired + DARKHERD_ONTOLOGY_PATCH_HEAD_REVERT_ENABLED; HTTP 404 without apply audits; idempotent already_at_target; P4ad rollback echo); P4m+P4ae: validate-claim-extraction-batch POST (schema validate + rollback echo); P4n+P4z: validate-apply-plan POST (schema validate + rollback echo); P4o+P4aa: validate-wide-restructure-bundle POST (bundle validate + rollback echo); P4t+P4u+P4w: wide-restructure-staged-preview POST; P4p+P4r+P4s+P4x: staged-apply-preview POST (registry_match + registry_summary/registry_gate_ok + rollback echo); P4au: execute-tool-probe POST (tool_id + optional correlation_id; audit orchestration.tool_probe.executed; DARKHERD_ORCHESTRATION_TOOL_PROBE_ENABLED=false → 403); P4be neo4j_graph_summary_read (read_only P4q tool; Bolt counts preview same as GET /api/v1/graph/summary) on tool-adapters-status + staged-apply-preview + execute-tool-probe; P4bc: supervisor_bound_tools JSON map (p4bc, per-tool wired/dry_run_default/max_assets_cap/allowed_kinds_count) when constitution defines supervisor_bound_tools — same fields on P4at/P4au orchestration_status_read read_only_preview; P4cb: supervisor_mutating_bound_tool_job_classes (orchestration_supervisor.mutating_bound_tool_job_classes; subset of job_classes; gates mutating P4ba/P4bb) on status + P4at preview; P4aw: execute-sqlite-noop-probe POST (optional note + correlation_id; audit orchestration.sqlite_noop_touch.executed; constitution sqlite_noop_touch wired + DARKHERD_ORCHESTRATION_SQLITE_NOOP_TOUCH_ENABLED) in detail","orchestration_supervisor_smoke":"/api/v1/orchestration/supervisor-smoke — P4b+P4aj: minimal LangGraph StateGraph compile+invoke (no LLM); p4aj + rollback/rollback_wired/rollback_config_source (P4v policy echo); not the production supervisor; P4c: echoes supervisor_budgets + invariants_version; P4d: max_graph_steps applied as LangGraph recursion_limit on bounded loop smoke; HyperCharts GET /api/darkherd/orchestration/supervisor-smoke (P4bq) forwards optional query string; portal.html ``btn-portal-supervisor-smoke`` loads full JSON on ``/portal`` (**P7jt**)","orchestration_supervisor_tool_round_smoke":"/api/v1/orchestration/supervisor-tool-round-smoke — P4e+P4ak: synthetic tool-round LangGraph loop bounded by max_tool_rounds + max_graph_steps (recursion_limit); p4ak + rollback/rollback_wired/rollback_config_source (P4v policy echo); no real tools; HyperCharts GET /api/darkherd/orchestration/supervisor-tool-round-smoke (P4bq) forwards optional query string; portal.html ``btn-portal-supervisor-tool-round-smoke`` loads full JSON on ``/portal`` (**P7jt**)","orchestration_dry_run_apply_preview":"/api/v1/orchestration/dry-run-apply-preview — P4f+P4y: read-only stub; apply_plan with schema_id from json_schema_ids.apply_plan (empty operations) + sample supervisor_decision shape; p4y + rollback/rollback_wired/rollback_config_source (P4v policy echo); no writes; json_schema_ids.supervisor_decision from invariants; for client-submitted plans see POST staged-apply-preview (P4p); HyperCharts GET /api/darkherd/orchestration/dry-run-apply-preview (P4bp) forwards optional query string; portal.html ``btn-portal-dry-run-apply-preview`` loads full JSON on ``/portal`` (**P7jt**)","orchestration_routing_preview":"/api/v1/orchestration/routing-preview — P4g+P4af+P4bn+P4cb: resolves orchestration_routing from invariants (public probe slugs + default_job_class); every response includes supervisor_mutating_bound_tool_job_classes (P4cb mutating P4ba/P4bb gate; matches GET …/orchestration/status); p4af + rollback/rollback_wired/rollback_config_source (P4v policy echo); optional ?job_class= adds p4bn + supervisor_job_class_preview (same job_class allowlist routing as P4ay supervisor-graph-invoke; preview includes resolved_job_class_allows_mutating_bound_tools; no LangGraph); HyperCharts GET /api/darkherd/orchestration/routing-preview (P4bo) forwards query string for P4bn; no writes; probe list may include tool-adapters-status (P4q) and rollback-checkpoints-status (P4v) and rollback-checkpoints (P4bk list); portal.html ``btn-portal-routing-preview`` + ``btn-portal-routing-preview-p4bn`` load full JSON on ``/portal`` (**P7jt**)","orchestration_tool_adapters_status":"GET /api/v1/orchestration/tool-adapters-status — portal.html btn-portal-tool-adapters-status loads full JSON on /portal (**P7jp**); P4q+P4al+P4as+P4at+P4be+P4ag+P4aw+P4bz+P7k+P4cs: read-only orchestration_tools registry from invariants (id, kind, wired, description) or built-in stubs; P4al/P4as/P4at/P4be wired read_only tools (constitution_snapshot_read, worker_queue_health_read, orchestration_status_read, neo4j_graph_summary_read) feed POST staged-apply-preview read_only_preview and POST execute-tool-probe (P4au audit orchestration.tool_probe.executed); p4aw true when sqlite_noop_touch is wired mutating_sqlite_noop (POST execute-sqlite-noop-probe P4aw and POST staged-apply-execute P4bf still need DARKHERD_ORCHESTRATION_SQLITE_NOOP_TOUCH_ENABLED; P4bf also needs DARKHERD_ORCHESTRATION_STAGED_APPLY_EXECUTE_ENABLED); p4bz discoverability when rollback_checkpoint_append is wired mutating_rollback_checkpoint (POST staged-apply-execute P4bz still needs DARKHERD_ORCHESTRATION_ROLLBACK_CHECKPOINT_IO_ENABLED + constitution orchestration_rollback.checkpoint_sqlite_metadata_wired); wired_tools_count + all_wired; JSON worker_job_kinds + worker_job_kinds_count echo canonical P7k worker_jobs kinds (same registry as POST …/admin/maintenance/queue-worker-job and P4bb enqueue_worker_job); **P4cs** analytical_refresh_policy same object as P4cq orchestration/status + P4cr GET …/meta top-level (Vision §5.2); p4ag + rollback/rollback_wired/rollback_config_source (P4v policy echo); no writes; HyperCharts GET /api/darkherd/orchestration/tool-adapters-status (P4bq) forwards optional query string","orchestration_rollback_checkpoints_status":"GET /api/v1/orchestration/rollback-checkpoints-status — portal.html btn-portal-rollback-checkpoints-status loads full JSON on /portal (**P7jr**); P4v+P4bh+P4cg+P4cj: read-only orchestration_rollback policy from invariants (checkpoint_store, max_checkpoints_hint, checkpoint_sqlite_metadata_wired, checkpoint_facets_v0_snapshot_wired, max_facets_v0_snapshot_chars, description) or defaults; p4bh + rollback_wired true when constitution checkpoint_sqlite_metadata_wired and DARKHERD_ORCHESTRATION_ROLLBACK_CHECKPOINT_IO_ENABLED; checkpoint_sqlite_row_count when wired (else 0); p4cj_snapshot_wired + p4cj_restore_http_wired (constitution snapshot gate + DARKHERD_ORCHESTRATION_ROLLBACK_CHECKPOINT_FACETS_RESTORE_ENABLED); P4cg adds p4cg + supervisor_enqueue_append_rollback_checkpoint (enqueue_worker_job wired, append_rollback_checkpoint in allowed_kinds, mutating_bound_tool_job_classes nonempty P4cb, rollback_checkpoint_io_wired) for **P4cf** supervisor mutating enqueue readiness; no writes; HyperCharts GET /api/darkherd/orchestration/rollback-checkpoints-status (P4bq) forwards optional query string","orchestration_rollback_checkpoints":"GET /api/v1/orchestration/rollback-checkpoints?limit= — P4bk+P4by+P4cj: read-only newest-first list from SQLite orchestration_rollback_checkpoints (metadata only; rows may include ontology_facets_v0_fp when appended with P4by capture; ontology_facets_v0_snapshot_present when P4cj snapshot stored; default limit 50, max 256); requires same P4bh gates as POST rollback-checkpoint-append (else HTTP 403); mutations_committed false; HyperCharts GET /api/darkherd/orchestration/rollback-checkpoints forwards query string; portal.html ``btn-portal-rollback-checkpoints-list`` + ``portal-rb-cp-list-msg`` + ``portal-rb-cp-list-out`` load GET JSON on ``/portal`` (**P7ju**)","orchestration_rollback_checkpoint_get":"GET /api/v1/orchestration/rollback-checkpoints/{checkpoint_id} — P4bl+P4bk+P4by+P4cj: read-only single metadata row from SQLite orchestration_rollback_checkpoints by primary key (ontology_facets_v0_fp when captured; ontology_facets_v0_snapshot_present for P4cj; snapshot JSON never echoed); requires same P4bh gates as P4bk list (else HTTP 403); HTTP 404 when id missing; mutations_committed false; response includes checkpoint object + p4bl true; HyperCharts GET /api/darkherd/orchestration/rollback-checkpoints/<int:checkpoint_id> forwards path; portal.html ``portal-rb-cp-id`` + ``btn-portal-rollback-checkpoint-get`` + ``portal-rb-cp-get-msg`` + ``portal-rb-cp-get-out`` load GET JSON on ``/portal`` (**P7ju**)","orchestration_rollback_checkpoint_append":"POST /api/v1/orchestration/rollback-checkpoint-append — P4bh/P4by/P4cj: JSON { label?, state_digest?, correlation_id?, capture_ontology_facets_v0_fp?, capture_ontology_facets_v0_snapshot? }; optional P4by stores ontology_facets_v0_fp (facets_v0_fingerprint_for_episodes hint; not restore); optional P4cj stores bounded minified facets_v0.json when constitution checkpoint_facets_v0_snapshot_wired (HTTP 413 when over max_facets_v0_snapshot_chars); bounded INSERT orchestration_rollback_checkpoints + audit orchestration.rollback_checkpoint.appended; requires constitution orchestration_rollback.checkpoint_sqlite_metadata_wired true and DARKHERD_ORCHESTRATION_ROLLBACK_CHECKPOINT_IO_ENABLED=true (else 403); HyperCharts POST /api/darkherd/orchestration/rollback-checkpoint-append (P4bi) forwards the same JSON","orchestration_rollback_checkpoint_restore_facets_v0":"POST /api/v1/orchestration/rollback-checkpoint-restore-facets-v0 — P4cj/P4cl: JSON { checkpoint_id, dry_run?, correlation_id? }; restores ontology/facets_v0.json from checkpoint snapshot when dry_run false (atomic write + cache invalidation; no Neo4j); requires P4bh I/O gates + constitution checkpoint_facets_v0_snapshot_wired + DARKHERD_ORCHESTRATION_ROLLBACK_CHECKPOINT_FACETS_RESTORE_ENABLED; HTTP 409 when snapshot missing; audit orchestration.rollback_checkpoint.facets_v0_restored; HyperCharts POST /api/darkherd/orchestration/rollback-checkpoint-restore-facets-v0 forwards the same JSON","orchestration_rollback_checkpoint_delete":"DELETE /api/v1/orchestration/rollback-checkpoints/{checkpoint_id} — P4bm: bounded DELETE one SQLite orchestration_rollback_checkpoints metadata row + audit orchestration.rollback_checkpoint.deleted; requires same P4bh gates as append (else 403); HTTP 404 when id missing; returns checkpoint_sqlite_row_count + rollback echoes; HyperCharts DELETE /api/darkherd/orchestration/rollback-checkpoints/<int:checkpoint_id> forwards path","orchestration_wide_restructure_intake":"POST /api/v1/orchestration/wide-restructure-intake — P4h+P4ah: optional correlation_id + note JSON; always accepted=false + effect=none; p4ah + rollback/rollback_wired/rollback_config_source (P4v policy echo); appends SystemAuditEvent orchestration.wide_restructure.intake_declined; no apply-plan execution; HyperCharts POST /api/darkherd/orchestration/wide-restructure-intake (P4bx)","orchestration_validate_supervisor_decision":"POST /api/v1/orchestration/validate-supervisor-decision — P4j+P4ab: JSON body validated against supervisor_decision v1 (Pydantic mirror of schemas/supervisor_decision.v1.schema.json); p4ab + rollback/rollback_wired/rollback_config_source (P4v policy echo); HTTP 200 with valid boolean + validation_errors; no writes; json_schema_ids.supervisor_decision echoed as supervisor_decision_schema_id; HyperCharts POST /api/darkherd/orchestration/validate-supervisor-decision (P4bt)","orchestration_validate_neighborhood_plan":"POST /api/v1/orchestration/validate-neighborhood-plan — P4k+P4ac: JSON body validated against neighborhood_plan v1 (Pydantic mirror of schemas/neighborhood_plan.v1.schema.json) + job_class must appear in invariants job_classes; p4ac + rollback/rollback_wired/rollback_config_source (P4v policy echo); HTTP 200 with valid + validation_errors; no writes; json_schema_ids.neighborhood_plan echoed as neighborhood_plan_schema_id; echoes job_classes_available; HyperCharts POST /api/darkherd/orchestration/validate-neighborhood-plan (P4bt)","orchestration_validate_ontology_patch":"POST /api/v1/orchestration/validate-ontology-patch — P4l+P4ad: JSON body validated against ontology_patch v1 (Pydantic mirror of schemas/ontology_patch.v1.schema.json) + each op.op must not be in invariants forbidden_ontology_ops; p4ad + rollback/rollback_wired/rollback_config_source (P4v policy echo); HTTP 200 with valid + validation_errors; no writes; echoes forbidden_ontology_ops list; HTTP JSON detail cites P5a simulate + P5c apply-pointer for durable audits; HyperCharts POST /api/darkherd/orchestration/validate-ontology-patch (P4bt)","orchestration_simulate_ontology_patch":"POST /api/v1/orchestration/simulate-ontology-patch — P5a+P4ad: same ontology_patch v1 validation as validate-ontology-patch; on valid appends SystemAuditEvent ontology.patch.simulated with patch_sha256 + semantic_patch_sha256 + op_kind_counts; mutations_committed true only when audit row written; ontology_patch_applied false (no facets_v0.json / Neo4j mutation); optional ?correlation_id= for GET /api/v1/admin/audit-events (P4i); p4ad rollback echo; P5b updates ontology_patch_head last_simulated_* + last_simulated_semantic_patch_sha256; HyperCharts POST /api/darkherd/orchestration/simulate-ontology-patch (P5bg)","orchestration_propose_ontology_patch_for_asset":"POST /api/v1/orchestration/propose-ontology-patch-for-asset — P5g+P4ad: JSON {asset_id, ontology_version}; Mistral-assisted draft body validated like P5a; on valid appends SystemAuditEvent ontology.patch.proposed (audit only); requires constitution ontology_patch_proposal.wired true + DARKHERD_ONTOLOGY_PATCH_PROPOSAL_ENABLED=true + MISTRAL_API_KEY (HTTP 403 otherwise); HTTP 404 when asset_id missing; optional ?correlation_id=; p4ad rollback echo; operators chain P5a simulate / P5c apply on returned proposal JSON; HyperCharts POST /api/darkherd/orchestration/propose-ontology-patch-for-asset (P5gi)","orchestration_apply_ontology_patch":"POST /api/v1/orchestration/apply-ontology-patch — P5c+P5e+P4ad+P6p+P5ck+P5cp: same validators as P5a; when valid and body dry_run false appends SystemAuditEvent ontology.patch.applied (payload includes previous applied_* + simulated_sha_matches_apply + ontology_facets_v0_written + ontology_bundle_manifest_cache_invalidated + optional facets_catalog_executor_stats manifest_v0_disk_fp_sync_* when repo facets path written) and updates ontology_patch_head applied_*; when ontology_facets_catalog_executor.wired true in invariants, rename_node, deprecate_node, merge_concept, split_concept, add_edge_type, and rename_facet_map_key ops may write ontology/facets_v0.json (ontology_facets_v0_written; ontology_bundle_manifest_cache_invalidated mirrors it for P6p ontology_bundle_manifest file_fp coherence; P5 may persist manifest_v0.json files[].file_fp on disk); when ontology_facets_v0_written JSON includes graph_followup_hint (neo4j_uri_configured + enqueue_worker_job_kind neo4j_sync_graph_constraints + enqueue_worker_job_kind_assets neo4j_sync_graph_assets with optional asset_offset paging + enqueue_worker_job_kind_claim_ontology repair_claim_ontology_edges in queue JSON + enqueue hints for POST …/queue-worker-job + optional HyperCharts POST /api/darkherd/admin/maintenance/queue-worker-job (**P7xi** same JSON) + optional POST …/repair-claim-ontology-edges + optional HyperCharts POST /api/darkherd/admin/maintenance/repair-claim-ontology-edges (**P7xi** auth forward) + suggested_cli_* for Bolt materialization after disk edits; route still performs no Neo4j mutation) plus optional neo4j_followup_auto_enqueue summary (**P5ck**/**P5cp**: constitution ontology_patch_neo4j_followup_auto_enqueue.wired + DARKHERD_ONTOLOGY_PATCH_NEO4J_FOLLOWUP_AUTO_ENQUEUE_ENABLED + NEO4J_URI + enqueue_worker_job allowed_kinds may enqueue neo4j_sync_graph_constraints and/or neo4j_sync_graph_assets (after constraints) and/or repair_claim_ontology_edges worker_jobs; **P5cl** each ``jobs[]`` row echoes ``normalized_payload`` — **P4cv** parity; audit ontology.patch.neo4j_followup_auto_enqueued when jobs list non-empty); facets_catalog_executor_failed skips audit+head; ontology_patch_applied false; optional ?correlation_id=; p4ad rollback echo; HyperCharts POST /api/darkherd/orchestration/apply-ontology-patch (P5bh)","orchestration_revert_ontology_patch_head":"POST /api/v1/orchestration/revert-ontology-patch-head — P5f+P4ad: reads newest SystemAuditEvent ontology.patch.applied and sets ontology_patch_head.applied_* from payload previous_applied_* (SQLite pointer only; no facets_v0.json or Neo4j restore); requires constitution ontology_patch_head_revert.wired true and DARKHERD_ONTOLOGY_PATCH_HEAD_REVERT_ENABLED=true (else 403); HTTP 404 when no ontology.patch.applied rows; idempotent already_at_target skips new audit; on success appends ontology.patch.head_reverted; optional ?correlation_id=; p4ad rollback echo; HyperCharts POST /api/darkherd/orchestration/revert-ontology-patch-head forwards JSON body","orchestration_ontology_patch_head":"GET /api/v1/orchestration/ontology-patch-head — P5b+P4ad: read-only SQLite singleton ontology_patch_head (id=1); last_simulated_* from latest successful P5a simulate; applied_* from latest P5c apply-pointer when dry_run false; p4ad rollback echo; no writes; HyperCharts GET /api/darkherd/orchestration/ontology-patch-head (P4bq) forwards optional query string; portal.html ``btn-portal-ontology-patch-head`` loads full JSON on ``/portal`` (**P7js**)","orchestration_facets_catalog_status":"GET /api/v1/orchestration/facets-catalog-status — P5d+P5e+P4ad: read-only ontology/facets_v0.json presence + ontology_facets_v0_fp (facets_v0_fingerprint_for_episodes; P6g contract) plus ontology/manifest_v0.json presence + ontology_manifest_v0_fp (ontology_file_content_fp; P6p digest contract); ontology_facets_catalog_executor_wired mirrors invariants ontology_facets_catalog_executor.wired (P5e rename_node/deprecate_node/merge_concept/split_concept/add_edge_type/rename_facet_map_key disk apply on P5c when true); p5e echoes wired; p4ad rollback echo; complements GET /api/v1/graph/ontology-facets-v0; HyperCharts GET /api/darkherd/orchestration/facets-catalog-status (P4bq) forwards optional query string; portal.html ``btn-portal-facets-catalog-status`` loads full JSON on ``/portal`` (**P7js**)","orchestration_validate_claim_extraction_batch":"POST /api/v1/orchestration/validate-claim-extraction-batch — P4m+P4ae: JSON body validated against claim_extraction_batch v1 (Pydantic mirror of schemas/claim_extraction_batch.v1.schema.json); p4ae + rollback/rollback_wired/rollback_config_source (P4v policy echo); structural only (not claim_validation / P2 staging); HTTP 200 with valid + validation_errors; no writes; json_schema_ids.claim_extraction_batch echoed; HyperCharts POST /api/darkherd/orchestration/validate-claim-extraction-batch (P4bt)","orchestration_validate_apply_plan":"POST /api/v1/orchestration/validate-apply-plan — P4n+P4z: JSON body validated against apply_plan v1 (Pydantic mirror of schemas/apply_plan.v1.schema.json) + each operations[].op must not be in invariants forbidden_ontology_ops; p4z + rollback/rollback_wired/rollback_config_source (P4v policy echo); HTTP 200 with valid + validation_errors; no writes; json_schema_ids.apply_plan echoed as apply_plan_schema_id; echoes forbidden_ontology_ops list; HyperCharts POST /api/darkherd/orchestration/validate-apply-plan (P4bt)","orchestration_validate_wide_restructure_bundle":"POST /api/v1/orchestration/validate-wide-restructure-bundle — P4o+P4aa: JSON envelope with optional supervisor_decision, apply_plan, neighborhood_plan (same validators as P4j/P4n/P4k); p4aa + rollback/rollback_wired/rollback_config_source (P4v policy echo); HTTP 200 with valid + per-key results + bundle_validation_errors; at least one artifact required; extra top-level keys forbidden; no writes; echoes schema_ids, job_classes_available, forbidden_ontology_ops; HyperCharts POST /api/darkherd/orchestration/validate-wide-restructure-bundle (P4bt)","orchestration_wide_restructure_staged_preview":"POST /api/v1/orchestration/wide-restructure-staged-preview — P4t+P4u+P4w+P4cb: same P4o envelope + validation; adds p4t/p4p/p4r/p4s/p4u/p4w, dry_run, orchestration_routing, apply_plan_valid, staged_preview, registry_summary, registry_gate_ok (when apply_plan validates), supervisor_allow, supervisor_allow_gate_ok, wide_restructure_dry_run_ok, supervisor_mutating_bound_tool_job_classes (P4cb), rollback/rollback_wired/rollback_config_source (P4v policy echo); no writes; HyperCharts POST /api/darkherd/orchestration/wide-restructure-staged-preview (P4bt)","orchestration_staged_apply_preview":"POST /api/v1/orchestration/staged-apply-preview — P4p+P4r+P4s+P4x+P4cb: JSON { apply_plan, correlation_id? }; validates apply_plan (P4n rules); HTTP 200 with p4r, p4s, p4x, rollback/rollback_wired/rollback_config_source (P4v policy echo), supervisor_mutating_bound_tool_job_classes (P4cb), registry_summary, registry_gate_ok, apply_plan_valid, staged_preview per op (registry_match vs P4q orchestration_tools ids, execution skipped, no mutating writes); P4al constitution_snapshot_read + P4as worker_queue_health_read + P4at orchestration_status_read + P4be neo4j_graph_summary_read add read_only_preview (P4as uses SQLite session; P4at includes P4bc supervisor_bound_tools when configured); wired sqlite_noop_touch mutating_sqlite_noop adds mutating_capability (P4aw) pointing at POST execute-sqlite-noop-probe; wired rollback_checkpoint_append mutating_rollback_checkpoint adds mutating_capability (P4bz) pointing at POST rollback-checkpoint-append; dry_run true; orchestration_routing.wide_restructure_requires_dry_run_preview echo; complements GET dry-run-apply-preview (P4f); sibling POST execute-tool-probe (P4au) runs one wired read_only tool with audit; sibling POST staged-apply-execute (P4bf+P4bz) runs bounded sqlite_noop_touch and/or rollback_checkpoint_append ops when apply_plan matches (HyperCharts P4bg); HyperCharts POST /api/darkherd/orchestration/staged-apply-preview (P4bs)","orchestration_staged_apply_execute":"POST /api/v1/orchestration/staged-apply-execute — P4bf+P4bz+P4bg+P4x+P4cb: same JSON envelope as staged-apply-preview (response includes supervisor_mutating_bound_tool_job_classes P4cb); executes 1..N operations (each op sqlite_noop_touch and/or rollback_checkpoint_append and/or wired read_only P4q tool ids with read_only_preview payloads P4bg; total N capped by constitution orchestration_staged_apply_execute.max_sqlite_noop_touch_ops default 16 max 256) + single audit orchestration.staged_apply.executed (payload orchestration_sqlite_noop_touch_ids and/or orchestration_rollback_checkpoint_ids and/or read_only_tools_executed); sqlite path requires DARKHERD_ORCHESTRATION_SQLITE_NOOP_TOUCH_ENABLED + constitution sqlite_noop_touch wired mutating_sqlite_noop; rollback path requires DARKHERD_ORCHESTRATION_ROLLBACK_CHECKPOINT_IO_ENABLED + constitution orchestration_rollback.checkpoint_sqlite_metadata_wired + orchestration_tools rollback_checkpoint_append wired mutating_rollback_checkpoint; read_only path requires wired read_only registry + same preview eligibility as P4au (HTTP 400 staged_apply_execute_read_only_not_ready when ineligible); HTTP 403 when DARKHERD_ORCHESTRATION_STAGED_APPLY_EXECUTE_ENABLED=false or a required per-kind gate is off; HTTP 400 when operations empty, over cap, unsupported op, or mutating registry unwired; HyperCharts POST /api/darkherd/orchestration/staged-apply-execute (P4bg) forwards the same JSON","orchestration_execute_tool_probe":"POST /api/v1/orchestration/execute-tool-probe — P4au: JSON { tool_id, correlation_id? }; wired read_only P4q tools only (constitution_snapshot_read, worker_queue_health_read, orchestration_status_read, neo4j_graph_summary_read P4be read Cypher counts); returns read_only_preview + rollback/rollback_wired/rollback_config_source (P4v echo) + audit_event_id (orchestration.tool_probe.executed for P4i filters); mutations_committed true when audit row written; no ontology disk / Graphiti mutation; HTTP 403 when DARKHERD_ORCHESTRATION_TOOL_PROBE_ENABLED=false; HyperCharts POST /api/darkherd/orchestration/execute-tool-probe (P4av) forwards the same JSON","orchestration_execute_sqlite_noop_probe":"POST /api/v1/orchestration/execute-sqlite-noop-probe — P4aw: JSON { note?, correlation_id? }; requires constitution orchestration_tools sqlite_noop_touch wired true with kind mutating_sqlite_noop (else HTTP 400); bounded INSERT into orchestration_sqlite_noop_touches + audit_event_id (orchestration.sqlite_noop_touch.executed); returns orchestration_sqlite_noop_touch_id + orchestration_sqlite_noop_touch_table_rows + rollback echoes (P4v); HTTP 403 when DARKHERD_ORCHESTRATION_SQLITE_NOOP_TOUCH_ENABLED=false; HyperCharts POST /api/darkherd/orchestration/execute-sqlite-noop-probe (P4ax) forwards the same JSON","orchestration_supervisor_graph_invoke":"POST /api/v1/orchestration/supervisor-graph-invoke — P4ay+P4ba+P4bb: JSON { job_class?, correlation_id?, tool_id?, tool_dry_run?, tool_payload? }; requires constitution orchestration_supervisor.supervisor_graph_wired true (else HTTP 400); LangGraph resolves job_class + optional supervisor_bound_tools (refresh_tag_overlap_communities: Louvain; enqueue_worker_job: validated worker_jobs enqueue with constitution allowed_kinds (**P4cw** ``tool_result.normalized_payload`` echoes **P4cv** — same schema-normalized dict as stored / JSON null for invalidate; **P4cf** ``tool_payload`` may use ``kind:append_rollback_checkpoint`` when listed — **P4cd** queue row + **P4bh** gates on drain); mutating persist/enqueue only when resolved_job_class is in orchestration_supervisor.mutating_bound_tool_job_classes (P4cb; default dirty_community_refresh|scheduled_full_rebuild|manual_admin) when tool wired); JSON echoes resolved_job_class_allows_mutating_bound_tools (same gate as P4bn routing-preview ?job_class=); audit orchestration.supervisor_graph.invoked (payload includes that flag); response tool_mutations_committed when SQLite persist or enqueue ran; rollback echoes (P4v); HTTP 403 when DARKHERD_SUPERVISOR_GRAPH_INVOKE_ENABLED=false; HyperCharts POST /api/darkherd/orchestration/supervisor-graph-invoke (P4az) forwards the same JSON","page_analytical_graph":"/graph — viz fetch failures → **Reset overview** retries (**P1veq** ``graph_explorer.js`` status hint + **P1ver** graph.html); corpus_scope on overview|neighbourhood|tag-focus (SQLite pool); viz_mode|dim|kg_dim; nb_hops|hops, nb_max_*, tf_max_assets; include_claims|include_ontology_facets (aliases viz_claims|viz_ontology_facets; ontology independent of claims, P1aq+P1ar); viz_asset_tier=all|active|archived (alias kg_asset_tier; client-only corpus_tier filter, P1au); viz_show_domains|viz_show_tags (aliases kg_show_*; client-only, P1ay); viz_show_claim_nodes|viz_show_catalog_nodes (aliases kg_show_claim_nodes|kg_show_catalog_nodes; client-only claim/ClaimKind + Technology/Risk viz nodes, P1az); lockdown: denied HTML → /admin?next= same-origin return after sign-in (P1av); ontology-facets-v0 (P1an); graph/summary rel counts (P1ao+P1ar); force-graph facets (P1ap+P1ar) (runbook 4); Bolt snapshot also fetches claim-kind-facet-counts when claims>0 (P1ac+P3aa) and P3aq–P3at global ontology histograms when assets/claims>0 (P3au) plus P3av/P3aw Technology×Risk pair tables (P3ax) plus P3bl/P3bm domain/tag Technology×Risk triple tables on assets when assets>0 and domains/tags>0 plus P3bp tag-overlap-community domain×asset Technology×Risk triple when assets>0 and domains>0 (P3bl×persisted community on :Asset) plus P3ay/P3az ClaimKind×ontology pair tables when claims>0 (P3ba) plus P3bb/P3bc distinct-asset ClaimKind×ontology tables when claims>0 (P3bd) plus P3bu tag-overlap-community distinct-asset ClaimKind×Technology|Risk pair tables when claims>0 (P3bb/P3bc×persisted tag_overlap_community_id on claim hosts) plus P3bf/P3bg domain-scoped ClaimKind×ontology triple tables when claims>0 and domains>0 plus P3bh/P3bi tag-scoped triple tables when claims>0 and tags>0 plus P3bt tag-overlap-community tag×ClaimKind×Technology|Risk when claims>0 and tags>0 (P3bh/P3bi×persisted tag_overlap_community_id + HAS_TAG) plus P3bw tag-overlap-community tag×distinct-asset ClaimKind×Technology|Risk when claims>0 and tags>0 (P3bt×distinct-asset rollup on claim hosts) plus P3bj/P3bk domain/tag Technology×Risk triple tables on claims when claims>0 and domains/tags>0 plus P3bq tag-overlap-community domain×claim Technology×Risk triple when claims>0 and domains>0 (P3bj×persisted tag_overlap_community_id on hosts) plus P3bx tag-overlap-community domain×distinct-asset claim Technology×Risk when claims>0 and domains>0 (P3bq×distinct-asset rollup on claim hosts) plus P3bs tag-overlap-community domain×ClaimKind×Technology|Risk quadruples when claims>0 and domains>0 (P3bf/P3bg×persisted tag_overlap_community_id on claim hosts) plus P3bv tag-overlap-community domain×distinct-asset ClaimKind×Technology|Risk when claims>0 and domains>0 (P3bs×distinct-asset rollup on claim hosts) plus P3bn tag-overlap-community claim Technology×Risk triple table when claims>0 (persisted tag_overlap_community_id on hosts; tags summary not required) plus P3bz tag-overlap-community asset-claim Technology×Risk triple when claims>0 (P3bn×distinct-asset rollup on claim hosts; tags summary not required) plus P3br tag-overlap-community tag×claim Technology×Risk table when claims>0 and tags>0 (P3bk×persisted community + HAS_TAG on hosts) plus P3by tag-overlap-community tag×distinct-asset claim Technology×Risk when claims>0 and tags>0 (P3br×distinct-asset rollup on claim hosts); plus P3bo tag-overlap-community asset Technology×Risk triple when assets>0 (same persist on :Asset; P3av); Bolt snapshot logic in /static/graph_snapshot_panel.js also loaded by /dashboard (P3be); companion meta endpoints.page_dashboard for embedded /dashboard KG (P1bd); HTML echoes endpoints.page_analytical_graph + endpoints.page_dashboard + endpoints.page_portal (P1be; /portal footer P1bf same trio); graph.html header cites GET /api/v1/orchestration/status + endpoints.orchestration_status on GET /api/v1/meta (P4ao) + graph.html **P4de** **P4db** strip + **P4dj** static **P4dh**/**P4di** line (insights **P4bc**/**P4cb**; meta **P4di**) (GET /api/v1/insights/summary supervisor_wired|supervisor_graph_invoke_enabled|p4db — **P4cz**/**P4da**; mirrors /portal **P4dc**) + graph.html P4cq strip GET /api/v1/insights/summary + analytical_refresh_policy (Vision §5.2) parity with orchestration/status + meta P4cr + GET /api/v1/orchestration/tool-adapters-status P4cs + runbook 9f/P5cw scheduling (not auto from JSON) + **P3dv** footer ``p3ds_global_refresh_autoschedule_metrics`` (**P3ds**/ **P3dr** parity ``GET /metrics``) + **P4de** cross-read ``/portal`` (**P3dq**/ **P3ds**) + ``/admin`` (**P3du**) + **P7zaoi** ``database_dialect``/marker ``p7zaoi`` (``GET /api/v1/ready`` **P7zaoe**; ``GET /metrics`` ``darkherd_database_up`` **P7zaoh**) + GET /api/v1/graphiti/status + endpoints.graphiti_status + HyperCharts /api/darkherd/graphiti/status (P6b) + POST /api/v1/graphiti/search + endpoints.graphiti_search + HyperCharts POST /api/darkherd/graphiti/search (P6d) + endpoints.graphiti_episodes Graphiti POST /messages server ingest (P6e, P6h echoes P6g facets_v0 fingerprint + P6j echoes P6i darkherd_episode_v0 JSON prefix + P6k ontology_facets_v0_fp + P6m ontology_template_id|ontology_catalog_sizes + P6p ontology_bundle_manifest|manifest_v0.json bundle + P6q+P6r+P6s operator HTML+lockdown403 echo ontology_bundle_roles + ontology_narrative_template_meta + endpoints.graph_ontology_facets_v0 + HyperCharts GET /api/darkherd/graph/ontology-facets-v0 (P6o graph proxy) in operator HTML/403); HyperCharts orchestration ontology spine: GET /api/darkherd/orchestration/status (P4ar); POST /api/darkherd/orchestration/validate-ontology-patch + validate-* read bundle + wide-restructure-staged-preview (P4bt read-only); POST /api/darkherd/orchestration/simulate-ontology-patch (P5bg P5a); POST /api/darkherd/orchestration/apply-ontology-patch (P5bh P5c); POST /api/darkherd/orchestration/revert-ontology-patch-head (P5f); GET /api/darkherd/orchestration/ontology-patch-head + …/facets-catalog-status (P4bq P5b/P5d); same GET /api/v1/meta|HyperCharts GET /api/darkherd/meta exposes endpoints.operator_readme_startup (§9 README_STARTUP + README Execution progress checklist 2 smoke-header README checklist 3; matches endpoints.page_portal); GET /api/v1/meta lists orchestration_validate_ontology_patch orchestration_simulate_ontology_patch orchestration_ontology_patch_head orchestration_apply_ontology_patch orchestration_facets_catalog_status; README.md INTEGRATION.md (page_portal parity)","page_dashboard":"/dashboard — operator HTML; Bolt snapshot strip above the KG uses /static/graph_snapshot_panel.js (same fetches as /graph summary + P3aa/P3au–P3ax + P3bl/P3bm/P3bp/P3bo + P3ba/P3bd/P3bu + P3bf/P3bg/P3bh/P3bi/P3bt/P3bw/P3bj/P3bk/P3bq/P3bx/P3bs/P3bv/P3bn/P3bz/P3br/P3by when counts allow; per-fetch gates match endpoints.page_analytical_graph (e.g. P3bn/P3bz at claims>0 without requiring snapshot tags>0) — P3be); embedded analytical KG (graph_explorer.js) accepts the same URL query vocabulary as /graph: corpus_scope, viz_mode|dim|kg_dim, nb_hops|hops, nb_max_*, tf_max_assets, include_claims|include_ontology_facets (viz_claims|viz_ontology_facets — SQLite **P1vfw** + **P1vfx** dashboard KG hint mirrors /graph), client-only viz_asset_tier|kg_asset_tier (P1au), viz_show_domains|viz_show_tags (P1ay), viz_show_claim_nodes|viz_show_catalog_nodes (P1az); hints link /portal presets (P1bb); discoverability triangle with /portal (P1bc); lockdown same as /graph (P1av) (P1bd); HTML Bolt + KG cite endpoints.page_dashboard/endpoints.page_analytical_graph/endpoints.page_portal (P1be); HTML KG hint documents center_asset_id + tag URL deep-links matching /graph (P1ad P1ae P1bd); dashboard.html KG section cites GET /api/v1/orchestration/status + endpoints.orchestration_status on GET /api/v1/meta (P4ao) + dashboard.html **P4de** **P4db** strip + **P4dj** static **P4dh**/**P4di** line (insights **P4bc**/**P4cb**; meta **P4di**) (GET /api/v1/insights/summary supervisor_wired|supervisor_graph_invoke_enabled|p4db — **P4cz**/**P4da**; mirrors /portal **P4dc**) + dashboard.html P4cq strip GET /api/v1/insights/summary + analytical_refresh_policy (Vision §5.2) parity with orchestration/status + meta P4cr + GET /api/v1/orchestration/tool-adapters-status P4cs + runbook 9f/P5cw scheduling (not auto from JSON) + **P3dv** footer ``p3ds_global_refresh_autoschedule_metrics`` (**P3ds**/ **P3dr** parity ``GET /metrics``) + **P4de** cross-read ``/portal`` (**P3dq**/ **P3ds**) + ``/admin`` (**P3du**) + **P7zaoi** ``database_dialect``/marker ``p7zaoi`` (``GET /api/v1/ready`` **P7zaoe**; ``GET /metrics`` ``darkherd_database_up`` **P7zaoh**) + GET /api/v1/graphiti/status + endpoints.graphiti_status + HyperCharts /api/darkherd/graphiti/status (P6b) + POST /api/v1/graphiti/search + endpoints.graphiti_search + HyperCharts POST /api/darkherd/graphiti/search (P6d) + endpoints.graphiti_episodes Graphiti POST /messages server ingest (P6e, P6h echoes P6g facets_v0 fingerprint + P6j echoes P6i darkherd_episode_v0 JSON prefix + P6k ontology_facets_v0_fp + P6m ontology_template_id|ontology_catalog_sizes + P6p ontology_bundle_manifest|manifest_v0.json bundle + P6q+P6r+P6s operator HTML+lockdown403 echo ontology_bundle_roles + ontology_narrative_template_meta + endpoints.graph_ontology_facets_v0 + HyperCharts GET /api/darkherd/graph/ontology-facets-v0 (P6o graph proxy) in operator HTML/403); HyperCharts orchestration ontology spine: GET /api/darkherd/orchestration/status (P4ar); POST /api/darkherd/orchestration/validate-ontology-patch + validate-* read bundle + wide-restructure-staged-preview (P4bt read-only); POST /api/darkherd/orchestration/simulate-ontology-patch (P5bg P5a); POST /api/darkherd/orchestration/apply-ontology-patch (P5bh P5c); POST /api/darkherd/orchestration/revert-ontology-patch-head (P5f); GET /api/darkherd/orchestration/ontology-patch-head + …/facets-catalog-status (P4bq P5b/P5d); same GET /api/v1/meta|HyperCharts GET /api/darkherd/meta exposes endpoints.operator_readme_startup (§9 README_STARTUP + README Execution progress checklist 2 smoke-header README checklist 3; matches endpoints.page_portal); GET /api/v1/meta lists orchestration_validate_ontology_patch orchestration_simulate_ontology_patch orchestration_ontology_patch_head orchestration_apply_ontology_patch orchestration_facets_catalog_status; README.md INTEGRATION.md (page_portal parity)","html_lockdown_signin_next":"DARKHERD_LOCKDOWN_HTML: /graph|/dashboard|/portal 403 links to /admin?next=<encoded path>; allowlist /graph /dashboard /portal + query; admin_gate redirects after POST /api/v1/admin/login (P1av); 403 HTML body lists /graph /dashboard /portal + GET /api/v1/meta (P1bg); HTML echoes endpoints.html_lockdown_signin_next + endpoints.page_analytical_graph + endpoints.page_dashboard + endpoints.page_portal (P1bg extends P1be); 403 HTML + this string cite GET /api/v1/orchestration/status + endpoints.orchestration_status (P4aq) + 403 HTML P4cq analytical_refresh_policy paragraph after P4aq before P5 (GET /api/v1/insights/summary + orchestration/status parity + meta P4cr + tool-adapters-status P4cs; mirrors signed-in /graph + /dashboard strips) + 403 HTML **P3dw** autoschedule metrics (`p3ds_global_refresh_autoschedule_metrics` / **P3dr** GET /metrics / **P3ds** / **P3du** — **P4de** lockdown parity vs **P3dv** /graph + /dashboard) after **P4cq** before **P4dd** + 403 HTML **P7zaoi** SQL engine dialect paragraph (`database_dialect`, marker `p7zaoi`, **P7zaoe** GET /api/v1/ready + **P7zaoh** `darkherd_database_up` on GET /metrics; **P4dd** lockdown parity vs signed-in /portal + /graph + /dashboard) after **P3dw** before **P7zkl** + 403 HTML **P7zkl**/**P7zki** worker job queue depth paragraph (`worker_jobs_rows_by_status`, `p7zki`, **P7zf** `darkherd_worker_jobs_rows`; **P7zkk** signed-in /portal + /graph + /dashboard parity) after **P7zaoi** + 403 HTML **P2zy** staging_claims_rows_by_status paragraph (`staging_claims_rows_by_status`, `p2zy`, **P7zf** `darkherd_staging_claims_rows`; signed-in /portal + /graph + /dashboard parity) after worker paragraph + 403 HTML **P2zb** extract_claims_staging_worker_jobs_rows_by_status paragraph (`extract_claims_staging_worker_jobs_rows_by_status`, `p2zb`, **P7zf** `darkherd_extract_claims_staging_worker_jobs_rows`; **P7p** kind `extract_claims_staging`; signed-in /portal + /graph + /dashboard parity) after **P2zy** before supervisor **P4db** + lockdown **P2vdi**/**P2vdh** `extract_claims_corpus_sweep_pages_total` + **P7zf** `darkherd_extract_claims_corpus_sweep_pages_total` paragraph after **P2zb** + 403 HTML **P4dd** **P4db** supervisor invoke prerequisites paragraph after **P7zkl** before **P7zak** (same GET /api/v1/insights/summary fields as **P4cz**/**P4da**; complements signed-in **P4dc** /portal) + 403 HTML **P4dd** **P4dj**/**P4dh**/**P4di** bound-tool governance paragraph after **P4db** (insights/meta parity) + 403 HTML **P7zak** Recent jobs pointer after **P4dd** (GET /api/v1/admin/jobs + HyperCharts GET /api/darkherd/admin/jobs **P7zai**; **P7zah** tag_overlap_followup append; **P7zaj** admin_gate signed-in cue complement; **P7zac**/**P7zag**/**P7zae**) + 403 HTML P5 ontology patch paragraph after P4cq (same copy as signed-in HTML footers: orchestration_validate_ontology_patch orchestration_simulate_ontology_patch orchestration_ontology_patch_head orchestration_apply_ontology_patch orchestration_facets_catalog_status on GET /api/v1/meta; HyperCharts /api/darkherd/orchestration/status (P4ar) + POST validate/simulate/apply/revert ontology + read-only validate bundle (P4bt P5bg P5bh P5f); GET /api/v1/meta|HyperCharts GET /api/darkherd/meta exposes endpoints.operator_readme_startup (§9 README_STARTUP + README Execution progress checklist 2 smoke-header README checklist 3; matches endpoints.page_portal); README INTEGRATION) + GET /api/v1/graphiti/status + endpoints.graphiti_status + HyperCharts /api/darkherd/graphiti/status (P6c) + ontology facets 403 paragraph GET /api/v1/graph/ontology-facets-v0 + endpoints.graph_ontology_facets_v0 + HyperCharts GET /api/darkherd/graph/ontology-facets-v0 (P6o) + graphiti episode ingest 403 paragraph endpoints.graphiti_episodes Graphiti POST /messages server ingest (P6f; P6h echoes P6g facets_v0 fingerprint like signed-in HTML footers; P6j echoes P6i darkherd_episode_v0 JSON prefix + P6k ontology_facets_v0_fp + P6m ontology_template_id|ontology_catalog_sizes + P6p ontology_bundle_version|ontology_bundle_fp|ontology_bundle_manifest + P6q+P6r+P6s operator HTML footers + lockdown 403 echo P6p bundle fields + ontology_bundle_roles + ontology_narrative_template_meta; _html_lockdown_denied 403 body + this meta cite HyperCharts-only operator gate path GET /darkherd/admin-gate as prose (**P7xw**; **P7xr**/**P7xv**); not a relative link on this FastAPI host)","page_admin_gate":"/admin — when DARKHERD_LOCKDOWN_HTML and unauthenticated, returns admin_gate.html (password form); POST /api/v1/admin/login then redirect to next allowlist path or /admin; HyperCharts GET /darkherd/admin-gate serves the same template with companion fetch to POST /api/darkherd/admin/login + default post-login /darkherd/admin (**P7xr**; ?next= allowlist matches lockdown); template lists /admin /dashboard /graph /portal + GET /api/v1/meta (P1bh); **P7xv** gate login strip refreshAuthProbeStatus calls GET /api/v1/admin/configured + GET /api/v1/admin/me via sameOriginApiPath on load + after failed login (HyperCharts **P7xt** paths when ADMIN_FETCH_VIA_COMPANION); **P7jd** admin_gate.html cost wiring card (btn-gate-costs-hints → GET /api/v1/costs/summary provider_export_hints **P7jb**; sameOriginApiPath **P7xq**); **P7jg** btn-gate-costs-export-darkherd → GET /api/v1/costs/provider-export?provider=darkherd (**P7zc**; sameOriginApiPath **P7xq**); **P7jj** btn-gate-costs-export-mistral|openai|anthropic|deepseek|openrouter|stability|replicate|huggingface → same route (**P7j**/**P7y**/**P7zd**/**P7jl**/**P7zal**/**P7zas**/**P7zat**/**P7zau**; wireGateCostsProviderExport); **P5cs** btn-gate-p5-neo4j-followup-echo + gate-p5-neo4j-followup-status + gate-p5-neo4j-followup-out → ``GET /api/v1/orchestration/status`` ``ontology_patch_neo4j_followup_auto_enqueue`` (**P5cn**); optional ``GET /api/v1/insights/summary`` **P5cm** JSON equality when reachable (else **P5cr** on signed-in ``/admin``); **P5cu** btn-gate-p5-graph-followup-echo + gate-p5-graph-followup-status + gate-p5-graph-followup-out → same GETs for ``ontology_patch_graph_followup`` (**P5co** + optional **P5cj** parity; signed-in **P5ct** on ``/portal``); **P7kg** btn-gate-p7kg-refresh-trace + gate-p7kg-refresh-status + gate-p7kg-refresh-out → ``GET /api/v1/insights/summary`` ``analytical_global_refresh_admin_job_runs`` when unauthenticated route policy allows (else status cues signed-in ``/admin`` btn-p7kg-refresh-trace); **P3du** btn-gate-p3du-autoschedule-metrics + gate-p3du-metrics-status + gate-p3du-metrics-out → same GET ``p3ds_global_refresh_autoschedule_metrics`` (**P3ds** · **P3dr**); **P7zaol** ``admin_gate.html`` SQL dialect prose card (**P7zaoi** ``database_dialect``/``p7zaoi`` — **P7zaoe** ``GET /api/v1/ready`` + **P7zaoh** ``GET /metrics`` ``darkherd_database_up``; parity **P7zaok**/**P7zaoj** operator surfaces); **P7ji** btn-gate-worker-job-kinds → GET /api/v1/meta worker_job_kinds + worker_job_kinds_count (**P7jh**; sameOriginApiPath **P7xq**); **P4ct** btn-gate-arp-parity + gate-arp-status + gate-arp-out → GET /api/v1/meta + GET /api/v1/orchestration/tool-adapters-status JSON equality on analytical_refresh_policy (**P4cr**/**P4cs**; sameOriginApiPath **P7xq**); **P4df** ``admin_gate.html`` P4ct gate cites **P4db** + **P4dh**/**P4di** on ``GET …/insights/summary`` / ``GET …/meta`` when allowed; **P5cx** signed-in ``/admin`` analytical refresh card **P4cu** ``btn-top-pipeline-enqueue`` → ``tag_overlap_publish_pipeline`` + **P5cw** ``btn-top-rebuild-full-enqueue`` → ``rebuild_tag_overlap_full`` via ``POST /api/v1/admin/maintenance/queue-worker-job`` (**P7k**; HyperCharts ``POST /api/darkherd/admin/maintenance/queue-worker-job`` **P7xi**); gate template read-only (no queue POST here); **P7zaj** admin_gate.html header cites signed-in ``/admin`` **Recent jobs** (**btn-jobs** → ``GET /api/v1/admin/jobs`` + HyperCharts ``GET /api/darkherd/admin/jobs`` **P7zai**) **P7zah** ``detail.tag_overlap_followup`` append for ``incremental_ingest`` rows (**P7zac**/**P7zag**/**P7zae**); HTML echoes endpoints.page_admin_gate + endpoints.page_analytical_graph + endpoints.page_dashboard + endpoints.page_portal (P1bh extends P1be); gate HTML + this string cite GET /api/v1/orchestration/status + endpoints.orchestration_status on GET /api/v1/meta (P4an) + GET /api/v1/graphiti/status + endpoints.graphiti_status + HyperCharts /api/darkherd/graphiti/status (P6b) + POST /api/v1/graphiti/search + endpoints.graphiti_search + HyperCharts POST /api/darkherd/graphiti/search (P6d) + endpoints.graphiti_episodes Graphiti POST /messages server ingest (P6e, P6h echoes P6g facets_v0 fingerprint + P6j echoes P6i darkherd_episode_v0 JSON prefix + P6k ontology_facets_v0_fp + P6m ontology_template_id|ontology_catalog_sizes + P6p ontology_bundle_manifest|manifest_v0.json bundle + P6q+P6r+P6s operator HTML+lockdown403 echo ontology_bundle_roles + ontology_narrative_template_meta + endpoints.graph_ontology_facets_v0 + HyperCharts GET /api/darkherd/graph/ontology-facets-v0 (P6o graph proxy) in operator HTML/403); HyperCharts orchestration ontology spine: GET /api/darkherd/orchestration/status (P4ar); POST /api/darkherd/orchestration/validate-ontology-patch + validate-* read bundle + wide-restructure-staged-preview (P4bt read-only); POST /api/darkherd/orchestration/simulate-ontology-patch (P5bg P5a); POST /api/darkherd/orchestration/apply-ontology-patch (P5bh P5c); POST /api/darkherd/orchestration/revert-ontology-patch-head (P5f); GET /api/darkherd/orchestration/ontology-patch-head + …/facets-catalog-status (P4bq P5b/P5d); same GET /api/v1/meta|HyperCharts GET /api/darkherd/meta exposes endpoints.operator_readme_startup (§9 README_STARTUP + README Execution progress checklist 2 smoke-header README checklist 3; matches endpoints.page_portal); GET /api/v1/meta lists orchestration_validate_ontology_patch orchestration_simulate_ontology_patch orchestration_ontology_patch_head orchestration_apply_ontology_patch orchestration_facets_catalog_status; README.md INTEGRATION.md (page_portal parity)","page_admin":"/admin — when lockdown off (or after cookie session when lockdown on), returns admin.html; header links /dashboard /graph /portal + GET /api/v1/meta (P1bi); staging list P2z one-click prev/next offset (P2x when Filter total on); staging P2aa bulk dry-run prev/next offset buttons (P2y after Preview); claim revisions P2ab live line-diff vs canonical_claim_text while typing; P2ac auto-refresh revisions GET after append; P2ad click staging ID column to fill Claim id; P2ae double-click ID cell to Load revisions; P2af Use claim from selection → draft + Claim id; P2ag same button fills kind/conf when optional fields blank; P2ah ID cell click/dblclick checks row checkbox; P2ai Download page JSON (Blob) exports last Load/refresh scLastRows + filter echo client-side; P2aj Copy page JSON (Clipboard writeText) same payload as P2ai with secure-context fallback message; P2ca+P2cb btn-sc-csv-export window.open GET /api/v1/admin/staging-claims/export with buildStagingClaimsQueryParams('csv') (same list filters; omits include_promotion_hints only; Filter total on → include_total=true + **P2cb** X-DarkHerd-Staging-* paging echo headers); P2ak sessionStorage restores staging list filters + include toggles + emit/detach checkboxes (debounced persist; after list load + P2z/P2aa offset copies); P2al sessionStorage **v6** for extract-claims row (asset limit/offset, chunks per asset, chunk rank offset **P2vcj** / **P2vci**, chunk sweep passes **P2vck**, sleep, queue-to-worker, include archived **P2vcx**, corpus sweep + optional max sweep pages **P2vda**/**P2vcz**; debounced + after extract POST); P2am sessionStorage for claim-revisions panel (claim id, diff toggles, optional kind/conf, neo sync; not new-claim textarea; debounced + after load/append/ID fills); P2an Clear saved staging UI removes P2ak/P2al/P2am sessionStorage keys for the tab (fields unchanged until reload); P2ap client-only substring filter on last-loaded staging table rows (no new API; label skips P2ao to avoid confusion with P2o Neo4j sync); P2aq P2ap row_filter string capped 200 chars stored in P2ak list_filters sessionStorage + cleared with P2an; Tag overlap (P3): btn-tc-leiden-sqlite + btn-tc-leiden-neo4j call read-only P3ag Leiden GETs with same max_assets/resolution/tag_fanout_cap/seed as persist row (P3ah preview; no SQLite writes); queue observability card (P7zq/P7zr) — **P7zfq** fragment ``#p7-worker-queue`` on Worker queue observability ``h2`` for ``/portal`` Summary when ``worker_jobs_rows_by_status.failed>0``; exposes /api/v1/admin/maintenance/worker-jobs/health + /health-trend + /slo from /admin; P7zt adds queue remediation controls on the same card (btn-wq-retry, btn-wq-cancel, btn-wq-prune, btn-wq-list) for POST /api/v1/admin/maintenance/worker-jobs/{worker_job_id}/retry + /cancel + /prune and GET /api/v1/admin/maintenance/worker-jobs list (**P7zaa** optional ``kind``/``status`` query + ``wq-list-kind``/``wq-list-status`` beside ``wq-list-limit``); P7zu adds prune preview safety (btn-wq-prune-preview uses dry_run=true before destructive prune); P7zv adds recent action feed button btn-wq-actions for GET /api/v1/admin/maintenance/worker-jobs/actions (admin.worker_job.* audit stream); P7zw adds digest button btn-wq-actions-summary for GET /api/v1/admin/maintenance/worker-jobs/actions-summary (event_type_counts aggregate); P7zx adds wq-actions-since-hours optional rolling window (since_hours query on actions + actions-summary); P7zy wq-actions-summary-limit input (1..10000) for actions-summary only alongside wq-list-limit (1..200) for worker-jobs list + …/actions. HTML echoes endpoints.page_admin + endpoints.page_analytical_graph + endpoints.page_dashboard + endpoints.page_portal (P1bi extends P1be); staging Symbol column links /graph?center_asset_id= and /dashboard?center_asset_id= for SQLite asset id (P2ar+P2at crosses P1ad); header HTML + this string cite GET /api/v1/orchestration/status + endpoints.orchestration_status on GET /api/v1/meta (P4an) + GET /api/v1/graphiti/status + endpoints.graphiti_status + HyperCharts /api/darkherd/graphiti/status (P6b) + POST /api/v1/graphiti/search + endpoints.graphiti_search + HyperCharts POST /api/darkherd/graphiti/search (P6d) + endpoints.graphiti_episodes Graphiti POST /messages server ingest (P6e, P6h echoes P6g facets_v0 fingerprint + P6j echoes P6i darkherd_episode_v0 JSON prefix + P6k ontology_facets_v0_fp + P6m ontology_template_id|ontology_catalog_sizes + P6p ontology_bundle_manifest|manifest_v0.json bundle + P6q+P6r+P6s operator HTML+lockdown403 echo ontology_bundle_roles + ontology_narrative_template_meta + endpoints.graph_ontology_facets_v0 + HyperCharts GET /api/darkherd/graph/ontology-facets-v0 (P6o graph proxy) in operator HTML/403); HyperCharts orchestration ontology spine: GET /api/darkherd/orchestration/status (P4ar); POST /api/darkherd/orchestration/validate-ontology-patch + validate-* read bundle + wide-restructure-staged-preview (P4bt read-only); POST /api/darkherd/orchestration/simulate-ontology-patch (P5bg P5a); POST /api/darkherd/orchestration/apply-ontology-patch (P5bh P5c); POST /api/darkherd/orchestration/revert-ontology-patch-head (P5f); GET /api/darkherd/orchestration/ontology-patch-head + …/facets-catalog-status (P4bq P5b/P5d); same GET /api/v1/meta|HyperCharts GET /api/darkherd/meta exposes endpoints.operator_readme_startup (§9 README_STARTUP + README Execution progress checklist 2 smoke-header README checklist 3; matches endpoints.page_portal); GET /api/v1/meta lists orchestration_validate_ontology_patch orchestration_simulate_ontology_patch orchestration_ontology_patch_head orchestration_apply_ontology_patch orchestration_facets_catalog_status; README.md INTEGRATION.md (page_portal parity); P6l incremental ingest section cites endpoints.admin_incremental_ingest for post_ingest.graphiti replay keys + Done status summarizes episodes_replayed length when present; **P7zae** tagOverlapFollowupLine on btn-ingest ingest-msg + promoteStagingIds + btn-sc-bulk-exe-prom appends tag_overlap_followup (**P7zac** incremental when new assets; **P7zad** promote/bulk); **P2vfp** ``stagingPromoteBoltHint`` on promote + bulk-promote + bulk dry-run promote API failures when the error text suggests Bolt/**NEO4J_URI** (runbook **4** / ``sync_graph``); **P2vfs** ``extractStagingErrorHint`` on ``POST …/extract-claims-staging`` (**btn-sc-extract**) when errors suggest Mistral / **MISTRAL_API_KEY** / rate / timeout (**P2zz**, runbook **6b**); **P7zah** Recent jobs (**btn-jobs** → GET /api/v1/admin/jobs) appends adminJobsTagOverlapFollowupAppend after JSON for incremental_ingest rows using detail.tag_overlap_followup (**P7zac**/**P7zag**); **P7xu** login card refreshAuthProbeStatus calls GET /api/v1/admin/configured + GET /api/v1/admin/me via sameOriginApiPath after load + login/logout (HyperCharts **P7xt** paths when ADMIN_FETCH_VIA_COMPANION); **P7jc** Cost dashboard wiring card: btn-costs-hints → GET /api/v1/costs/summary provider_export_hints (**P7jb**; sameOriginApiPath **P7xq**); **P7jg** btn-costs-export-darkherd → GET /api/v1/costs/provider-export?provider=darkherd (**P7zc** SQLite rows envelope; sameOriginApiPath **P7xq** → HyperCharts GET /api/darkherd/costs/provider-export); **P7jj** btn-costs-export-mistral|openai|anthropic|deepseek|openrouter|stability|replicate|huggingface → same route provider=mistral|openai|anthropic|deepseek|openrouter|stability|replicate|huggingface (**P7j**/**P7y**/**P7zd**/**P7jl**/**P7zal**/**P7zas**/**P7zat**/**P7zau**; wireAdminCostsProviderExport); **P7ji** btn-worker-job-kinds → GET /api/v1/meta worker_job_kinds + worker_job_kinds_count (**P7jh**; sameOriginApiPath **P7xq** → HyperCharts GET /api/darkherd/meta); **P4ct** btn-arp-parity + arp-status + arp-out → GET /api/v1/meta + GET /api/v1/orchestration/tool-adapters-status client JSON equality on analytical_refresh_policy (**P4cr**/**P4cs** parity with **P4cq** status object); **P4df** ``admin.html`` P4ct card cites **P4db** + **P4dh**/**P4di** on ``GET …/insights/summary`` / ``GET …/meta`` (``supervisor_wired`` / ``supervisor_graph_invoke_enabled`` / ``p4db``; bound-tool **P4bc**/**P4cb** — cross-read **P4dc**/**P4de**/**P4dd**/**P4dj**); **P4cu** btn-top-pipeline-enqueue + top-pipeline-msg + top-pipeline-out + checkboxes top-pipeline-sync-neo4j / top-pipeline-summarize → POST /api/v1/admin/maintenance/queue-worker-job kind tag_overlap_publish_pipeline (Vision §5.2 scheduled-style pass; **P7k** drain; optional Mistral summarize); **P5cw** btn-top-rebuild-full-enqueue + top-rebuild-full-msg + top-rebuild-full-out + checkboxes top-rebuild-full-neo4j-sync / top-rebuild-full-summarize → same POST kind rebuild_tag_overlap_full (**P5cv** ``rebuild_tag_overlap_job`` / runbook **9f**; **P7k** drain); **P5cr** btn-p5-neo4j-followup-echo + p5-neo4j-followup-status + p5-neo4j-followup-out → GET /api/v1/insights/summary + GET /api/v1/orchestration/status JSON equality on ontology_patch_neo4j_followup_auto_enqueue (**P5cm**/**P5cn**/**P5cq** audit echo parity; sameOriginApiPath **P7xq**); **P7kg** btn-p7kg-refresh-trace + p7kg-refresh-status + p7kg-refresh-out → GET /api/v1/insights/summary ``analytical_global_refresh_admin_job_runs`` bounded trace (Vision §5.2 cron correlator; sameOriginApiPath **P7xq**); **P3du** btn-p3du-autoschedule-metrics + p3du-metrics-status + p3du-metrics-out → same GET ``p3ds_global_refresh_autoschedule_metrics`` (**P3ds** · **P3dr**); **P7zaol** ``admin.html`` SQL dialect prose card (**P7zaoi** — **P7zaoe**/ **P7zaoh**; parity **P7zaok**); **P1bp** CoinGecko stale card: btn-admin-reconcile-coingecko-stale → POST /api/v1/admin/maintenance/reconcile-coingecko-stale-archive (**P1bn**); btn-admin-enqueue-coingecko-stale → POST /api/v1/admin/maintenance/queue-worker-job kind reconcile_coingecko_stale_archive (**P7k**; sameOriginApiPath **P7xq**); **P1bq** archived Neo4j sync card: btn-admin-sync-archived-assets-neo4j → POST /api/v1/admin/maintenance/sync-archived-assets-neo4j; btn-admin-enqueue-archived-neo4j-sync → POST …/queue-worker-job kind neo4j_sync_archived_assets (**P7k**; sameOriginApiPath **P7xq**); **P4ca**/**P4cc**/**P4ch**/**P4cl** rollback checkpoint card (`section-rb-cp` + `btn-rb-cp-status` + `btn-rb-cp-list` + `rb-cp-list-limit` + `btn-rb-cp-get-one` + `rb-cp-get-id` + `btn-rb-cp-append` + `btn-rb-cp-enqueue-append` + `rb-cp-cap-snap` + `btn-rb-cp-restore` + `rb-cp-restore-id` + `rb-cp-restore-dry` + `btn-rb-cp-delete` + **P4cd** ``append_rollback_checkpoint`` **P7k** enqueue): GET rollback-checkpoints-status + GET rollback-checkpoints?limit= + **P4bl** GET rollback-checkpoints/{id} + POST rollback-checkpoint-append (optional **P4cj** ``capture_ontology_facets_v0_snapshot``) + POST rollback-checkpoint-restore-facets-v0 (**P4cl**/**P4cj** gated disk restore; ``dry_run`` checkbox + confirm when false) + DELETE rollback-checkpoints/{id} (`rbCpFetchJson` shows 403 JSON); card copy cites **P4cg** readiness fields (``p4cg``, ``supervisor_enqueue_append_rollback_checkpoint``) and **P4a** ``GET /api/v1/orchestration/status`` parity (**P4ch**); cites `endpoints.orchestration_rollback_checkpoints_status` / `orchestration_rollback_checkpoints` / `orchestration_rollback_checkpoint_get` / `orchestration_rollback_checkpoint_append` / `orchestration_rollback_checkpoint_delete` / `orchestration_rollback_checkpoint_restore_facets_v0` + HyperCharts **P4bi**/**P4bk**/**P4bl**/**P4bm**/**P4cj** paths","cli_rebuild_tag_overlap":"python -m app.jobs.rebuild_tag_overlap --help","worker_job_kinds_registry":"endpoints.worker_job_kinds_registry — **P7jh** documents the canonical **P7k** worker_jobs kind allowlist (app.schemas.worker_job_payload.WORKER_JOB_KINDS; same registry as QueueWorkerJobIn + POST /api/v1/admin/maintenance/queue-worker-job + HyperCharts POST /api/darkherd/admin/maintenance/queue-worker-job **P7xi**); GET /api/v1/meta (+ HyperCharts GET /api/darkherd/meta) also returns top-level worker_job_kinds (sorted list) + worker_job_kinds_count for JSON-first discovery without calling GET /api/v1/orchestration/status or GET /api/v1/orchestration/tool-adapters-status (those responses still echo worker_job_kinds for orchestration operators); scripts/smoke_darkherd.sh jq asserts array shape + invalidate_analytics_cache membership + P7jh prose here; **P4cr** top-level ``analytical_refresh_policy`` on the same GET /api/v1/meta|HyperCharts GET /api/darkherd/meta JSON mirrors **P4cq** ``GET /api/v1/orchestration/status`` (Vision §5.2); **P4da** top-level ``supervisor_wired`` + ``supervisor_graph_invoke_enabled`` + ``p4da`` mirror **P4cz**/**P4ay** on the same orchestration status GET (invoke prerequisites without POST); **P4di** top-level ``supervisor_bound_tools`` + ``supervisor_mutating_bound_tool_job_classes`` + ``p4bc`` + ``p4cb`` mirror **P4bc**/**P4cb** on the same GET (**P4dh** insights parity — bound-tool governance for **P4ba**/**P4bb**); **P3dp** top-level ``global_refresh_autoschedule_enabled`` + ``global_refresh_autoschedule_tick_s`` + ``global_refresh_autoschedule_bootstrap`` + ``p3do_autoschedule_effective`` (env ∧ ``analytical_refresh_policy.autoschedule_enqueue_pipeline_wired``) echo optional **P3do** FastAPI lifespan enqueue loop — **P7k** ``queue_worker`` still drains); **P7ji** admin.html ``btn-worker-job-kinds`` + admin_gate.html ``btn-gate-worker-job-kinds`` fetch this JSON for operators"}}