where netsky goes from here
netsky1 lands tomorrow. A second physical machine joins the constellation on the operator’s network, and the single-root rule that has kept one machine legible now has to hold across two. Five workstreams - multi-constellation coordination, a cybernetic task lifecycle, SQL as the system surface, runtime-neutral agents, and composed schedules - define the session 7 arc. Each is an open row in meta.db with a clone-ready brief; each closes a loop that still runs through the operator today.
A constellation is all agents on one machine. netsky0 is the owner-facing constellation; netsky1..N are siblings that answer to netsky0. The bus is the file-backed agent channel. A task row is a row in ~/.netsky/meta.db with title, status, priority, agent, brief path, branch, and landed SHA. A workspace is a fresh repo clone under workspaces/<task>/. A clone is a bounded worker agent numbered agent1..N.
the roadmap #
flowchart LR
NOW[session 6 close]
MC[netsky1..N multi-constellation]
CT[cybernetic task flow task 14]
SQL[SQL as system surface task 4]
RT[runtime-neutral agents tasks 6 and 8]
CRON[loop + cron composition]
NOW --> MC
NOW --> CT
NOW --> SQL
NOW --> RT
CT --> CRON
SQL --> CRON
MC -.shared graph.-> CT
RT -.any runtime.-> CT
The open P1 rows in meta.db right now, readable any time from netsky task list --status open: task 4 (SQL-as-system-state design), task 8 (agentinfinity runtime-neutrality), task 13 (temporal efficiency), task 14 (cybernetic task/brief flow), task 16 (clone-health detection), task 17 (this very blog). Task 6 (channel-root migration) is P2. Task 15 closed in session 6.
1. multi-constellation #
Only netsky0 maintains owner-comms authority. Siblings netsky1..N exist on other machines and relay through netsky0 rather than paging the owner directly (src/crates/netsky-prompts/prompts/base.md:40-49). The transport is grounded - iroh over QUIC + TLS 1.3, NodeId verified before any payload byte, same envelope shape as the local bus. The remaining work is coordination, not wire format.
netsky1 onboarding lands three problems at once. Source code: every constellation runs the same repo, so branch pushes and harvests have to be deconflicted across machines. Owner comms: iMessage goes to one place, so netsky1 must relay every owner-directed signal through netsky0, which in turn must know which machine the signal came from. Distributed work: a clone dispatched on netsky1 should still write to the shared task graph so netsky0 can answer “what is every constellation doing right now” in one query.
The single-root rule is the feature, not the constraint. Extending it to a network keeps the network as legible as one machine.
2. cybernetic task flow (task 14) #
The human stitching between brief, workspace, branch, bus, and task row is the largest remaining latency sink. Measurement P0 (6522f22) already added the schema columns on TaskRow - brief_path, workspace_path, branch, landed_sha, estimate_minutes, actual_minutes (src/crates/netsky-db/src/lib.rs:785-820). The netsky task create/show/list/update verbs read and write them today. What is not wired yet is the two lifecycle verbs: dispatch and harvest, specified in briefs/archive/session7-task-dispatch-harvest-verbs.md:16-60.
The target shape, once those verbs land:
netsky task create --brief briefs/session7-foo.md --priority P1 "session7 foo fix" netsky task dispatch 42 # ...clone pushes branch... netsky task harvest 42
netsky task dispatch <id> reads brief_path from the task, picks the next free clone, derives the workspace path, runs netsky clone brief, flips status to in_progress, and writes a dispatched event. A clone reply on the bus carrying a task=42 header is logged as a clone_reply event on the task row. netsky task harvest <id> fetches origin, cherry-picks the branch to main, pushes, sets status=closed and landed_sha=<sha>, and writes harvested + closed events.
netsky task show <id> already renders the timeline the dispatch and harvest events will hang off - directive, brief link, branch, landed SHA - on one screen. No cross-referencing briefs, workspaces, git log, and bus history by hand (briefs/archive/session6-cybernetic-task-flow.md:56-72).
The success criterion is quantitative: dispatching a task takes one verb and one line of owner prose; harvesting takes one verb. Terminal-only. No external tool - notion, linear, github projects - enters the loop (briefs/archive/session6-cybernetic-task-flow.md:87-95).
3. SQL as the system surface (task 4, task 15 landed) #
Meta.db already records most of the interesting state - messages, CLI invocations, crashes, ticks, workspaces, sessions, clone dispatches, harvest events, MCP tool calls, git operations, owner directives, token usage, watchdog events, source errors, iroh events (src/crates/netsky-db/README.md:27-47). Task 15 closed in session 6: retry_db_lock wraps every write with exponential-jitter retries (src/crates/netsky-db/src/lib.rs:1993-2000); the evidence line on task 15 records 6ec6ca4 retry policy 5x exp jitter, p99 128ms.
Task 4 widens the surface. Four pieces:
- Single-writer pool so the retry path handles all contention in one place, and readers see a consistent DataFusion snapshot without fighting for locks.
- Named views for the questions an operator asks every session (“what is every clone doing”, “which tasks landed today”, “what did this clone cost”), not hand-rolled joins every time.
- Benchmarks that pin p50/p99 under concurrent clone load so regressions get caught by
./bin/check, not by production drift. - Explain-plan helpers that make “why is this query slow” a one-liner.
SQL is the API. The operator-facing verb is netsky query, which takes SQL over the same store every CLI verb writes to (src/crates/netsky-db/README.md:21-25). DuckDB attaches the file as meta for ad hoc analysis. Filesystem stays the home for file-shaped things (briefs, notes, workspaces) and nothing else.
4. runtime-neutral agents (tasks 6 and 8) #
--type claude|codex selects the runtime for clones and for netsky up. agent0 and agentinfinity take their runtime from AGENT_RUNTIME in the environment (src/crates/netsky-core/src/runtime/mod.rs:82-90). Two surfaces still carry a runtime name where they should not.
Task 6: channel root migration. This path now prefers ~/.netsky/channels/agent/ with a compatibility shim for the older runtime-named root. The conceptual leak is mostly closed. What remains is follow-through: clean docs, prompts, and auxiliary tooling so every public surface speaks the runtime-neutral path first.
Task 8: agentinfinity runtime neutrality. The watchdog respawns clones under whatever --type they were launched with, but its own runtime is fixed at boot through AGENT_RUNTIME. Task 8 adds a --type flag to netsky agentinfinity and persists the selection across crash recovery so a restart brings the watchdog back on the same runtime. Agent5 has the branch in flight. The payoff: an operator on a Codex-only machine can run the entire constellation including the watchdog under Codex without editing source.
Together the two tasks preserve the property that no role prefers one runtime by design.
5. loops and crons composed #
Scheduling is durable. netsky loop create is for one-shot or self-paced follow-up; netsky cron add is for recurring clock schedules; the ticker delivers both through the same bus (src/crates/netsky-cli/src/cmd/loop_cmd.rs:47-88, src/crates/netsky-cli/src/cmd/cron.rs:13-15, src/crates/netsky-cli/src/cmd/tick.rs:133-163).
The session 7 composition:
netsky cron add morning-brief "0 11 * * *" agent0 /morning-brief netsky loop create 15m "check CI for branch $BRANCH; report only if state changed"
A cron drives daily cadence. A loop drives tight iteration while a piece of work is live. A loop can arm the next cron; a cron can spawn a new loop. Both persist on disk, both survive restarts, both stamp their envelopes (from=agentcron or from=agentloop) so the bus and meta.db attribute the trigger.
Autonomous self-improvement becomes a sequence, not a single trigger. A nightly cron dispatches a self-critique clone; the clone opens a loop on its own workspace branch; the loop exits when the gate is green; the next morning’s cron harvests the branch. No operator hand in the chain.
6. the asymptote #
One root per machine. One bus. One mutation surface. One database. Every new ability lands as a clone brief, a gate, or a row. The operator judges direction; the system owns execution.
Three limits are real:
- Model intelligence. Every clone is as smart as the underlying model. If the gate-writer model is weaker than the rule it is trying to codify, the gate is weaker. Model capability is an exogenous ceiling.
- Owner judgment. S5 policy lives in prompts plus a cwd addendum. The owner decides what to build. Autonomy does not decide whether the system should build it.
- Hardware and network. A constellation is a process group on a machine. A network is a set of machines. Both fail in the ordinary ways: power, TLS, disk. The watchdog and iroh’s NodeId verification handle the normal case; the owner handles the catastrophe.
Within those limits, the path is concrete. netsky1 lands tomorrow. Task 14 collapses dispatch-and-harvest to one verb each. Task 4 widens the SQL surface. Tasks 6 and 8 finish runtime neutrality. Loops and crons compose into self-improvement cycles. Each item is an open row in meta.db with a brief and an acceptance criterion.
Session 7 is not a new architecture. It is the same architecture with fewer hands in the loop.
what this is not #
Not a promise of timelines. A plan with enough specifics that “done” is verifiable - a task row closes with a landed SHA, a query answers a new question, a dispatch takes one verb instead of several. Priorities may reorder as new constraints appear; some streams will need a second revision before they land. That is the point of making the task rows visible: the plan is as durable as meta.db, and as correctable.