Full admin dashboard: cron run history, cache freshness for all keys, data quality metrics, Telegram bot subscriber stats, and operator reconciliation signals.
Preferred access:
- Browser:
https://ops.pharos.watch/admin/ -> same-origin /api/admin/status - CLI:
CF-Access-Client-Id: <id> and CF-Access-Client-Secret: <secret> against https://ops-api.pharos.watch/api/status
Response shape: StatusResponse (defined in shared/types/index.ts)
json
{
"timestamp": 1771856453,
"dbHealthy": true,
"availabilityStatus": "healthy",
"dataQualityStatus": "healthy",
"rawOverallStatus": "degraded",
"overallStatus": "healthy",
"confidence": 0.94,
"causes": {
"availability": [{ "code": "degraded_cron_warning", "severity": "info" }],
"dataQuality": [],
"overall": [{ "code": "degraded_cron_warning", "severity": "info" }]
},
"state": {
"currentStatus": "healthy",
"rawStatus": "degraded",
"lastEvaluatedAt": 1771856453,
"lastChangedAt": 1771856200,
"consecutiveRaw": { "healthy": 3, "degraded": 0, "stale": 0 }
},
"staleness": { "ageSeconds": 0, "maxAgeSec": 1800, "isStale": false },
"probe": {
"timestamp": 1771856440,
"status": "healthy",
"sampleCount": 22,
"passCount": 22,
"failCount": 0,
"p95LatencyMs": 301
},
"discrepancy": {
"hasDivergence": false,
"severityDelta": 0,
"consecutiveDivergent": 0
},
"timeline": [
{
"id": 411,
"from": "degraded",
"to": "healthy",
"rawStatus": "healthy",
"transitionType": "recover",
"reason": "raw-healthy-recovery-threshold",
"confidence": 0.94,
"at": 1771856200
}
],
"caches": { ... },
"crons": {
"sync-stablecoins": {
"lastRun": { "startedAt": 1234567890, "durationMs": 2300, "status": "ok", "itemCount": 156 },
"inFlight": null,
"recentRuns": [...],
"expectedIntervalSec": 900,
"healthy": true
}
},
"dataQuality": {
"totalStablecoins": 156,
"missingPrices": 3,
"blacklistMissingAmounts": 0,
"blacklistRecentMissingAmounts": 0,
"blacklistRecentWindowSec": 86400,
"blacklistMissingRatio": 0,
"blacklistTotal": 13422,
"blacklistOldestRecoverableAgeSec": 0,
"blacklistNeverAttemptedCount": 0,
"blacklistRepeatedFailureCount": 0,
"onchainSupplyDivergences": 0,
"onchainDivergenceRatio": 0,
"onchainSupplyMonitoring": "active",
"onchainSupplyLatestAt": 1771856300,
"onchainSupplyTrackedCoins": 96,
"activeDepegs": 12,
"staleOnchainSupply": 0,
"onchainStaleRatio": 0
},
"sectionErrors": {},
"telegramBot": {
"totalChats": 128,
"alertEnabledChats": 123,
"deliverableChats": 121,
"subscribedChats": 124,
"emptyAlertChats": 2,
"mutedChatsWithSubscriptions": 3,
"totalSubscriptions": 611,
"avgSubscriptionsPerSubscribedChat": 4.9,
"pendingDisambiguations": 1,
"pendingDeliveries": 6,
"lastSubscriberActivityAt": 1771856420,
"customPreferenceChats": 47,
"quietHoursEnabledChats": 18,
"alertTypeChats": {
"dews": 121,
"depeg": 118,
"safety": 102,
"allTypes": 95
},
"topStablecoins": [
{ "stablecoinId": "usdc-circle", "symbol": "USDC", "subscribers": 82 },
{ "stablecoinId": "usdt-tether", "symbol": "USDT", "subscribers": 77 }
]
},
"datasetFreshness": {
"stablecoins": 1771856400,
"blacklist": 1771856200,
"mintBurn": 1771856340,
"supply": 1771804800,
"safetyGrades": 1771804800,
"yield": 1771856320,
"depegs": 1771856010,
"dews": 1771856400,
"digest": 1771804800,
"discoveryCandidates": 1771856400
},
"summary": {
"unhealthyCrons": 0,
"degradedCrons": 1,
"cronErrors": 0,
"worstCacheRatio": 1.03
},
"priceSourceHealth": {
"sourceDistribution": {
"coingecko": 14,
"coingecko+defillama-list": 118,
"defillama": 10,
"defillama-list": 0,
"protocol-redeem": 1,
"defillama-contract": 4,
"coinmarketcap": 2,
"dexscreener": 1,
"geckoterminal": 0,
"cached": 4,
"missing": 3
},
"confidenceDistribution": {
"high": 127,
"single-source": 15,
"low": 8,
"fallback": 6
},
"totalAssets": 156,
"lastSync": 1771856400
},
"coingeckoPriceDiff": {
"checkedAt": 1771856453,
"trackedWithGeckoId": 152,
"comparedCoins": 149,
"mismatchedCount": 2,
"thresholdPct": 5,
"rows": [
{
"stablecoinId": "pyusd-paypal",
"symbol": "PYUSD",
"name": "PayPal USD",
"geckoId": "paypal-usd",
"ourPrice": 0.944,
"coinGeckoPrice": 1.002,
"diffPct": 5.79,
"priceSource": "defillama",
"priceConfidence": "single-source"
}
]
},
"d1Usage": {
"checkedAt": 1771856453,
"windowStart": 1771770053,
"windowEnd": 1771856453,
"databaseId": "8f3f54ca-e035-4cdf-9ec5-a4fbbe48b27a",
"databaseName": "stablecoin-db",
"databaseSizeBytes": 1589248000,
"numTables": 56,
"region": "EEUR",
"readReplicationMode": "disabled",
"readQueries24h": 942012,
"writeQueries24h": 709241,
"rowsRead24h": 1633139670,
"rowsWritten24h": 1555568
},
"liquidityHealth": {
"lastRunStatus": "degraded",
"currentCoverage": 120,
"previousCoverage": 125,
"currentGlobalTvl": 123000000,
"previousGlobalTvl": 125000000,
"currentTop10CoveredTvl": 100000000,
"previousTop10CoveredTvl": 102000000,
"failedSources": ["defillama-yields"],
"nearCoverageGuard": false,
"nearValueGuard": false,
"nearMajorCoverageGuard": false,
"currentCoverageClasses": { "primary": 80, "mixed": 20, "fallback": 20, "legacy": 0, "unobserved": 36 },
"previousCoverageClasses": { "primary": 82, "mixed": 18, "fallback": 25, "legacy": 0, "unobserved": 31 }
},
"discoveryCandidates": [
{
"id": 12,
"geckoId": "usdq",
"llamaId": null,
"name": "USDQ",
"symbol": "USDQ",
"marketCap": 18200000,
"source": "coingecko",
"firstSeen": 1771683600,
"lastSeen": 1771856400,
"daysSeen": 2,
"dismissed": false
}
],
"mintBurnReconciliation": {
"checkedAt": 1771856453,
"comparedCoins": 42,
"criticalCount": 1,
"warnCount": 3,
"insufficientCount": 12,
"rows": [
{
"stablecoinId": "usdt-tether",
"symbol": "USDT",
"flowNet24hUsd": -240000000,
"chainSupplyDelta24hUsd": -220000000,
"absoluteDiffUsd": 20000000,
"diffRatio": 0.08,
"status": "warn",
"coverageStatus": "full"
}
]
}
}
dataQuality.onchainSupplyTrackedCoins counts only coins with at least one onchain_supply row inside the current 3-day active monitoring window. Older historical rows are excluded from staleOnchainSupply and onchainStaleRatio.
Ratio-based on-chain status thresholds apply only when dataQuality.onchainSupplyTrackedCoins >= 10; below that floor, the counts remain visible but do not by themselves escalate dataQualityStatus.
itemCount and dataQuality.totalStablecoins are illustrative example values. In the live handler they reflect the current cached stablecoin payload size, not TRACKED_STABLECOINS.length.
crons[*].healthy reflects availability impact. Fresh cron runs with status="degraded" are warning-only and counted in summary.degradedCrons, but they do not mark availability unhealthy on their own.
availabilityStatus also inherits the shared public-health floor used by /api/health: cache-impact status, the critical mint/burn lane's public warning/staleness contract, and 3+ open circuit groups can degrade availability even when cron freshness alone is still green.
crons[*].inFlight is present when a leased cron is actively reporting cron_run_progress and the matching cron_leases row is still active for the same owner. It includes startedAt, updatedAt, stage, optional itemsDone/itemsTotal, optional message/metadata, and a stale flag when the heartbeat stops updating.
overallStatus is the effective (hysteresis-smoothed) status. rawOverallStatus is the immediate worst-of availability/data-quality signal.
dbHealthy=false means the DB sentinel failed (SELECT 1), so status is forced to at least degraded and data-quality/database freshness queries are skipped.
telegramBot is null when the Telegram tables are unavailable in the current environment (for example, migrations not yet applied in dev/staging). The rest of /api/status still resolves normally.
sectionErrors is a machine-readable map of subsection loader failures. When an individual status subsection fails (for example Telegram stats, discovery backlog, CoinGecko price drift, D1 usage telemetry, liquidity health, reserve drift, or mint/burn reconciliation), /api/status still returns 200, keeps the unaffected sections intact, and records the degraded subsection under sectionErrors with a stable code plus an operator-facing message.
crons["dispatch-telegram-alerts"].lastRun.metadata now carries a richer delivery breakdown, including fields such as freshAttempted, freshSent, freshRetryQueued, freshPermanentFailures, pendingAttempted, pendingDrained, pendingRetryQueued, pendingDropped, pendingEnqueued, and expanded eventsDetected counters (depegTriggered, depegResolved, depegWorsening, suppressedMethodologyChanges).
datasetFreshness covers the key operator-visible datasets written by the pipeline: cache-backed stablecoins, blacklist, mint/burn, supply snapshots, safety-grade history, yield, depeg/dews tables, daily digest, and discovery backlog timestamps.
priceSourceHealth is derived from the final sync-stablecoins asset payload and summarizes resolved price-source distribution, confidence buckets, total assets, and the timestamp of the latest successful price-health snapshot. CoinGecko-vs-Pharos divergence details live in the separate coingeckoPriceDiff block.
coingeckoPriceDiff is an admin-only live comparison block. It reads the cached tracked assets with geckoId, fetches current CoinGecko spot prices through one or more batched simple/price calls, and reports the rows where abs(pharosPrice - coinGeckoPrice) / coinGeckoPrice > 0.05. The field is null when the comparison is unavailable in the current environment or when the loader fails; failures are surfaced through sectionErrors.coingeckoPriceDiff.
d1Usage is an admin-only live D1 telemetry block. It uses Cloudflare's D1 database info endpoint plus a trailing-24h d1AnalyticsAdaptiveGroups GraphQL query to surface current storage size, table count, replication mode, and recent query/row volume. The field is null until CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_D1_STATUS_API_TOKEN, and CLOUDFLARE_D1_DATABASE_ID are configured on the worker; loader/config failures are surfaced through sectionErrors.d1Usage.
liquidityHealth is derived from the latest sync-dex-liquidity cron metadata and summarizes row coverage, value coverage, major-asset coverage, failed sources, and current/previous coverage-class distribution for the operator dashboard.
discoveryCandidates exposes the current untracked-coverage backlog from discovery_candidates, ordered by market cap for the /status operator workflow.
mintBurnReconciliation compares 24h Ethereum mint/burn net flow (mint_burn_hourly) against the cached stablecoins payload's Ethereum chain-supply delta (chainCirculating.ethereum.current - circulatingPrevDay). It is intended for operator diagnostics, not public scoring.