Changelog¶
A curated record of what shipped on supachad (the chad-dev/main line).
Hand-edited from git log; not exhaustive.
2026-10-14¶
Reboot recovery, memory restored, phone approvals, and a gate fix¶
A host reboot after the first OpenShell 0.0.116 cutover attempt left Chad down
and exposed several gaps. Chad is back on 0.0.20 with everything restored, and
the gaps are now codified in chad-ops:
- Recovery tooling.
doctornow checks reachability first and gates gbrain on page count and embed coverage.recoverno longer overwrites a surviving brain, restores missing runtime files (the action-gate policy, queue state), re-authenticatesgh, and reinstalls the Proton wrapper. Newhandshake-sync,cli-mtls, andgbrain-dimssubcommands cover the reboot-only failures. See Health & recovery. - Memory restored. gbrain had come back empty; 4,076 pages were re-imported
from the
chad-stateexport and re-embedded to 100% coverage. - Skills and tools. All five custom skills and the orchestrator tools now
ship through the deploy manifest; four skills and
chad-budgethad only ever been installed by the full setup script. OpenWebUI credentials are synced to the sandbox again, so everychad-webuitool works. - Phone approvals. Smithers approval gates push an Approve/Deny card through Moshi; a tap approves or denies and resumes the run. See Front-ends.
- Email gate fix. Auto-reply drafts were classified auto-sent regardless of the action gate. The gate's verdict is now enforced. See Autonomy & action gate.
- CI. The fork's static checks pass again after clearing a repo-wide lint backlog; upstream-only workflows (Fern docs publishing, cache-only gbrain jobs) are disabled or removed on the fork.
2026-10-06¶
Chad goes hosted: free tier, credits, and premium billing¶
Chad is now a hosted product, not just a self-host blueprint. Sign up at supachad.com and launch at chad.supachad.com:
- Free — 50 messages a day on Chad Lite, no card.
- Credits — pay-as-you-go packs via Square hosted checkout; 1 credit = 1 message, no daily cap, credits don't expire.
- Premium — the full Chad agent, unlimited.
New signup + onboarding flow on the landing page; an atomic credit ledger on Cloudflare D1; a Square checkout + signature-verified webhook that tops up credits or grants premium; and per-message metering in the OpenWebUI rate-limit filter with a live "credits remaining" status that falls back to the free cap if the billing worker is unreachable. See Get started.
2026-10-04¶
Caught up with upstream NemoClaw (4,928 commits) + renamed to supachad¶
Merged roughly five months of NVIDIA/NemoClaw — 4,928 commits — into the fork,
resolving 29 conflicts while preserving Chad's network policies, gbrain/gstack
plugins, and live version pins (upstream had moved eslint→oxlint, rewritten the CLI,
and bumped the sandbox base image to Debian 13). The fork is now
tantodefi/supachad. Added a lean, fork-friendly CI gate (typecheck + config
validation on every push — upstream's full matrix needs NVIDIA infra a fork can't
run) and a weekly, PR-gated upstream-sync so the fork stays current without
hand-merging.
2026-10-01¶
In-browser terminal, OpenWebUI v0.11.4, free-tier limit, gbrain embed rescue¶
A real WebVM + Docker terminal inside OpenWebUI, with an agent bridge so Chad can
type commands you watch live. chad-webui wired to the OpenWebUI 0.11.4 API
(calendar, notes, automations, memories). A per-user free-tier daily message cap.
And a gbrain rescue — migrated embeddings off an EOL model to nemotron-3-embed-1b
after the old endpoint began returning 410 (column migrated to 2048-dim vectors),
restoring semantic search. The shim's operator-allowlist gate is now fail-closed.
2026-07-07¶
chad-ops dispatcher + mobile runs IDE + allowlist hardening¶
chad-ops.sh codifies the recurring pod operations behind one dispatcher —
doctor (read-only health), recover (idempotent cold-start), deploy,
gate-sync — so an interrupted recovery finishes by simply re-running. The runs IDE
gained a responsive mobile layout with a hamburger nav, and the Chad-lite operator
allowlist gate was hardened to fail-closed.
2026-07-06¶
landing-lab, opencode coding pipeline, Moshi phone push¶
landing-lab — a grounded marketing-copy lab: nemotron distills the real docs (README + supachad docs) into a fact sheet (each claim tied to a source), opencode big-pickle writes several distinct landing pages per angle using ONLY those facts, and nemotron compares them and flags any unbacked/hallucinated claim (first run: developer-depth 93/100 vs founder-outcomes 78/100, 5 claims flagged). Not a re-skin — original copy backed by technical truth. Never touches the live landing repo.
coding-task v2 — Chad (nemotron) drives a long, validated opencode big-pickle
build: plan (+ a real validate command) → [ code → validate → assess ] looped to
convergence → Moshi ping → Approval gate → optional draft PR (doubly gated; never
auto-writes the repo). Two coder paths: spawn (isolated pod/GHA, default) and
direct (host opencode).
opencode coder (lib/opencode.js) — root-caused why opencode "wrote 0 files":
it only engages its tool loop when launched under a shell with stdout→file (a
direct node pipe runs it degraded); now runs sh -c 'opencode run "$OC_TASK" … >log'
with --pure (autonomous, no plugin clutter), isolated /tmp workdir.
Moshi phone notifications — device-token push (chad-moshi-notify /
lib/notify.js) works from nemotron/cron/workflows with no Pro or claude-hook; wired
as the moshi approval channel. Approve/deny buttons need a routable (tmux)
session — chad-claude launches Claude that way. dev.nemoclaw.moshi-hook-refresh
self-heals stale hooks. See Front-ends.
2026-07-03¶
Composite audit follow-ups: two more workflows, concurrency caps, tested helpers¶
Audited the 13 pre-composite workflows against the 0.26 composites — verdict: they
were already well-hardened (fallback + tier-aware timeouts + continueOnFail +
deterministic-first routing), and composites would have flattened the richest ones
(fusion's 3-stage, experiments' persistent Pareto population). Follow-ups from that
audit: (a) fusion/token-optimize fan-outs now cap in-flight model calls with
<Parallel maxConcurrency> (fixed a latent node-id collision in fusion too); (b) two
new workflows — pr-shepherd.jsx (deterministic per-PR triage via lib/pr.js, no LLM
for routing) and coverage-loop.jsx (built-in <Loop> measure→fix→re-measure to a
target); (c) clarified in the docs that coerceJson is for raw subprocess stdout, not
model-task output (Smithers validates that itself). New pure helpers lib/pr.js +
lib/coverage.js are unit-tested (lib suite: 51 tests, 0 fail); all 20
workflows graph-validate. See Runs IDE.
2026-07-02¶
Smithers 0.26 upgrade + five composite-based workflows¶
Bumped smithers-orchestrator 0.23 → 0.26.1 (was an unpinned latest).
Clean upgrade — all workflows graph-validate, tests pass, dashboard read/graph/
durable-write smoke-tested; no API breakage (the .smithers/ anchor change from
0.24 is a non-issue because the IDE points the CLI at named DBs via the
smithers.db symlink shim). Adopted Smithers' built-in composite components
in five new workflows: code-review-loop.jsx (ReviewLoop),
dependency-update.jsx (ScanFixVerify), debate.jsx (Debate — the
argue-to-consensus counterpart to fusion's parallel-synthesize), canary-judge.jsx
(Poller), and changelog.jsx (plain Sequence). All shadow-safe + gated.
The chad-runs CLI also gained chain-fork (copy + re-run a whole chain, source
untouched). See Self-improvement and Runs IDE.
2026-06-24¶
Self-improvement loop: directives, trace-grounded breeding, chaining¶
The Runs IDE went from four tabs to seven (added Approvals,
Chains, Schedules, Directives). The evolutionary arena's breeding is
now trace-grounded: lib/signal.js scans every run DB for
failed/stale/low-quality runs and lib/fixtures.js harvests real run
inputs as the eval set, so mutatePrompt() targets concrete failure
modes (the GEPA pattern). A new Directives tab + state/directives.json
steers both the arena and every agent's system prompt
(agents.js#directiveSystem). Workflow chaining strings workflows
into resumable pipelines (state/chains/*.json). Three nightly
self-improvement workflows landed — token-optimize (tokenmaxxing →
cheaper-model downgrades, with a model×task matrix + efficiency view),
bug-report (Chad files his own bugs), and skill-improve (Chad
proposes his own enhancements) — all Approval-gated. The chad-runs
CLI now mirrors every serve-runs.js endpoint 1:1 so Chad drives
all of it headlessly. See Self-improvement and
Runs IDE.
2026-06-17¶
Chad Lite — a stateless tier for new users + SearXNG web search¶
A lightweight rung for onboarding more Open WebUI users without sharing
the operators' agent or memory. Chad Lite (chad-lite model) is
plain Nemotron Ultra + a generic prompt with no OpenClaw agent,
gbrain, or pod state — memory and web search come from Open WebUI
itself (per-user Memory + a private in-stack SearXNG, json +
limiter:false, keyless, never host/internet-exposed). Isolated by
account, zero new pod load, scales to the Cloudflare 50-seat cap.
Ships with chad-provision-tier0.sh, a chad-webui models
--access-control passthrough, and the multi-user design doc (tiers,
the limits of many OpenClaw agents in one pod, and the auth flow:
Cloudflare's list is the whitelist; Open WebUI auto-provisions on first
login at DEFAULT_USER_ROLE=user). See Front-ends.
2026-06-16¶
Runs IDE at runs.supachad.com¶
A web IDE for durable Smithers workflows, served by a Hono server
(scripts/chad-smithers/serve-runs.js) that reads the Smithers SQLite
DBs directly — full run history across every workflow DB,
auto-discovering new runs, no Smithers daemon to babysit. Four tabs:
Runs (live-polling list + run detail with task tree, outputs,
logs, chat, diffs, trace), Workflows (interactive mermaid DAG from
smithers graph), Editor (CodeMirror read/edit/save of the
.jsx, path-validated), and Experiments (the evolutionary
leaderboard). From the browser the operator can cancel, approve/deny
an <Approval> gate, fork for replay, diff a node, and launch a run.
Fail-closed auth: x-smithers-key (programmatic) or
Cf-Access-Authenticated-User-Email (SSO); writes pass an extra
operator gate. Chad drives the same REST API headlessly via the
chad-runs ESM CLI (health / runs / get / logs / trace / launch /
cancel / fork / approve / experiments / cat / save). Deploy is a
launchd agent on 0.0.0.0:7331 behind the existing cloudflared; the
one remaining step is a Cloudflare dashboard public-hostname route +
Access app for the subdomain.
Model fusion + daily NVIDIA model refresh¶
workflows/fusion.jsx runs one prompt across N models in parallel
(each its own durable task), then a synthesizer fuses them into one
best answer with a best_model pick — the runs IDE gets access to
every model Open WebUI does. The roster stays current via
refresh-models.js (launchd chad-models-refresh, daily 04:45):
fetches NVIDIA's /v1/models, filters to chat/agentic, and writes a
priority-ordered featured list to state/models.json. New NVIDIA
open models join the fusion roster the next morning with no manual
edit. (GLM 5.1 is on the NVIDIA API; 5.2 is not yet — auto-adopted
when it lands.)
Two orchestrators, bridged — and the first ports¶
Settled the chad-spawn vs chad-Smithers question: keep both, bridge
them. chad-spawn stays the GHA-isolated one-shot sub-agent substrate;
chad-Smithers is the durable workflow orchestrator that can call
chad-spawn to offload one heavy step onto a GH runner (reuses the
existing machinery, no parallel GHA system). Then built it:
- The bridge —
scripts/chad-smithers/lib/spawn.js.runSpawn()runs inside a durable Smithers task and shells out tochad-spawn; never throws (always resolves to aresult.jsonshape). Transports: host stub (CHAD_SPAWN_STUB=1), SSH-to-pod (CHAD_SPAWN_SSH, task streamed in / result back since scp is blocked), or local. Portschad-route→route()and issue scoring →scoreIssue()as unit-tested plain JS (8/8). - Migrated multi-spawn flows —
issue-triage.jsx(fetch → score+route →Parallelspawn per issue → report; verified end-to-end) andcontent-pipeline.jsx(research→draft→review spawns → reviewer-gatedApproval→ publish). - Ported cron features —
self-improve.jsx,memory-curator.jsx, andlog-digest.jsx(verified on the host's 29 service logs). All shadow-safe by default.
Mechanical one-shot crons (backups, prune, gc, budget-audit) stay plain wrappers — Smithers is overhead there. See Runs IDE, Orchestrator, Substrates.
2026-06-13¶
Nemotron 3 Ultra 550B + reasoning on by default¶
Adopted NVIDIA's newest, most capable open model
(nvidia/nemotron-3-ultra-550b-a55b) as the default for the hosted
inference profiles. The long-standing harness bug that blocked
reasoning with tool calls (the Kimi K2.5 reasoningSafe=false class)
was retested against Ultra and is absent — Ultra emits standard
tool calls and round-trips cleanly with reasoning on, so reasoning is
now on by default. Self-hosted profiles stay on Super 120B (550B local
is a much larger GPU footprint).
Smithers evolutionary experiment runner (shadow)¶
A durable, host-side experiment runner on
Smithers under scripts/chad-smithers/: a model
router (auto-routes tiers across Nemotron Ultra / Claude subscription /
local), an evolutionary selection engine (start wide → score in
parallel → keep only what works), crash-resumable runs, and a nightly
launchd job that posts the leaderboard to OpenWebUI. Runs in shadow
beside the deterministic chad-experiment-cron. Plus MCP-health-probe
and fail-only cron-report workflows.
Moshi notifications + phone approval¶
Wired the Moshi agent hooks so host claude runs notify the operator's
phone on finish and route approval gates to the phone — the mechanism
behind the autonomy ladder. Added chad-tmux for phone-attachable
host sessions.
2026-05-14¶
Autonomous experiment lifecycle¶
A sixth autonomy loop: chad-experiment-night cron at 02:00 UTC runs
four phases nightly — propose hypotheses from memory, observe running
experiments, evaluate against success metrics, auto-schedule calendar
coordination. Bounded by a per-operator concurrent budget (default 3)
and a regression auto-retire threshold (default -0.30). Materializes
artifacts (automations, functions, tools, knowledge collections,
memories, notes, calendar events) via the chad-webui MCP tools.
Components: chad-experiment CLI (13 verbs), chad-experiment skill
documenting methodology, state/experiments/{config,ledger,active,archive}
ledger format, calendar tag conventions ([chad-block],
[chad-experiment], [operator-sync], [experiment-review]).
Full OpenWebUI v0.9.5 API coverage + native MCP tools¶
chad-webui CLI extended from 33 to 60 sub-commands across 10 groups,
covering every documented v0.9.5 REST endpoint. Companion
chad-webui-mcp stdio server registers each sub-command as a native
MCP tool (webui__<group>_<command>). Fail-closed per-operator
API-key selection (OPENWEBUI_API_KEY_<SLUG>) enforced at the wrapper
layer. New openwebui skill (927 lines) documents every command with
worked examples + composed recipes + nightly experiment playbook.
Host-side watchdogs¶
spawn-poll moved out of openclaw cron (was 288 agent turns/day at
~44k tokens each → ~12.7M tokens/day) to a host launchd job. Same
script, no agent overhead. State-change events flow back to Chad via
a new state/agent-inbox.jsonl stream that cron agent turns can tail
on startup. Also: new chad-shim-watchdog launchd job catches
BrokenPipeError-class shim crashes in 5-min worst case (was 6h).
Wrapper-bug shim layer¶
Five argv-vs-env / hardcoded-path bugs in /usr/local/bin/chad-*
(chad-budget, chad-issue-triage ×3 sites, chad-mail-check,
chad-issue-triage-cron, chad-email-check-cron) caused
silent skips and traceback crashes across the issue-triage,
email-check, and self-improve cron paths. All shimmed via
/sandbox/.openclaw-data/bin/ with cron-payload absolute-path
overrides; documented at docs/operations/wrapper-bugs.md in the
NemoClaw repo.
2026-05-13¶
Memory pipeline consolidation + gateway watchdog¶
Three jobs now converge OpenWebUI chats, workspace events, and system
docs into a single bounded gbrain. chad-gbrain-prune (sandbox cron,
Sundays 02:00 UTC) is the new weekly retention sweep: deletes
memory/<date> and events/<date> pages older than 365 days,
chat/<id> pages older than 180 days, and workspace
dream-digest-*.md/feedback_*.md/prune-log-*.md files older
than 30 days. Default DRY_RUN=1; protects system/*, agent/*,
and the workspace <date>.md journal (source-of-truth).
chad-webui-ingest (host launchd, 04:30 UTC daily) reads chats
updated in the last 25 h from ~/.nemoclaw/openwebui/data/webui.db
(turns live in the chat.chat JSON column — not the message
table, which is for channels), renders each as markdown with
frontmatter, and SSHes the content into the sandbox via
gbrain put chat/<chat-id>. After ingest, the next
chad-gbrain-dream pass picks chats up alongside the workspace
journal. The dream wrapper now surfaces the Embedded/Chunks
ratio in dream-digest-<date>.md and writes
feedback_embed_staleness_<date>.md if coverage drops below 95%
(catches a silently-stalled detached gbrain embed --stale).
chad-gateway-watchdog (host launchd, every 5 min) is the new
supervisor for the OpenClaw gateway. The chad pod has no PID-1
supervisor for the gateway process — when it crashed on
2026-05-12 with a V8 OOM at the default 1.7 GB heap, nothing
restarted it for 9 hours, silently failing every cron and
chad-shim call. The watchdog pings the WS port via SSH, kills any
stale process if needed, and relaunches with
NODE_OPTIONS=--max-old-space-size=4096 to push the OOM
threshold further out.
Critical doc fix. Discovered during the same audit: the chad
pod has no PVC backing /sandbox — verified via
kubectl get pod chad -n openshell -o jsonpath='{.spec.volumes[*].name}'.
The only mounts are openshell-client-tls,
openshell-supervisor-bin, and the kube-api-access SA volume.
Running kubectl delete pod chad wipes ~1.2 GB of state. chad-readme.md
§ 8 and docs/workspace/workspace-files.md were updated to remove
the old "PVC outlives container restarts" claim and add an
SSH-tar backup recipe to take before any pod-recreating operation.
The proper fix is a PVC for /sandbox in the nemoclaw-blueprint
StatefulSet.
2026-05-12¶
OpenWebUI auto-curated dropdown + cloudflared HTTP/2 fix¶
The model picker in OpenWebUI is now auto-curated. A host launchd
job (nvidia-liveness, daily 04:00 UTC) probes every model in
NVIDIA Build's /v1/models with a one-token chat completion,
classifies each as live / dead / unknown / transient
(HTTP 410 Gone marks dead immediately; 4xx/5xx need three
consecutive strikes; network timeouts preserve previous status),
ranks them per-provider by parsed version + params, and writes
featured + per-model status to ~/.nemoclaw/openwebui/liveness.json.
A separate sibling proxy (nvidia-proxy, host launchd, KeepAlive)
sits in front of integrate.api.nvidia.com — passes through every
request unchanged except GET /v1/models, which it filters to the
featured set. OpenWebUI's OPENAI_API_BASE_URL points at the
proxy so the dropdown stays current with NVIDIA's catalog and
hides EOL'd models the day they're flagged.
Curation is one TOML file (scripts/openwebui/nvidia-curation.toml)
with per_provider_limit and a glob exclude list. Default is
flagship-only — ~14 models. Curated model rows in webui.db whose
base_model_id is dead get auto-soft-disabled (is_active=0)
by the liveness sweep, so the dead-llama-3.1-405b entries that had
been producing user-visible 410 errors stopped appearing.
Separately: cloudflared on the tunnel side was reconnecting every
10–30 minutes with QUIC stream timeouts ("no recent network
activity"). Residential routers / NAT firewalls / mobile carriers
prune idle UDP flows aggressively. Forcing --protocol http2
moves the transport to TCP and removes the entire failure class
at ~5–15 ms of extra latency per request.
Also pinned WEBUI_SECRET_KEY from .env so container recreates
don't regenerate the file inside the image layer, which had been
invalidating every existing browser JWT and bouncing users back
to the sign-in page on every redeploy.
2026-05-11¶
Sandbox survival hardening¶
The Bonjour mDNS plugin was crash-looping the gateway on the
loopback-only sandbox. Disabled it in openclaw.json's
agents.defaults. Raised agents.defaults.llm.idleTimeoutSeconds
from 60 s to 180 s so the slow cold-start path on
nvidia/nemotron-3-super-120b-a12b doesn't trip the idle gate
mid-tool-call. Consolidated the split-brain
feedback-proposals.md path so the chad-self-improve wrapper
and the curator agree on a single canonical location. Rewrote
the proton-calendar SKILL.md with a cron-boundary decision
table and a link to EMAIL-POLICY so subagents don't reach for the
calendar when an email reply would do.
A new chad-readme.md § 11.5 documents the deploy gap between
source/scripts/chad-cron-wrappers/ and /usr/local/bin/ on the
running image, plus the kubectl cp recovery procedure when a
wrapper needs to be pushed without rebuilding the image.
2026-05-07¶
Cron context optimization + reliability cleanup¶
Applied --light-context to every registered cron via
openclaw cron edit. Observed input-token reductions of 70–82% on
wrapper-only fires (e.g. chad-skill-watch 177k → 48k, duration
167 s → 55 s). Added
agents.defaults.llm.idleTimeoutSeconds = 60 to openclaw.json so
hung Nemotron sessions fail fast instead of sitting until the
600 s job timeout. Re-registered the three crons that were
documented but missing from the live gateway
(memory-curator, spawn-poll, spawn-gc); the chad-readme
listed nine but chad-setup.sh had since grown to register
eleven. Sticky Error statuses on chad-proposal-apply,
chad-skill-watch, self-improve, and chad-budget-audit cleared
once the underlying delivery Channel is required failure was
resolved by re-applying --no-deliver --best-effort-deliver to
every job.
2026-05-06¶
Async sub-agent spawns¶
chad-spawn --async --substrate gha now returns a task_id immediately
and writes a running ledger entry. The new chad-spawn-poll cron
(every 5 min) reconciles when the GHA runner commits result.json back
to the spawn branch, transitioning the ledger and triggering
chad-collect. Async mode deletion via chad-spawn-gc (weekly Mon)
prevents chad-spawn/* branches from accruing on chad-state. Added
opencode kind + preset (multi-provider coding CLI) and a new
--binary-override flag for per-spawn binary swap (e.g., spawning
writer with the codex binary instead of claude while keeping
the writer's prompt template and timeout). The kind's L7 policy
preset still applies — the override binary must be in that preset's
allowlist. Ledger entries now carry substrate and async fields.
NVIDIA fallback in the GHA agent-job runner¶
The runner now picks an inference provider at workflow time. With only
NVIDIA_API_KEY set, codex / opencode kinds route through
integrate.api.nvidia.com/v1 (OpenAI-compatible) targeting Nemotron;
adding OPENAI_API_KEY automatically upgrades to real OpenAI.
claude requires ANTHROPIC_API_KEY (no NVIDIA fallback —
Anthropic-only). The resolved provider lands in result.json so
chad-collect knows which backend produced each output.
GHA substrate for chad-spawn (popebot pattern)¶
Sub-agent spawns can now route to a GitHub Actions runner per job.
New --substrate <local|gha> flag on chad-spawn, kind manifests gain
a substrate field, chad-spawn-gha.sh helper handles
push + dispatch + sync poll. Workflow template + chad-state-bootstrap
installer ship in the source repo. The branch on chad-state is the
job record — no jobs table, no queue service.
Codex kind stub + design doc¶
First non-built-in kind, validating the "no recompile, no image
rebuild" extensibility claim. Architecture for spawn substrates
captured in docs/design/spawn-as-github-run.md.
Hermes-style memory curator + pre-mutation snapshots¶
chad-memory-curator runs weekly Sat 04:00 UTC. Inactivity-gated,
budget-guarded, draft-only. Snapshots lancedb + wiki + workspace
before any work via chad-memory-snapshot (tar.gz, keep last 5,
reversible rollback). Memory-lancedb autoCapture self-healed to
true by chad-setup.sh Step 3e — the unlock for Chad's previously
empty LTM. Step 3f actively removes gbrain from mcp.servers if
re-introduced (PGLite single-process file lock means MCP serve
blocks every cron wrapper that uses gbrain CLI).