{"phase":"P4","p4c":true,"p4q":true,"p4al":true,"p4aw":true,"p4bz":true,"p4ag":true,"rollback_wired":true,"rollback":{"checkpoint_store":"none","max_checkpoints_hint":256,"checkpoint_sqlite_metadata_wired":true,"checkpoint_facets_v0_snapshot_wired":false,"max_facets_v0_snapshot_chars":524288,"description":"Wide-restructure rollback checkpoints: P4v read-only policy + optional P4bh SQLite metadata rows when checkpoint_sqlite_metadata_wired true and DARKHERD_ORCHESTRATION_ROLLBACK_CHECKPOINT_IO_ENABLED=true (checkpoint_store stays none for policy tests). P4bk GET /api/v1/orchestration/rollback-checkpoints lists recent metadata rows when the same gates pass. P4bl GET /api/v1/orchestration/rollback-checkpoints/{checkpoint_id} returns one metadata row (HTTP 404 when unknown id) under the same gates. P4"},"rollback_config_source":"invariants","tools":[{"id":"neo4j_merge_stub","kind":"stub","wired":false,"description":"Placeholder Bolt-side merge/set (no executor; pair with staged-apply-preview P4p/P4r registry_match)."},{"id":"sqlite_noop_stub","kind":"stub","wired":false,"description":"Placeholder SQLite touch (no executor)."},{"id":"constitution_snapshot_read","kind":"read_only","wired":true,"description":"P4al: bounded constitution/invariants snapshot surfaced in POST …/staged-apply-preview read_only_preview (no mutations; execution remains skipped)."},{"id":"worker_queue_health_read","kind":"read_only","wired":true,"description":"P4as: SQLite worker_jobs health snapshot (queue_depth, pressure_score, …) in staged-apply-preview read_only_preview via compute_worker_jobs_health_snapshot; no writes."},{"id":"orchestration_status_read","kind":"read_only","wired":true,"description":"P4at: bounded GET …/orchestration/status-shaped snapshot (langgraph, supervisor_wired, budgets, rollback hints) in staged-apply-preview read_only_preview via orchestration_status_snapshot; no writes."},{"id":"neo4j_graph_summary_read","kind":"read_only","wired":true,"description":"P4be: read-only Bolt node/rel counts (same field names as GET /api/v1/graph/summary) for staged-apply-preview read_only_preview and execute-tool-probe; no writes."},{"id":"sqlite_noop_touch","kind":"mutating_sqlite_noop","wired":true,"description":"P4aw: bounded INSERT into orchestration_sqlite_noop_touches + SystemAuditEvent orchestration.sqlite_noop_touch.executed via POST …/execute-sqlite-noop-probe (HyperCharts P4ax) when constitution wired true AND DARKHERD_ORCHESTRATION_SQLITE_NOOP_TOUCH_ENABLED=true. P4bf: POST …/staged-apply-execute runs the same bounded touches (1..N operations, each op sqlite_noop_touch, N capped by orchestration_staged_apply_execute.max_sqlite_noop_touch_ops) when apply_plan validates and DARKHERD_ORCHESTRATION_"},{"id":"rollback_checkpoint_append","kind":"mutating_rollback_checkpoint","wired":true,"description":"P4bz: bounded INSERT into orchestration_rollback_checkpoints (metadata only) when POST …/staged-apply-execute includes operations[].op rollback_checkpoint_append (same P4bh gates as POST …/rollback-checkpoint-append); optional JSON in operations[].detail for label, state_digest, correlation_id override, capture_ontology_facets_v0_fp; counts toward orchestration_staged_apply_execute.max_sqlite_noop_touch_ops cap alongside sqlite_noop_touch ops."}],"tools_count":8,"registry_source":"invariants","wired_tools_count":6,"all_wired":false,"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,"mutations_committed":false,"orchestration_routing":{"wide_restructure_requires_dry_run_preview":true},"supervisor_budgets":{"max_graph_steps":64,"max_tool_rounds":32,"dry_run_default":true},"detail":"**P4q** tool registry — **P4al** / **P4as** / **P4at** / **P4be** allow ``kind: read_only`` + ``wired: true`` entries (e.g. ``constitution_snapshot_read``, ``worker_queue_health_read``, ``orchestration_status_read``, ``neo4j_graph_summary_read``) for bounded ``read_only_preview`` payloads on ``POST …/staged-apply-preview`` (execution still **skipped**) and **P4au** ``POST …/execute-tool-probe`` (audit ``orchestration.tool_probe.executed``). **P4aw** ``sqlite_noop_touch`` with ``kind: mutating_sqlite_noop`` + ``wired: true`` enables ``p4aw`` and ``POST …/execute-sqlite-noop-probe`` (bounded SQLite + audit; env ``DARKHERD_ORCHESTRATION_SQLITE_NOOP_TOUCH_ENABLED``). **P4bz** ``rollback_checkpoint_append`` with ``kind: mutating_rollback_checkpoint`` + ``wired: true`` enables ``p4bz`` and ``POST …/staged-apply-execute`` rollback ops (**P4bh** env + constitution gates still apply). ``all_wired`` is **true** only when every tool row is wired; see ``wired_tools_count``. **P4ag** echoes read-only ``rollback`` policy (mirrors **P4v**). Operators may extend ``orchestration_tools`` in ``constitution/invariants.json``; invalid rows are skipped and the list falls back to built-in stubs when empty. ``worker_job_kinds`` lists every bounded **P7k** ``worker_jobs`` ``kind`` string (same registry as **P4bb** ``enqueue_worker_job`` / admin queue POST). **P4cs** ``analytical_refresh_policy`` mirrors **P4cq** / **P4cr** (scheduled full-rebuild cadence + active analytical corpus ceiling hint).","invariants_version":"2026-04-18.168","supervisor_mutating_bound_tool_job_classes":["dirty_community_refresh","manual_admin","scheduled_full_rebuild"],"p4cb":true,"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."}}