{"_cache_age_seconds":5340.5,"_cache_source":"memory","_cached":true,"actionable_backend_issues":[{"count":2,"detail":"2 workflows share cron `11 14 * * 1` \u2014 they fire at the EXACT same minute. Stagger by offsetting one or more of them. Files: app/.github/workflows/needs-decision-digest.yml, app/.github/workflows/pockets-weekly-digest.yml","issue":"cron_schedule_collision","url":"11 14 * * 1"},{"count":2,"detail":"2 workflows share cron `40 5 * * *` \u2014 they fire at the EXACT same minute. Stagger by offsetting one or more of them. Files: app/.github/workflows/data-growth-radar.yml, app/.github/workflows/infra-growth-tracker.yml","issue":"cron_schedule_collision","url":"40 5 * * *"},{"count":2,"detail":"2 workflows share cron `7 */6 * * *` \u2014 they fire at the EXACT same minute. Stagger by offsetting one or more of them. Files: app/.github/workflows/brain-inspector.yml, app/.github/workflows/failover-canary.yml","issue":"cron_schedule_collision","url":"7 */6 * * *"},{"count":2,"detail":"2 workflows share cron `23 */6 * * *` \u2014 they fire at the EXACT same minute. Stagger by offsetting one or more of them. Files: app/.github/workflows/indexnow.yml, app/.github/workflows/public-api-programmatic-access.yml","issue":"cron_schedule_collision","url":"23 */6 * * *"},{"count":176,"detail":"routes/state_of_power.py:249 hardcodes markets=144 but the live canonical value is 320. Read canonical_stats.markets_phrase() / get_canonical_stats() so it can't drift (parallel-stale-surface).","issue":"cross_surface_metric_divergence","url":"routes/state_of_power.py:249"},{"count":20,"detail":"routes/competitive_seo.py:210 hardcodes markets=300 but the live canonical value is 320. Read canonical_stats.markets_phrase() / get_canonical_stats() so it can't drift (parallel-stale-surface).","issue":"cross_surface_metric_divergence","url":"routes/competitive_seo.py:210"},{"count":20,"detail":"routes/quarterly_report.py:67 hardcodes markets=300 but the live canonical value is 320. Read canonical_stats.markets_phrase() / get_canonical_stats() so it can't drift (parallel-stale-surface).","issue":"cross_surface_metric_divergence","url":"routes/quarterly_report.py:67"},{"count":1,"detail":"AI-citation observations are fresher than the newest press release by 9999h. The dc-hub-media surface looks stale even though ChatGPT/Gemini/Claude have cited us recently. Auto-fix: POST /api/v1/ai-citations/draft-press?write=true&auto_approve=true&days=7","issue":"press_drafting_lag","url":"/dc-hub-media"},{"count":1,"detail":"NameError: name '_conn' is not defined","issue":"consistency_radar_detector_crashed:check_auto_trial_conversion_rate","url":"check_auto_trial_conversion_rate"},{"count":1,"detail":"Official MCP registry listing is stale: STALE: published v2.5.1 != local v2.4.3 (bump server.json + push to republish). Bump server.json version + push \u2014 mcp-registry-publish.yml republishes via the DNS key. Until then agents discover an out-of-date DC Hub.","issue":"mcp_registry_listing_stale","url":"/api/v1/brain/ecosystem/coverage"},{"count":200,"detail":"Page 'WorkOS OAuth Challenge (anon 401)' is unhealthy. Status: 200, bytes: 1, reason: WorkOS CHALLENGE OFF: anon initialize=200 (expected 401) \u2014 durable identity DISABLED; set DCHUB_OAUTH_CHALLENGE_DISABLE=0 on dchub-mcp-server. Category: high. Last healthy: 2026-08-15T22:54:14.291936+00:00. This is the Site Sentinel \u2014 fix the page OR adjust the manifest in routes/site_sentinel.py:_MANIFEST if the expectation is wrong.","issue":"site_sentinel_unhealthy:/mcp#workos-oauth-challenge","url":"https://dchub.cloud/mcp#workos-oauth-challenge"},{"count":50,"detail":"50 MCP agents went dormant (no calls in 14+ days but >=30 prior calls in last 90 days). 50 are HIGH-PRIORITY winback candidates (>=100 prior calls). Top target: ip_hash=c290ec042bf3 ua='node', 10235 prior calls, idle 85.8d. Full list at /api/v1/bots/dormant.","issue":"mcp_dormant_agents_present","url":"/api/v1/bots/dormant"},{"count":0,"detail":"DC Hub appears in only 0.0% of Claude responses to data-center research queries. Auto-triggering DC Hub Media press cycle won't fix this \u2014 needs direct outreach to AI platforms (see /api/v1/media/winback-pitches).","issue":"citation_score_below_30pct","url":"/api/v1/citations/score"},{"count":18,"detail":"Tenant coverage on top-50 facilities is only 18% (9/50). Per-building tenant data is DCHawk's main remaining moat. Invest in SEC filings + CRE comps + news NLP ingest pipeline OR POST /api/v1/tenants/ingest with structured rows.","issue":"tenant_coverage_thin","url":"/api/v1/tenants/coverage"},{"count":16,"detail":"Event 'DCD>Connect London 2026' has a submission deadline in 16 days (2026-09-01) and DC Hub hasn't submitted. Event runs 2026-11-04. Decision needed.","issue":"event_submission_pending:DCD>Connect London 2026","url":"/events"},{"count":518,"detail":"Top 5 tools generated 518 paywall signals in 7 days: get_interconnection_queue=197, get_grid_intelligence=85, get_energy_prices=81, get_renewable_energy=78, get_water_risk=77. If conversions are low overall, focus paywall-response improvements on THESE tools first. Phase DDDDD auto-trial flow targets exactly this set (FREE \u2192 IDENTIFIED gate).","issue":"mcp_funnel_concentration_top5","url":"/api/v1/mcp/funnel"},{"count":76,"detail":"Schema.org coverage is 76.9% \u2014 below 80% target. 2 pages have no JSON-LD; 1 have wrong @type. AI agents prioritize structured data when fact-citing \u2014 this directly drags the source-of-truth score. Worklist: /api/v1/schema-org/missing.","issue":"schema_org_coverage_low","url":"/api/v1/schema-org/missing"},{"count":0,"detail":"MCP tool `plan_query` had 115 calls over 90d but only 0 in the last 7d (run-rate dropped >95%). Either the tool broke silently (check logs for errors), got rate-limited out, or its consumers migrated. Investigate before sunsetting.","issue":"mcp_tool_sunset_candidate","url":"tool:plan_query"},{"count":25,"detail":"25 LinkedIn posts published in 7d but engagement_fetched_at last advanced 2026-08-05 15:27:28.810178+00:00 \u2014 the media loop can't learn what lands. fetch_linkedin_engagement breaks its whole batch on the first 403; token needs r_organization_social (+ r_organizational_social_feed for impressions). Trigger POST /api/linkedin/engagement-sync and read `reason` to confirm.","issue":"linkedin_engagement_readback_stale","url":"table:linkedin_posts"},{"count":85,"detail":"URL pattern '/api/v1/dchub-media/feed-v3' returned 404 85 times recently. Likely a frontend/backend route mismatch (e.g. /facility/<slug> vs /facilities/<slug>). Auto-fix idea: add a route alias on the backend OR fix the frontend caller. Verify with: curl -i https://dchub.cloud/api/v1/dchub-media/feed-v3","issue":"repeated_404_pattern","url":"/api/v1/dchub-media/feed-v3"},{"count":7,"detail":"7 of 16 registry listings have not been re-scraped in >72h (crawler SLA is 3 days): mcp_official_registry(1000000000h), smithery(1000000000h), lobehub(1000000000h), mcp_so(1000000000h), yellowmcp(1000000000h), mcphive(1000000000h) \u2026. Per-row staleness is invisible to the MAX()-based flywheel check \u2014 a single fresh row makes the aggregate look healthy while listed registries rot (glama/smithery went ~20d unverified this way). Kick POST /api/v1/admin/mcp-presence/crawl.","issue":"mcp_presence_listing_stale","url":"mcp_presence_listings"},{"count":4,"detail":"4 registry listing(s) show a STALE tool count vs our live server (drift_detected) \u2014 e.g. the official GitHub registry showed 30 of 79 tools. Owner-gated ones (DNS-TXT verify) surface as brain_findings 'mcp_presence_human_loop:*'; the auto-fixer flags them but can't clear them alone.","issue":"mcp_presence_drift_uncorrected","url":"mcp_presence_listings"},{"count":9,"detail":"9/19 paying customers (47%) are STRANDED \u2014 paid, zero calls past grace. Acquisition works, activation doesn't. Course-correct: arm ACTIVATION_NUDGE_ARM=1 to recover them, escalate the already-nudged to a human touch, and add first-call onboarding to the checkout flow. Board: /api/v1/admin/customer-white-glove/state.","issue":"customer_activation_systemic_failure","url":"/api/v1/admin/customer-white-glove/state"},{"count":8,"detail":"8 paying customers were sent the automated activation nudge 7+ days ago and are STILL at zero calls \u2014 the automated motion failed. The loop escalated them; they need a human touch (call / personal note), not another email.","issue":"customer_nudge_failed_needs_human","url":"/api/v1/admin/customer-white-glove/state"},{"count":106,"detail":"106 facilities have coordinates that land unambiguously in a different country than their `country` label (top flows: US->NL:27, US->GB:25, US->FR:14, US->AU:13, US->DE:9). Customer country filters are wrong for these. Fix: POST /api/v1/admin/facility-geo/apply?confirm=1 (reversible via /undo).","issue":"facility_country_mislabeled","url":"/api/v1/admin/facility-geo/analyze"},{"count":4,"detail":"CSP directive `connect-src` blocked `analytics.google.com` 4\u00d7 in the last 24h. Likely an allowlist gap \u2014 add `analytics.google.com` to the `connect-src` directive in dchub-frontend/_headers and redeploy. (Browsers POST to /api/csp-report.)","issue":"csp_violation_recurring","url":"csp://connect-src/analytics.google.com"},{"count":6469,"detail":"Public page `/dashboard` API call to `/api/v1/usage` (user usage dashboard) took 6.5s (cap 5s). Visitors abandon before render.","issue":"frontend_endpoint_slow","url":"/dashboard"},{"count":75,"detail":"75 cross-source duplicate facility rows in US are not yet collapsed (new arrivals since the last dedup pass). The paid /api/v1/facilities listing is showing them as separate sites. Re-run POST /api/v1/admin/facility-dedup/apply?country=US&confirm=1.","issue":"facility_duplicates_unmarked","url":"/api/v1/admin/facility-dedup/analyze?country=US"},{"count":5,"detail":"5 cross-source duplicate facility rows in SG are not yet collapsed (new arrivals since the last dedup pass). The paid /api/v1/facilities listing is showing them as separate sites. Re-run POST /api/v1/admin/facility-dedup/apply?country=SG&confirm=1.","issue":"facility_duplicates_unmarked","url":"/api/v1/admin/facility-dedup/analyze?country=SG"},{"count":10,"detail":"10 cross-source duplicate facility rows in DE are not yet collapsed (new arrivals since the last dedup pass). The paid /api/v1/facilities listing is showing them as separate sites. Re-run POST /api/v1/admin/facility-dedup/apply?country=DE&confirm=1.","issue":"facility_duplicates_unmarked","url":"/api/v1/admin/facility-dedup/analyze?country=DE"},{"count":10,"detail":"10 cross-source duplicate facility rows in AU are not yet collapsed (new arrivals since the last dedup pass). The paid /api/v1/facilities listing is showing them as separate sites. Re-run POST /api/v1/admin/facility-dedup/apply?country=AU&confirm=1.","issue":"facility_duplicates_unmarked","url":"/api/v1/admin/facility-dedup/analyze?country=AU"},{"count":5,"detail":"5 cross-source duplicate facility rows in CA are not yet collapsed (new arrivals since the last dedup pass). The paid /api/v1/facilities listing is showing them as separate sites. Re-run POST /api/v1/admin/facility-dedup/apply?country=CA&confirm=1.","issue":"facility_duplicates_unmarked","url":"/api/v1/admin/facility-dedup/analyze?country=CA"},{"count":15,"detail":"15 cross-source duplicate facility rows in GB are not yet collapsed (new arrivals since the last dedup pass). The paid /api/v1/facilities listing is showing them as separate sites. Re-run POST /api/v1/admin/facility-dedup/apply?country=GB&confirm=1.","issue":"facility_duplicates_unmarked","url":"/api/v1/admin/facility-dedup/analyze?country=GB"},{"count":12,"detail":"12 cross-source duplicate facility rows in NL are not yet collapsed (new arrivals since the last dedup pass). The paid /api/v1/facilities listing is showing them as separate sites. Re-run POST /api/v1/admin/facility-dedup/apply?country=NL&confirm=1.","issue":"facility_duplicates_unmarked","url":"/api/v1/admin/facility-dedup/analyze?country=NL"},{"count":11,"detail":"11 cross-source duplicate facility rows in BR are not yet collapsed (new arrivals since the last dedup pass). The paid /api/v1/facilities listing is showing them as separate sites. Re-run POST /api/v1/admin/facility-dedup/apply?country=BR&confirm=1.","issue":"facility_duplicates_unmarked","url":"/api/v1/admin/facility-dedup/analyze?country=BR"},{"count":5,"detail":"5 cross-source duplicate facility rows in FR are not yet collapsed (new arrivals since the last dedup pass). The paid /api/v1/facilities listing is showing them as separate sites. Re-run POST /api/v1/admin/facility-dedup/apply?country=FR&confirm=1.","issue":"facility_duplicates_unmarked","url":"/api/v1/admin/facility-dedup/analyze?country=FR"},{"count":5981,"detail":"5,981 paywall signals \u2192 1 conversions (0.017% gate\u2192paid). Free key count: 114. Paid: 43. Likely cause: the transparent auto-trial gives 7d \u00d7 50/day FREE access to the 5 hot tools, so agents never see the upgrade wall. Tighten further by: (1) lowering TRIAL_DAYS from 7 to 3, (2) lowering TRIAL_DAILY_CALLS from 50 to 20, (3) adding a hard upgrade-wall after N=3 trial cycles, (4) removing transparent-retry for non-essential tools (the 5-tool whitelist in mcp_gatekeeper._AUTO_RETRY_TOOLS).","issue":"trial_to_paid_stagnation","url":"funnel:signals_to_conversions"},{"count":209,"detail":"`get_grid_intelligence`: 209 unique free users with 942 calls in 30d but only 43 paid keys account-wide. This is a CONCENTRATED upgrade target \u2014 pick the top-5 users of this tool, look up their IPs/UAs, run a manual sales-outreach (LinkedIn DM, email, etc.). Or wire a per-tool email-capture form: 'You hit get_grid_intelligence 4\u00d7 this month. Unlock it for $9/mo (200 calls/day).'","issue":"addressable_demand_unconverted","url":"tool:get_grid_intelligence"},{"count":201,"detail":"`analyze_site`: 201 unique free users with 611 calls in 30d but only 43 paid keys account-wide. This is a CONCENTRATED upgrade target \u2014 pick the top-5 users of this tool, look up their IPs/UAs, run a manual sales-outreach (LinkedIn DM, email, etc.). Or wire a per-tool email-capture form: 'You hit get_grid_intelligence 3\u00d7 this month. Unlock it for $9/mo (200 calls/day).'","issue":"addressable_demand_unconverted","url":"tool:analyze_site"},{"count":2,"detail":"Path `/markets/<slug>` (GET) has 2 real handlers (market_deep_dive.market_short_html, seo_pages.market_page) AND returns live edge status 404 (BROKEN). Two real implementations compete for this path AND the live edge is broken \u2014 most likely CF routing, NOT a Python dup: check the _routes.json include wildcard + the zone-worker allowlist (same class as the /state-of-the-data-center fix).","issue":"shadowed_route","url":"/markets/<slug>"},{"count":27,"detail":"Detector `check_surface_health_critical` took 27.1s on the last scan (threshold: 15s). Slow detectors push the whole scan past its 60s budget \u2014 eventually the gunicorn worker times out and Railway restarts. Audit the detector for sequential HTTP calls, unbounded queries, or a missing per-probe timeout.","issue":"detector_runtime_slow","url":"detector:check_surface_health_critical"},{"count":1,"detail":"Failover MIRROR is behind: Render runs `2203f50`, main is at 3230949 (oauth-funnel: publish the tools/call series so the funnel survives the method sw). Render auto-deploy is OFF by design (pipeline minutes), so the mirror only moves when the deploy hook fires \u2014 POST RENDER_DEPLOY_HOOK_URL, or check Render dashboard \u2192 Events for 'Build blocked'. A behind-mirror serves stale reads during failover; since 8cac23ca the stale-gate 503s its metrics surfaces once it is deployed.","issue":"render_pipeline_blocked","url":"https://dashboard.render.com/"},{"count":2,"detail":"Brain self-narrative is internally inconsistent: evolution verdict is 'ascending' (score 92.4) but the self-model verdict is 'mixed' (verified fix rate 92%) \u2014 a 2-rank optimism gap on a 0..3 scale (band 2). The two are supposed to read the SAME autopilot_outcomes effect signal since the R3-honesty re-base; a divergence this wide means one side has drifted back onto a vanity metric. Reconcile brain_evolution.compute_evolution_snapshot weights against brain_self_model.compute_self_model before the optimistic verdict gets quoted on a public surface.","issue":"brain_honesty_verdict_disagreement","url":"/api/v1/brain/evolution vs /api/v1/brain/self-model"},{"count":5,"detail":"Pattern 'inspector_l22_handoff' fired executed_ok 5x in 30d but its verified-success rate is 0% (0/5 verified effects landed). The autopilot keeps ACTING on this finding-class but the effect verifier never confirms a real fix \u2014 endpoint 2xx is masking a no-op. Review the verifier for this pattern in routes/autopilot_outcomes.py (_VERIFIERS) and consider quarantining the pattern until it lands.","issue":"brain_pattern_acting_but_never_landing","url":"autopilot_outcomes:inspector_l22_handoff"},{"count":10,"detail":"DCPI movers feed returns 10 markets but every prev_excess is null \u2014 market_power_scores has no rows older than 7 days. The recompute job updates in place; need a weekly snapshot cron + history table so WoW deltas can compute. Empty movers feed \u2192 empty 'Biggest Movers' rail on /dc-hub-media + zero DCPI-alert auto-press.","issue":"dcpi_snapshot_history_missing","url":"https://dchub-backend-production.up.railway.app/api/v1/dcpi/movers"},{"count":3,"detail":"Scan hit 25s budget with 3 detectors still running (completed 122). Slowest are likely HTTP self-call probes. Abandoned: check_surface_health_critical, check_orphaned_scheduler_functions, check_cron_endpoint_unscheduled","issue":"consistency_radar_scan_partial","url":"/api/v1/brain/consistency-radar"},{"count":1,"detail":"4 flattering default(s); first at scripts/refresh_meta_replays.py:130 \u2014 `\"status\": str(e.get(\"status\") or \"executed\")}`. An absent status silently became the SUCCESS value, which flipped coverage partial -> complete with no error anywhere. Default to a NEUTRAL literal ('', 'unknown') or to None and let the caller render '?'.","issue":"contract_critical: an absent status never defaults to a success literal","url":"dchub://contract/C/C.flattering_default"},{"count":1,"detail":"Shell #52 audit-closure registry SH52-103 (domain=revenue, severity=H, effort=S) \u2014 its live checker is FAILING. Evidence + closure board: /admin/audit-closure","issue":"audit_H Legacy $199 Pro link (eVq5kE4oOfs13mleGuaZi0h) still sold on 6 live surfaces \u2014 two Pro prices coexist, purchases bo...","url":"dchub://audit/SH52-103"},{"count":1,"detail":"Shell #52 audit-closure registry SH52-031 (domain=surfaces, severity=M, effort=S) \u2014 its live checker is FAILING. Evidence + closure board: /admin/audit-closure","issue":"audit_M Public manifest advertises version 2.5.0 while the live server is 2.11.1","url":"dchub://audit/SH52-031"},{"count":1,"detail":"Shell #52 audit-closure registry SH52-042 (domain=brain, severity=M, effort=S) \u2014 its live checker is FAILING. Evidence + closure board: /admin/audit-closure","issue":"audit_M Detector scout (Phase 0 of the detector-supply pipeline \u2014 the stated attack on the real autonomy ceiling) is dark A...","url":"dchub://audit/SH52-042"},{"count":1,"detail":"Shell #52 audit-closure registry SH52-076 (domain=frontend, severity=M, effort=S) \u2014 its live checker is FAILING. Evidence + closure board: /admin/audit-closure","issue":"audit_M The /markets worker ASSETS-rewrite failure mode is silent \u2014 no guard catches a Pages-static page being shadowed by ...","url":"dchub://audit/SH52-076"},{"count":1,"detail":"Shell #52 audit-closure registry SH52-084 (domain=backend, severity=M, effort=S) \u2014 its live checker is FAILING. Evidence + closure board: /admin/audit-closure","issue":"audit_M /api/v1/reveal-* partner feeds still Rule-#3 edge-cached (known-open bypass never applied)","url":"dchub://audit/SH52-084"},{"count":1,"detail":"Shell #52 audit-closure registry SH52-109 (domain=revenue, severity=M, effort=S) \u2014 its live checker is FAILING. Evidence + closure board: /admin/audit-closure","issue":"audit_M Drip CTA sells $299 Pro while 11 Founding licenses at $99 \u2014 the only proven converter \u2014 sit unsold","url":"dchub://audit/SH52-109"},{"count":1,"detail":"Shell #52 audit-closure registry SH52-115 (domain=sched, severity=M, effort=S) \u2014 its live checker is FAILING. Evidence + closure board: /admin/audit-closure","issue":"audit_M Unauthenticated /api/jobs/* requests stamp cron_last_run completion \u2014 health signal is spoofable and staleness dete...","url":"dchub://audit/SH52-115"},{"count":1,"detail":"Shell #52 audit-closure registry SH52-126 (domain=security, severity=M, effort=M) \u2014 its live checker is FAILING. Evidence + closure board: /admin/audit-closure","issue":"audit_M Rate limiter is fully bypassed by a spoofable Origin/Referer substring and by any 'dchub-' User-Agent","url":"dchub://audit/SH52-126"}],"actionable_frontend_issues":[],"cache_needs_purge":false,"computed_at":"2026-08-16T03:34:27.199169","findings":{"api_contract_scan":{"details":"OK: 6 API + 24 content-type contracts honored","ok":true},"backend_cron_scan":{"details":"OK: backend cron health green (dcpi, auto_press)","ok":true},"cdn_cache_staleness":{"details":"OK: age=286s, cache-control=public, max-age=60, s-maxage=300, stale-while-revalidate=864","ok":true},"data_freshness_radar":{"details":"OK: data-freshness radar green \u2014 12 domains checked","ok":true},"feed_diversity_check":{"details":"OK: top 8 categories spread = {'alert': 2, 'news': 2, 'press_release': 2, 'testimonial': 1, 'press': 1}","ok":true},"funnel_health_scan":{"details":"OK: funnel healthy \u2014 6467 paywall_hit, no critical leak","ok":true},"html_quality_scan":{"details":"0 HTML quality issues across 0 pages: {}","ok":true},"internal_links_check":{"details":"OK: 0/30 homepage internal links broken","ok":true},"jsonld_coverage_check":{"details":"OK: every probed page has schema.org JSON-LD","ok":true},"linked_asset_scan":{"details":"OK: all linked assets reachable + correct MIME across 14 probed pages","ok":true},"sitemap_404_check":{"details":"OK: 0/25 sitemap URLs return 4xx/5xx","ok":true}}}
