analytics 2026-04-20

This page is the daily netsky observability cut: DuckDB-style SQL over ~/.netsky/meta.db, rendered by netsky analytics daily, with Plotly charts checked into the website. It is both the operator dashboard and the product demo of what the system measures about itself.

generated 2026-04-20T22:56:37Z

summary #

  • sessions: 4 (median —)
  • crashes: 0 (MTTR —)
  • clones dispatched: 36 (0.0 clone-hours)
  • tokens: 85479387585 in / 195834557 out / 83499149098 cached ($0.00)
  • tasks closed: 67 (actual 8950 min, median drift +243.3%)
  • task state: 16 open / 75 closed (close rate +82.4%)
  • messages: 668
  • commits to main: 0
  • uptime: agent0 12h52m / any session 12h52m

sessions by agent #

messages by source #

clones by runtime #

tokens by runtime #

token percentiles (input / event) #

tasks closed today #

  • count: 67
  • total actual minutes: 8950
  • median drift: +243.3%

task metrics #

Historical fix: same-minute closes now floor actual_minutes at 1 when a task closes after creation but before the clock crosses a full minute. That repairs pre-v8 zero-minute rows without inventing a new lifecycle column.

  • open: 16
  • closed: 75
  • close rate: +82.4%
  • median estimate: 60 min
  • median actual: 206 min
  • median drift: +243.3%
  • dispatch to harvest median: —

open by priority #

closed by priority #

open by source #

closed by source #

cycle time histogram #

dispatch to harvest latency #

no data for this day

top drifted tasks #

taskestimateactualdrift
#26 measurement floor bug: actual_minutes=0 when close fires within seconds of create. floor at 1min OR record (first_status_change - created_at) instead of (closed_at - created_at) when latter is <60s.30 min407 min+1256.7%
#36 workspace name derived from task title can exceed filesystem max (>255 char). netsky task dispatch errors with “File name too long (os error 63)” for long task titles. fix: cap workspace name length (e.g. first N words, or hash-tail), or reject task creation when title > N chars. Repro: task 27 + 30 in session 8.30 min391 min+1203.3%
#24 netsky gc merged-branches: prune origin branches whose tips are reachable from main. 155 stale clone branches as of session 7.30 min364 min+1113.3%
#25 agentinfinity-ready marker wiped by restart sweep. file gets removed each /restart and agentinfinity must re-touch. fix the sweep to preserve the marker, or move it out of the swept path.30 min364 min+1113.3%
#41 agentinit threshold-cross should call netsky escalate directly, not depend on agent0 reading agentinit-escalation marker. If root is dead, marker has no consumer.30 min244 min+713.3%
#40 netsky restart reports complete with missing clones. Either error on clone failure or write a degraded phase visible to watchdog + owner. Source: src/crates/netsky-cli/src/cmd/restart.rs:76-81.45 min244 min+442.2%
#35 db benchmarking + design follow-up: extend the v8 baseline with measured query perf on meta.db (analytics queries, task list, token aggregations). compare DuckDB vs DataFusion (depends on task 27 outcome). sketch schema v9 from agent3 design (briefs/session8 derived from docs/sql-system-state.md).90 min442 min+391.1%
#9 session6: netsky1 cross-machine readiness (cargo install + iroh pairing runbook)60 min271 min+351.7%
#45 blog: when test fixtures collide with the live constellation. Story: clone tests hardcoded agent7; bin/check failed because real agent7 was busy on a real task. Lesson: tests against a live system need out-of-band fixture numbering (we picked 8888). Cite commit 72c0cd9. House voice, ASCII only, ~600 words.60 min267 min+345.0%
#38 failed_revive_guard converts one failed restart into durable page-and-wait. Convert into cooldowned retry with capped counter + explicit “gave up after N retries” marker. Watchdog should degrade into slower retries, not hard stop.60 min244 min+306.7%

test suite timing #

  • tracked tests: 10
suitetestrunsp50 7dp90 7dlast
netsky test integrationintegration/test-clone-tool-deny-hook.sh131038 ms31038 ms31038 ms
netsky test integrationintegration/test-mcp-emit-only.sh117671 ms17671 ms17671 ms
netsky test integrationintegration/test-clone-double-spawn.sh110392 ms10392 ms10392 ms
netsky test integrationintegration/test-clone-brief-codex-delivery.sh110349 ms10349 ms10349 ms
netsky test unitunit/test-iroh-e2e.sh158859 ms9015 ms8813 ms
netsky test integrationintegration/test-clone-health-json.sh15231 ms5231 ms5231 ms
netsky test unitunit/test-channel-concurrent-send.sh163650 ms4170 ms4214 ms
netsky test unitunit/test-test-record-to-db.sh163115 ms3196 ms3182 ms
netsky test unitunit/test-status-watch.sh163119 ms3156 ms3156 ms
netsky test unitunit/test-fresh-clone.sh162430 ms3092 ms4249 ms

tokens per task #

  • no task-attributed token rows

iroh #

  • connect: 2, evict: 0, reconnect: 0, handshake_refused: 1

queries #

DuckDB rerun snippets:

task snapshot by priority #

SELECT status, COALESCE(priority, 'unscoped') AS priority, COUNT(*) AS n
FROM tasks
WHERE created_at < '2026-04-21T00:00:00Z'
GROUP BY status, priority
ORDER BY status, n DESC;

closed-task drift #

SELECT id, title, estimate_minutes, actual_minutes,
((actual_minutes - estimate_minutes) * 100.0) / estimate_minutes AS drift_pct
FROM tasks
WHERE status = 'closed'
AND closed_at >= '2026-04-20T00:00:00Z' AND closed_at < '2026-04-21T00:00:00Z'
AND estimate_minutes IS NOT NULL AND actual_minutes IS NOT NULL
ORDER BY ABS(((actual_minutes - estimate_minutes) * 100.0) / estimate_minutes) DESC
LIMIT 10;

task token attribution #

SELECT task_id, model,
SUM(COALESCE(input_tokens, 0)) AS input_tokens,
SUM(COALESCE(output_tokens, 0)) AS output_tokens,
SUM(COALESCE(cached_input_tokens, 0)) AS cached_tokens,
SUM(COALESCE(cost_usd_micros, 0)) AS cost_usd_micros
FROM token_usage
WHERE task_id IS NOT NULL
AND ts_utc >= '2026-04-20T00:00:00Z' AND ts_utc < '2026-04-21T00:00:00Z'
GROUP BY task_id, model
ORDER BY cost_usd_micros DESC;

test timing rollup #

SELECT suite, name, duration_ms
FROM test_runs
WHERE ts_utc >= '2026-04-14T00:00:00Z' AND ts_utc < '2026-04-21T00:00:00Z'
AND name <> ''
ORDER BY suite, name, duration_ms;

dispatch to harvest proxy #

SELECT c.branch, MIN(c.ts_utc_start) AS dispatch_start, h.commit_sha, MIN(h.ts_utc) AS harvest_ts
FROM clone_dispatches c
JOIN harvest_events h ON h.source_branch = c.branch
WHERE c.ts_utc_start < '2026-04-21T00:00:00Z' AND h.ts_utc < '2026-04-21T00:00:00Z' AND h.status = 'applied'
GROUP BY c.branch, h.commit_sha;