cyberine

Cyberine — Supported Features

Static feature catalog. This file is the canonical, living list of what Cyberine (AI Agent Solution) supports today. When a feature ships, add a row here (and keep USAGE.md for the step-by-step recipes). It renders as the Features page of the site under site/ - run npm run docs:dev (or npm run docs:build) to preview the whole site.

Cyberine is a vendor-independent, multi-provider AI agent orchestrator (ports-and-adapters): dispatch one task to N agents — raw-API loop workers and/or headless CLI coding agents — judge the results, and ship the winner. It can be used standalone as a day-to-day coding agent (a Claude Code / Codex replacement) that prioritizes zero-marginal-cost subscription workers.


Global CLI (cyberine)

CommandWhat it does
cyberine setup [--status]Guided onboarding: configure provider API keys, pick + pin a chat model, print available workers. Re-runnable, idempotent.
cyberine auth <login|list|status|logout> [provider]Manage provider credentials in ~/.cyberine/.env with live validation; key values never printed.
cyberine agents [--once|--json]Interactive fleet TUI of every run across all projects (--once = plain-text list for scripts; --json = structured JSON array with per-worker waitingFor when blocked).
cyberine run "<task>"Dispatch a task to the fleet and judge the results (one-shot, foreground).
cyberine run --bg "<task>"Detached background run; returns a runId immediately, survives the terminal closing. Auto-routes the fleet.
cyberine run --mode compete|swarmOperating mode preset wired end-to-end into the engine: compete caps fleet to all eligible workers + [diff, behavior] judge chain + verifyCmd gate active; swarm caps to one worker + [diff] chain + no verifyCmd gate.
cyberine wait <runId>Event-driven block until a background run reaches a terminal state; exits 0 (done), 1 (run failed/cancelled), 124 (timeout), 125 (watcher crashed / could not observe).
cyberine digest <runId>Compact one-screen summary of a run: state, verdict, winner, diffstat, outcome summary; no raw diff.
cyberine land <runId...> [--dry-run]Batch-land dogfood runs: wait → digest → apply+commit per run → one final typecheck.
cyberine apply <runId> [--dry-run] [--step <id>] [--commit] [-m <msg>]Land a code run's winning diff onto the working tree; --commit also stages and commits it.
cyberine chatPlanner REPL: brainstorm/sharpen a task with a model, then /run it to the fleet. Sessions persist.
cyberine chat sessions | --continue | --resume <id> | --task "<text>"List, reopen, resume, or auto-submit a chat session.
cyberine route "<task>"Dry-run the router: print the classified tier/kind, the chosen fleet, and per-worker reasons — no dispatch.
cyberine models [<provider>] / cyberine model which|use|resetOffline model catalog: list providers/models, resolve active model, switch via ~/.cyberine/.env upsert.
cyberine cost [<runId>] [--days N]Spend ledger: per-run / per-day / per-provider token + $ cost, including premium-subscription savings.
cyberine credits [list]List tracked provider balances: balance / estimated-spent / remaining / status (ok / low / exhausted).
cyberine credits set <provider> <usd>Seed or reset a provider's balance (resets estimated spend to $0).
cyberine credits add <provider> <usd>Top-up a provider's balance without resetting estimated spend.
cyberine credits reset <provider>Remove a provider from the ledger (revert to unlimited / no gate).
cyberine eval [--compare]Replay stored runs against current fleet/judge config; report win-rate, cost, gate-pass-rate vs baseline.
cyberine group <which|list|runs|chats>Inspect project groups that share runs, chats, and memory across linked directories.
cyberine memory <list|show|search|issues|chain|rebuild>Inspect long-term memory: records, search, the issue ledger, run lineage, index rebuild.
cyberine tasks [--all]Print the task board, same as cyberine tasks status; read-only. The legacy .local/dogfood/backlog-*.md listing is cyberine tasks dogfood [--all] (k0zd1).
cyberine skill list|showDiscover and inspect Claude-Code-compatible SKILL.md files (global + project scopes).
cyberine wf list|save <name> <path>|run <name|path>Saved workflow registry under ~/.cyberine/workflows/; scripts callable inline via workflow() host function; step-resume via --resume.
Project-local workflow override<repo>/.cyberine/workflows/<name>.ts takes precedence over ~/.cyberine/workflows/<name>.ts; cyberine wf list merges both dirs with project entries shadowing global. Resolution order: literal path > project > global.
cyberine wf author [--bg] "<task>"Dynamic workflow authoring: planner writes a workflow script at runtime, typecheck-gates it, then dispatches.
cyberine wf show <path>Print a workflow script's meta + phase list without running it.
cyberine tui [<runId>|--dir]Open the fleet TUI scoped to one project.
cyberine plugin install [--copy|--force]Wire the bundled Claude Code plugin: one symlink into ~/.claude/skills/cyberine, exposing ten skills (/cyberine:help, /cyberine:init, /cyberine:run, /cyberine:autopilot, /cyberine:plan, /cyberine:ask, /cyberine:tasks, /cyberine:research, /cyberine:handoff, /cyberine:end) and the bundled MCP server.
cyberine plugin statusReport whether the Claude Code plugin is loaded and which skills are accessible.
cyberine plugin list|info|doctor|install|remove|enable|disableGeneral plugin lifecycle: install extension plugins from local path or git, enable/disable, inspect, health-check.
cyberine reap [--dry-run]Sweep the global registry for stuck runs (engine alive, no events.jsonl progress for CYBERINE_STUCK_IDLE_MS, or past CYBERINE_STUCK_WALL_MS wall-clock cap). Cooperative teardown: SIGTERM → CYBERINE_STUCK_GRACE_MS → SIGKILL; marks run cancelled with killed:stuck provenance; tombstones from cyberine agents.
cyberine plans list [--all] / cyberine plans show <slug>Read-only browser over the traceable plan files written by cyberine chat plan mode. list shows this project's plans newest-first (id · created · status · description from frontmatter; --all includes superseded); show resolves a partial topic-slug and prints frontmatter facts (session_id, run_ids[], status, approved_mode) + the markdown body. Reads ~/.cyberine/plans/<project-slug>/ and <cwd>/.cyberine/plans/ when CYBERINE_PLANS_DIR is set.
cyberine doctor (T540)Unified health check (also /doctor in chat): node version, config validity across layers, store sanity, provider keys presence, gateway reachability, CLI worker availability, fleet.json drift, MCP, hook executability — [PASS]/[WARN]/[FAIL] lines with fix hints, exit code reflects failures.
Run-corruption visibility (T674)The doctor's run-store check opens each registry record's own <runsDir>/<runId>/run.json and flags corrupt/unparseable run.json files distinctly from corrupt registry records (tombstoned runs skipped; missing run.json reported as its own orphaned-record flavor); the same count from RunStore.list() renders live as a warn-tone corrupt stat in the fleet TUI header (local mode), and the store's aggregated stderr warning is deduped per distinct corrupted-id set instead of re-firing every poll. Smoke: npm run selftest:doctor-run-corruption.

Claude Code integration

FeatureWhat it does
Claude Code pluginOne-command setup: cyberine plugin install wires the bundled plugin into ~/.claude/skills/cyberine (symlink by default, copy option for symlink-unsafe hosts), exposing all ten skills + the bundled MCP server without needing separate skill install / mcp install steps.
Eight bundled skills/cyberine:help (free, model-invocable front door that routes plain language anchored on "cyberine" to the right leaf below and asks before any leaf spends), /cyberine:init (is this repo ready for Cyberine), /cyberine:run (dispatch to Claude subscription seats), /cyberine:autopilot (agent-driven task board), /cyberine:plan (generate competing task lists, written to the board as backlog), /cyberine:ask (settle blocking decisions, one verdict), /cyberine:tasks (converge conversation work onto the board), /cyberine:research (cited web-research fleet: plan -> search -> verify -> synthesize). All reachable with / trigger once the plugin is installed.
Bundled MCP serverThe plugin bundles the orchestration MCP server (cyberine-mcp), exposing every orchestrate() tool (read-only agent tools, code-implementation tools, run lifecycle tools) without needing a separate MCP server registration step. Accessed by the bundled skills and the web dashboard.
Plugin status reportingcyberine plugin status reports whether the plugin is loaded and which skills are accessible; cyberine doctor includes a claude-code: section flagging missing/stale/loaded plugin + skills state; the bare cyberine command nudges an authed user with cyberine plugin install when the plugin is not wired.

Cost-aware routing (standalone / "prioritize free")

