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 #
| task | estimate | actual | drift |
|---|---|---|---|
| #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 min | 407 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 min | 391 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 min | 364 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 min | 364 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 min | 244 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 min | 244 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 min | 442 min | +391.1% |
| #9 session6: netsky1 cross-machine readiness (cargo install + iroh pairing runbook) | 60 min | 271 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 min | 267 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 min | 244 min | +306.7% |
test suite timing #
- tracked tests: 10
| suite | test | runs | p50 7d | p90 7d | last |
|---|---|---|---|---|---|
netsky test integration | integration/test-clone-tool-deny-hook.sh | 1 | 31038 ms | 31038 ms | 31038 ms |
netsky test integration | integration/test-mcp-emit-only.sh | 1 | 17671 ms | 17671 ms | 17671 ms |
netsky test integration | integration/test-clone-double-spawn.sh | 1 | 10392 ms | 10392 ms | 10392 ms |
netsky test integration | integration/test-clone-brief-codex-delivery.sh | 1 | 10349 ms | 10349 ms | 10349 ms |
netsky test unit | unit/test-iroh-e2e.sh | 15 | 8859 ms | 9015 ms | 8813 ms |
netsky test integration | integration/test-clone-health-json.sh | 1 | 5231 ms | 5231 ms | 5231 ms |
netsky test unit | unit/test-channel-concurrent-send.sh | 16 | 3650 ms | 4170 ms | 4214 ms |
netsky test unit | unit/test-test-record-to-db.sh | 16 | 3115 ms | 3196 ms | 3182 ms |
netsky test unit | unit/test-status-watch.sh | 16 | 3119 ms | 3156 ms | 3156 ms |
netsky test unit | unit/test-fresh-clone.sh | 16 | 2430 ms | 3092 ms | 4249 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;