FeatureWhat it does
Marginal-cost cost modelEach worker carries costModel (subscription / metered / free-local) + priorityRank. Routing prefers zero-marginal-cost workers over pay-per-token ones.
Preferred poolEvery worker whose costModel is subscription (e.g. claude, codex, muse), plus metered CLI agents at costClass 1 — always eligible, never excluded for cost. Retired workers (opencode-deepseek, opencode-kimi, …) drop out of the pool entirely.
QA vs code routingA question gets ONE subscription worker (no race); a code task races the whole available preferred pool, DiffJudge picks the winner.
Native-API as last resortMetered loop-* / gemini workers are auto-selected only when no preferred-pool worker is available (else opt-in via CYBERINE_BUILD_FLEET).
Auto mode-routingSwarm-then-compete escalation: trivial tasks go swarm (single cheap worker, fast), complex tasks escalate to compete (full fleet race). The mode preset is wired into WorkflowEngine via WorkflowEngineOpts.preset and drives fleet size cap, judge chain, verify gate, and governor initialisation.
Availability-filtered candidatesThe router only considers workers actually usable now (logged-in CLIs + key-configured loop workers), so the fallback is real.
Subscription billingSpawned claude / codex workers scrub the metered API-key env var when a sub exists, so they bill the flat subscription, not per-token.
Deterministic, no-LLM classifierQuestion/edit-verb/size heuristics (English + Vietnamese) — reproducible routing with explainable reasons.
Worker ELO track-recordPer-worker win/loss history in ~/.cyberine/worker-track-record.jsonl; informs fleet selection and routing over time.
Smart (LLM-as-router) (CYBERINE_SMART_ROUTER)Opt-in: when enabled, an LLM call (CYBERINE_ROUTER_MODEL / CYBERINE_ROUTER_BASE_URL) picks workers from the available set after the deterministic classifier runs; the LLM pick is validated and falls back to the deterministic result if invalid. Off by default.
Budget admission / smart spawn (CYBERINE_SMART_SPAWN)On by default (CYBERINE_SMART_SPAWN=0 disables). Gates new worker spawns against current credit balances and concurrency headroom before dispatch; surfaces a capacity-wall signal for chunked handoff when the fleet is full.
Fleet budget caps — mid-run abort (CYBERINE_MAX_BUDGET_USD / CYBERINE_FLEET_USD_CAP / Task.maxBudgetUsd)Per-worker + per-fleet USD caps checked between tool rounds against each worker's live costUsd; on breach the worker(s) checkpoint to status='partial' (output + usage preserved, judge still sees the partial diff). Tighter cap wins; reuses estimateCostUsd (no rate-table dup). TUI shows a live spent/cap (NN%) meter on capped runs (warn tone >= 80%). Distinct from the cross-run CYBERINE_DAILY_USD_CAP dispatch-time hard-stop.
Per-tier model variant resolutionWorkers that declare variants.flash / variants.reasoning in their profile get the appropriate model id auto-selected based on the classified task tier (trivial/standard -> flash; complex -> reasoning). Env-key overrides (e.g. DEEPSEEK_MODEL) always win and are preserved in route audit output.
Enabled means used for every role (khv45)Enabling a worker in fleet.json is consent to use it for planning, task splitting, reviewing and judging, not only implementing — there is no separate consent field, acknowledgement or prompt. With the defaults, the design/review/plan steps dispatch the strongest ENABLED workers by the model strength table (top band, widened until at least two compete), the implement step dispatches the cost-class-1 workers, and the judge chain is ordered by strength with an API backend ahead of a CLI-spawn judge at equal strength. A fleet whose enabled workers are all cheap-class is unchanged. Every run records a note naming the picked workers and any subscription the thinking steps bill. cyberine fleet disable <provider> takes a worker out of every role; routing.steps and routing.judges still override everything. Replaced the pre-2026-09-17 import-time ban on subscription workers in the design step.
Fleet policy file (fleet.json + cyberine fleet)Optional user-editable policy file (project .cyberine/fleet.json full-replaces global ~/.cyberine/fleet.json) declaring which providers/models are active (replace semantics) and which model handles each task-kind (qa/code-small/code-large). Manage via cyberine fleet init/list/enable/disable/set-default/set-model/route/doctor/edit. Holds policy only, never keys; precedence CLI flag > env > fleet.json > built-in; absent file = unchanged behavior.

Worker fleet (adapters)

Worker / adapterWhat it is
LoopAgentAdapterModel-level tool-calling loop against any OpenAI-compatible endpoint (DeepSeek direct, OpenRouter, Moonshot/Kimi, Ollama, LiteLLM gateway, native Anthropic). Sandbox-pinned.
CliAgentAdapterSpawns a headless CLI coding agent: claude, codex, opencode (deepseek/kimi), gemini. Host-sandbox wrapped.
Key-only loop workersloop-deepseek-build, loop-openrouter-build, loop-kimi-build, loop-ollama-build, loop-claude-native-build — zero CLI install, need only an API key.
Ollama Cloud providerHosted Ollama inference (https://ollama.com/v1, requires OLLAMA_CLOUD_API_KEY). Compare-fleet adapter loop-ollama-cloud; build worker loop-ollama-cloud-build (opt-in via CYBERINE_BUILD_FLEET). Cloud models carry a :cloud suffix (qwen3-coder:480b-cloud, gpt-oss:120b-cloud, gpt-oss:20b-cloud, deepseek-v3.1:671b-cloud). Separate env vars from local Ollama — not keyless, not localhost. See docs/providers/ollama-cloud.md.
Command Code providerCommand Code Provider API (https://api.commandcode.ai/provider/v1, requires CMD_API_KEY) as the key-only build worker loop-commandcode-build, billed against the subscription credit windows rather than the daily money cap. :free model ids record zero cost; claude-* ids are refused at registration; off-plan and unsupported-model refusals cool the worker down instead of retrying. cyberine route prints the remaining credits and both usage windows from the /alpha/billing/credits endpoint; a closed window drops paid-model Command Code workers from the candidate set until it resets (free models stay eligible), and a 429 parks the worker until the reset the refusal names instead of retrying. The command-code CLI worker runs Command Code's own harness (command-code -p --yolo) inside the host sandbox with a narrow ~/.commandcode write grant, maps the NDJSON result's usage and cache reads, treats a non-success subtype as an error, cools down on an auth failure, returns partial at --max-turns, and draws the same credit windows through the same gate (CYBERINE_COMMANDCODE_MODEL, CYBERINE_COMMANDCODE_MAX_TURNS). A free lane, loop-commandcode-free-build, binds whichever zero-credit models the live catalog lists (no id in code), is routed for qa and code-small, and takes the paid worker's place in an explicit fleet while the paid worker is parked. See docs/providers/command-code.md.
Gateway loop workersloop-claude-build, loop-gpt-build — Claude/GPT via the LiteLLM gateway through one OpenAI-compatible loop.
CLI coding agentsclaude, codex, opencode-deepseek, opencode-kimi (dead/self-skipping since 2026-08-25), gemini — full project-aware tool harnesses.
Headless login gatingA CLI worker is only spawned when it is installed AND authenticated; missing ones are skipped with a note.
Host sandboxCLI workers run wrapped in a host sandbox when available (Seatbelt / bubblewrap); CYBERINE_TASK_TRUSTED=false makes a sandbox mandatory.
OpenCode worktree config-lockBefore spawning an opencode worker, a minimal opencode.json (locked model + permissions) is written into the worker's worktree dir, so opencode's upward config traversal can't inherit a conflicting .opencode/opencode.json from an ancestor repo and override Cyberine's chosen model. opencode-only; other adapters unaffected.
Shared OpenAI client (makeOpenAIClient)Every OpenAI-wire client (chat planner, judges, loop workers, oracle, memory, web) is built through one factory — the single, mandatory construction point for new OpenAI(...) in the repo. On openai SDK ^7.x (since 2026-09-03, task kwed4) it passes options straight through with keep-alive on; the SDK's native-fetch transport does not have the keep-alive/socket-reuse bug 4.x had, so no transport override is needed.
Anthropic model catalogCatalog + pricing cover claude-fable-5-1/claude-fable-5 (1M ctx, $10/$50), claude-opus-5/claude-opus-4-8 (1M ctx, $5/$25), claude-sonnet-5 (1M ctx, $2/$10, the default claude worker), claude-sonnet-4-6 (1M ctx, $3/$15), claude-haiku-4-5 (200K, $1/$5) — all selectable as worker models.
Connection-failure cooldownA refused/unreachable endpoint (a local gateway or Ollama that is not running, DNS miss, timeout) records a short 5-minute cooldown after its first failure, so a configured-but-down worker drops out of the fleet instead of erroring on every dispatch — then rejoins once reachable. Tunable via CYBERINE_QUOTA_COOLDOWN_CONNECTION_MS.
CLI flag-compat diagnosis (T656)An older installed claude/codex/gemini that rejects a version-gated flag Cyberine passes (e.g. codex --dangerously-bypass-hook-trust, claude --exclude-dynamic-system-prompt-sections) surfaces a named, diagnosable error — flag, owning task, known-good CLI version, disable knob — instead of a bare unknown option exit. Registry: CLI_FLAG_COMPAT in src/adapters/CliAgentAdapter.ts; smoke: npm run selftest:cli-flag-compat. Also wires the T626/T628/T631 opt-ins to reachable env knobs: CYBERINE_CLAUDE_CAPTURE_SUBAGENT_TEXT, CYBERINE_CLAUDE_OUTPUT_SCHEMA, CYBERINE_CODEX_OUTPUT_SCHEMA.
code_execution job control (kc8cn)A Python snippet can start a background job via call_tool('run_bash', ..., background=True) and list/read/kill it with call_tool('bash_jobs', ...) in the same snippet; the snippet-side tool registry mirrors the adapter-level run_bash/bash_jobs pairing. Also fixes the macOS Seatbelt path that made every snippet-side call_tool fail. Smoke: npm run selftest:codeexec-bash-jobs.
Per-run background-job reaping (k8w8k)Background jobs die when the worker run that started them ends (per-run ownership token, not cwd-keyed); a nested delegate_subtask inherits its parent's token and never reaps, so a subagent returning cannot kill the parent's live jobs. Process-exit reaper + 30-minute ceiling remain as backstops. Smoke: npm run selftest:per-run-reap.

Judges

JudgeWhat it does
ConsensusJudgePure majority vote across candidate outputs.
LlmJudgeAn LLM scores and ranks the candidates. Reasoning judge models (e.g. deepseek-v4-flash) get a 2048-token budget so reasoning_content doesn't starve the verdict JSON, falls back to reasoning_content when visible content is empty, and retries once with a strict-JSON reprompt before degrading to the safe first-result default — so a real rationale is produced instead of silently ruling for the first candidate.
AdversarialJudgeN skeptics try to refute each candidate before it wins.
DiffJudgeApplies each candidate diff in a throwaway worktree, gates on apply-cleanly + typecheck, and disqualifies no-op (empty) diffs — the implementer-fleet winner picker.
Default judge chain by strength (khv45)Without routing.judges, the backends are ordered by the strength of the model each would use, preferring a vendor no candidate worker runs, and putting an API backend ahead of a CLI-spawn judge at equal strength. An enabled claude / claude-<seat> entry is a default candidate instead of a routing.judges-only opt-in, so a seats-only fleet gets llm-judge and adversarial back. Each backend's billing class comes from src/core/billingClass.ts and lands in run.json judging.backends[].billingClass — informational, it never adds or drops a candidate.
BehaviorJudgeGates the winning diff on a project-defined verifyCmd (e.g. npm run typecheck); scores apply-cleanly + typecheck + custom verify; used by compete mode and DiffJudge tie-break.

Engine & workflows

FeatureWhat it does
WorkflowEngineRuns multi-step DAG workflow definitions; per-step workers, judges, and dependency wiring.
Worktree isolationSteps marked isolate: true give each worker a detached git worktree off HEAD and capture its diff — no live-tree clobbering.
Per-step model overrideA WorkflowStep.model field overrides the dispatched loop worker's model for that step only (cheap model for grunt steps, expensive for a gated verify) — threads through Task.modelOverride to LoopAgentAdapter; absent = unchanged worker default.
implementTaskWorkflowThe standing design -> implement fleet: plan, then the writing fleet competes in isolated worktrees, DiffJudge picks the winning diff. Used by cyberine run code tasks.
Imperative workflow script runtimeA meta + default async module shape runs through WorkflowScriptRuntime with host.agent(), host.parallel(), host.pipeline(), host.phase(), host.budget helpers; auto-detected by npm run wf.
Workflow journal + resumeEach imperative run journals step results; --resume replays cached steps and re-runs only changed/new ones.
Nested + saved workflowsworkflow(name) inside a script delegates to a named saved workflow; cyberine wf save registers scripts in ~/.cyberine/workflows/.
Token budget (CYBERINE_WF_BUDGET)Per-script token ceiling; host.budget.spent() / host.budget.remaining() introspectable at runtime; auto-stops before ceiling.
Concurrency governor (CYBERINE_MAX_CONCURRENT)Global cap on simultaneously-running workers with backpressure queuing; prevents runaway fan-out.
flow-dream-consolidate workflowRETIRED 2026-09-09 (k0wf7, operator decision). It was the June port of the operator's private flow-dream memory-hygiene flow, decision-only (its write phases were never built), never run outside three smoke runs, and already a different design from the engine the operator rewrote in July. Cleaning ~/.claude/memory is Claude Code tooling's job; Cyberine's own memory lives at ~/.cyberine/memory/ (see Long-term memory) and stays vendor-independent so the same orchestrator serves Codex or any other CLI. src/workflows/ is gone with it. The generic <repo>/.cyberine/workflows/ override (see the cyberine wf row) is unrelated and still supported.
Write-set disjointness enforcementThe swarm scheduler detects overlapping file claims across parallel steps and serializes conflicting batches — no silent merge conflicts.
Early-kill for compete mode (M6)Once the first candidate passes the BehaviorJudge gate in compete mode, remaining in-flight workers are aborted rather than run to timeout.
awaitRun workflow stepA step delegates to a child background run and blocks on its completion envelope via the message bus; child's summary flows into dependent steps.
autoEvolveWorkflowBuilt-in self-improvement workflow: a read-only worker authors a spec, the writing fleet implements it in isolated worktrees, DiffJudge gates the winner.
npm run wf -- <def.ts>Run any workflow definition.
Lifecycle hooksClaude-Code-style hooks (PreDispatch, etc.) with an exit-code contract; can block or rewrite a dispatch.
Worker quota cooldown circuit-breaker (CYBERINE_QUOTA_COOLDOWN)Workers that return 402/429/auth errors are placed in a per-error-type cooldown (configurable via CYBERINE_QUOTA_COOLDOWN_RATELIMIT_MS, _CREDITS_MS, _AUTH_MS, _CLI_MS); excluded from dispatch until the window expires. cyberine cooldown [clear [workerId]] lists or clears active cooldowns. Set CYBERINE_QUOTA_COOLDOWN=0 to bypass entirely.
High-risk mode (CYBERINE_HIGH_RISK)Setting CYBERINE_HIGH_RISK=1 (or cyberine run --high-risk) escalates the run to the L3 adversarial judge tier: an AdversarialJudge runs skeptic workers against each candidate before a winner is accepted. Forwarded to child background runs automatically.
Swarm grouping knobs (CYBERINE_SWARM_GROUP_BY / CYBERINE_SWARM_LANES / CYBERINE_SWARM_MAX_LANE_SIZE)Fine-tune swarm lane packing: CYBERINE_SWARM_GROUP_BY controls edge type (files = file-overlap only, deps = dependency edges too); CYBERINE_SWARM_LANES overrides the lane count cap; CYBERINE_SWARM_MAX_LANE_SIZE sets the split-warning threshold above which a lane is flagged as too large.
Repo briefing (CYBERINE_REPO_BRIEFING)Loop workers receive a repo-structure preamble before each task (default on in a git repo). Set CYBERINE_REPO_BRIEFING=0 to disable.
Autopilot session driver (createSessionDriver)Drives ONE long-lived Claude Code session turn by turn over claude -p + --resume, reporting the exact context after every turn (input_tokens + cache_read_input_tokens + cache_creation_input_tokens) plus cost, duration and the model that actually answered. Typed failures, a LIVENESS watchdog (khgxt, 2026-09-06: a turn is killed only when stdout AND every descendant process stay quiet for stallTimeoutMs, never for running long; turnTimeoutMs is an opt-in cap), and an optional per-turn series at .local/runs/<runId>/autopilot.jsonl. Prompt and result content never reach the terminal or disk unless debug is set. No policy: it measures, the caller decides.
--engine claude reads a scope: --area <tag> and an explicit task-id listShipped
Batch deferrals and unreachable named ids are reported, never droppedShipped

Self-evolve loop

FeatureWhat it does
Plan -> execute -> re-plan loopThe cyberine evolve command runs continuous improvement cycles: plan tasks, gate execution via judge verdicts, re-plan from results. Two entry cases (cold goal via --goal, or existing backlog via --from-backlog) feed the same loop.
Domain-group modelTasks are organized into domain groups with disjoint write-sets, so parallel workers never touch the same files.
Trust gateA cycle advances a task only when a judge picks a winner AND that winner's diff applies cleanly + typechecks. Worker self-claims are never trusted. An untrusted task (CYBERINE_TASK_TRUSTED=false) is always classified high-risk and the L3 adversarial gate becomes mandatory: with no adversarial judge available the winner is rejected, never auto-merged on L1/L2 alone (guarded by npm run selftest:trust-untrusted).
Stop modesuntil-done (default) stops when every group backlog is drained; continuous-evolution keeps looping, mining each cycle's diff for fix tasks and (with --grow) proposing new features.
CLI surfacescyberine evolve start, cyberine evolve status, cyberine evolve steer, cyberine evolve stop.
Chat integrationThe planner can start/steer a session via start_evolve_session / steer_evolve_session tools; /evolve shows status, /evolve steer <text>, /evolve stop.

MessageBus

FeatureWhat it does
File message busJSONL mailboxes under ~/.cyberine/bus/; relay run:completed envelopes to the dispatching chat session and parent runs. CYBERINE_BUS_BACKEND=none degrades to poll.
Mid-flight steerControlMessage (stop / steer) sent to a run's inbox; the step loop checks it between steps and either halts or redirects.
Chat run-completion reportChat sessions subscribe to the bus; a background run's completion summary is pushed to the chat that launched it.
MCP bus toolsnpm run mcp exposes send_message, poll_inbox, query_runs over the MCP protocol alongside the orchestrate tool.
Team presence / roster (T564/T565, src/store/presence.ts)Lightweight cross-run, cross-project roster: each live process (run, chat session, worker, MCP server) announces itself under ~/.cyberine/bus/presence/, heartbeats, and tombstones on graceful exit. cyberine chat joins on start; /team (chat slash command) and the MCP list_team tool both read the live roster (name, team, role, capabilities, last-heartbeat age) filtered to non-stale, non-tombstoned entries. /team send resolves a target by name, then role, then falls back to a team broadcast; /team join/leave mutate this session's team tag and re-announce immediately. Inbound teammate messages (T565/T566) surface live in the chat transcript without blocking the input loop or a mid-stream reply.

Store & memory

FeatureWhat it does
RunStorePersists each run under .local/runs/<runId>/ (run.json + events.jsonl).
Worker waitingFor fieldOptional string on WorkerRun set while the worker is stalled; explains the blocker (governor queue, pending upstream dep). Cleared on resume or termination. Surfaced in cyberine agents --json and TUI run-detail.
GlobalRegistryCross-project run index under $CYBERINE_HOME (~/.cyberine), powering cyberine agents.
ChatSessionStorePersists chat sessions (naming, history, resume) under $CYBERINE_HOME/chat-sessions/. Active permissionMode is saved on the record for session resume.
planStoreWrites traceable plan-mode markdown files: ~/.cyberine/plans/<project-slug>/<YYYYMMDD-HHMMSS>__<topic-slug>.md (or <cwd>/.cyberine/plans/ when CYBERINE_PLANS_DIR is set). YAML frontmatter carries session_id, run_ids[], status, approved_mode, cwd. updatePlanRunIds / updatePlanStatus keep the frontmatter in sync as runs are dispatched.
Long-term memoryMemoryStore records run outcomes + an issue ledger; a MEMORY preamble is injected into dispatched tasks; cyberine memory inspects it.
Run lineageParent / chat-session / previous / root run links for dispatch-chain provenance.
Worker track-recordPer-worker win/loss/cost history in ~/.cyberine/worker-track-record.jsonl; feeds router selection and routing decisions.
Cost ledgerPer-run token + dollar cost persisted in run.json; aggregated by cyberine cost; premium savings (sub vs metered) tracked separately.
Credit ledger (cyberine credits)Optional per-provider balance tracking in ~/.cyberine/credits.json; estimated spend decrements after each run (conservative round-up); workers below CYBERINE_CREDIT_MIN_USD are down-ranked; hard 402/quota errors zero the provider balance immediately. Providers with no entry are unlimited (default unchanged).
cyberine eval replay harnessReplay past runs against a new fleet/judge/verifyCmd config without re-running workers; reports win-rate, cost-rate, gate-pass-rate vs baseline.
Claude Code memory adapter (CYBERINE_CC_MEMORY), opt-inCyberine's memory is its own ~/.cyberine/memory/; a Claude Code memory folder is an optional adapter, read (preamble) and written (handoff-cyberine_<slug>.md on completion) ONLY when named by CYBERINE_CC_MEMORY=<path> or a .local/cc-memory file. Since 2026-09-09 (kmspc) there is no ~/.claude/memory fallback: unconfigured means untouched, pinned by selftest:memory-containment.
Project groupsLink directories via ~/.cyberine/groups.json; runs, chats, and memory collaborate across sibling repos; cyberine group manages.
ContextQ / MCP memory backendOPTIONAL, config-selected long-term-memory augmentation via HTTP /api or MCP /mcp; the local store stays canonical and degrades gracefully offline.
ContextBrain — Code-Context 3-Act seam (T441/T454)Separate port (src/core/contextBrain.ts) behind WorkflowEngine / AutonomyLoop's boot/recall/carry acts. createContextBrain() auto-selects between LocalBrain (default, fully offline: repo skeleton + git co-change signal + local MemoryStore lessons) and ContextQBrain (CYBERINE_CONTEXTQ=1: POST /api/agent/boot for repo-map + lessons, POST /api/retrieve for kNN recall on verify failure, POST /api/contexts/bulk-upsert to carry the post-judge capsule) — same env switch as the memory backend above, LocalBrain's output always computed first as the offline floor.
Hard spend cap — race-free ceiling (T482/T575)Opt-in (CYBERINE_SPEND_CAP_USD, unset/0 = disabled) append-then-verify reservation gate (src/store/spendCap.ts) closing the soft per-provider credit-ledger race: every dispatch reserves before running, re-reads the fully folded cumulative total, and denies over-cap. Gates both dispatch choke points (Orchestrator.dispatch, WorkflowEngine.runWorker) identically. T575 made the cumulative total self-tracked (recordRealizedSpend, no credits set balance required) and added event-log rotation/compaction (CYBERINE_SPENDCAP_ROTATION_BYTES, default 256 KB) carrying forward any still-open reservation. Reservation TTL via CYBERINE_SPEND_CAP_TTL_MS (default 10 min) auto-frees budget if a worker is killed.

TUI

FeatureWhat it does
Fleet hub (cyberine agents)Grouped runs list, run detail, folder picker, compose panel, quick reply, chats view — modelled on best-in-class fleet views.
Confluence ring brand markWelcome screens (hub + chat) show the Cyberine mark: an open ring in the theme accent, one arc and a centre diamond in TONE.verified (many attempts in, one verified out), as two-tone half-block pixel art on HalfBlockCanvas + HalfBlockMascot. The same geometry drives the website and dashboard marks (site/scripts/gen-mark.mjs). Replaced the eclipse mark 2026-09-25.
Chat REPL (cyberine chat)Planner with a real dispatch tool, slash commands, session resume, ghost-text completion, queued-message steering, cost/usage display.
Chat markdown renderingAssistant replies render as terminal markdown: headings (H1–H4), bold/italic/bold-italic/strikethrough, inline code (calm violet TONE.code), [label](url) links + bare autolinks, fenced code with syntax + diff highlighting, GFM tables (aligned columns, styled header, cell truncation), nested ordered/unordered lists (indent-aware, +/en-dash markers), task-list checkboxes (- [ ]/- [x]), blockquotes, and rules. Leaked tool-call protocol markup (<invoke>/<tool_calls>/DeepSeek <|…|> tokens) is stripped before display without harming legit angle brackets.
Chat slash commands/run, /steer, /skill, /backlog [run <n...>], /land <runId...>, /workflow author, /model, /copy, /clear, /resume, /style, /cost, /agents, /version, /mdtest (one-screen markdown render gallery for eyeballing the renderer), /team (T564/T565 — roster / directed send / join-leave / inbound recap, see MessageBus table).
Multimodal dispatch (T417-multimodal-dispatch)A pasted image (Ctrl+V) reaches BACKGROUND-dispatched workers, not just the in-chat planner turn: /run, dispatch_run/dispatch_tasks, and the Ctrl+B streaming handoff all persist the attachment into the dispatched run's own directory (.local/runs/<runId>/attachments/, type- and size-validated) and forward it as a CYBERINE_TASK_IMAGES manifest. Vision-capable loop workers get a real image_url content part; codex (the one CLI with a native image flag) gets it on argv via -i <path>; every other CLI worker gets a readable-path note in its prompt; a text-only loop worker keeps the pre-existing text-note fallback. Shipped 2026-09-03 (kqgcj). Pinned by npm run selftest:multimodal-dispatch (positive-controlled).
Chat planner provider tuningDeepSeek-direct planner turns run with thinking mode disabled (thinking: {type:'disabled'}, provider-gated): tool calls stay clean and the final answer returns in the content channel (a bright answer bubble) instead of being routed into reasoning_content (which rendered as a dim [thinking] block and tripped a thinking-mode reasoning-replay HTTP 400).
Standby worker pool (CYBERINE_STANDBY_POOL / --standby)Opt-in pre-warmed worker pool for cyberine chat: declare a slot spec (e.g. opencode-build:2,loop-deepseek:1), workers pre-provision git worktrees before any task arrives. /run claims an idle slot first and injects CYBERINE_STANDBY_WORKTREE so WorkflowEngine reuses the warmed tree instead of cold-provisioning. Pool state (idle/busy counts) shown in the chat status line and in cyberine agents --once output. On exit the pool drains gracefully (worktrees reset to HEAD, handed to the reaper). Default = no pool; behavior byte-for-byte unchanged when unset.
Permission mode (--permission-mode / CYBERINE_CHAT_PERMISSION_MODE)Claude-Code-style dispatch-gating layer for cyberine chat. Six modes: default (confirm before dispatch), acceptEdits (auto-approve edits, bounded by deny floor + host sandbox), plan (never dispatches — writes a traceable plan file and stops), auto (fully autonomous, same bounds), bypassPermissions (skip all permission checks), dontAsk (silently refuses non-pre-approved actions). Shift+Tab cycles default -> acceptEdits -> plan. Active mode shown in the chat status line. Mode persists on the session record and is restored on --resume.
Chat input affordances!-prefixed shell escape, Ctrl+R reverse history, Shift+Tab plan/build toggle, @-file picker with line-range support and auto-expansion.
Persistent input historyChat prompt history survives session restart; Ctrl+R fuzzy-searches prior prompts.
Ghost-text completionDim suffix completing from prompt history; Right-arrow to accept.
Queued-message steeringPrompts typed while a reply streams are queued; Esc peels the last queued prompt; second Esc after queue-empty interrupts the stream.
Mouse wheel scroll (CYBERINE_MOUSE=1)SGR mouse mode in chat TUI; wheel events translate to transcript scroll.
/resume inline pickerFuzzy filter of prior chat sessions; Enter to resume, Esc for a fresh session.
Real cost in chat statuslineProvider-reported $cost displayed in the statusline; context bar ████░░░░ N% with amber warning at ~85 % used (bar hidden below ~60 %).
TUI progress phase groupshost.phase(title) in workflow scripts emits group header rows in the fleet list, grouping related steps visually.
Run source tagRuns display their origin (Chat, Cli, Sample, or workflow kind) as a tag column in the fleet list.
Themes & responsivenessTheme tokens (dark/light/ansi), alternate screen, OSC titles, narrow-width degradation. Boxed panels use a top+bottom rule only (no left/right borders) with padding re-tuned to match.
Interactive dispatchNew-session flow picks a folder and launches a chat; /run dispatches to the auto-routed fleet and reports completion (with an cyberine apply hint for code runs).
OS desktop notification (CYBERINE_NOTIFY)System notification on run completion (default on; CYBERINE_NOTIFY=0 to disable).
Terminal bell (CYBERINE_BELL)Bell on run completion (default on; CYBERINE_BELL=0 to disable).
Worker toast notificationsTransient overlay toasts on worker done/error/cancelled transitions.
Fleet TUI Ctrl+X tombstoneRemove a finished run from the registry history (two-press confirm).
Agents-as-chat unified list (c)The fleet TUI's agents view merges runs + chat sessions into ONE folder-grouped list (buildConversations, ConversationList) instead of two separate screens — 1 agent = 1 chat. ⏎ on a run row opens it as a read-only, live-updating chat transcript (runToChatMessages, reusing the same <Transcript> a live chat renders); ⏎ on a chat row resumes it as before. One control surface (x stop, m ping/steer) works identically from the list row and from inside the open transcript.
Esc-Esc previous-message recall (T523)With an empty input box, a fast double-Esc recalls the most recent submitted prompt for editing (repeat steps further back, like Claude Code); sends as a new message, never a retroactive replace.
Readline residual keys (T522)Alt+Y kill-ring yank-pop cycling + Ctrl+F char-forward on top of the already-shipped Ctrl+A/E/K/U/W/Y set; delta-vs-CC audit captured in .local/research/cc-parity/.
# quick-remember shortcut (T524)Input starting with # routes straight to the /remember store with a confirmation chip; bare #foo still goes to the planner.
vim mode /vim (T525)Opt-in NORMAL/INSERT modal editing in the chat input (h l j k w b e 0 $ x dd dw cw i a A I o O + counts), NORMAL/INSERT badge in the frame corner, persisted via chat.vimMode. Default OFF.
Auto-generated session titles (T526)After the first exchange, a background call to the cheapest configured provider writes a <=6-word title (placeholder = first-line truncation); /rename pins forever; CYBERINE_CHAT_AUTOTITLE=0 opts out.
Fork-on-resume (T528)Ctrl+F in the /resume picker / session browser, or cyberine chat --resume <id> --fork: clones the session into a new id ("(fork)" suffix), original untouched.
Checkpoints + /rewind (T527)One checkpoint per user turn (message index + dispatched runs + shadow-git file refs where they exist); /rewind truncates the transcript back and offers file restore ONLY behind an explicit confirm.
/bg background surface (T529)Lists detached runs + !&-spawned background shells with status/elapsed, kill, and tail actions; !& cmd is the new background shell escape.
Context bar CC thresholds (T530)The status-line context meter stays hidden until ~60% used, flips to warn color at ~85%, and marks the auto-compact trigger point; single-knob CONTEXT_BAR in theme/env.
/context breakdown (T531)Static report of context composition (system prompt, memory preamble, tool schemas, todo, transcript) as proportional bars with token counts, consistent with the auto-compaction estimator.
Statusline command contract (T532)CYBERINE_STATUSLINE_CMD (or config statusline.command) now receives a JSON snapshot on stdin and re-runs on a ~300ms debounce in chat (fleet hub keeps the 30s poll); errors fall back silently.
Update notifier (T533)Once-a-day version-freshness check on TUI/chat start (git tag or npm registry by install shape); one muted "update available" line; CYBERINE_NO_UPDATE_CHECK=1 opts out; never blocks startup.
Local notifications (T534)Terminal bell / OS notification (osascript / notify-send) when a run finishes, input is awaited, or a long turn completes; `CYBERINE_NOTIFICATIONS=bell
Keybinding namespaces (T535)~/.cyberine/keybindings.json gains fleet.* / chat.* namespaces (bare ids stay back-compat); 11 chat actions + fleet actions remappable with conflict warnings at load.
/permissions /hooks /mcp viewers (T536-T538)Read-only views of the active permission policy (with per-layer provenance), configured lifecycle hooks + recent firings, and MCP server status with retry/details actions.
/output-style presets (T539)Named system-prompt overlays for the planner (default/concise/explanatory + user-defined in config outputStyles), persisted per session, separate from the /style verbosity toggle.
Per-language syntax highlighting (T541)Fenced code blocks highlight per language (ts/js/tsx/json/bash/python/go/rust/sql/yaml) via lowlight, cached once per block, CYBERINE_SYNTAX_HIGHLIGHT=0 opt-out; diff fences keep the diff path.
Fleet TUI profiling report (T547)CYBERINE_PROFILE=1 now prints the checkpoint table on genuine fleet-TUI quit too (not just chat/loop), skipping interactive-session handoff cycles.

Performance & smoothness

FeatureWhat it does
Profiling (CYBERINE_PROFILE)profileCheckpoint/profileReport util gated behind CYBERINE_PROFILE=1: prints a per-phase timing table for chat boot (session-resolve, planner-resolve, render) and per-round loop metrics (TTFT, per-tool durations). Zero allocation overhead when unset.
Adaptive prompt-cache policyProvider-aware cache policy (src/core/cachePolicy.ts): DeepSeek rides server-side auto-cache via a guaranteed byte-stable prefix; Anthropic-routed calls inject cache_control: {type: ephemeral} on the trailing system block + tool definitions, default 5-min TTL latching to 1h once the session reaches 8 model turns, with all cache params sticky-latched per session so the prefix never reorders mid-session.
Streaming budget-exhausted fallbackThe budget-exhausted final completion streams token-by-token (stream: true + per-chunk emit) like the main loop — no non-streaming completion path remains in the loop adapter.
Speculative tool executorThe loop adapter dispatches a tool the instant its tool_use block is known-complete mid-stream (new tool_calls index => prior call complete; finish_reason=tool_calls => last call complete, dedup-guarded), gated on the Tool port canParallel flag (read-only tools overlap + run early; write tools serialize in model order). Tool-result messages reassemble by tool_call_id in original order. DeepSeek-direct gets thinking: {type:disabled} auto-injected when tools are present; degrades to post-stream parallel-within-turn for any provider lacking a mid-stream boundary.
2-tier parallel startupChat + fleet-hub boot run independent critical-path I/O concurrently (session load, planner/provider resolve, UI settings + groups), render the shell ASAP, then fire deferred non-critical work (memory preamble, MCP discovery) post-first-paint.
Live-tail tokens in fleet TUIA running worker's tokens appear live in the fleet TUI run-detail: in-process runs subscribe to a token bus directly; bg runs file-tail events.jsonl (token deltas batched at 50ms to avoid disk thrash). New token:delta event kind, backward-compatible with existing projection/replay consumers.
useDeferredValue render isolationThe fleet runs-list and chat transcript snapshot use useDeferredValue so burst updates do not freeze input; the actively-streaming line stays on the priority (non-deferred) path.

Rules & skills

FeatureWhat it does
Rules system (CYBERINE_RULES)Global ~/.cyberine/rules/*.md + project .cyberine/rules/*.md injected as RULES preamble before dispatched tasks; path-gated rules via paths: frontmatter.
Skills systemClaude-Code-compatible SKILL.md format; `cyberine skill list
Backlog tasks (cyberine tasks dogfood)Read-only listing of open items from .local/dogfood/backlog-*.md; surfaced in chat via /backlog run <n...>.
/cyberine:run Claude Code skillPlugin skill (plugin/skills/run/, formerly cyberine-seat) mapping a plain-language Claude-subscription-seat request onto the exact cyberine run/wait/digest/apply invocation; discovers declared seat names via cyberine fleet doctor rather than assuming any.

Plugins

FeatureWhat it does
Plugin manifest (cyberine-plugin.json)Declares plugin kind (mcp for declarative out-of-process / code for in-process), display name, env-var requirements, and optional entry path.
Declarative MCP plugin (kind mcp)Cyberine connects to the plugin's MCP server out-of-process via McpToolAdapter; tools are namespaced and exposed to loop workers. Safe default: no code runs in-process.
Code plugin (kind code)In-process plugin; confirmed install prompt (shows kind, source, env requirements, --dangerously-skip-permissions warning) unless --yes flag is passed.
Trusted-dir gatePlugins only load from ~/.cyberine/plugins (or CYBERINE_PLUGINS_DIR); the project working directory and task-writable paths are never scanned — one boundary, no drift.
cyberine plugin doctorHealth-check all installed plugins: declared env vars, missing binaries, manifest validation errors.
Three bundled skills renamed: seat -> run, decide -> ask, brainstorm -> planShipped
/cyberine:help -- the eighth bundled skill, a free front doorShipped
The plugin ships NO hooks: plugin/hooks/ removed and refusedShipped

Web UI (cyberine web)

FeatureWhat it does
Browser fleet monitor + chatDependency-free node:http server serving a no-build SPA: 3-pane shell, live SSE run list, run detail with steer/stop/reap, chat planner with ask_user parity, Cmd-K search, OpenAPI /doc.
URL navigation (hash router)Deep-linkable views (#/runs/<id>, #/chat/<id>, #/queue); browser Back/Forward walk the view history; all selection paths route through the hash. Shipped 2026-07-10.
Keyboard list navigationArrowUp/Down or j/k move a sidebar selection highlight, Enter opens, Esc closes overlays — TUI parity. Shipped 2026-07-10.
Full CRUD parity with the TUIRun delete (registry tombstone), chat session create/rename/fork/delete, queue list + pending-entry delete (advisory-lock-guarded) — via DELETE /api/runs/:id, /api/chat/sessions CRUD, `GET
Queue viewSidebar entry with live pending-count badge; status chips, runId links, per-row confirm-delete, 5s polling while open. Shipped 2026-07-10.
OAuth login/logout (SaaS auth)GitHub + Google (OIDC/PKCE) login for the web UI via operator-supplied OAuth apps; hashed-at-rest cookie sessions with TTL, CSRF double-submit, deny-by-default CYBERINE_OAUTH_ALLOWED allowlist, GET /api/me, audit-logged logins. Login state is bound to the browser via a short-lived HttpOnly cookie checked at /auth/callback (RFC 9700 login-CSRF protection); Google logins are rejected unless the provider reports email_verified. Activation: CYBERINE_WEB_REQUIRE_AUTH=1 or non-loopback bind + configured provider; loopback stays open by default. Bearer API tokens keep working for programmatic access. Fail-closed gap: a non-loopback bind with neither an OAuth provider configured nor CYBERINE_WEB_REQUIRE_AUTH=1 refuses GET /api/* with 503 AUTH_SETUP_REQUIRED instead of serving it unauthenticated (a valid bearer token still works); mutating routes on any non-loopback bind have always required a bearer token. Shipped 2026-07-10, fail-closed gap + login-CSRF/email-verify hardening added 2026-07-11 (T596/T597).
Strict CSP (no 'unsafe-inline')Every response carries Content-Security-Policy with script-src 'self' and style-src 'self' plus one sha256 hash for the placeholder page's <style> block — an injected inline script or on*-handler attribute no longer executes. The dashboard markup has zero inline handlers/styles (addEventListener wiring + app.css classes); regression-guarded by npm run selftest:csp-inline-guard. Shipped 2026-08-20 (T676).

Other entry points

Entry pointWhat it does
npm run cli -- --json "<task>"One task -> every available adapter -> judge verdicts, as JSON.
npm run mcpExpose the orchestrator itself as an MCP server (orchestrate + bus tools).
npm run demoMulti-adapter compare demo.
npm run typechecktsc --noEmit — the single build gate.
npm run selftest:dep-auditRecurring dependency-audit gate: red on any HIGH+ advisory with an in-range npm audit fix, warn-only on deferred major upgrades (vite/esbuild/vitepress trio). Since 2026-08-29 it discovers EVERY package-lock.json in the repo and audits each with an explicit cwd, reporting per-tree counts -- it previously ran npm audit with no cwd, so site/'s 701 dependencies had never been audited by anything; the site CI job now runs the site-scoped form too. Shipped 2026-08-20 (T673), multi-tree 2026-08-29 (T707).
npm run sweepThe full selftest sweep, with a machine-readable SKIP channel. Discovers every selftest:* script from package.json, classifies on the exit code (0 pass / 78 skip / other fail), prints counts that add up, and FAILS when the observed skip set differs -- either direction -- from expectedSkips[<platform>] in scripts/selftest-manifest.json. Replaces a bash loop inside ci.yml that treated exit 0 as the only success signal and printed all N selftests passed using the DISCOVERED count, so a smoke that ran zero assertions counted as green (CI run 33106474716 skipped the whole host-sandbox class and still passed). Shipped 2026-08-29 (T707).
npm run selftest:gate-list-driftSecurity-gate drift check. scripts/selftest-manifest.json declares the security/data-integrity smoke set; this asserts the TRACKED .claude/rules/push-gates.md precondition 3 equals it, that ci.yml runs no runtime smoke or sweep (only the static drift checks), that every declared and every expected-skip name resolves to a real script, and that the local enforcement exists (sweep stamp writer, executable .githooks/pre-push, prepare wiring core.hooksPath). Shipped 2026-08-29 (T707) against the gitignored user-git-workflow.md and ci.yml's gate loop, where the rule comparison was UNVERIFIED on every runner; retargeted 2026-09-07 with the code-only CI cut.
npm run selftest:sandbox-deny / -devnull / -symlinkHost-sandbox regression guards, executable on Linux CI since 2026-08-29. All three were Seatbelt-only and printed SKIP on every runner (ubuntu-latest detects docker, because seatbelt is darwin-only and runsc/bwrap were absent), so ~15 credential-exfil assertions plus the only end-to-end write confinement check never ran while the gate recorded a pass -- a class that had already regressed three times. CI now installs bubblewrap; each smoke has a bubblewrap arm asserting the same outcome by the other mechanism (confinement by non-binding rather than by deny-list), probes that the backend actually works before asserting, places fixtures off /tmp (bubblewrap binds it read-write), and exits 78 rather than 0 when no backend exists. Verified on a real Linux kernel with bwrap 0.8.0. Shipped 2026-08-29 (T707).
npm run selftest:no-hard-resetSelftest-suite hardening: no script under scripts/ may run a destructive git op (reset --hard, checkout -- ., clean -f, stash drop) against the live checkout; only worktree/tmp-scoped targets or an explicit // destructive-git-ok: comment pass. The t276 trust-regression smoke no longer hard-resets the repo root on porcelain drift (it had wiped uncommitted files). Shipped 2026-08-21 (kxbxj).
npm run selftest:opus-catalogAnthropic Opus 5 catalog: claude-opus-5 (1M ctx, 128K out) added to modelCatalog.ts + modelPricing.ts at the live-verified standard rate $5/$25 (the Claude Code release note's $10/$50 is fast mode), alongside the still-cataloged claude-opus-4-8; no worker default changed (Sonnet 5 stays). Same pass corrected claude-sonnet-5 to its now-permanent $2/$10. Smoke guards both ids, the standard-vs-fast rate, and that the invitation-only claude-mythos-* ids are NOT cataloged. Shipped 2026-08-21 (k3kbw).
npm run selftest:deepseek-peak-pricingDeepSeek peak/off-peak pricing, time-of-day-aware: the direct deepseek-v4-pro/deepseek-v4-flash rows in modelPricing.ts carry off-peak base + peak rates (peak = 01:00-04:00 and 06:00-10:00 UTC, live since 2026-08-16); getModelPricing()/computeChatCost() resolve from an optional Date (default now). The spend-cap path was fixed too: creditLedger.estimateCostUsd() accepts modelId + at and bills at the per-model rate when known (LoopAgentAdapter passes its model), and the deepseek provider fallback was raised to the peak v4-pro rate so it never under-counts. Also corrected deepseek.md: reasoning_effort is a top-level request field (none/low/medium/high/xhigh/max). Shipped 2026-08-21 (knk0q).
npm run selftest:opencode-config-guardOpenCode config known-key guard: the per-worker opencode.json the opencode adapter generates (T493) is checked at generation time against the top-level keys of opencode's published schema (https://opencode.ai/config.json), failing closed with the offending key named -- needed because opencode v1.18.16+ silently ignores unknown top-level fields instead of erroring. Generator extracted as buildOpenCodeWorkerConfig(); config content and argv unchanged. Shipped 2026-08-21 (km8aw, guard half; the binary upgrade from 1.17.10 is a separate operator decision).
npm run selftest:opencode-parseOpenCode --format json parse contract + drift guard: parseOpenCodeStdout coalesces streamed text parts by part.id, reads step_finish tokens/cost, degrades a tool-only run to a (no assistant text captured ...) summary instead of dumping raw NDJSON, and (2026-08-22) surfaces error events instead of swallowing them plus reports SCHEMA DRIFT naming the unrecognised event types when zero events match a known type -- the stream is unversioned, and before this an upstream envelope rename degraded silently to status:'success' with usage:undefined, so a build worker could write real diffs and report nothing. 21 fixture checks, no spawn. Shipped 2026-06-09, hardened 2026-08-22 (cyber-06).
npm run docs:devRun the Next.js + Fumadocs docs site locally, hot-reloading (this catalog + USAGE + provider/design pages). VitePress was retired 2026-09-25 (T670).
npm run docs:buildBuild the static Next site to site/out/ (npm --prefix site run build under the hood).
npm run docs:previewServe the pre-built static Next export (site/out/) locally for a production-accurate review.
Docs-site discoverabilityOn the Next site (site/), NOT the retired VitePress config this row used to describe: pageMetadata() (site/src/lib/metadata.ts) gives every docs route and all 6 marketing routes real og:title/og:description/og:image/twitter:* tags against a per-route card (og-default for docs, a named card per marketing route), sourced from frontmatter title/description with a site-tagline fallback. site/src/app/robots.ts emits Allow: / unconditionally and site/src/app/sitemap.ts enumerates every marketing + docs route; both are static Next metadata routes, not a bespoke buildEnd() hook. CYBERINE_DOCS_ORIGIN gates every absolute URL: sitemap.xml's entries (empty list when unset, rather than emitting relative URLs), the robots.txt Sitemap: line, canonical + og:url, and metadataBase-resolved og:image. Unset builds correctly with those omitted rather than shipping a placeholder domain; npm run site:deploy sets it to https://cyberine.dev, live since 2026-10-01 (T671). Shipped 2026-08-23 (cyber-010), rebuilt for the Next stack 2026-08-29 (T701).
External MCP consumptionCyberine consumes any external MCP server's tools via McpToolAdapter; tools are namespaced mcp__<server>__<tool>; stdio + HTTP transports; configured via CYBERINE_MCP_SERVERS or CYBERINE_MCP_CONFIG.
npm run selftest:footprint-corpusTask-footprint estimator guard: asserts loadCorpus() actually reads run history (confidence rises above the 0.2 fallback and the numbers track the samples), that CYBERINE_RUNS_DIR re-scopes it, and (k5m89) that the typical-case fields are the MEDIAN not the mean, that a worker with >= 3 samples is keyed on its own history while a thinner one falls back to the blend, that an agentId@suffix folds onto its base worker, and that both admission bounds are p90. Exists because the estimator was dead from the day it was written -- a lazy require('node:fs') in an ESM package threw on every call and a bare catch swallowed it, so planBudget never once used real history. Every assertion positive-controlled by reverting the fix. Shipped 2026-08-23 (cyber-009), calibrated 2026-08-23 (cyber-010).
npm run selftest:sync-outputDEC 2026 synchronized-output shim contract: makeSyncStdout() re-implements Node's Writable.write() overload normalisation by hand and fronts every Ink stdout write, previously with zero coverage. Asserts the bytes that reach the stream for string / buffer / empty / encoding / callback shapes, and that write(chunk, cb) still fires. No TTY -- writes into a PassThrough. Positive-controlled. Shipped 2026-08-23 (cyber-009).
DeepSeek-backed Codex worker (recipe)Documented, NO-GO as standing worker
Thinking-model stuck detectionShipped
Design-step fleet redundancyShipped
DeepSeek user_id request isolationShipped
RunStore corruption scopingShipped
Worker retirement (RETIRED_WORKERS)Shipped
Spawned-CLI PWD syncShipped
opencode2 build-fleet workerShipped
Seatbelt /dev/null write exception (ka8vw)Shipped
Claude cold-spawn --no-session-persistenceShipped
Run.json structural validationShipped
MCP orchestrate non-blocking transportShipped
Selectable Moonshot judge backendShipped (code-only, unverified live)
Daily-cap admission reservationShipped
Spend-cap selftest isolationFixed
Website rebuild: Next.js + Fumadocs siteShipped
Owned design token system, theme-awareShipped
Self-hosted typefaces, zero third-party requestsShipped
Six-route marketing surface with four signature movesShipped
Committed design QA gateShipped
Cyberine visual asset kitShipped
Web gate: one canonical path, no cross-origin writes, no fail-open bindFixed
Spend-cap truth: what counts, what is covered, what is heldShipped
MCP auth gate covers all eleven dispatch/mutating/read surfacesShipped
MCP surface hardening: crash-resume durability, real install path, credential-scoped MCP-client spawns, honest dispatch errorsFixed
Host-sandbox confinement: config writes, host credentials, grandchildren, fail-closed code_executionFixed
ToolContext identity and bounds: per-worker jobs, live budgets, reaping in every adapterFixed
Provider circuit breaker, bounded retry, and behavioural coverage for the untested stores and web routesShipped
KEYMAP-V2: chord notation, a context axis, and a structural guard for the TUI keymapShipped
KEYMAP-WORKFLOW-CONTEXT: a dedicated Workflow context closes the khh09 follow-upShipped
Swarm chunk dependsOn edges actually order executionFixed
ACCENT budget: two claims per screen, enforced against a rendered frameShipped
KEYMAP-FLEET-ACTIONS: fleet.filter / fleet.hideFolder close the km09f follow-upShipped
FLEET-BENCH: a versioned coding suite that scores solve rate and dollars per taskShipped
OPENAI-SDK-7-MIGRATION: drop the keepAlive:false workaroundShipped
Divider dim opt-in, light-weight rule glyph, and a doubled fleet-header rule removedFixed
OpenTelemetry GenAI export -- CYBERINE_OTEL_ENDPOINTShipped
BOLD budget: one bold per region, owned by a single componentShipped
Border vocabulary recorded as a decision: corner-less, one archetype, dead one deletedShipped
WIDE-BREAKPOINT: at 140 columns the hub splits into list and preview panesShipped
SMOKE-SKIP-ON-DEPLETED-CREDIT: live-provider refusal is a skip, not a failFixed
One dot separator, no raw colour literal, no doubled hueFixed
Muse Code (Meta) as a CLI build-fleet workerShipped
Session handles: a unique, typeable name per live session, run and workerShipped
@ mention completes live sessions, and the planner can message oneShipped
Fleet TUI team-roster overlay, and a decision recorded for every other inputShipped
Board record corrected: durable teammates ARE built; the addressability boundary is now statedFixed
Site QA: the last MEDIUM closed, and heading order promoted to a hard gateFixed
claude-fable-5-1 in the catalog and pricing, with its cache anomaly recordedFixed
Claude workers deny prompts instead of hanging on a host that does not existFixed
Duplicate-handle sends fan out and say so; Claude Code's ask-which-one declinedShipped
OpenRouter ~...-latest alias: decision re-confirmed, and it serves nothingFixed
The sweep names the failing check, and the swarm flake's leading theory is disprovedFixed
Two sweep failures diagnosed the hour the reporting landed: a load-sensitive bound and a spacing regressionFixed
The awaitRun flake was the assertion, not the system: no bus-latency defect existsFixed
MCP runs on the split 2.x SDK, and the audit that predicted a breaking rewrite was wrongShipped
A visual settings screen: four tabs, 39 knobs, and a gate that fails on a switch wired to nothingShipped
CI on main was red for a day on a platform-specific npx install, not a code defectFixed
cyberine tasks calibrate — declared effort vs measured context tokensShipped
Task-boundary policy — three tiers, evaluated only when a task finishesShipped
cyberine writes the task board on its own: the deterministic nf-tasks core, portedShipped
TASKS-INTEROP-SMOKE: cross-implementation board interop, plus a spec-conformant cyberine init seedShipped
Handoff bridge — an autopilot session hands off through amemoria, then bootstraps the next oneShipped
cyberine autopilot — the whole session -> handoff -> session loop, bounded and auditedShipped
First-party Telegram alerts (CYBERINE_TELEGRAM_BOT_TOKEN + CYBERINE_TELEGRAM_CHAT_ID)Shipped
Foreground cyberine run auto-routes a build fleet for code tasks (fleet.json map, then router; dead routes dropped; exit 2 when nothing routable)Shipped
Foreground cyberine run with a build fleet runs the implement-task workflow: per-worker worktrees, DiffJudge, run.json + cyberine applyShipped
Judge backend fallback on 402/429/auth (deepseek-direct -> openrouter), judges abstain instead of crowning candidate 0, [verdict:positional] + state: done (unjudged)Shipped
CYBERINE_DEBUG_HANDLES=1 active-handle dump; foreground run shuts the LSP registry down so the process exits after state: doneShipped
opencode workers retired (opencode-deepseek, default-compare opencode); implement/swarm review pools no longer name opencodeShipped
CI is code-only: selftests job + security loop + bubblewrap probes removed from ci.yml (~20 min -> ~3.5 min per push); the sweep runs locally, writes .local/selftest-stamp/<sha>.json, and tracked .githooks/pre-push (wired by npm run prepare) refuses a push to main without an ok stamp; push preconditions and CI facts moved from the skill-regenerated user-git-workflow.md to tracked .claude/rules/push-gates.md + ci.md; T414-B (subscription allowlist) deleted from selftest:fleet-whitelist as an environment fact dressed as a code checkShipped
cyberine run --image <path> (repeatable) — image input on the one-command path; image tasks pin the vision-capable fleet and orchestrate() drops text-only workers via AgentInfo.acceptsImagesShipped
cyberine cost <runId> shows a per-worker prompt-cache hit % and a token-weighted run aggregateShipped
MCP caller identity read from the per-request envelope (ctx.mcpReq.envelope), getClientVersion() only as the 2025-era fallbackShipped
SecurityJudge pattern smoke (hostile + benign fixture per pattern, positive-controlled per pattern) and a URL-packed exfiltration heuristic with a host-anchored registry allowlistShipped
CYBERINE_CLAUDE_BASH_OUTPUT_MAX_CHARS caps a claude build worker's bash output via inline --settings (verified on 2.1.263: unset delivers 60k chars whole, 2000 delivers 2,048 + a notice)Shipped
Measured boundary: a claude build worker's Agent subagents do not inherit the appended/overriding system prompt; an --agents override of general-purpose would, but --safe-mode (T492) drops itDocumented
CLI-worker liveness: claude system/thinking_tokens (rate-limited per 500 tokens) and compact_boundary map to heartbeat progress events, so the reaper's idle clock sees a thinking or just-compacted worker as aliveShipped
Autopilot --driver stream — one steerable claude child per SESSION, and a SendMessage from any Claude session lands as an operator turnShipped
cyberine autopilot --driver bg — the driven session is a real claude agents fleet row, steerable mid-runShipped
cyberine autopilot --bg IS a claude agents fleet row by default, steerable from peek/attachShipped
Every launchBackgroundRun dispatch (cyberine run --bg, chat /run, the queue consumer, awaitRun steps) tries a claude agents fleet row before the old detached child, by DEFAULT, with a read-only operator-input channelShipped
CYBERINE_CLAUDE_WORKER_MODE=bg — the claude build worker is a daemon-supervised claude agents fleet row (cyberine-w-<runId8>-<slot>) instead of an opaque -p childShipped
A task's model: tier reaches the model that answers on every autopilot driver, and a mixed-tier board's session cost is stated in the planShipped
Adapter liveness: cyberine doctor --liveness, GET /api/adapters/liveness and a fourth overview column report whether an adapter is FUNDED, not merely keyedShipped
The autopilot's overshoot past --max-hours is BOUNDED and stated as a number, not left open-endedShipped
The attached autopilot's fleet-row detail line is printable ASCII by contract, and its first stdout write is newline-guardedShipped
cyberine autopilot --on-drained brainstorm drafts the next batch as BACKLOG tasks when the board runs out of runnable work, instead of exitingShipped
cyberine autopilot --batch N — one turn takes N disjoint tasks and fans each out to its own worktree agent, with subagent spend measuredShipped
Adversarial review of the day's five commits found and fixed a FALSE wall-clock guarantee, a false-ok in the liveness table, an unbounded metered-spend loop and a prompt-deep promote gateShipped
Three narrow board-write gaps found by review: converge validates status, brainstorm ids are checked against the board, and a flag no longer swallows the next flagShipped
The autopilot's wall-clock bound now covers EVERY phase of a --driver bg turn, not just its measured phaseShipped
A --bg turn left unfinished at blocked is a named needs-input failure, not a successShipped
Autopilot backs off on a held turn instead of re-prompting at once; held turns do not count toward the turn ceilingShipped
cyberine daemon --help prints usage and exits before any pidfile or loopShipped
A handoff file that stabilises empty or without Where:/Next: or frontmatter is rejected with HandoffFileIncompleteErrorShipped
Attached mode strips CSI/SS3 escapes and control bytes from operator lines; attach writes nothing to stdoutShipped
A cli-unavailable cooldown is re-probed with the login check before it is honoured; a passing probe clears it, and doctor clears one it can disproveShipped
Autopilot cold start reads the newest project handoff for session 1 and carries repeat-fail counts across invocations in .local/autopilot/history.jsonShipped
--driver bg re-probes the subscription quota at session boundaries (reading older than 1m) and turn boundaries (older than 10m) through the same fold as a stream turnShipped
DeepSeek key-loop workers get an out-of-credits cooldown from the free balance endpoint whenever liveness is collectedShipped
Aborting a claude --bg worker inside the spawn window stops its job instead of orphaning it under the daemonShipped
A spawned claude worker no longer inherits CLAUDE_CODE_OAUTH_TOKEN; the seat it bills is an explicit makeClaudeAdapter({ oauthToken }) choiceShipped
Multi-seat Claude dispatch: declare per-account token files once, pin or fan out a build across seatsShipped
cyberine run --bg on a seat-pinned fleet detaches through Cyberine's own child instead of a claude --bg fleet rowShipped
Claude Code first-run wiring: cyberine skill install/mcp install, a doctor claude-code: section, and a bare-invocation nudgeShipped
cyberine init pins a project fleet.json after writing config.jsonShipped
cyberine autopilot readiness: a non-git-repo refusal, a backlog-aware dry-run hint, and a ## 0. Readiness skill tableShipped
The global cyberine shim runs a built artifact, never the live working treeShipped
cyberine wait reports four outcomes: done, run-failed, timeout, watcher-diedShipped
Artifact swap is atomic, snapshot contents come from HEAD, and wait prefers state over deadlineShipped
build.fleet from config.json is a preference resolved against fleet.json; /cyberine:seat pins the routed seatShipped
First-run readiness: unborn-HEAD refusal, .local/ gitignored on seed, empty-board message, seats-only build.fleet alignmentShipped
/cyberine:seat applies the winner by default; preview is the opt-inShipped
claude plugin eval suite for the bundled pluginShipped
/cyberine:dispatch retired; the cheap lane is plain cyberine run --cheapShipped
/cyberine:setup renamed /cyberine:init; plugin eval suite executed and rewrittenShipped
cyberine autopilot context window follows the modelShipped
cyberine autopilot --handoff checkpoint -- mechanical checkpoint from the agent's own STATE trailerShipped
Spike kcgg5: one session + /compact vs fresh session + checkpoint -- fresh wins, flag removedShipped
Exhausted Claude seat detected from api_retry; spawn abandoned, cooldown until the real resetShipped
AdversarialJudge skeptic reasonsShipped
DiffJudge verdict names each rejected candidate and git's apply-failure detailShipped
CLI worker timeout is CYBERINE_CLI_TIMEOUT_MS; OPENCODE_TIMEOUT_MS kept as a deprecated aliasShipped
Handoff selection ranks by filename date, not raw mtimeShipped
Quota reading attributionShipped
Loop workers cool down until the provider's retry-afterShipped
HTTP message-bus backend (CYBERINE_BUS_BACKEND=http), hub-and-spoke cross-machine comms behind cyberine webShipped
Pre-emptive seat rotation on allowed_warningShipped
CC-memory preamble handoff selection also ranks by filename dateShipped
/cyberine:tasks plugin skill -- the judgement half over the board writerShipped
Autopilot's quota preflight and session drivers also abandon an api_retry-exhausted seatShipped
cyberine init --vibe-rule bundles the vibe-coding rule templateShipped
Bundled plugin skills carry no dependency on the author's private toolingShipped
Builtin handoff writer replaces the hard amemoria requirementShipped
Cyberine rules replace --vibe-rule with asked, config-recorded consentShipped
Board parity with upstream 2026-09-14: completed: baked from the flip epoch, damaged-bracket tolerance, doctor section 8Shipped
Board parity with upstream 2026-09-16: extras-reader tolerance, one status list, measured fence and field-order fixturesShipped
Sweep stamp bound to the machine that swept it: .local/selftest-stamp/<host>/<sha>.json + a recorded host, verified by scripts/sweep-stamp.mjs from .githooks/pre-pushShipped
A non-success Claude result subtype fails the run instead of landing as an empty successShipped
Submodule-scoped board listing: cyberine next / chat /next inside a manifest-less submodule show only tasks whose path: lands in it, --all restoresShipped
Worker env provenance: every toolingSnapshot records the launch-inherited CLAUDE_CODE_* / ANTHROPIC_* keys and whether the run was launched from a Claude Code sessionShipped
Foreign text fenced before every prompt: worker outputs, diffs, command output, web and search results, teammate notes, stored memory, CC handoffShipped
Chat @ trigger and insertion aligned with Claude Code 2.1.273 as measured on a real terminal: quoted @"path with spaces" opens and completes, whitespace paths insert quotedShipped
Global shim resolves the artifact symlink to its real path, so Ink surfaces compile with the automatic JSX runtime againShipped
Chat input keys aligned with Claude Code 2.1.273 as measured on a real terminal: Ctrl+W to whitespace, Ctrl+C discards text into the kill ring, Ctrl+C double-press exit actually works, Esc Esc on empty opens rewindShipped
cyberine init wires what it DETECTED: one evidence-based detector, a detected default preset, and a setup --status detection tableShipped
fleet.json provider keys say CLI or API: API twins of a CLI worker end in -api (command-code-api, command-code-api-free, muse-api, gemini-api, claude-api, claude-api-gateway, openai-api, openai-api-gateway), fleet list gains a TRANSPORT column, and fleet doctor names the CLI twin that makes a keyless API provider optional and the pinned step that will skip a worker with no key or loginShipped
Sweep flake ledger: every sweep appends failedNames to .local/selftest-stamp/<host>/ledger.jsonl, the stamp records failedNames, and npm run sweep:flakes ranks smokes by failures and flags a same-SHA pass-later as a load flake; every in-process git worktree add/remove in one repo now shares one chain, judges and the standby pool includedShipped
npm platform gaps closed: x64 binaries on Bun's -baseline runtime, darwin-x64 compiled on a pinned Bun 1.4.2 when the running Bun is older, and the launcher refuses musl Linux by name instead of spawning a glibc binaryShipped (unreleased; needs a version bump and republish)
Chat planner add_tasks tool: cyberine chat writes a brainstormed task list onto the repo's board through the converge-apply writer, so chat -> board -> cyberine autopilot is one flowShipped
Autopilot hands off only through the builtin writer; the amemoria handoff mode is renamed offloadShipped
Plugin SessionEnd capture hook dropped; the headless handoff writer runs hooklessShipped
cyberine end inside an instruction runs to completion unaskedFixed
Secret redaction covers Basic auth, percent-encoded tokens, zero-width-split key names and URL passwordsFixed
cyberine doctor flags a coexisting TaskBoard pluginShipped
TaskBoard bundle split under the plugin directory's 256 KiB file limitShipped
npm run plugin:export for the plugin directory repoShipped
The site is live at cyberine.devShipped
One-line installer at cyberine.dev/install.shShipped
SEO pass for cyberine.devShipped
Run-record site designShipped
Site figures cite a real runFixed
Docs Trust column coloured by its roleShipped